Skip to content

Commit 54309fd

Browse files
cloehlestorulf
authored andcommitted
mmc: block: fix read single on recovery logic
On reads with MMC_READ_MULTIPLE_BLOCK that fail, the recovery handler will use MMC_READ_SINGLE_BLOCK for each of the blocks, up to MMC_READ_SINGLE_RETRIES times each. The logic for this is fixed to never report unsuccessful reads as success to the block layer. On command error with retries remaining, blk_update_request was called with whatever value error was set last to. In case it was last set to BLK_STS_OK (default), the read will be reported as success, even though there was no data read from the device. This could happen on a CRC mismatch for the response, a card rejecting the command (e.g. again due to a CRC mismatch). In case it was last set to BLK_STS_IOERR, the error is reported correctly, but no retries will be attempted. Fixes: 8119697 ("mmc: block: Add blk-mq support") Cc: stable@vger.kernel.org Signed-off-by: Christian Loehle <cloehle@hyperstone.com> Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Link: https://lore.kernel.org/r/bc706a6ab08c4fe2834ba0c05a804672@hyperstone.com Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
1 parent bd2db32 commit 54309fd

File tree

1 file changed

+14
-14
lines changed

1 file changed

+14
-14
lines changed

drivers/mmc/core/block.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,31 +1682,31 @@ static void mmc_blk_read_single(struct mmc_queue *mq, struct request *req)
16821682
struct mmc_card *card = mq->card;
16831683
struct mmc_host *host = card->host;
16841684
blk_status_t error = BLK_STS_OK;
1685-
int retries = 0;
16861685

16871686
do {
16881687
u32 status;
16891688
int err;
1689+
int retries = 0;
16901690

1691-
mmc_blk_rw_rq_prep(mqrq, card, 1, mq);
1691+
while (retries++ <= MMC_READ_SINGLE_RETRIES) {
1692+
mmc_blk_rw_rq_prep(mqrq, card, 1, mq);
16921693

1693-
mmc_wait_for_req(host, mrq);
1694+
mmc_wait_for_req(host, mrq);
16941695

1695-
err = mmc_send_status(card, &status);
1696-
if (err)
1697-
goto error_exit;
1698-
1699-
if (!mmc_host_is_spi(host) &&
1700-
!mmc_ready_for_data(status)) {
1701-
err = mmc_blk_fix_state(card, req);
1696+
err = mmc_send_status(card, &status);
17021697
if (err)
17031698
goto error_exit;
1704-
}
17051699

1706-
if (mrq->cmd->error && retries++ < MMC_READ_SINGLE_RETRIES)
1707-
continue;
1700+
if (!mmc_host_is_spi(host) &&
1701+
!mmc_ready_for_data(status)) {
1702+
err = mmc_blk_fix_state(card, req);
1703+
if (err)
1704+
goto error_exit;
1705+
}
17081706

1709-
retries = 0;
1707+
if (!mrq->cmd->error)
1708+
break;
1709+
}
17101710

17111711
if (mrq->cmd->error ||
17121712
mrq->data->error ||

0 commit comments

Comments
 (0)