diff -urNp linux-2.6-orig/drivers/mmc/card/block.c linux-2.6/drivers/mmc/card/block.c --- linux-2.6-orig/drivers/mmc/card/block.c 2007-10-08 10:26:01.000000000 +0200 +++ linux-2.6/drivers/mmc/card/block.c 2007-10-08 10:29:17.000000000 +0200 @@ -224,6 +224,7 @@ static int mmc_blk_issue_rq(struct mmc_q if (!mmc_card_blockaddr(card)) brq.cmd.arg <<= 9; brq.cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_ADTC; + brq.cmd.retries = 8; brq.data.blksz = 1 << md->block_bits; brq.stop.opcode = MMC_STOP_TRANSMISSION; brq.stop.arg = 0; diff -urNp linux-2.6-orig/drivers/mmc/core/core.c linux-2.6/drivers/mmc/core/core.c --- linux-2.6-orig/drivers/mmc/core/core.c 2007-10-08 10:26:01.000000000 +0200 +++ linux-2.6/drivers/mmc/core/core.c 2007-10-08 17:01:12.000000000 +0200 @@ -102,6 +102,13 @@ void mmc_request_done(struct mmc_host *h pr_debug("%s: %d bytes transferred: %d\n", mmc_hostname(host), mrq->data->bytes_xfered, mrq->data->error); + if (mrq->data->error && cmd->retries) { + pr_debug(" ...DATA error: retrying...\n"); + cmd->retries--; + cmd->error = 0; + mrq->data->error = 0; + host->ops->request(host, mrq); + } } if (mrq->stop) { @@ -110,6 +117,13 @@ void mmc_request_done(struct mmc_host *h mrq->stop->error, mrq->stop->resp[0], mrq->stop->resp[1], mrq->stop->resp[2], mrq->stop->resp[3]); + if (mrq->stop->error && cmd->retries) { + pr_debug(" ...STOP error: retrying...\n"); + cmd->retries--; + cmd->error = 0; + mrq->stop->error = 0; + host->ops->request(host, mrq); + } } if (mrq->done)