modem: chat: remove receive and transmit timeouts

Remove receive and transmit timeouts which are no
longer useful as the RECEIVE_READY and
TRANSMIT_IDLE events will be used to efficiently
manage timeouts between transmit/receive calls.

Then update the the in-tree drivers using the
modem_chat module to omit the process timeout
parameter.

Signed-off-by: Bjarki Arge Andreasen <bjarki@arge-andreasen.me>
This commit is contained in:
Bjarki Arge Andreasen 2024-01-15 10:19:29 +01:00 committed by Carles Cufí
parent 62809d7581
commit 27b0d4e3fe
6 changed files with 14 additions and 24 deletions

View file

@ -127,7 +127,6 @@ static int gnss_nmea_generic_init_chat(const struct device *dev)
.argv_size = ARRAY_SIZE(data->chat_argv), .argv_size = ARRAY_SIZE(data->chat_argv),
.unsol_matches = unsol_matches, .unsol_matches = unsol_matches,
.unsol_matches_size = ARRAY_SIZE(unsol_matches), .unsol_matches_size = ARRAY_SIZE(unsol_matches),
.process_timeout = K_MSEC(2),
}; };
return modem_chat_init(&data->chat, &chat_config); return modem_chat_init(&data->chat, &chat_config);

View file

@ -686,7 +686,6 @@ static int quectel_lcx6g_init_chat(const struct device *dev)
.argv_size = ARRAY_SIZE(data->chat_argv), .argv_size = ARRAY_SIZE(data->chat_argv),
.unsol_matches = unsol_matches, .unsol_matches = unsol_matches,
.unsol_matches_size = ARRAY_SIZE(unsol_matches), .unsol_matches_size = ARRAY_SIZE(unsol_matches),
.process_timeout = K_MSEC(2),
}; };
return modem_chat_init(&data->chat, &chat_config); return modem_chat_init(&data->chat, &chat_config);

View file

@ -1520,7 +1520,6 @@ static int modem_cellular_init(const struct device *dev)
.argv_size = ARRAY_SIZE(data->chat_argv), .argv_size = ARRAY_SIZE(data->chat_argv),
.unsol_matches = unsol_matches, .unsol_matches = unsol_matches,
.unsol_matches_size = ARRAY_SIZE(unsol_matches), .unsol_matches_size = ARRAY_SIZE(unsol_matches),
.process_timeout = K_MSEC(2),
}; };
modem_chat_init(&data->chat, &chat_config); modem_chat_init(&data->chat, &chat_config);

View file

