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.
This commit is contained in:
David Sidrane 2023-10-27 03:37:49 -07:00 committed by Xiang Xiao
parent 8b9d05d0f7
commit 881d67272c
1 changed files with 1 additions and 1 deletions

View File

@ -2815,7 +2815,7 @@ static int s32k3xx_dma_nextrx(struct s32k3xx_uart_s *priv)
{ {
int dmaresidual = s32k3xx_dmach_getcount(priv->rxdma); int dmaresidual = s32k3xx_dmach_getcount(priv->rxdma);
return RXDMA_BUFFER_SIZE - dmaresidual; return (RXDMA_BUFFER_SIZE - dmaresidual) % RXDMA_BUFFER_SIZE;
} }
#endif #endif