diff mbox

dma: imx: correct sdmac->status for cyclic dma tx

Message ID 1386913966-20595-1-git-send-email-jiada_wang@mentor.com (mailing list archive)
State New, archived
Headers show

Commit Message

Wang, Jiada Dec. 13, 2013, 5:52 a.m. UTC
From: Jiada Wang <jiada_wang@mentor.com>

In cyclic dma tx's handler sdma_handle_channel_loop(),
SDMA channel statue is set to either DMA_ERROR or DMA_IN_PROGRESS
based on each period's status. This has the following issues:

1) If one period's status is BD_RROR, then channel status
   will be set to DMA_ERROR, but it will be overwritten to DMA_IN_PROGRESS
   if the following periods are OK.
2) DMA client may call sdma_control(DMA_TERMINATE_ALL) to stop the cyclic dma
   operation, sdma channel status will be set to DMA_ERROR,
   but if after this handler is called, then again the channel status will be overwritten
   to DMA_IN_PROGRESS. Then the following dmaengine_prep_dma_cyclic() will always fail,
   as channel status is DMA_IN_PROGRESS.

As in cyclic dma tx, channel status will be initially set to DMA_IN_PROGRESS,
driver only needs to change it to DMA_ERROR, when something wrong happens
(one period status is wrong, or stoped by client explicitly).

Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
---
 drivers/dma/imx-sdma.c | 2 --
 1 file changed, 2 deletions(-)

Comments

Fabio Estevam May 14, 2014, 9:42 p.m. UTC | #1
Jiada,

On Fri, Dec 13, 2013 at 3:52 AM,  <jiada_wang@mentor.com> wrote:
> From: Jiada Wang <jiada_wang@mentor.com>
>
> In cyclic dma tx's handler sdma_handle_channel_loop(),
> SDMA channel statue is set to either DMA_ERROR or DMA_IN_PROGRESS
> based on each period's status. This has the following issues:
>
> 1) If one period's status is BD_RROR, then channel status
>    will be set to DMA_ERROR, but it will be overwritten to DMA_IN_PROGRESS
>    if the following periods are OK.
> 2) DMA client may call sdma_control(DMA_TERMINATE_ALL) to stop the cyclic dma
>    operation, sdma channel status will be set to DMA_ERROR,
>    but if after this handler is called, then again the channel status will be overwritten
>    to DMA_IN_PROGRESS. Then the following dmaengine_prep_dma_cyclic() will always fail,
>    as channel status is DMA_IN_PROGRESS.
>
> As in cyclic dma tx, channel status will be initially set to DMA_IN_PROGRESS,
> driver only needs to change it to DMA_ERROR, when something wrong happens
> (one period status is wrong, or stoped by client explicitly).
>
> Signed-off-by: Jiada Wang <jiada_wang@mentor.com>

It seems this one got lost as you did not put the dma maintainer on Cc.

Please run ./scripts/get_maintainer.pl and re-submit it.
diff mbox

Patch

diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index c75679d..c8a0094 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -605,8 +605,6 @@  static void sdma_handle_channel_loop(struct sdma_channel *sdmac)
 
 		if (bd->mode.status & BD_RROR)
 			sdmac->status = DMA_ERROR;
-		else
-			sdmac->status = DMA_IN_PROGRESS;
 
 		bd->mode.status |= BD_DONE;
 		sdmac->buf_tail++;