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

Reply via email to