svn commit: r278688 - stable/10/sys/dev/sdhci
Ian Lepore
ian at FreeBSD.org
Fri Feb 13 18:13:43 UTC 2015
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
More information about the svn-src-stable-10
mailing list