diff options
author | br <br@FreeBSD.org> | 2014-10-08 08:51:05 +0000 |
---|---|---|
committer | br <br@FreeBSD.org> | 2014-10-08 08:51:05 +0000 |
commit | 0dadf7ed0179eb855ab382a48c86fc3d604ad3db (patch) | |
tree | 521a7e6788f374548cf848bdffec9f03148b6b38 | |
parent | 19898d914311955aef80693f5f59eacb74116af0 (diff) | |
download | FreeBSD-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.c | 10 |
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) { |