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:
parent
8b9d05d0f7
commit
881d67272c
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue