Date: Sun, 16 Feb 2014 17:22:50 +0000 (UTC) From: Ian Lepore <ian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r261983 - head/sys/dev/sdhci Message-ID: <201402161722.s1GHMom6048510@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ian Date: Sun Feb 16 17:22:49 2014 New Revision: 261983 URL: http://svnweb.freebsd.org/changeset/base/261983 Log: 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. Modified: head/sys/dev/sdhci/sdhci.c Modified: head/sys/dev/sdhci/sdhci.c ============================================================================== --- head/sys/dev/sdhci/sdhci.c Sun Feb 16 16:49:54 2014 (r261982) +++ head/sys/dev/sdhci/sdhci.c Sun Feb 16 17:22:49 2014 (r261983) @@ -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 *s 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
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201402161722.s1GHMom6048510>