Skip to content

Commit 1760fdb

Browse files
committed
mmc: core: Restore (almost) the busy polling for MMC_SEND_OP_COND
Commit 76bfc7c ("mmc: core: adjust polling interval for CMD1"), significantly decreased the polling period from ~10-12ms into just a couple of us. The purpose was to decrease the total time spent in the busy polling loop, but unfortunate it has lead to problems, that causes eMMC cards to never gets out busy and thus fails to be initialized. To fix the problem, but also to try to keep some of the new improved behaviour, let's start by using a polling period of 1-2ms, which then increases for each loop, according to common polling loop in __mmc_poll_for_busy(). Reported-by: Jean Rene Dawin <jdawin@math.uni-bielefeld.de> Reported-by: H. Nikolaus Schaller <hns@goldelico.com> Cc: Huijin Park <huijin.park@samsung.com> Fixes: 76bfc7c ("mmc: core: adjust polling interval for CMD1") Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Tested-by: Jean Rene Dawin <jdawin@math.uni-bielefeld.de> Tested-by: H. Nikolaus Schaller <hns@goldelico.com> Link: https://lore.kernel.org/r/20220304105656.149281-1-ulf.hansson@linaro.org
1 parent f0d2f15 commit 1760fdb

File tree

5 files changed

+14
-8
lines changed

5 files changed

+14
-8
lines changed

drivers/mmc/core/block.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1908,7 +1908,7 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req)
19081908

19091909
cb_data.card = card;
19101910
cb_data.status = 0;
1911-
err = __mmc_poll_for_busy(card->host, MMC_BLK_TIMEOUT_MS,
1911+
err = __mmc_poll_for_busy(card->host, 0, MMC_BLK_TIMEOUT_MS,
19121912
&mmc_blk_busy_cb, &cb_data);
19131913

19141914
/*

drivers/mmc/core/mmc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1962,7 +1962,7 @@ static int mmc_sleep(struct mmc_host *host)
19621962
goto out_release;
19631963
}
19641964

1965-
err = __mmc_poll_for_busy(host, timeout_ms, &mmc_sleep_busy_cb, host);
1965+
err = __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_sleep_busy_cb, host);
19661966

19671967
out_release:
19681968
mmc_retune_release(host);

drivers/mmc/core/mmc_ops.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
#define MMC_BKOPS_TIMEOUT_MS (120 * 1000) /* 120s */
2323
#define MMC_SANITIZE_TIMEOUT_MS (240 * 1000) /* 240s */
24+
#define MMC_OP_COND_PERIOD_US (1 * 1000) /* 1ms */
25+
#define MMC_OP_COND_TIMEOUT_MS 1000 /* 1s */
2426

2527
static const u8 tuning_blk_pattern_4bit[] = {
2628
0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc,
@@ -232,7 +234,9 @@ int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr)
232234
cmd.arg = mmc_host_is_spi(host) ? 0 : ocr;
233235
cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR;
234236

235-
err = __mmc_poll_for_busy(host, 1000, &__mmc_send_op_cond_cb, &cb_data);
237+
err = __mmc_poll_for_busy(host, MMC_OP_COND_PERIOD_US,
238+
MMC_OP_COND_TIMEOUT_MS,
239+
&__mmc_send_op_cond_cb, &cb_data);
236240
if (err)
237241
return err;
238242

@@ -495,13 +499,14 @@ static int mmc_busy_cb(void *cb_data, bool *busy)
495499
return 0;
496500
}
497501

498-
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
502+
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
503+
unsigned int timeout_ms,
499504
int (*busy_cb)(void *cb_data, bool *busy),
500505
void *cb_data)
501506
{
502507
int err;
503508
unsigned long timeout;
504-
unsigned int udelay = 32, udelay_max = 32768;
509+
unsigned int udelay = period_us ? period_us : 32, udelay_max = 32768;
505510
bool expired = false;
506511
bool busy = false;
507512

@@ -546,7 +551,7 @@ int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
546551
cb_data.retry_crc_err = retry_crc_err;
547552
cb_data.busy_cmd = busy_cmd;
548553

549-
return __mmc_poll_for_busy(host, timeout_ms, &mmc_busy_cb, &cb_data);
554+
return __mmc_poll_for_busy(host, 0, timeout_ms, &mmc_busy_cb, &cb_data);
550555
}
551556
EXPORT_SYMBOL_GPL(mmc_poll_for_busy);
552557

drivers/mmc/core/mmc_ops.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ int mmc_can_ext_csd(struct mmc_card *card);
4141
int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal);
4242
bool mmc_prepare_busy_cmd(struct mmc_host *host, struct mmc_command *cmd,
4343
unsigned int timeout_ms);
44-
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms,
44+
int __mmc_poll_for_busy(struct mmc_host *host, unsigned int period_us,
45+
unsigned int timeout_ms,
4546
int (*busy_cb)(void *cb_data, bool *busy),
4647
void *cb_data);
4748
int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,

drivers/mmc/core/sd.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1672,7 +1672,7 @@ static int sd_poweroff_notify(struct mmc_card *card)
16721672

16731673
cb_data.card = card;
16741674
cb_data.reg_buf = reg_buf;
1675-
err = __mmc_poll_for_busy(card->host, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
1675+
err = __mmc_poll_for_busy(card->host, 0, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
16761676
&sd_busy_poweroff_notify_cb, &cb_data);
16771677

16781678
out:

0 commit comments

Comments
 (0)