[PATCH v2] mmc: mmc_spi: Enable stable writes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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>

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




[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux