mmc: block: avoid multiblock reads for the last sector in SPI mode
commit 41591b38f5
upstream.
On some SD cards over SPI, reading with the multiblock read command the last
sector will leave the card in a bad state.
Remove last sectors from the multiblock reading cmd.
Signed-off-by: Chris Boot <bootc@bootc.net>
Signed-off-by: Clément Péron <peron.clem@gmail.com>
Cc: stable@vger.kernel.org # v4.10+
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bc183079dd
commit
d5833a50c6
@ -1613,6 +1613,16 @@ static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq,
|
|||||||
brq->data.blocks = card->host->max_blk_count;
|
brq->data.blocks = card->host->max_blk_count;
|
||||||
|
|
||||||
if (brq->data.blocks > 1) {
|
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
|
* After a read error, we redo the request one sector
|
||||||
* at a time in order to accurately determine which
|
* at a time in order to accurately determine which
|
||||||
|
Reference in New Issue
Block a user