Skip to content

Commit 92c9182

Browse files
committed
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]>
1 parent 4ef1163 commit 92c9182

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
@@ -183,6 +183,10 @@ New APIs and options
183183

184184
* :kconfig:option:`CONFIG_HAWKBIT_REBOOT_NONE`
185185

186+
* Modem
187+
188+
* :kconfig:option:`CONFIG_MODEM_DEDICATED_WORKQUEUE`
189+
186190
* Networking
187191

188192
* 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)
@@ -257,11 +259,11 @@ static void modem_cmux_bus_callback(struct modem_pipe *pipe, enum modem_pipe_eve
257259

258260
switch (event) {
259261
case MODEM_PIPE_EVENT_RECEIVE_READY:
260-
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
262+
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
261263
break;
262264

263265
case MODEM_PIPE_EVENT_TRANSMIT_IDLE:
264-
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
266+
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
265267
break;
266268

267269
default:
@@ -321,7 +323,7 @@ static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
321323
buf[0] = fcs;
322324
buf[1] = MODEM_CMUX_SOF;
323325
ring_buf_put(&cmux->transmit_rb, buf, 2);
324-
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
326+
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
325327
return data_len;
326328
}
327329

@@ -940,7 +942,7 @@ static void modem_cmux_receive_handler(struct k_work *item)
940942
}
941943

942944
/* Reschedule received work */
943-
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
945+
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
944946
}
945947

946948
static void modem_cmux_dlci_notify_transmit_idle(struct modem_cmux *cmux)
@@ -1027,7 +1029,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
10271029
};
10281030

10291031
modem_cmux_transmit_cmd_frame(cmux, &frame);
1030-
k_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
1032+
modem_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
10311033
}
10321034

10331035
static void modem_cmux_disconnect_handler(struct k_work *item)
@@ -1057,7 +1059,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)
10571059

10581060
/* Transmit close down command */
10591061
modem_cmux_transmit_cmd_frame(cmux, &frame);
1060-
k_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
1062+
modem_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
10611063
}
10621064

10631065
#if CONFIG_MODEM_STATS
@@ -1107,7 +1109,7 @@ static int modem_cmux_dlci_pipe_api_open(void *data)
11071109
K_SPINLOCK_BREAK;
11081110
}
11091111

1110-
k_work_schedule(&dlci->open_work, K_NO_WAIT);
1112+
modem_work_schedule(&dlci->open_work, K_NO_WAIT);
11111113
}
11121114

11131115
return ret;
@@ -1173,7 +1175,7 @@ static int modem_cmux_dlci_pipe_api_close(void *data)
11731175
K_SPINLOCK_BREAK;
11741176
}
11751177

1176-
k_work_schedule(&dlci->close_work, K_NO_WAIT);
1178+
modem_work_schedule(&dlci->close_work, K_NO_WAIT);
11771179
}
11781180

11791181
return ret;
@@ -1210,7 +1212,7 @@ static void modem_cmux_dlci_open_handler(struct k_work *item)
12101212
};
12111213

12121214
modem_cmux_transmit_cmd_frame(dlci->cmux, &frame);
1213-
k_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
1215+
modem_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
12141216
}
12151217

12161218
static void modem_cmux_dlci_close_handler(struct k_work *item)
@@ -1239,7 +1241,7 @@ static void modem_cmux_dlci_close_handler(struct k_work *item)
12391241
};
12401242

12411243
modem_cmux_transmit_cmd_frame(cmux, &frame);
1242-
k_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
1244+
modem_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
12431245
}
12441246

12451247
static void modem_cmux_dlci_pipes_release(struct modem_cmux *cmux)
@@ -1367,7 +1369,7 @@ int modem_cmux_connect_async(struct modem_cmux *cmux)
13671369
}
13681370

13691371
if (k_work_delayable_is_pending(&cmux->connect_work) == false) {
1370-
k_work_schedule(&cmux->connect_work, K_NO_WAIT);
1372+
modem_work_schedule(&cmux->connect_work, K_NO_WAIT);
13711373
}
13721374
}
13731375

@@ -1406,7 +1408,7 @@ int modem_cmux_disconnect_async(struct modem_cmux *cmux)
14061408
}
14071409

14081410
if (k_work_delayable_is_pending(&cmux->disconnect_work) == false) {
1409-
k_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
1411+
modem_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
14101412
}
14111413
}
14121414

0 commit comments

Comments
 (0)