diff options
author | Jon Medhurst <jon.medhurst@linaro.org> | 2011-12-20 15:03:38 +0000 |
---|---|---|
committer | Jon Medhurst <tixy@linaro.org> | 2012-05-21 12:50:25 +0100 |
commit | 9ab6f622068422b97278e55dd9689f2ce9a66661 (patch) | |
tree | 8c5a9a3b6fa3cc516e355420a38b32a88f9ee83d | |
parent | 76e10d158efb6d4516018846f60c2ab5501900bc (diff) |
mmc: block: Make multi-block write errors retry as single block writestracking-previous-armlt-mmc-llt-20130130.0tracking-previous-armlt-mmc-llt-20121213.0tracking-previous-armlt-mmc-llt-20121210.0tracking-previous-armlt-mmc-llt-20121206.0tracking-previous-armlt-mmc-llt-20121123.0tracking-previous-armlt-mmc-llt-20121016.1tracking-previous-armlt-mmc-llt-20121016.0tracking-previous-armlt-mmc-llt-20120921.0tracking-previous-armlt-mmc-llt-20120827.0tracking-previous-armlt-mmc-llt-20120821.0tracking-previous-armlt-mmc-llt-20120717.0tracking-previous-armlt-mmc-llt-20120626.1tracking-previous-armlt-mmc-llt-20120626.0tracking-armlt-mmc-3.4-2012.05-1tracking-armlt-mmc-3.4-2012.05-0
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 <jon.medhurst@linaro.org>
-rw-r--r-- | drivers/mmc/card/block.c | 6 |
1 files changed, 5 insertions, 1 deletions
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; |