summaryrefslogtreecommitdiffstats
path: root/drivers/mmc
diff options
context:
space:
mode:
authorSeungwon Jeon <tgih.jun@samsung.com>2012-05-20 13:27:21 +0900
committerChris Ball <cjb@laptop.org>2012-06-06 09:35:47 -0400
commiteed6c63cefaf935e6fb28c4dd9977a280ae544a8 (patch)
treec8be5ba50ffd562d35bccbb140bd4ba5644185e4 /drivers/mmc
parent2a0fe914a38745f5b03534c4e4f4056cbd6978b8 (diff)
downloadlinux-eed6c63cefaf935e6fb28c4dd9977a280ae544a8.tar.gz
linux-eed6c63cefaf935e6fb28c4dd9977a280ae544a8.tar.bz2
linux-eed6c63cefaf935e6fb28c4dd9977a280ae544a8.zip
mmc: dw_mmc: fix the transmission handling in IDMAC
DTO interrupt can be later than transmit interrupt(IDMAC) in case of write. Current handling of IDMAC interrupt sets EVENT_DATA_COMPLETE as well as EVENT_XFER_COMPLETE regardless of DTO rising. This makes the current request finish in tasklet and permits the next request even though current data transfer is still in progress. As a result, sequence is broken and lock-up happens. Setting EVENT_DATA_COMPLETE is not proper after IDMAC interrupt. It should be taken after DTO interrupt is generated. Reported-by: Dmitry Shmidt <dimitrysh@android.com> Signed-off-by: Seungwon Jeon <tgih.jun@samsung.com> Signed-off-by: Hyeonsu Kim <hyeonsu.kim@samsung.com> Acked-by: Will Newton <will.newton@imgtec.com> Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r--drivers/mmc/host/dw_mmc.c1
1 files changed, 0 insertions, 1 deletions
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 9bbf45f8c538..b46faf0cfb27 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -1623,7 +1623,6 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
if (pending & (SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI)) {
mci_writel(host, IDSTS, SDMMC_IDMAC_INT_TI | SDMMC_IDMAC_INT_RI);
mci_writel(host, IDSTS, SDMMC_IDMAC_INT_NI);
- set_bit(EVENT_DATA_COMPLETE, &host->pending_events);
host->dma_ops->complete(host);
}
#endif