summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Hannemann <arnd@arndnet.de>2010-12-29 14:21:14 +0100
committerChris Ball <cjb@laptop.org>2011-01-09 05:52:32 +0100
commit2bd6a935555b06622fa7f47a9c411b8a7812e4dc (patch)
treeaa96bbf4376b9b40d52946b7e41d58082cc3c183
parentmmc: tmio_mmc: handle missing HW interrupts (diff)
downloadlinux-2bd6a935555b06622fa7f47a9c411b8a7812e4dc.tar.xz
linux-2bd6a935555b06622fa7f47a9c411b8a7812e4dc.zip
mmc: tmio_mmc: fix CMD irq handling
With current code card insert/eject interrupts will acknowledge outstanding commands. Normally this seems to be no problem, however if the hardware gets stuck and no interrupts for CMD_TIMEOUT or CMD_RESPEND are generated, then inserting and ejecting cards will falsely acknowledge outstanding commands from the core. This patch changes the behavior so that CMDs are only acked, if CMD_TIMEOUT or CMD_RESPEND is received. Signed-off-by: Arnd Hannemann <arnd@arndnet.de> Signed-off-by: Chris Ball <cjb@laptop.org>
-rw-r--r--drivers/mmc/host/tmio_mmc.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/mmc/host/tmio_mmc.c b/drivers/mmc/host/tmio_mmc.c
index 689a3692242e..e3c6ef208391 100644
--- a/drivers/mmc/host/tmio_mmc.c
+++ b/drivers/mmc/host/tmio_mmc.c
@@ -727,8 +727,10 @@ static irqreturn_t tmio_mmc_irq(int irq, void *devid)
*/
/* Command completion */
- if (ireg & TMIO_MASK_CMD) {
- ack_mmc_irqs(host, TMIO_MASK_CMD);
+ if (ireg & (TMIO_STAT_CMDRESPEND | TMIO_STAT_CMDTIMEOUT)) {
+ ack_mmc_irqs(host,
+ TMIO_STAT_CMDRESPEND |
+ TMIO_STAT_CMDTIMEOUT);
tmio_mmc_cmd_irq(host, status);
}