diff options
author | ian <ian@FreeBSD.org> | 2014-02-16 17:22:49 +0000 |
---|---|---|
committer | ian <ian@FreeBSD.org> | 2014-02-16 17:22:49 +0000 |
commit | 1b3ed53c801a3acd14f95d66a6c3224648e79135 (patch) | |
tree | 792e553c242dbba4c0a7f0d59586caf973afcc74 | |
parent | 0c8f485c9421879292ffd9a528130bc8ee8d0439 (diff) | |
download | FreeBSD-src-1b3ed53c801a3acd14f95d66a6c3224648e79135.zip FreeBSD-src-1b3ed53c801a3acd14f95d66a6c3224648e79135.tar.gz |
After a timeout, reset the controller using SDHCI_RESET_CMD|SDHCI_RESET_DATA
rather than SDHCI_RESET_ALL; the latter turns off clocks and power, removing
any possibility of recovering from the error.
Also, double the timeout to 2 seconds. Despite what the SD spec says about
all transactions completing in 250ms or less, I have a card which sometimes
takes more than a second to complete a write.
-rw-r--r-- | sys/dev/sdhci/sdhci.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/sdhci/sdhci.c b/sys/dev/sdhci/sdhci.c index 8ecaf54..92a9b4f 100644 --- a/sys/dev/sdhci/sdhci.c +++ b/sys/dev/sdhci/sdhci.c @@ -725,7 +725,7 @@ sdhci_timeout(void *arg) struct sdhci_slot *slot = arg; if (slot->curcmd != NULL) { - sdhci_reset(slot, SDHCI_RESET_ALL); + sdhci_reset(slot, SDHCI_RESET_CMD|SDHCI_RESET_DATA); slot->curcmd->error = MMC_ERR_TIMEOUT; sdhci_req_done(slot); } @@ -850,8 +850,8 @@ sdhci_start_command(struct sdhci_slot *slot, struct mmc_command *cmd) sdhci_set_transfer_mode(slot, cmd->data); /* Start command. */ WR2(slot, SDHCI_COMMAND_FLAGS, (cmd->opcode << 8) | (flags & 0xff)); - /* Start timeout callout; no command should take more than a second. */ - callout_reset(&slot->timeout_callout, hz, sdhci_timeout, slot); + /* Start timeout callout. */ + callout_reset(&slot->timeout_callout, 2*hz, sdhci_timeout, slot); } static void |