@ -242,7 +242,7 @@ struct modem_chat {
/* Script sending */ /* Script sending */
uint16_t script_send_request_pos; uint16_t script_send_request_pos;
uint16_t script_send_delimiter_pos; uint16_t script_send_delimiter_pos;
struct k_work_delayable script_send_work; struct k_work script_send_work;
struct k_work_delayable script_send_timeout_work; struct k_work_delayable script_send_timeout_work;
/* Match parsing */ /* Match parsing */
@ -252,8 +252,7 @@ struct modem_chat {
uint16_t parse_match_type; uint16_t parse_match_type;
/* Process received data */ /* Process received data */
struct k_work_delayable process_work; struct k_work receive_work;
k_timeout_t process_timeout;
}; };
/** /**
@ -282,8 +281,6 @@ struct modem_chat_config {
const struct modem_chat_match *unsol_matches; const struct modem_chat_match *unsol_matches;
/** Elements in array of unsolicited matches */ /** Elements in array of unsolicited matches */
uint16_t unsol_matches_size; uint16_t unsol_matches_size;
/** Delay from receive ready event to pipe receive occurs */
k_timeout_t process_timeout;
}; };
/** /**

View file

@ -97,7 +97,7 @@ static void modem_chat_script_stop(struct modem_chat *chat, enum modem_chat_scri
/* Cancel work */ /* Cancel work */
k_work_cancel_delayable(&chat->script_timeout_work); k_work_cancel_delayable(&chat->script_timeout_work);
k_work_cancel_delayable(&chat->script_send_work); k_work_cancel(&chat->script_send_work);
k_work_cancel_delayable(&chat->script_send_timeout_work); k_work_cancel_delayable(&chat->script_send_timeout_work);
/* Clear script running state */ /* Clear script running state */
@ -117,7 +117,7 @@ static void modem_chat_script_send(struct modem_chat *chat)
chat->script_send_delimiter_pos = 0; chat->script_send_delimiter_pos = 0;
/* Schedule script send work */ /* Schedule script send work */
k_work_schedule(&chat->script_send_work, K_NO_WAIT); k_work_submit(&chat->script_send_work);
} }
static void modem_chat_script_set_response_matches(struct modem_chat *chat) static void modem_chat_script_set_response_matches(struct modem_chat *chat)
@ -308,8 +308,7 @@ static uint16_t modem_chat_script_chat_get_send_timeout(struct modem_chat *chat)
static void modem_chat_script_send_handler(struct k_work *item) static void modem_chat_script_send_handler(struct k_work *item)
{ {
struct k_work_delayable *dwork = k_work_delayable_from_work(item); struct modem_chat *chat = CONTAINER_OF(item, struct modem_chat, script_send_work);
struct modem_chat *chat = CONTAINER_OF(dwork, struct modem_chat, script_send_work);
uint16_t timeout; uint16_t timeout;
/* Validate script running */ /* Validate script running */
@ -319,13 +318,13 @@ static void modem_chat_script_send_handler(struct k_work *item)
/* Send request */ /* Send request */
if (modem_chat_script_send_request(chat) == false) { if (modem_chat_script_send_request(chat) == false) {
k_work_schedule(&chat->script_send_work, chat->process_timeout); k_work_submit(&chat->script_send_work);
return; return;
} }
/* Send delimiter */ /* Send delimiter */
if (modem_chat_script_send_delimiter(chat) == false) { if (modem_chat_script_send_delimiter(chat) == false) {
k_work_schedule(&chat->script_send_work, chat->process_timeout); k_work_submit(&chat->script_send_work);
return; return;
} }
@ -687,8 +686,7 @@ static void modem_chat_process_bytes(struct modem_chat *chat)
static void modem_chat_process_handler(struct k_work *item) static void modem_chat_process_handler(struct k_work *item)
{ {
struct k_work_delayable *dwork = k_work_delayable_from_work(item); struct modem_chat *chat = CONTAINER_OF(item, struct modem_chat, receive_work);
struct modem_chat *chat = CONTAINER_OF(dwork, struct modem_chat, process_work);
int ret; int ret;
/* Fill work buffer */ /* Fill work buffer */
@ -702,7 +700,7 @@ static void modem_chat_process_handler(struct k_work *item)
/* Process data */ /* Process data */
modem_chat_process_bytes(chat); modem_chat_process_bytes(chat);
k_work_schedule(&chat->process_work, K_NO_WAIT); k_work_submit(&chat->receive_work);
} }
static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_event event, static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_event event,
@ -711,7 +709,7 @@ static void modem_chat_pipe_callback(struct modem_pipe *pipe, enum modem_pipe_ev
struct modem_chat *chat = (struct modem_chat *)user_data; struct modem_chat *chat = (struct modem_chat *)user_data;
if (event == MODEM_PIPE_EVENT_RECEIVE_READY) { if (event == MODEM_PIPE_EVENT_RECEIVE_READY) {
k_work_schedule(&chat->process_work, chat->process_timeout); k_work_submit(&chat->receive_work);
} }
} }
@ -741,14 +739,13 @@ int modem_chat_init(struct modem_chat *chat, const struct modem_chat_config *con
chat->filter_size = config->filter_size; chat->filter_size = config->filter_size;
chat->matches[MODEM_CHAT_MATCHES_INDEX_UNSOL] = config->unsol_matches; chat->matches[MODEM_CHAT_MATCHES_INDEX_UNSOL] = config->unsol_matches;
chat->matches_size[MODEM_CHAT_MATCHES_INDEX_UNSOL] = config->unsol_matches_size; chat->matches_size[MODEM_CHAT_MATCHES_INDEX_UNSOL] = config->unsol_matches_size;
chat->process_timeout = config->process_timeout;
atomic_set(&chat->script_state, 0); atomic_set(&chat->script_state, 0);
k_sem_init(&chat->script_stopped_sem, 0, 1); k_sem_init(&chat->script_stopped_sem, 0, 1);
k_work_init_delayable(&chat->process_work, modem_chat_process_handler); k_work_init(&chat->receive_work, modem_chat_process_handler);
k_work_init(&chat->script_run_work, modem_chat_script_run_handler); k_work_init(&chat->script_run_work, modem_chat_script_run_handler);
k_work_init_delayable(&chat->script_timeout_work, modem_chat_script_timeout_handler); k_work_init_delayable(&chat->script_timeout_work, modem_chat_script_timeout_handler);
k_work_init(&chat->script_abort_work, modem_chat_script_abort_handler); k_work_init(&chat->script_abort_work, modem_chat_script_abort_handler);
k_work_init_delayable(&chat->script_send_work, modem_chat_script_send_handler); k_work_init(&chat->script_send_work, modem_chat_script_send_handler);
k_work_init_delayable(&chat->script_send_timeout_work, k_work_init_delayable(&chat->script_send_timeout_work,
modem_chat_script_send_timeout_handler); modem_chat_script_send_timeout_handler);
@ -831,8 +828,8 @@ void modem_chat_release(struct modem_chat *chat)
k_work_cancel_sync(&chat->script_run_work, &sync); k_work_cancel_sync(&chat->script_run_work, &sync);
k_work_cancel_sync(&chat->script_abort_work, &sync); k_work_cancel_sync(&chat->script_abort_work, &sync);
k_work_cancel_delayable_sync(&chat->process_work, &sync); k_work_cancel_sync(&chat->receive_work, &sync);
k_work_cancel_delayable_sync(&chat->script_send_work, &sync); k_work_cancel_sync(&chat->script_send_work, &sync);
chat->pipe = NULL; chat->pipe = NULL;
chat->receive_buf_len = 0; chat->receive_buf_len = 0;

View file

@ -254,7 +254,6 @@ static void *test_modem_chat_setup(void)
.argv_size = ARRAY_SIZE(cmd_argv), .argv_size = ARRAY_SIZE(cmd_argv),
.unsol_matches = unsol_matches, .unsol_matches = unsol_matches,
.unsol_matches_size = ARRAY_SIZE(unsol_matches), .unsol_matches_size = ARRAY_SIZE(unsol_matches),
.process_timeout = K_MSEC(2),
}; };
zassert(modem_chat_init(&cmd, &cmd_config) == 0, "Failed to init modem CMD"); zassert(modem_chat_init(&cmd, &cmd_config) == 0, "Failed to init modem CMD");