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

View File

@ -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