Skip to content

Commit 1b05ede

Browse files
lstnlrlubos
authored andcommitted
[nrf fromtree] modules: hal_nordic: nrfs: improve error handling
Added option to retry message send over ipc when for example there is -ENOMEM error (shared memory buffer full). Number of max retries and delay between them are Kconfigs. Fixed nrfs error reporting when sending directly over ipc service, status was not correct when negative value was returned from ipc service send function. Signed-off-by: Łukasz Stępnicki <[email protected]> (cherry picked from commit e62ebd8)
1 parent 3b583c2 commit 1b05ede

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-4
lines changed

modules/hal_nordic/nrfs/backends/Kconfig

+15
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,19 @@ config NRFS_BACKEND_TX_MSG_QUEUE_SIZE
2525
range 1 16
2626
default 8
2727

28+
config NRFS_SEND_RETRY_DELAY
29+
int "Delay in us"
30+
range 1 100
31+
default 1
32+
help
33+
Delay when waiting for next message send retry in case of send error.
34+
35+
config NRFS_SEND_RETRY_MAX_COUNT
36+
int "Max number of send retries"
37+
range 0 100
38+
default 5
39+
help
40+
How many times nrfs will try to send message over ipc service until
41+
error will be reported. For example when shared ipc memory is full.
42+
2843
endmenu

modules/hal_nordic/nrfs/backends/nrfs_backend_ipc_service.c

+39-4
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ __weak void nrfs_backend_error_handler(enum nrfs_backend_error error_id, int err
8080
LOG_ERR("IPC register endpoint failure with error: %d", error);
8181
break;
8282

83+
case NRFS_ERROR_SEND_DATA_FROM_QUEUE:
84+
LOG_ERR("IPC backend sent data failed.");
85+
break;
86+
8387
default:
8488
LOG_ERR("Undefined error id: %d, error cause: %d", error_id, error);
8589
break;
@@ -120,14 +124,45 @@ static void ipc_sysctrl_ept_recv(const void *data, size_t size, void *priv)
120124
}
121125
}
122126

127+
/**
128+
* @brief This function will try to send data directly using ipc service
129+
* In case of errors it will retry if configured.
130+
*
131+
* @param message Pointer to the buffer to send.
132+
* @param size Number of bytes to send.
133+
* @retval NRFS_SUCCESS Message sent successfully.
134+
* @retval NRFS_ERR_IPC Backend returned error during message sending.
135+
*/
136+
static nrfs_err_t nrfs_backend_try_send_directly_over_ipc_service(void *message, size_t size)
137+
{
138+
size_t retry_count = CONFIG_NRFS_SEND_RETRY_MAX_COUNT + 1;
139+
int ret = 0;
140+
141+
do {
142+
ret = ipc_service_send(&ipc_cpusys_channel_config.ipc_ept, message, size);
143+
if (ret < (int)size) {
144+
k_usleep(CONFIG_NRFS_SEND_RETRY_DELAY);
145+
} else {
146+
return NRFS_SUCCESS;
147+
}
148+
} while (--retry_count);
149+
150+
return NRFS_ERR_IPC;
151+
}
152+
123153
static void nrfs_backend_send_work(struct k_work *item)
124154
{
125155
struct ipc_data_packet data_to_send;
126156

127157
LOG_DBG("Sending data from workqueue");
128158
while (k_msgq_get(&ipc_transmit_msgq, &data_to_send, K_NO_WAIT) == 0) {
129-
ipc_service_send(&ipc_cpusys_channel_config.ipc_ept, &data_to_send.data,
130-
data_to_send.size);
159+
160+
nrfs_err_t ret = nrfs_backend_try_send_directly_over_ipc_service(&data_to_send.data,
161+
data_to_send.size);
162+
163+
if (ret != NRFS_SUCCESS) {
164+
nrfs_backend_error_handler(NRFS_ERROR_SEND_DATA_FROM_QUEUE, 0, true);
165+
}
131166
}
132167
}
133168

@@ -177,8 +212,8 @@ nrfs_err_t nrfs_backend_send(void *message, size_t size)
177212
nrfs_err_t nrfs_backend_send_ex(void *message, size_t size, k_timeout_t timeout, bool high_prio)
178213
{
179214
if (!k_is_in_isr() && nrfs_backend_connected()) {
180-
return ipc_service_send(&ipc_cpusys_channel_config.ipc_ept, message, size) ?
181-
NRFS_SUCCESS : NRFS_ERR_IPC;
215+
return nrfs_backend_try_send_directly_over_ipc_service(message, size);
216+
182217
} else if (size <= MAX_PACKET_DATA_SIZE) {
183218
int err;
184219
struct ipc_data_packet tx_data;

modules/hal_nordic/nrfs/backends/nrfs_backend_ipc_service.h

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ enum nrfs_backend_error {
3636
NRFS_ERROR_IPC_OPEN_INSTANCE,
3737
NRFS_ERROR_IPC_REGISTER_ENDPOINT,
3838
NRFS_ERROR_BACKEND_NOT_CONNECTED,
39+
NRFS_ERROR_SEND_DATA_FROM_QUEUE,
3940
NRFS_ERROR_COUNT
4041
};
4142

0 commit comments

Comments
 (0)