Skip to content

Commit 857a583

Browse files
JordanYatesrlubos
authored andcommitted
[nrf fromtree] modem: optional dedicated workqueue
Add the option to use a dedicated workqueue for the modem backend instead of the system workqueue. Signed-off-by: Jordan Yates <[email protected]> (cherry picked from commit 761961f)
1 parent c58e47c commit 857a583

File tree

12 files changed

+159
-40
lines changed

12 files changed

+159
-40
lines changed

doc/releases/release-notes-4.3.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ New APIs and options
171171

172172
* :kconfig:option:`CONFIG_HAWKBIT_REBOOT_NONE`
173173

174+
* Modem
175+
176+
* :kconfig:option:`CONFIG_MODEM_DEDICATED_WORKQUEUE`
177+
174178
* Networking
175179

176180
* Sockets

subsys/modem/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ if(CONFIG_MODEM_MODULES)
55

66
zephyr_library()
77

8+
zephyr_library_sources_ifdef(CONFIG_MODEM_DEDICATED_WORKQUEUE modem_workqueue.c)
89
zephyr_library_sources_ifdef(CONFIG_MODEM_CHAT modem_chat.c)
910
zephyr_library_sources_ifdef(CONFIG_MODEM_CMUX modem_cmux.c)
1011
zephyr_library_sources_ifdef(CONFIG_MODEM_PIPE modem_pipe.c)

subsys/modem/Kconfig

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,21 @@ menuconfig MODEM_MODULES
66

77
if MODEM_MODULES
88

9+
config MODEM_DEDICATED_WORKQUEUE
10+
bool "Use a dedicated workqueue for modem operations"
11+
12+
if MODEM_DEDICATED_WORKQUEUE
13+
14+
config MODEM_DEDICATED_WORKQUEUE_STACK_SIZE
15+
int "Modem dedicated workqueue stack size"
16+
default 1024
17+
18+
config MODEM_DEDICATED_WORKQUEUE_PRIORITY
19+
int "Modem dedicated workqueue priority"
20+
default SYSTEM_WORKQUEUE_PRIORITY
21+
22+
endif # MODEM_DEDICATED_WORKQUEUE
23+
924
config MODEM_CHAT
1025
bool "Modem chat module"
1126
select RING_BUFFER

subsys/modem/backends/modem_backend_uart_async.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include "modem_backend_uart_async.h"
8+
#include "../modem_workqueue.h"
89

910
#include <zephyr/logging/log.h>
1011
LOG_MODULE_REGISTER(modem_backend_uart_async, CONFIG_MODEM_MODULES_LOG_LEVEL);
@@ -58,7 +59,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
5859
case UART_TX_DONE:
5960
atomic_clear_bit(&backend->async.common.state,
6061
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
61-
k_work_submit(&backend->transmit_idle_work);
62+
modem_work_submit(&backend->transmit_idle_work);
6263
break;
6364

6465
case UART_TX_ABORTED:
@@ -67,7 +68,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
6768
}
6869
atomic_clear_bit(&backend->async.common.state,
6970
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
70-
k_work_submit(&backend->transmit_idle_work);
71+
modem_work_submit(&backend->transmit_idle_work);
7172

7273
break;
7374

@@ -127,7 +128,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
127128
}
128129

129130
k_spin_unlock(&backend->async.receive_rb_lock, key);
130-
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
131+
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
131132
break;
132133

133134
case UART_RX_DISABLED:
@@ -144,7 +145,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
144145
}
145146

146147
if (modem_backend_uart_async_is_uart_stopped(backend)) {
147-
k_work_submit(&backend->async.common.rx_disabled_work);
148+
modem_work_submit(&backend->async.common.rx_disabled_work);
148149
}
149150
}
150151

