From 881d67272cbc840b6f477241784146490dc6c87c Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Fri, 27 Oct 2023 03:37:49 -0700 Subject: [PATCH] s32k3xx:Serial overcome race where DMA has not fetched TCD again" With TCD set to loop, there is a window where the DMA has raised Done, but not reloaded the TCD, resetting count and clearing Done. In this window imxrt_dmach_getcount could then return 0. Resulting in imxrt_dma_nextrx returning RXDMA_BUFFER_SIZE. Which is not a valid index in the FIFO. Since the count will be set to RXDMA_BUFFER_SIZE. When the DMA engine completes the TCD reload. The imxrt_dma_nextrx would return 0. Therefore: (RXDMA_BUFFER_SIZE - dmaresidual) % RXDMA_BUFFER_SIZE accomplishes this. --- arch/arm/src/s32k3xx/s32k3xx_serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/src/s32k3xx/s32k3xx_serial.c b/arch/arm/src/s32k3xx/s32k3xx_serial.c index ca30e7fa50..3ef3dccb1b 100644 --- a/arch/arm/src/s32k3xx/s32k3xx_serial.c +++ b/arch/arm/src/s32k3xx/s32k3xx_serial.c @@ -2815,7 +2815,7 @@ static int s32k3xx_dma_nextrx(struct s32k3xx_uart_s *priv) { int dmaresidual = s32k3xx_dmach_getcount(priv->rxdma); - return RXDMA_BUFFER_SIZE - dmaresidual; + return (RXDMA_BUFFER_SIZE - dmaresidual) % RXDMA_BUFFER_SIZE; } #endif