diff options
-rw-r--r-- | drivers/mmc/mmc.c | 20 | ||||
-rw-r--r-- | include/mmc.h | 2 |
2 files changed, 14 insertions, 8 deletions
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 7b09272..49c3349 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c @@ -108,7 +108,7 @@ int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data) int mmc_send_status(struct mmc *mmc, int timeout) { struct mmc_cmd cmd; - int err; + int err, retries = 5; #ifdef CONFIG_MMC_TRACE int status; #endif @@ -121,17 +121,21 @@ int mmc_send_status(struct mmc *mmc, int timeout) do { err = mmc_send_cmd(mmc, &cmd, NULL); - if (err) + if (!err) { + if ((cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) && + (cmd.response[0] & MMC_STATUS_CURR_STATE) != + MMC_STATE_PRG) + break; + else if (cmd.response[0] & MMC_STATUS_MASK) { + printf("Status Error: 0x%08X\n", + cmd.response[0]); + return COMM_ERR; + } + } else if (--retries < 0) return err; - else if (cmd.response[0] & MMC_STATUS_RDY_FOR_DATA) - break; udelay(1000); - if (cmd.response[0] & MMC_STATUS_MASK) { - printf("Status Error: 0x%08X\n", cmd.response[0]); - return COMM_ERR; - } } while (timeout--); #ifdef CONFIG_MMC_TRACE diff --git a/include/mmc.h b/include/mmc.h index 8744604..30c2375 100644 --- a/include/mmc.h +++ b/include/mmc.h @@ -112,6 +112,8 @@ #define MMC_STATUS_CURR_STATE (0xf << 9) #define MMC_STATUS_ERROR (1 << 19) +#define MMC_STATE_PRG (7 << 9) + #define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */ #define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */ #define MMC_VDD_21_22 0x00000200 /* VDD voltage 2.1 ~ 2.2 */ |