|
@@ -1016,6 +1016,7 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
|
|
|
mod_timer(&host->timer, timeout);
|
|
|
|
|
|
host->cmd = cmd;
|
|
|
+ host->busy_handle = 0;
|
|
|
|
|
|
sdhci_prepare_data(host, cmd);
|
|
|
|
|
@@ -2261,8 +2262,12 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)
|
|
|
if (host->cmd->data)
|
|
|
DBG("Cannot wait for busy signal when also "
|
|
|
"doing a data transfer");
|
|
|
- else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ))
|
|
|
+ else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ)
|
|
|
+ && !host->busy_handle) {
|
|
|
+ /* Mark that command complete before busy is ended */
|
|
|
+ host->busy_handle = 1;
|
|
|
return;
|
|
|
+ }
|
|
|
|
|
|
/* The controller does not support the end-of-busy IRQ,
|
|
|
* fall through and take the SDHCI_INT_RESPONSE */
|
|
@@ -2330,7 +2335,15 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
|
|
|
return;
|
|
|
}
|
|
|
if (intmask & SDHCI_INT_DATA_END) {
|
|
|
- sdhci_finish_command(host);
|
|
|
+ /*
|
|
|
+ * Some cards handle busy-end interrupt
|
|
|
+ * before the command completed, so make
|
|
|
+ * sure we do things in the proper order.
|
|
|
+ */
|
|
|
+ if (host->busy_handle)
|
|
|
+ sdhci_finish_command(host);
|
|
|
+ else
|
|
|
+ host->busy_handle = 1;
|
|
|
return;
|
|
|
}
|
|
|
}
|