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:
parent
1477865a7a
commit
c2647ff24b
2 changed files with 21 additions and 6 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue