From dfecd98a94bcdc5a21bc1c8f794483b9dfaca979 Mon Sep 17 00:00:00 2001 From: Ulf Hansson Date: Wed, 22 Feb 2012 10:23:55 +0100 Subject: mmc: mmci: Do not finalize dma job at data error irq mmci_dma_finalize must not be executed when a data error irq has been received. We do mmci_dma_unmap directly instead and moreover make sure the dma handles are reset as soon as the dma job is done/terminated. Change-Id: Ib4ed3f380f4383cb2a28613552569b950c5204a5 Signed-off-by: Ulf Hansson Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/49925 Reviewed-by: Per FORLIN --- drivers/mmc/host/mmci.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index b36a68dfd72..501227da03e 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c @@ -379,6 +379,8 @@ static void mmci_dma_data_error(struct mmci_host *host) { dev_err(mmc_dev(host->mmc), "error during DMA transfer!\n"); dmaengine_terminate_all(host->dma_current); + host->dma_current = NULL; + host->dma_desc_current = NULL; host->data->host_cookie = 0; } @@ -418,10 +420,8 @@ static void mmci_dma_finalize(struct mmci_host *host, struct mmc_data *data) * contiguous buffers. On TX, we'll get a FIFO underrun error. */ if (status & MCI_RXDATAAVLBLMASK) { - if (!data->error) { - data->error = -EIO; - mmci_dma_data_error(host); - } + data->error = -EIO; + mmci_dma_data_error(host); } if (!data->host_cookie) @@ -435,6 +435,9 @@ static void mmci_dma_finalize(struct mmci_host *host, struct mmc_data *data) dev_err(mmc_dev(host->mmc), "buggy DMA detected. Taking evasive action.\n"); mmci_dma_release(host); } + + host->dma_current = NULL; + host->dma_desc_current = NULL; } /* prepares DMA channel and DMA descriptor, returns non-zero on failure */ @@ -779,8 +782,10 @@ mmci_data_irq(struct mmci_host *host, struct mmc_data *data, u32 remain, success; /* Terminate the DMA transfer */ - if (dma_inprogress(host)) + if (dma_inprogress(host)) { mmci_dma_data_error(host); + mmci_dma_unmap(host, data); + } /* * Calculate how far we are into the transfer. Note that -- cgit v1.2.3