mmc: dw_mmc: fix the transfer termination in IDMAC mode
Subsystems (2)
PATCH 14/14 mmc: dw_mmc: fix the transfer termination in IDMAC mode
In IDMAC mode EVENT_XFER_COMPLETE is set when RI/TI of last descriptor is done. So if errors are happened in the middle of data transfers, 'dw_mci_stop_dma' during error handing can be called and eventually prevents this flag to be set.
This results in permanent wait for EVENT_XFER_COMPLETE in 'dw_mci_tasklet_func'. Therefore, if dma running is stopped forcibly, EVENT_XFER_COMPLETE should be set.
--- drivers/mmc/host/dw_mmc.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
drivers/mmc/host/dw_mmc.c +3 -3
@@ -345,10 +345,10 @@ static void dw_mci_stop_dma(struct dw_mci *host)if (host->using_dma) { host->dma_ops->stop (host); host->dma_ops->cleanup (host); - }else { -/* Data transfer was stopped by the interrupt handler */ -set_bit (EVENT_XFER_COMPLETE , &host->pending_events); } + +/* Data transfer was stopped by the interrupt handler */ +set_bit (EVENT_XFER_COMPLETE , &host->pending_events); }static int dw_mci_get_dma_dir (struct mmc_data *data)
Signature · 1 line
1.7.4.1
Quoted 33 lines · Seungwon Jeon
In IDMAC mode
EVENT_XFER_COMPLETEis set when RI/TI of last descriptor is done. So if errors are happened in the middle of data transfers, 'dw_mci_stop_dma' during error handing can be called and eventually prevents this flag to be set.
This results in permanent wait forEVENT_XFER_COMPLETEin 'dw_mci_tasklet_func'. Therefore, if dma running is stopped forcibly,EVENT_XFER_COMPLETEshould be set.Reported-by Bing Zhao <[email protected]>Signed-off-by Doug Anderson <[email protected]>Signed-off-by Seungwon Jeon <[email protected]>--- drivers/mmc/host/dw_mmc.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)drivers/mmc/host/dw_mmc.c +3
-3@@ -345,10 +345,10 @@ static void dw_mci_stop_dma(struct dw_mci *host)if (host->using_dma) { host->dma_ops->stop (host); host->dma_ops->cleanup (host); - }else { -/* Data transfer was stopped by the interrupt handler */ -set_bit (EVENT_XFER_COMPLETE , &host->pending_events); } + +/* Data transfer was stopped by the interrupt handler */ +set_bit (EVENT_XFER_COMPLETE , &host->pending_events); }static int dw_mci_get_dma_dir (struct mmc_data *data)