From 8b96dff2f6616caebd670da48f82ab0f10ce4266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?= Date: Fri, 12 Apr 2024 09:23:28 +0200 Subject: [PATCH] drivers: serial: nrfx_uarte2: Fix error event not being sent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When RX length was 0 and error was reported then UART_RX_STOPPED event was not sent. Fixing the condition check to ensure that UART_RX_STOPPED is always generated. Signed-off-by: Krzysztof Chruściński --- drivers/serial/uart_nrfx_uarte2.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/drivers/serial/uart_nrfx_uarte2.c b/drivers/serial/uart_nrfx_uarte2.c index c76e2e05af3..99c70f47831 100644 --- a/drivers/serial/uart_nrfx_uarte2.c +++ b/drivers/serial/uart_nrfx_uarte2.c @@ -242,23 +242,22 @@ static void on_rx_done(const struct device *dev, const nrfx_uarte_event_t *event struct uarte_nrfx_data *data = dev->data; struct uart_event evt; - if (event->data.rx.length) { - if (data->async->err) { - evt.type = UART_RX_STOPPED; - evt.data.rx_stop.reason = UARTE_ERROR_FROM_MASK(data->async->err); - evt.data.rx_stop.data.buf = event->data.rx.p_buffer; - evt.data.rx_stop.data.len = event->data.rx.length; - /* Keep error code for uart_err_check(). */ - if (!IS_INT_DRIVEN_API(dev)) { - data->async->err = 0; - } - } else { - evt.type = UART_RX_RDY, - evt.data.rx.buf = event->data.rx.p_buffer, - evt.data.rx.len = event->data.rx.length, - evt.data.rx.offset = 0; + if (data->async->err) { + evt.type = UART_RX_STOPPED; + evt.data.rx_stop.reason = UARTE_ERROR_FROM_MASK(data->async->err); + evt.data.rx_stop.data.buf = event->data.rx.p_buffer; + evt.data.rx_stop.data.len = event->data.rx.length; + /* Keep error code for uart_err_check(). */ + if (!IS_INT_DRIVEN_API(dev)) { + data->async->err = 0; } data->async->user_callback(dev, &evt, data->async->user_data); + } else if (event->data.rx.length) { + evt.type = UART_RX_RDY, + evt.data.rx.buf = event->data.rx.p_buffer, + evt.data.rx.len = event->data.rx.length, + evt.data.rx.offset = 0; + data->async->user_callback(dev, &evt, data->async->user_data); } evt.type = UART_RX_BUF_RELEASED;