Re: [PATCH v2] mmc: mmc_spi: Enable stable writes

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

 



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
>



[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