Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions doc/releases/release-notes-4.3.rst
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,10 @@ New APIs and options

* :kconfig:option:`CONFIG_HAWKBIT_REBOOT_NONE`

* Modem

* :kconfig:option:`CONFIG_MODEM_DEDICATED_WORKQUEUE`

* Networking

* Sockets
Expand Down
1 change: 1 addition & 0 deletions subsys/modem/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ if(CONFIG_MODEM_MODULES)

zephyr_library()

zephyr_library_sources_ifdef(CONFIG_MODEM_DEDICATED_WORKQUEUE modem_workqueue.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_CHAT modem_chat.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_CMUX modem_cmux.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_PIPE modem_pipe.c)
Expand Down
15 changes: 15 additions & 0 deletions subsys/modem/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@ menuconfig MODEM_MODULES

if MODEM_MODULES

config MODEM_DEDICATED_WORKQUEUE
bool "Use a dedicated workqueue for modem operations"

if MODEM_DEDICATED_WORKQUEUE

config MODEM_DEDICATED_WORKQUEUE_STACK_SIZE
int "Modem dedicated workqueue stack size"
default 1024

config MODEM_DEDICATED_WORKQUEUE_PRIORITY
int "Modem dedicated workqueue priority"
default SYSTEM_WORKQUEUE_PRIORITY

endif # MODEM_DEDICATED_WORKQUEUE

config MODEM_CHAT
bool "Modem chat module"
select RING_BUFFER
Expand Down
11 changes: 6 additions & 5 deletions subsys/modem/backends/modem_backend_uart_async.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

#include "modem_backend_uart_async.h"
#include "../modem_workqueue.h"

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(modem_backend_uart_async, CONFIG_MODEM_MODULES_LOG_LEVEL);
Expand Down Expand Up @@ -58,7 +59,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
case UART_TX_DONE:
atomic_clear_bit(&backend->async.common.state,
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
k_work_submit(&backend->transmit_idle_work);
modem_work_submit(&backend->transmit_idle_work);
break;

case UART_TX_ABORTED:
Expand All @@ -67,7 +68,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
}
atomic_clear_bit(&backend->async.common.state,
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
k_work_submit(&backend->transmit_idle_work);
modem_work_submit(&backend->transmit_idle_work);

break;

Expand Down Expand Up @@ -127,7 +128,7 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
}

k_spin_unlock(&backend->async.receive_rb_lock, key);
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
break;

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

if (modem_backend_uart_async_is_uart_stopped(backend)) {
k_work_submit(&backend->async.common.rx_disabled_work);
modem_work_submit(&backend->async.common.rx_disabled_work);
}
}

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

if (!empty) {
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
}

return (int)received;
Expand Down
13 changes: 7 additions & 6 deletions subsys/modem/backends/modem_backend_uart_async_hwfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

#include "modem_backend_uart_async.h"
#include "../modem_workqueue.h"

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(modem_backend_uart_async_hwfc, CONFIG_MODEM_MODULES_LOG_LEVEL);
Expand Down Expand Up @@ -136,7 +137,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
case UART_TX_DONE:
atomic_clear_bit(&backend->async.common.state,
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMIT_BIT);
k_work_submit(&backend->transmit_idle_work);
modem_work_submit(&backend->transmit_idle_work);
break;

case UART_TX_ABORTED:
Expand All @@ -145,7 +146,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
}
atomic_clear_bit(&backend->async.common.state,
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMIT_BIT);
k_work_submit(&backend->transmit_idle_work);
modem_work_submit(&backend->transmit_idle_work);

break;

Expand Down Expand Up @@ -182,7 +183,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
rx_buf_unref(&backend->async, evt->data.rx.buf);
break;
}
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
}
break;

Expand All @@ -191,7 +192,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
MODEM_BACKEND_UART_ASYNC_STATE_OPEN_BIT)) {
if (!atomic_test_and_set_bit(&backend->async.common.state,
MODEM_BACKEND_UART_ASYNC_STATE_RECOVERY_BIT)) {
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
LOG_DBG("RX recovery started");
}
}
Expand All @@ -206,7 +207,7 @@ static void modem_backend_uart_async_hwfc_event_handler(const struct device *dev
}

