From bdf9e11d339ebc121e80e7ecdd44e0abcaf4ff38 Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Tue, 24 Jun 2014 13:57:21 +0200 Subject: mmc: card: retry if transfer aborted due to out of range This works around a issue we see when using eMMC 4.5 on tegra SDHCI host controller. --- drivers/mmc/card/block.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index bd5427d1f9e3..1583904a93a9 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -860,6 +860,15 @@ static int mmc_blk_err_check(struct mmc_card *card, if (brq->cmd.resp[0] & CMD_ERRORS) { pr_err("%s: r/w command failed, status = %#x\n", req->rq_disk->disk_name, brq->cmd.resp[0]); + + /* HACK: if the error is out of range, retry... */ + if (brq->cmd.resp[0] & R1_OUT_OF_RANGE) { + pr_info("%s: opcode: %x, arg: %x\n", req->rq_disk->disk_name, + brq->sbc.opcode, brq->sbc.arg); + pr_err("%s: I/O error, retrying...\n", req->rq_disk->disk_name); + return MMC_BLK_RETRY; + } + return MMC_BLK_ABORT; } -- cgit v1.2.3