@@ -254,7 +255,7 @@ static int modem_backend_uart_async_receive(void *data, uint8_t *buf, size_t siz
254255
k_spin_unlock(&backend->async.receive_rb_lock, key);
255256

256257
if (!empty) {
257-
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
258+
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
258259
}
259260

260261
return (int)received;

subsys/modem/backends/modem_backend_uart_async_hwfc.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include "modem_backend_uart_async.h"
8+
#include "../modem_workqueue.h"
89

910
#include <zephyr/logging/log.h>
1011
LOG_MODULE_REGISTER(modem_backend_uart_async_hwfc, CONFIG_MODEM_MODULES_LOG_LEVEL);
@@ -136,7 +137,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
136137
case UART_TX_DONE:
137138
atomic_clear_bit(&backend->async.common.state,
138139
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMIT_BIT);
139-
k_work_submit(&backend->transmit_idle_work);
140+
modem_work_submit(&backend->transmit_idle_work);
140141
break;
141142

142143
case UART_TX_ABORTED:
@@ -145,7 +146,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
145146
}
146147
atomic_clear_bit(&backend->async.common.state,
147148
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMIT_BIT);
148-
k_work_submit(&backend->transmit_idle_work);
149+
modem_work_submit(&backend->transmit_idle_work);
149150

150151
break;
151152

@@ -182,7 +183,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
182183
rx_buf_unref(&backend->async, evt->data.rx.buf);
183184
break;
184185
}
185-
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
186+
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
186187
}
187188
break;
188189

@@ -191,7 +192,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
191192
MODEM_BACKEND_UART_ASYNC_STATE_OPEN_BIT)) {
192193
if (!atomic_test_and_set_bit(&backend->async.common.state,
193194
MODEM_BACKEND_UART_ASYNC_STATE_RECOVERY_BIT)) {
194-
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
195+
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
195196
LOG_DBG("RX recovery started");
196197
}
197198
}
@@ -206,7 +207,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
206207
}
207208

208209
if (modem_backend_uart_async_hwfc_is_uart_stopped(backend)) {
209-
k_work_submit(&backend->async.common.rx_disabled_work);
210+
modem_work_submit(&backend->async.common.rx_disabled_work);
210211
}
211212
}
212213

@@ -335,7 +336,7 @@ static int modem_backend_uart_async_hwfc_receive(void *data, uint8_t *buf, size_
335336

336337
if (backend->async.rx_event.len != 0 ||
337338
k_msgq_num_used_get(&backend->async.rx_queue) != 0) {
338-
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
339+
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
339340
}
340341

341342
modem_backend_uart_async_hwfc_rx_recovery(backend);

subsys/modem/backends/modem_backend_uart_isr.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66

77
#include "modem_backend_uart_isr.h"
8+
#include "../modem_workqueue.h"
89

910
#include <zephyr/logging/log.h>
1011
LOG_MODULE_REGISTER(modem_backend_uart_isr, CONFIG_MODEM_MODULES_LOG_LEVEL);
@@ -54,11 +55,11 @@ static void modem_backend_uart_isr_irq_handler_receive_ready(struct modem_backen
5455
* It temporarily disables the UART RX IRQ when swapping buffers
5556
* which can cause byte loss at higher baud rates.
5657
*/
57-
k_work_schedule(&backend->receive_ready_work,
58-
K_MSEC(CONFIG_MODEM_BACKEND_UART_ISR_RECEIVE_IDLE_TIMEOUT_MS));
58+
modem_work_schedule(&backend->receive_ready_work,
59+
K_MSEC(CONFIG_MODEM_BACKEND_UART_ISR_RECEIVE_IDLE_TIMEOUT_MS));
5960
} else {
6061
/* The buffer is getting full. Run the work item immediately to free up space. */
61-
k_work_reschedule(&backend->receive_ready_work, K_NO_WAIT);
62+
modem_work_reschedule(&backend->receive_ready_work, K_NO_WAIT);
6263
}
6364
}
6465

