From 892fe459006b4fbcd70aee2dd4c95f2b7c75de01 Mon Sep 17 00:00:00 2001 From: David Sidrane Date: Fri, 27 Oct 2023 03:15:10 -0700 Subject: [PATCH] imxrt: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/imxrt/imxrt_serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/src/imxrt/imxrt_serial.c b/arch/arm/src/imxrt/imxrt_serial.c index 30a487b553..939ccc6e58 100644 --- a/arch/arm/src/imxrt/imxrt_serial.c +++ b/arch/arm/src/imxrt/imxrt_serial.c @@ -1375,7 +1375,7 @@ static int imxrt_dma_nextrx(struct imxrt_uart_s *priv) int dmaresidual = imxrt_dmach_getcount(priv->rxdma); DEBUGASSERT(dmaresidual <= RXDMA_BUFFER_SIZE); - return RXDMA_BUFFER_SIZE - dmaresidual; + return (RXDMA_BUFFER_SIZE - dmaresidual) % RXDMA_BUFFER_SIZE; } #endif