if (modem_backend_uart_async_hwfc_is_uart_stopped(backend)) {
k_work_submit(&backend->async.common.rx_disabled_work);
modem_work_submit(&backend->async.common.rx_disabled_work);
}
}

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

if (backend->async.rx_event.len != 0 ||
k_msgq_num_used_get(&backend->async.rx_queue) != 0) {
k_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
modem_work_schedule(&backend->receive_ready_work, K_NO_WAIT);
}

modem_backend_uart_async_hwfc_rx_recovery(backend);
Expand Down
9 changes: 5 additions & 4 deletions subsys/modem/backends/modem_backend_uart_isr.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*/

#include "modem_backend_uart_isr.h"
#include "../modem_workqueue.h"

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

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

if (ring_buf_is_empty(&backend->isr.transmit_rb) == true) {
uart_irq_tx_disable(backend->uart);
k_work_submit(&backend->transmit_idle_work);
modem_work_submit(&backend->transmit_idle_work);
return;
}

Expand Down
18 changes: 10 additions & 8 deletions subsys/modem/modem_chat.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ LOG_MODULE_REGISTER(modem_chat, CONFIG_MODEM_MODULES_LOG_LEVEL);

#include <zephyr/modem/chat.h>

#include "modem_workqueue.h"

const struct modem_chat_match modem_chat_any_match = MODEM_CHAT_MATCH("", "", NULL);
const struct modem_chat_match modem_chat_empty_matches[0];
const struct modem_chat_script_chat modem_chat_empty_script_chats[0];
Expand Down Expand Up @@ -127,7 +129,7 @@ static void modem_chat_set_script_send_state(struct modem_chat *chat,
static void modem_chat_script_send(struct modem_chat *chat)
{
modem_chat_set_script_send_state(chat, MODEM_CHAT_SCRIPT_SEND_STATE_REQUEST);
k_work_submit(&chat->script_send_work);
modem_work_submit(&chat->script_send_work);
}

static void modem_chat_script_set_response_matches(struct modem_chat *chat)
Expand Down Expand Up @@ -178,7 +180,7 @@ static void modem_chat_script_chat_schedule_send_timeout(struct modem_chat *chat
{
uint16_t timeout = modem_chat_script_chat_get_send_timeout(chat);

k_work_schedule(&chat->script_send_timeout_work, K_MSEC(timeout));
modem_work_schedule(&chat->script_send_timeout_work, K_MSEC(timeout));
}

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

/* Start timeout work if script started */
if (chat->script != NULL) {
k_work_schedule(&chat->script_timeout_work, K_SECONDS(chat->script->timeout));
modem_work_schedule(&chat->script_timeout_work, K_SECONDS(chat->script->timeout));
}
}

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

/* Process data */
modem_chat_process_bytes(chat);
k_work_submit(&chat->receive_work);
modem_work_submit(&chat->receive_work);
}

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

switch (event) {
case MODEM_PIPE_EVENT_RECEIVE_READY:
k_work_submit(&chat->receive_work);
modem_work_submit(&chat->receive_work);
break;

case MODEM_PIPE_EVENT_TRANSMIT_IDLE:
k_work_submit(&chat->script_send_work);
modem_work_submit(&chat->script_send_work);
break;

default:
Expand Down Expand Up @@ -880,7 +882,7 @@ int modem_chat_run_script_async(struct modem_chat *chat, const struct modem_chat
k_sem_reset(&chat->script_stopped_sem);

chat->pending_script = script;
k_work_submit(&chat->script_run_work);
modem_work_submit(&chat->script_run_work);
return 0;
}

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

void modem_chat_script_abort(struct modem_chat *chat)
{
k_work_submit(&chat->script_abort_work);
modem_work_submit(&chat->script_abort_work);
}

void modem_chat_release(struct modem_chat *chat)
Expand Down
26 changes: 14 additions & 12 deletions subsys/modem/modem_cmux.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ LOG_MODULE_REGISTER(modem_cmux, CONFIG_MODEM_CMUX_LOG_LEVEL);

#include <string.h>

#include "modem_workqueue.h"

#define MODEM_CMUX_SOF (0xF9)
#define MODEM_CMUX_FCS_POLYNOMIAL (0xE0)
#define MODEM_CMUX_FCS_INIT_VALUE (0xFF)
Expand Down Expand Up @@ -257,11 +259,11 @@ static void modem_cmux_bus_callback(struct modem_pipe *pipe, enum modem_pipe_eve

switch (event) {
case MODEM_PIPE_EVENT_RECEIVE_READY:
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
break;

case MODEM_PIPE_EVENT_TRANSMIT_IDLE:
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
break;

default:
Expand Down Expand Up @@ -321,7 +323,7 @@ static uint16_t modem_cmux_transmit_frame(struct modem_cmux *cmux,
buf[0] = fcs;
buf[1] = MODEM_CMUX_SOF;
ring_buf_put(&cmux->transmit_rb, buf, 2);
k_work_schedule(&cmux->transmit_work, K_NO_WAIT);
modem_work_schedule(&cmux->transmit_work, K_NO_WAIT);
return data_len;
}

Expand Down Expand Up @@ -940,7 +942,7 @@ static void modem_cmux_receive_handler(struct k_work *item)
}

/* Reschedule received work */
k_work_schedule(&cmux->receive_work, K_NO_WAIT);
modem_work_schedule(&cmux->receive_work, K_NO_WAIT);
}

static void modem_cmux_dlci_notify_transmit_idle(struct modem_cmux *cmux)
Expand Down Expand Up @@ -1027,7 +1029,7 @@ static void modem_cmux_connect_handler(struct k_work *item)
};

