mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
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.
This commit is contained in:
parent
586a16c431
commit
a6873fd141
1 changed files with 3 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue