subsys/modem/backend: Correct async UART backend close

The backend currently returns the pipe closed event immediately
after calling uart_rx_disable() which is not the correct behavior.
the pipe closed event should be called when the UART_RX_DISABLED
event is raised by the UART driver.

With this fix, back-to-back open/close/open... will work as
expected, where before the second open would often fail since
the UART was not actually disabled yet.

Signed-off-by: Bjarki Arge Andreasen <bjarkix123@gmail.com>
This commit is contained in:
Bjarki Arge Andreasen 2023-09-05 08:55:32 +02:00 committed by Carles Cufí
commit c2647ff24b
2 changed files with 21 additions and 6 deletions

View file

@ -21,4 +21,12 @@ config MODEM_BACKEND_UART_ASYNC
bool "Modem UART backend module async implementation"
default y if UART_ASYNC_API
if MODEM_BACKEND_UART_ASYNC
config MODEM_BACKEND_UART_ASYNC_TRANSMIT_TIMEOUT_MS
int "Modem UART async transmit timeout in milliseconds"
default 100
endif
endif # MODEM_BACKEND_UART

View file

@ -17,8 +17,6 @@ LOG_MODULE_DECLARE(modem_backend_uart);
#define MODEM_BACKEND_UART_ASYNC_STATE_RX_BUF1_USED_BIT (2)
#define MODEM_BACKEND_UART_ASYNC_STATE_RX_RBUF_USED_INDEX_BIT (3)
#define MODEM_BACKEND_UART_ASYNC_BLOCK_MIN_SIZE (8)
static void modem_backend_uart_async_flush(struct modem_backend_uart *backend)
{
uint8_t c;
@ -62,6 +60,11 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
break;
case UART_TX_ABORTED:
LOG_WRN("Transmit aborted");
atomic_clear_bit(&backend->async.state,
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
case UART_RX_BUF_REQUEST:
if (!atomic_test_and_set_bit(&backend->async.state,
MODEM_BACKEND_UART_ASYNC_STATE_RX_BUF0_USED_BIT)) {
@ -116,8 +119,13 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
k_work_submit(&backend->receive_ready_work);
break;
case UART_TX_ABORTED:
LOG_WRN("Transmit aborted");
case UART_RX_DISABLED:
modem_pipe_notify_closed(&backend->pipe);
break;
case UART_RX_STOPPED:
LOG_WRN("Receive stopped for reasons: %u", (uint8_t)evt->data.rx_stop.reason);
break;
default:
break;
@ -176,7 +184,7 @@ static int modem_backend_uart_async_transmit(void *data, const uint8_t *buf, siz
memcpy(backend->async.transmit_buf, buf, bytes_to_transmit);
ret = uart_tx(backend->uart, backend->async.transmit_buf, bytes_to_transmit,
SYS_FOREVER_US);
CONFIG_MODEM_BACKEND_UART_ASYNC_TRANSMIT_TIMEOUT_MS * 1000L);
if (ret < 0) {
LOG_WRN("Failed to start async transmit");
@ -220,7 +228,6 @@ static int modem_backend_uart_async_close(void *data)
struct modem_backend_uart *backend = (struct modem_backend_uart *)data;
uart_rx_disable(backend->uart);
modem_pipe_notify_closed(&backend->pipe);
return 0;
}