modem_cmux_transmit_cmd_frame(cmux, &frame);
k_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
modem_work_schedule(&cmux->connect_work, MODEM_CMUX_T1_TIMEOUT);
}

static void modem_cmux_disconnect_handler(struct k_work *item)
Expand Down Expand Up @@ -1057,7 +1059,7 @@ static void modem_cmux_disconnect_handler(struct k_work *item)

/* Transmit close down command */
modem_cmux_transmit_cmd_frame(cmux, &frame);
k_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
modem_work_schedule(&cmux->disconnect_work, MODEM_CMUX_T1_TIMEOUT);
}

#if CONFIG_MODEM_STATS
Expand Down Expand Up @@ -1107,7 +1109,7 @@ static int modem_cmux_dlci_pipe_api_open(void *data)
K_SPINLOCK_BREAK;
}

k_work_schedule(&dlci->open_work, K_NO_WAIT);
modem_work_schedule(&dlci->open_work, K_NO_WAIT);
}

return ret;
Expand Down Expand Up @@ -1173,7 +1175,7 @@ static int modem_cmux_dlci_pipe_api_close(void *data)
K_SPINLOCK_BREAK;
}

k_work_schedule(&dlci->close_work, K_NO_WAIT);
modem_work_schedule(&dlci->close_work, K_NO_WAIT);
}

return ret;
Expand Down Expand Up @@ -1210,7 +1212,7 @@ static void modem_cmux_dlci_open_handler(struct k_work *item)
};

modem_cmux_transmit_cmd_frame(dlci->cmux, &frame);
k_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
modem_work_schedule(&dlci->open_work, MODEM_CMUX_T1_TIMEOUT);
}

static void modem_cmux_dlci_close_handler(struct k_work *item)
Expand Down Expand Up @@ -1239,7 +1241,7 @@ static void modem_cmux_dlci_close_handler(struct k_work *item)
};

modem_cmux_transmit_cmd_frame(cmux, &frame);
k_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
modem_work_schedule(&dlci->close_work, MODEM_CMUX_T1_TIMEOUT);
}

static void modem_cmux_dlci_pipes_release(struct modem_cmux *cmux)
Expand Down Expand Up @@ -1367,7 +1369,7 @@ int modem_cmux_connect_async(struct modem_cmux *cmux)
}

if (k_work_delayable_is_pending(&cmux->connect_work) == false) {
k_work_schedule(&cmux->connect_work, K_NO_WAIT);
modem_work_schedule(&cmux->connect_work, K_NO_WAIT);
}
}

Expand Down Expand Up @@ -1406,7 +1408,7 @@ int modem_cmux_disconnect_async(struct modem_cmux *cmux)
}

if (k_work_delayable_is_pending(&cmux->disconnect_work) == false) {
k_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
modem_work_schedule(&cmux->disconnect_work, K_NO_WAIT);
}
}

Expand Down
Loading