Prev: memcg: mem_cgroup_shrink_node_zone() doesn't need sc.nodemask
Next: vmscan: convert direct reclaim tracepoint to DEFINE_EVENT
From: Sonic Zhang on 16 Jul 2010 07:00 Any comments? Sonic On Mon, Jul 12, 2010 at 3:50 PM, sonic zhang <sonic.adi(a)gmail.com> wrote: > >From 94d1ea57ac2fbe37133e25e99ccb265250f0027d Mon Sep 17 00:00:00 2001 > From: Sonic Zhang <sonic.zhang(a)analog.com> > Date: Fri, 9 Jul 2010 15:36:20 +0800 > Subject: [PATCH v2] MMC:mmc_spi: Recover from crc error for SD read/write operation over SPI. > > SPI bus is not reliable on all platforms when doing large data transfer. > Current mmc spi driver fails SD read/write command immediately, if > occasional CRC error is reported by SD device. This patch makes the > operation recover from the CRC error by doing last SD command again. > The retry count is set to 5 to ensure the driver pass any stress test. > > Signed-off-by: Sonic Zhang <sonic.zhang(a)analog.com> > --- > �drivers/mmc/host/mmc_spi.c | � 22 ++++++++++++++++++++++ > �1 files changed, 22 insertions(+), 0 deletions(-) > > diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c > index ad847a2..8192434 100644 > --- a/drivers/mmc/host/mmc_spi.c > +++ b/drivers/mmc/host/mmc_spi.c > @@ -1055,6 +1055,8 @@ static void mmc_spi_request(struct mmc_host *mmc, struct mmc_request *mrq) > �{ > � � � �struct mmc_spi_host � � *host = mmc_priv(mmc); > � � � �int � � � � � � � � � � status = -EINVAL; > + � � � int � � � � � � � � � � crc_retry = 5; > + � � � struct mmc_command � � �stop; > > �#ifdef DEBUG > � � � �/* MMC core and layered drivers *MUST* issue SPI-aware commands */ > @@ -1084,10 +1086,30 @@ static void mmc_spi_request(struct mmc_host *mmc, struct mmc_request *mrq) > � � � �} > �#endif > > +crc_recover: > � � � �/* issue command; then optionally data and stop */ > � � � �status = mmc_spi_command_send(host, mrq, mrq->cmd, mrq->data != NULL); > � � � �if (status == 0 && mrq->data) { > � � � � � � � �mmc_spi_data_do(host, mrq->cmd, mrq->data, mrq->data->blksz); > + > + � � � � � � � /* > + � � � � � � � �* SPI bus is not reliable when doing large data transfer. > + � � � � � � � �* If occasional crc error is reported by SD device when do > + � � � � � � � �* data read/write over SPI, it can be recovered by doing > + � � � � � � � �* last SD command again. The retry count is set to 5 to > + � � � � � � � �* ensure the driver pass any stress test. > + � � � � � � � �*/ > + � � � � � � � if (mrq->data->error == -EILSEQ && crc_retry) { > + � � � � � � � � � � � stop.opcode = MMC_STOP_TRANSMISSION; > + � � � � � � � � � � � stop.arg = 0; > + � � � � � � � � � � � stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; > + > + � � � � � � � � � � � status = mmc_spi_command_send(host, mrq, &stop, 0); > + � � � � � � � � � � � crc_retry--; > + � � � � � � � � � � � mrq->data->error = 0; > + � � � � � � � � � � � goto crc_recover; > + � � � � � � � } > + > � � � � � � � �if (mrq->stop) > � � � � � � � � � � � �status = mmc_spi_command_send(host, mrq, mrq->stop, 0); > � � � � � � � �else > -- > 1.6.0 > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-mmc" in > the body of a message to majordomo(a)vger.kernel.org > More majordomo info at �http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Mike Frysinger on 16 Jul 2010 11:50
On Fri, Jul 16, 2010 at 06:51, Sonic Zhang wrote: > Any comments? might want to CC akpm so he'll pick this up in case the mmc guys miss it -mike -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |