diff options
author | Jean Pihet <[email protected]> | 2009-02-11 13:11:39 -0800 |
---|---|---|
committer | Pierre Ossman <[email protected]> | 2009-02-18 22:10:49 +0100 |
commit | c232f457e409b34417166596ea3daf298ace95c9 (patch) | |
tree | f0ab268076cfd4ba680b707285263e6794541781 | |
parent | eb25082657be3e7639e349fc926afdcbb0a4dc65 (diff) |
omap_hsmmc: recover from transfer failures
Timeouts during a command that has a data phase can result in the next
command issued after the command that failed not being processed, i.e. no
interrupt ever occurs to indicate the command has completed. This failure
can result in a deadlock.
This patch resets the data state machine to clear the error in case of a
command timeout.
Tested on OMAP3430 chip and intensive MMC/SD device removal while
transferring data.
Signed-off-by: Andy Lowe <[email protected]>
Signed-off-by: Jean Pihet <[email protected]>
Signed-off-by: Adrian Hunter <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Acked-by: Tony Lindgren <[email protected]>
Signed-off-by: Pierre Ossman <[email protected]>
-rw-r--r-- | drivers/mmc/host/omap_hsmmc.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 3bfd0facb794..8d21a07f63de 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -417,8 +417,15 @@ static irqreturn_t mmc_omap_irq(int irq, void *dev_id) } end_cmd = 1; } - if (host->data) + if (host->data) { mmc_dma_cleanup(host); + OMAP_HSMMC_WRITE(host->base, SYSCTL, + OMAP_HSMMC_READ(host->base, + SYSCTL) | SRD); + while (OMAP_HSMMC_READ(host->base, + SYSCTL) & SRD) + ; + } } if ((status & DATA_TIMEOUT) || (status & DATA_CRC)) { |