@@ -70,7 +71,7 @@ static void modem_backend_uart_isr_irq_handler_transmit_ready(struct modem_backe
7071

7172
if (ring_buf_is_empty(&backend->isr.transmit_rb) == true) {
7273
uart_irq_tx_disable(backend->uart);
73-
k_work_submit(&backend->transmit_idle_work);
74+
modem_work_submit(&backend->transmit_idle_work);
7475
return;
7576
}
7677

subsys/modem/modem_chat.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ LOG_MODULE_REGISTER(modem_chat, CONFIG_MODEM_MODULES_LOG_LEVEL);
1515

1616
#include <zephyr/modem/chat.h>
1717

18+
#include "modem_workqueue.h"
19+
1820
const struct modem_chat_match modem_chat_any_match = MODEM_CHAT_MATCH("", "", NULL);
1921
const struct modem_chat_match modem_chat_empty_matches[0];
2022
const struct modem_chat_script_chat modem_chat_empty_script_chats[0];
@@ -127,7 +129,7 @@ static void modem_chat_set_script_send_state(struct modem_chat *chat,
127129
static void modem_chat_script_send(struct modem_chat *chat)
128130
{
129131
modem_chat_set_script_send_state(chat, MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST);
130-
k_work_submit(&chat->script_send_work);
132+
modem_work_submit(&chat->script_send_work);
131133
}
132134

133135
static void modem_chat_script_set_response_matches(struct modem_chat *chat)
@@ -178,7 +180,7 @@ static void modem_chat_script_chat_schedule_send_timeout(struct modem_chat *chat
178180
{
179181
uint16_t timeout = modem_chat_script_chat_get_send_timeout(chat);
180182

181-
k_work_schedule(&chat->script_send_timeout_work, K_MSEC(timeout));
183+
modem_work_schedule(&chat->script_send_timeout_work, K_MSEC(timeout));
182184
}
183185

184186
static void modem_chat_script_next(struct modem_chat *chat, bool initial)
@@ -233,7 +235,7 @@ static void modem_chat_script_start(struct modem_chat *chat, const struct modem_
233235

234236
/* Start timeout work if script started */
235237
if (chat->script != NULL) {
236-
k_work_schedule(&chat->script_timeout_work, K_SECONDS(chat->script->timeout));
238+
modem_work_schedule(&chat->script_timeout_work, K_SECONDS(chat->script->timeout));
237239
}
238240
}
239241

@@ -742,7 +744,7 @@ static void modem_chat_process_handler(struct k_work *item)
742744

743745
/* Process data */
744746
modem_chat_process_bytes(chat);
745-
k_work_submit(&chat->receive_work);
747+
modem_work_submit(&chat->receive_work);
746748
}
747749

748750
static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_event event,
@@ -752,11 +754,11 @@ static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_ev
752754

753755
switch (event) {
754756
case MODEM_PIPE_EVENT_RECEIVE_READY:
755-
k_work_submit(&chat->receive_work);
757+
modem_work_submit(&chat->receive_work);
756758
break;
757759

758760
case MODEM_PIPE_EVENT_TRANSMIT_IDLE:
759-
k_work_submit(&chat->script_send_work);
761+
modem_work_submit(&chat->script_send_work);
760762
break;
761763

762764
default:
@@ -880,7 +882,7 @@ int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat
880882
k_sem_reset(&chat->script_stopped_sem);
881883

882884
chat->pending_script = script;
883-
k_work_submit(&chat->script_run_work);
885+
modem_work_submit(&chat->script_run_work);
884886
return 0;
885887
}
886888

@@ -903,7 +905,7 @@ int modem_chat_run_script(struct modem_chat *chat, const struct modem_chat_scrip
903905

904906
void modem_chat_script_abort(struct modem_chat *chat)
905907
{
906-
k_work_submit(&chat->script_abort_work);
908+
modem_work_submit(&chat->script_abort_work);
907909
}
908910

909911
void modem_chat_release(struct modem_chat *chat)

subsys/modem/modem_cmux.c

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ LOG_MODULE_REGISTER(modem_cmux, CONFIG_MODEM_CMUX_LOG_LEVEL);
1313

1414
#include <string.h>
1515

16+
#include "modem_workqueue.h"
17+
1618
#define MODEM_CMUX_SOF (0xF9)
1719
#define MODEM_CMUX_FCS_POLYNOMIAL (0xE0)
1820
#define MODEM_CMUX_FCS_INIT_VALUE (0xFF)
@@ -347,11 +349,11 @@ static void modem_cmux_bus_callback(struct modem_pipe *pipe, enum modem_pipe_eve
347349

348350
switch (event) {
349351
case MODEM_PIPE_EVENT_RECEIVE_READY:
350-
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
352+
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
351353
break;
352354

353355
case MODEM_PIPE_EVENT_TRANSMIT_IDLE:
354-
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
356+
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
355357
break;
356358

357359
default:
@@ -411,7 +413,7 @@ static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
411413
buf[0] = fcs;
412414
buf[1] = MODEM_CMUX_SOF;
413415
ring_buf_put(&cmux->transmit_rb, buf, 2);
414-
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
416+
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
415417
return data_len;
416418
}
417419

@@ -1222,7 +1224,7 @@ static void modem_cmux_receive_handler(struct k_work *item)
12221224
}
12231225

12241226
/* Reschedule received work */
1225-
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
1227+
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
12261228
}
12271229

12281230
static void modem_cmux_dlci_notify_transmit_idle(struct modem_cmux *cmux)
@@ -1312,7 +1314,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
13121314
};
13131315

13141316
modem_cmux_transmit_cmd_frame(cmux, &frame);
1315-
k_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
1317+
modem_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
13161318
}
13171319

