diff --git a/drivers/serial/uart_silabs_eusart.c b/drivers/serial/uart_silabs_eusart.c index 5def91e1d3ab8..9424fdb5106f0 100644 --- a/drivers/serial/uart_silabs_eusart.c +++ b/drivers/serial/uart_silabs_eusart.c @@ -470,9 +470,12 @@ __maybe_unused static void eusart_dma_tx_cb(const struct device *dma_dev, void * { const struct device *uart_dev = user_data; struct eusart_data *data = uart_dev->data; + const struct eusart_config *config = uart_dev->config; dma_stop(data->dma_tx.dma_dev, data->dma_tx.dma_channel); data->dma_tx.enabled = false; + + EUSART_IntEnable(config->eusart, EUSART_IF_TXC); } static int eusart_async_tx(const struct device *dev, const uint8_t *tx_data, size_t buf_size, @@ -500,7 +503,6 @@ static int eusart_async_tx(const struct device *dev, const uint8_t *tx_data, siz eusart_pm_lock_get(dev, EUSART_PM_LOCK_TX); EUSART_IntClear(config->eusart, EUSART_IF_TXC); - EUSART_IntEnable(config->eusart, EUSART_IF_TXC); ret = dma_config(data->dma_tx.dma_dev, data->dma_tx.dma_channel, &data->dma_tx.dma_cfg); if (ret) { diff --git a/drivers/serial/uart_silabs_usart.c b/drivers/serial/uart_silabs_usart.c index e0482bafe1fa6..bfb5a2362801f 100644 --- a/drivers/serial/uart_silabs_usart.c +++ b/drivers/serial/uart_silabs_usart.c @@ -461,9 +461,12 @@ void uart_silabs_dma_tx_cb(const struct device *dma_dev, void *user_data, uint32 { const struct device *uart_dev = user_data; struct uart_silabs_data *data = uart_dev->data; + const struct uart_silabs_config *config = uart_dev->config; dma_stop(data->dma_tx.dma_dev, data->dma_tx.dma_channel); data->dma_tx.enabled = false; + + USART_IntEnable(config->base, USART_IF_TXC); } static int uart_silabs_async_tx(const struct device *dev, const uint8_t *tx_data, size_t buf_size, @@ -499,7 +502,6 @@ static int uart_silabs_async_tx(const struct device *dev, const uint8_t *tx_data (void)uart_silabs_pm_lock_get(dev, UART_SILABS_PM_LOCK_TX); USART_IntClear(config->base, USART_IF_TXC | USART_IF_TCMP2); - USART_IntEnable(config->base, USART_IF_TXC); if (timeout >= 0) { USART_IntEnable(config->base, USART_IF_TCMP2); } @@ -537,11 +539,12 @@ static int uart_silabs_async_tx_abort(const struct device *dev) USART_IntClear(config->base, USART_IF_TXC | USART_IF_TCMP2); (void)uart_silabs_pm_lock_put(dev, UART_SILABS_PM_LOCK_TX); + dma_stop(data->dma_tx.dma_dev, data->dma_tx.dma_channel); + if (!dma_get_status(data->dma_tx.dma_dev, data->dma_tx.dma_channel, &stat)) { data->dma_tx.counter = tx_buffer_length - stat.pending_length; } - dma_stop(data->dma_tx.dma_dev, data->dma_tx.dma_channel); data->dma_tx.enabled = false; async_evt_tx_abort(data);