|
@@ -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
|