svn commit: r318095 - head/sys/dev/sdhci

Luiz Otavio O Souza loos at FreeBSD.org
Tue May 9 19:01:59 UTC 2017


Author: loos
Date: Tue May  9 19:01:57 2017
New Revision: 318095
URL: https://svnweb.freebsd.org/changeset/base/318095

Log:
  Add a new SDHCI quirk, SDHCI_QUIRK_BROKEN_AUTO_STOP, to workaround
  controllers that do not support or have broken ACMD12 implementations.
  
  Reviewed by:	jmcneill
  Obtained from:	NetBSD
  MFC after:	2 weeks
  Sponsored by:	Rubicon Communications, LLC (Netgate)
  Differential Revision:	https://reviews.freebsd.org/D10602

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	Tue May  9 18:54:35 2017	(r318094)
+++ head/sys/dev/sdhci/sdhci.c	Tue May  9 19:01:57 2017	(r318095)
@@ -1060,7 +1060,7 @@ sdhci_set_transfer_mode(struct sdhci_slo
 		mode |= SDHCI_TRNS_MULTI;
 	if (data->flags & MMC_DATA_READ)
 		mode |= SDHCI_TRNS_READ;
-	if (slot->req->stop)
+	if (slot->req->stop && !(slot->quirks & SDHCI_QUIRK_BROKEN_AUTO_STOP))
 		mode |= SDHCI_TRNS_ACMD12;
 	if (slot->flags & SDHCI_USE_DMA)
 		mode |= SDHCI_TRNS_DMA;
@@ -1305,7 +1305,8 @@ sdhci_finish_data(struct sdhci_slot *slo
 		    slot->intmask |= SDHCI_INT_RESPONSE);
 	}
 	/* Unload rest of data from DMA buffer. */
-	if (!slot->data_done && (slot->flags & SDHCI_USE_DMA)) {
+	if (!slot->data_done && (slot->flags & SDHCI_USE_DMA) &&
+	    slot->curcmd->data != NULL) {
 		if (data->flags & MMC_DATA_READ) {
 			left = data->len - slot->offset;
 			bus_dmamap_sync(slot->dmatag, slot->dmamap,
@@ -1343,17 +1344,18 @@ sdhci_start(struct sdhci_slot *slot)
 		sdhci_start_command(slot, req->cmd);
 		return;
 	}
-/* 	We don't need this until using Auto-CMD12 feature
-	if (!(slot->flags & STOP_STARTED) && req->stop) {
+	if ((slot->quirks & SDHCI_QUIRK_BROKEN_AUTO_STOP) &&
+	    !(slot->flags & STOP_STARTED) && req->stop) {
 		slot->flags |= STOP_STARTED;
 		sdhci_start_command(slot, req->stop);
 		return;
 	}
-*/
 	if (sdhci_debug > 1)
 		slot_printf(slot, "result: %d\n", req->cmd->error);
 	if (!req->cmd->error &&
-	    (slot->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST)) {
+	    ((slot->curcmd == req->stop &&
+	     (slot->quirks & SDHCI_QUIRK_BROKEN_AUTO_STOP)) ||
+	     (slot->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {
 		sdhci_reset(slot, SDHCI_RESET_CMD);
 		sdhci_reset(slot, SDHCI_RESET_DATA);
 	}

Modified: head/sys/dev/sdhci/sdhci.h
==============================================================================
--- head/sys/dev/sdhci/sdhci.h	Tue May  9 18:54:35 2017	(r318094)
+++ head/sys/dev/sdhci/sdhci.h	Tue May  9 19:01:57 2017	(r318095)
@@ -87,6 +87,8 @@
 #define	SDHCI_QUIRK_CAPS_BIT63_FOR_MMC_HS400		(1 << 26)
 /* Controller support for SDHCI_CTRL2_PRESET_VALUE is broken. */
 #define	SDHCI_QUIRK_PRESET_VALUE_BROKEN			(1 << 27)
+/* Controller does not support or the support for ACMD12 is broken. */
+#define	SDHCI_QUIRK_BROKEN_AUTO_STOP			(1 << 28)
 
 /*
  * Controller registers


More information about the svn-src-head mailing list