Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Aug 2013 19:08:54 +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: r254496 - head/sys/dev/sdhci
Message-ID:  <201308181908.r7IJ8sxR006193@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sun Aug 18 19:08:53 2013
New Revision: 254496
URL: http://svnweb.freebsd.org/changeset/base/254496

Log:
  Add a new SDHCI_QUIRK_DONT_SHIFT_RESPONSE for hardware that pre-shifts
  the response bits the way we do in software.  While the hardware is just
  doing the sensible thing rather than leaving it to the software, it's in
  violation of the spec by doing so.  Grrrr.

Modified:
  head/sys/dev/sdhci/sdhci.c
  head/sys/dev/sdhci/sdhci.h

Modified: head/sys/dev/sdhci/sdhci.c
==============================================================================
--- head/sys/dev/sdhci/sdhci.c	Sun Aug 18 18:08:12 2013	(r254495)
+++ head/sys/dev/sdhci/sdhci.c	Sun Aug 18 19:08:53 2013	(r254496)
@@ -835,8 +835,13 @@ sdhci_finish_command(struct sdhci_slot *
 			uint8_t extra = 0;
 			for (i = 0; i < 4; i++) {
 				uint32_t val = RD4(slot, SDHCI_RESPONSE + i * 4);
-				slot->curcmd->resp[3 - i] = (val << 8) + extra;
-				extra = val >> 24;
+				if (slot->quirks & SDHCI_QUIRK_DONT_SHIFT_RESPONSE)
+					slot->curcmd->resp[3 - i] = val;
+				else {
+					slot->curcmd->resp[3 - i] = 
+					    (val << 8) | extra;
+					extra = val >> 24;
+				}
 			}
 		} else
 			slot->curcmd->resp[0] = RD4(slot, SDHCI_RESPONSE);

Modified: head/sys/dev/sdhci/sdhci.h
==============================================================================
--- head/sys/dev/sdhci/sdhci.h	Sun Aug 18 18:08:12 2013	(r254495)
+++ head/sys/dev/sdhci/sdhci.h	Sun Aug 18 19:08:53 2013	(r254496)
@@ -57,6 +57,8 @@
 #define	SDHCI_QUIRK_BROKEN_TIMEOUT_VAL			(1<<11)
 /* SDHCI_CAPABILITIES is invalid */
 #define	SDHCI_QUIRK_MISSING_CAPS			(1<<12)
+/* Hardware shifts the 136-bit response, don't do it in software. */
+#define	SDHCI_QUIRK_DONT_SHIFT_RESPONSE			(1<<13)
 
 /*
  * Controller registers



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308181908.r7IJ8sxR006193>