Browse Source

mmc: sdhci: add timeout for data transfer

Signed-off-by: Lei Wen <leiwen@marvell.com>
Lei Wen 13 years ago
parent
commit
a004abde88
1 changed files with 8 additions and 1 deletions
  1. 8 1
      drivers/mmc/sdhci.c

+ 8 - 1
drivers/mmc/sdhci.c

@@ -81,8 +81,9 @@ static void sdhci_transfer_pio(struct sdhci_host *host, struct mmc_data *data)
 static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
 static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
 				unsigned int start_addr)
 				unsigned int start_addr)
 {
 {
-	unsigned int stat, rdy, mask, block = 0;
+	unsigned int stat, rdy, mask, timeout, block = 0;
 
 
+	timeout = 10000;
 	rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL;
 	rdy = SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DATA_AVAIL;
 	mask = SDHCI_DATA_AVAILABLE | SDHCI_SPACE_AVAILABLE;
 	mask = SDHCI_DATA_AVAILABLE | SDHCI_SPACE_AVAILABLE;
 	do {
 	do {
@@ -108,6 +109,12 @@ static int sdhci_transfer_data(struct sdhci_host *host, struct mmc_data *data,
 			sdhci_writel(host, start_addr, SDHCI_DMA_ADDRESS);
 			sdhci_writel(host, start_addr, SDHCI_DMA_ADDRESS);
 		}
 		}
 #endif
 #endif
+		if (timeout-- > 0)
+			udelay(10);
+		else {
+			printf("Transfer data timeout\n");
+			return -1;
+		}
 	} while (!(stat & SDHCI_INT_DATA_END));
 	} while (!(stat & SDHCI_INT_DATA_END));
 	return 0;
 	return 0;
 }
 }