13181320
static void modem_cmux_disconnect_handler(struct k_work *item)
@@ -1347,7 +1349,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)
13471349

13481350
/* Transmit close down command */
13491351
modem_cmux_transmit_cmd_frame(cmux, &frame);
1350-
k_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
1352+
modem_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
13511353
}
13521354

13531355
#if CONFIG_MODEM_STATS
@@ -1397,7 +1399,7 @@ static int modem_cmux_dlci_pipe_api_open(void *data)
13971399
K_SPINLOCK_BREAK;
13981400
}
13991401

1400-
k_work_schedule(&dlci->open_work, K_NO_WAIT);
1402+
modem_work_schedule(&dlci->open_work, K_NO_WAIT);
14011403
}
14021404

14031405
return ret;
@@ -1476,7 +1478,7 @@ static int modem_cmux_dlci_pipe_api_close(void *data)
14761478
K_SPINLOCK_BREAK;
14771479
}
14781480

1479-
k_work_schedule(&dlci->close_work, K_NO_WAIT);
1481+
modem_work_schedule(&dlci->close_work, K_NO_WAIT);
14801482
}
14811483

14821484
return ret;
@@ -1514,7 +1516,7 @@ static void modem_cmux_dlci_open_handler(struct k_work *item)
15141516
};
15151517

15161518
modem_cmux_transmit_cmd_frame(dlci->cmux, &frame);
1517-
k_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
1519+
modem_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
15181520
}
15191521

15201522
static void modem_cmux_dlci_close_handler(struct k_work *item)
@@ -1543,7 +1545,7 @@ static void modem_cmux_dlci_close_handler(struct k_work *item)
15431545
};
15441546

15451547
modem_cmux_transmit_cmd_frame(cmux, &frame);
1546-
k_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
1548+
modem_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
15471549
}
15481550

15491551
static void modem_cmux_dlci_pipes_release(struct modem_cmux *cmux)
@@ -1666,7 +1668,7 @@ int modem_cmux_connect_async(struct modem_cmux *cmux)
16661668
}
16671669

16681670
if (k_work_delayable_is_pending(&cmux->connect_work) == false) {
1669-
k_work_schedule(&cmux->connect_work, K_NO_WAIT);
1671+
modem_work_schedule(&cmux->connect_work, K_NO_WAIT);
16701672
}
16711673
}
16721674

@@ -1704,7 +1706,7 @@ int modem_cmux_disconnect_async(struct modem_cmux *cmux)
17041706
}
17051707

17061708
if (k_work_delayable_is_pending(&cmux->disconnect_work) == false) {
1707-
k_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
1709+
modem_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
17081710
}
17091711
}
17101712

0 commit comments

Comments
 (0)