On Mon, 22 Jul 2019 at 06:03, <shihpo.hung@xxxxxxxxxx> wrote: > > From: ShihPo Hung <shihpo.hung@xxxxxxxxxx> > > From: Andreas Koop <andreas.koop@xxxxxx> > > Hello, > > While using the mmc_spi driver occasionally errors like this popped up: > > mmcblk0: error -84 transferring data > end_request: I/O error, dev mmcblk0, sector 581756 > > I looked on the Internet for occurences of the same problem and came > across a helpful post [1]. It includes source code to reproduce the bug. > There is also an analysis about the cause. During transmission data in > the supplied buffer is being modified. Thus the previously calculated > checksum is not correct anymore. > > After some digging I found out that device drivers are supposed to > report they need stable writes. To fix this I set the appropriate flag > at queue initialization if CRC checksumming is enabled for that SPI host. > > [1] > https://groups.google.com/forum/#!msg/sim1/gLlzWeXGFr8/KevXinUXfc8J > > Signed-off-by: Andreas Koop <andreas.koop@xxxxxx> > [shihpo: rebase this on v5.3-rc1] > Signed-off-by: ShihPo Hung <shihpo.hung@xxxxxxxxxx> Wow, that was an old bug that needed to be fixed! Thanks for re-posting! I have applied this for fixes and by adding a stable tag! I also decided to keep Andreas as the author as it seems like the code is very similar to its original. I also cleanup up the changelog, but just a little bit. Kind regards Uffe > > Cc: Andreas Koop <andreas.koop@xxxxxx> > Cc: Ulf Hansson <ulf.hansson@xxxxxxxxxx> > Cc: linux-mmc@xxxxxxxxxxxxxxx > Cc: Paul Walmsley <paul.walmsley@xxxxxxxxxx> > --- > drivers/mmc/core/queue.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c > index e327f80..7102e2e 100644 > --- a/drivers/mmc/core/queue.c > +++ b/drivers/mmc/core/queue.c > @@ -10,6 +10,7 @@ > #include <linux/kthread.h> > #include <linux/scatterlist.h> > #include <linux/dma-mapping.h> > +#include <linux/backing-dev.h> > > #include <linux/mmc/card.h> > #include <linux/mmc/host.h> > @@ -427,6 +428,10 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card) > goto free_tag_set; > } > > + if (mmc_host_is_spi(host) && host->use_spi_crc) > + mq->queue->backing_dev_info->capabilities |= > + BDI_CAP_STABLE_WRITES; > + > mq->queue->queuedata = mq; > blk_queue_rq_timeout(mq->queue, 60 * HZ); > > -- > 2.7.4 >