Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Feb 2015 18:13:43 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r278688 - stable/10/sys/dev/sdhci
Message-ID:  <201502131813.t1DIDhcL010689@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Fri Feb 13 18:13:42 2015
New Revision: 278688
URL: https://svnweb.freebsd.org/changeset/base/278688

Log:
  MFC r277027:
    Handle the possibility that SDHCI_PLATFORM_START_TRANSFER() can fail.

Modified:
  stable/10/sys/dev/sdhci/sdhci.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/sdhci/sdhci.c
==============================================================================
--- stable/10/sys/dev/sdhci/sdhci.c	Fri Feb 13 18:12:30 2015	(r278687)
+++ stable/10/sys/dev/sdhci/sdhci.c	Fri Feb 13 18:13:42 2015	(r278688)
@@ -985,7 +985,6 @@ sdhci_finish_data(struct sdhci_slot *slo
 {
 	struct mmc_data *data = slot->curcmd->data;
 
-	slot->data_done = 1;
 	/* Interrupt aggregation: Restore command interrupt.
 	 * Auxiliary restore point for the case when data interrupt
 	 * happened first. */
@@ -994,7 +993,7 @@ sdhci_finish_data(struct sdhci_slot *slo
 		    slot->intmask |= SDHCI_INT_RESPONSE);
 	}
 	/* Unload rest of data from DMA buffer. */
-	if (slot->flags & SDHCI_USE_DMA) {
+	if (!slot->data_done && (slot->flags & SDHCI_USE_DMA)) {
 		if (data->flags & MMC_DATA_READ) {
 			size_t left = data->len - slot->offset;
 			bus_dmamap_sync(slot->dmatag, slot->dmamap, 
@@ -1005,6 +1004,7 @@ sdhci_finish_data(struct sdhci_slot *slo
 			bus_dmamap_sync(slot->dmatag, slot->dmamap, 
 			    BUS_DMASYNC_POSTWRITE);
 	}
+	slot->data_done = 1;
 	/* If there was error - reset the host. */
 	if (slot->curcmd->error) {
 		sdhci_reset(slot, SDHCI_RESET_CMD);
@@ -1172,12 +1172,7 @@ sdhci_data_irq(struct sdhci_slot *slot, 
 	}
 	if (slot->curcmd->error) {
 		/* No need to continue after any error. */
-		if (slot->flags & PLATFORM_DATA_STARTED) {
-			slot->flags &= ~PLATFORM_DATA_STARTED;
-			SDHCI_PLATFORM_FINISH_TRANSFER(slot->bus, slot);
-		} else
-			sdhci_finish_data(slot);
-		return;
+		goto done;
 	}
 
 	/* Handle PIO interrupt. */
@@ -1234,6 +1229,15 @@ sdhci_data_irq(struct sdhci_slot *slot, 
 		} else
 			sdhci_finish_data(slot);
 	}
+done:
+	if (slot->curcmd != NULL && slot->curcmd->error != 0) {
+		if (slot->flags & PLATFORM_DATA_STARTED) {
+			slot->flags &= ~PLATFORM_DATA_STARTED;
+			SDHCI_PLATFORM_FINISH_TRANSFER(slot->bus, slot);
+		} else
+			sdhci_finish_data(slot);
+		return;
+	}
 }
 
 static void



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