summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbr <br@FreeBSD.org>2014-10-08 08:51:05 +0000
committerbr <br@FreeBSD.org>2014-10-08 08:51:05 +0000
commit0dadf7ed0179eb855ab382a48c86fc3d604ad3db (patch)
tree521a7e6788f374548cf848bdffec9f03148b6b38
parent19898d914311955aef80693f5f59eacb74116af0 (diff)
downloadFreeBSD-src-0dadf7ed0179eb855ab382a48c86fc3d604ad3db.zip
FreeBSD-src-0dadf7ed0179eb855ab382a48c86fc3d604ad3db.tar.gz
Always wait 'command done' interrupt status bit before proceeding next command.
Sponsored by: DARPA, AFRL
-rw-r--r--sys/dev/mmc/host/dwmmc.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/sys/dev/mmc/host/dwmmc.c b/sys/dev/mmc/host/dwmmc.c
index 003db4f..79fe69b 100644
--- a/sys/dev/mmc/host/dwmmc.c
+++ b/sys/dev/mmc/host/dwmmc.c
@@ -348,9 +348,10 @@ dwmmc_tasklet(struct dwmmc_softc *sc)
if (cmd == NULL)
return;
- if (cmd->error != MMC_ERR_NONE) {
- dwmmc_next_operation(sc);
- } else if (!cmd->data && sc->cmd_done) {
+ if (!sc->cmd_done)
+ return;
+
+ if (cmd->error != MMC_ERR_NONE || !cmd->data) {
dwmmc_next_operation(sc);
} else if (cmd->data && sc->dto_rcvd) {
if ((cmd->opcode == MMC_WRITE_MULTIPLE_BLOCK ||
@@ -394,11 +395,8 @@ dwmmc_intr(void *arg)
dprintf("data err 0x%08x cmd 0x%08x\n",
reg, cmd->opcode);
cmd->error = MMC_ERR_FAILED;
-
dma_done(sc, cmd);
dma_stop(sc);
- DWMMC_UNLOCK(sc);
- return;
}
if (reg & SDMMC_INTMASK_CMD_DONE) {
OpenPOWER on IntegriCloud