lkml.org 
[lkml]   [2019]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 086/131] mmc: mmc_spi: Enable stable writes
    Date
    From: Andreas Koop <andreas.koop@zf.com>

    commit 3a6ffb3c8c3274a39dc8f2514526e645c5d21753 upstream.

    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 occurrences 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@zf.com>
    [shihpo: Rebase on top of v5.3-rc1]
    Signed-off-by: ShihPo Hung <shihpo.hung@sifive.com>
    Cc: Paul Walmsley <paul.walmsley@sifive.com>
    CC: stable@vger.kernel.org
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/mmc/core/queue.c | 5 +++++
    1 file changed, 5 insertions(+)

    --- 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>
    @@ -430,6 +431,10 @@ int mmc_init_queue(struct mmc_queue *mq,
    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);


    \
     
     \ /
      Last update: 2019-08-05 15:56    [W:4.139 / U:0.168 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site