From 9ab6f622068422b97278e55dd9689f2ce9a66661 Mon Sep 17 00:00:00 2001 From: Jon Medhurst Date: Tue, 20 Dec 2011 15:03:38 +0000 Subject: mmc: block: Make multi-block write errors retry as single block writes The current mmc block code retries i/o errors on multi-block reads by using single block reads. For platforms with unreliable multi-block operations, like the ARM Versatile Express board, this is a valuable error recovery path. This patch extends the single block retry to also include write operations. Signed-off-by: Jon Medhurst --- drivers/mmc/card/block.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index dabec556ebb8..20c5e3d74728 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1079,6 +1079,10 @@ static int mmc_blk_err_check(struct mmc_card *card, return MMC_BLK_ECC_ERR; return MMC_BLK_DATA_ERR; } else { + if (brq->data.blocks > 1) { + /* Hack to redo transfer one sector at a time */ + return MMC_BLK_DATA_ERR; + } return MMC_BLK_CMD_ERR; } } @@ -1355,7 +1359,7 @@ static int mmc_blk_issue_rw_rq(struct mmc_queue *mq, struct request *rqc) case MMC_BLK_ECC_ERR: if (brq->data.blocks > 1) { /* Redo read one sector at a time */ - pr_warning("%s: retrying using single block read\n", + pr_warning("%s: retrying using single block transfer\n", req->rq_disk->disk_name); disable_multi = 1; break; -- cgit v1.2.3