[U-Boot] [PATCH v1] mmc: dwmmc: Enable small delay before returning error
chee.hong.ang at intel.com
chee.hong.ang at intel.com
Mon Feb 18 04:16:05 UTC 2019
From: "Ang, Chee Hong" <chee.hong.ang at intel.com>
'SET_BLOCKLEN' may occasionally fail on first attempt.
This patch enable a small delay in dwmci_send_cmd() on
busy, I/O or CRC error to allow the MMC controller recovers
from the failure/error on subsequent retries.
Signed-off-by: Ang, Chee Hong <chee.hong.ang at intel.com>
---
drivers/mmc/dw_mmc.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/drivers/mmc/dw_mmc.c b/drivers/mmc/dw_mmc.c
index 7544b84..8dcc518 100644
--- a/drivers/mmc/dw_mmc.c
+++ b/drivers/mmc/dw_mmc.c
@@ -266,8 +266,11 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
if (data)
flags = dwmci_set_transfer_mode(host, data);
- if ((cmd->resp_type & MMC_RSP_136) && (cmd->resp_type & MMC_RSP_BUSY))
- return -1;
+ if ((cmd->resp_type & MMC_RSP_136) &&
+ (cmd->resp_type & MMC_RSP_BUSY)) {
+ ret = -1;
+ goto delay_ret;
+ }
if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
flags |= DWMCI_CMD_ABORT_STOP;
@@ -316,11 +319,13 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
return -ETIMEDOUT;
} else if (mask & DWMCI_INTMSK_RE) {
debug("%s: Response Error.\n", __func__);
- return -EIO;
+ ret = -EIO;
+ goto delay_ret;
} else if ((cmd->resp_type & MMC_RSP_CRC) &&
(mask & DWMCI_INTMSK_RCRC)) {
debug("%s: Response CRC Error.\n", __func__);
- return -EIO;
+ ret = -EIO;
+ goto delay_ret;
}
@@ -347,6 +352,7 @@ static int dwmci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
}
}
+delay_ret:
udelay(100);
return ret;
--
2.7.4
More information about the U-Boot
mailing list