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
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to