Re: [PATCH] mmc: block: avoid multiblock reads for the last sector in SPI mode

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

 



On Thu, 4 Oct 2018 at 18:05, Clément Péron <peron.clem@xxxxxxxxx> wrote:
>
> From: Chris Boot <bootc@xxxxxxxxx>
>
> I was trying to get a Micro-SD card working over SPI today when I ran
> into an issue which made the card unusable. The card was probed
> correctly, and the msdos partition table was read, but then some command
> was sent that made the card go into a bad state and stay that way. Only
> a re-probe would get the card unstuck and only until just after the
> partition tables were read.
>
> After some digging I ran into a post [1] on the spi-devel-general mailing
> list where someone had exactly the same issue as me, but back in 2007.
> There was a patch attached which, after some cleanup, fixes the issue
> completely for me.
>
> I have tried this with 3 different Micro-SD cards, all of which suffered
> from the problem before the patch and none of which fail after the
> patch.
>
> The error shows up as lots of:
> mmcblk0: error -38 sending status comand, retrying
> mmcblk0: error -38 sending status comand, retrying
> mmcblk0: error -38 sending status comand, aborting
>
>    1 : http://permalink.gmane.org/gmane.linux.kernel.spi.devel/516
>
> Signed-off-by: Chris Boot <bootc@xxxxxxxxx>
> Signed-off-by: Clément Péron <peron.clem@xxxxxxxxx>

Hi,

I got issue with some SD Cards over SPI.
After some debugging I understand that there is an issue with reading
latest sector in multiblock mode.
Googling and found this patch from 2007
https://lore.kernel.org/patchwork/patch/305060/
I test it on my Kernel 4.9 and was fixing my issue !

If someone could have a look at it,

Thanks,
Clément


> ---
>  drivers/mmc/core/block.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index a0b9102c4c6e..7bf94ed96506 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1370,6 +1370,16 @@ static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq,
>                 brq->data.blocks = card->host->max_blk_count;
>
>         if (brq->data.blocks > 1) {
> +               /*
> +                * Some SD cards in SPI mode return a CRC error or even lock up
> +                * completely when trying to read the last block using a
> +                * multiblock read command.
> +                */
> +               if (mmc_host_is_spi(card->host) && (rq_data_dir(req) == READ) &&
> +                               (blk_rq_pos(req) + blk_rq_sectors(req) ==
> +                                       get_capacity(md->disk)))
> +                       brq->data.blocks--;
> +
>                 /*
>                  * After a read error, we redo the request one sector
>                  * at a time in order to accurately determine which
> --
> 2.17.1
>




[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