|
@@ -1969,6 +1969,7 @@ static int mmc_do_erase(struct mmc_card *card, unsigned int from,
|
|
|
unsigned int qty = 0, busy_timeout = 0;
|
|
|
bool use_r1b_resp = false;
|
|
|
unsigned long timeout;
|
|
|
+ int loop_udelay=64, udelay_max=32768;
|
|
|
int err;
|
|
|
|
|
|
mmc_retune_hold(card->host);
|
|
@@ -2093,9 +2094,15 @@ static int mmc_do_erase(struct mmc_card *card, unsigned int from,
|
|
|
err = -EIO;
|
|
|
goto out;
|
|
|
}
|
|
|
+ if ((cmd.resp[0] & R1_READY_FOR_DATA) &&
|
|
|
+ R1_CURRENT_STATE(cmd.resp[0]) != R1_STATE_PRG)
|
|
|
+ break;
|
|
|
+
|
|
|
+ usleep_range(loop_udelay, loop_udelay*2);
|
|
|
+ if (loop_udelay < udelay_max)
|
|
|
+ loop_udelay *= 2;
|
|
|
+ } while (1);
|
|
|
|
|
|
- } while (!(cmd.resp[0] & R1_READY_FOR_DATA) ||
|
|
|
- (R1_CURRENT_STATE(cmd.resp[0]) == R1_STATE_PRG));
|
|
|
out:
|
|
|
mmc_retune_release(card->host);
|
|
|
return err;
|