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 >