aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-10-12 06:57:05 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-10-12 06:57:05 -0400
commit4ea07abbfbdadb10bc67c2b78dc2dbfafa4b1009 (patch)
tree46517e9473a3845bae5d40900a10bccf68fe91af
parent60bd7be764e8adada97034b4836875b3e449bd7c (diff)
parent4f666675cdff0b986195413215eb062b7da6586f (diff)
Merge tag 'mmc-v4.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
Ulf writes: "MMC core: - Avoid fragile multiblock reads for the last sector in SPI mode WIFI/SDIO: - libertas: Fixup suspend sequence for the SDIO card" * tag 'mmc-v4.19-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: libertas: call into generic suspend code before turning off power mmc: block: avoid multiblock reads for the last sector in SPI mode
-rw-r--r--drivers/mmc/core/block.c10
-rw-r--r--drivers/net/wireless/marvell/libertas/if_sdio.c4
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index a0b9102c4c6e..e201ccb3fda4 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1371,6 +1371,16 @@ static void mmc_blk_data_prep(struct mmc_queue *mq, struct mmc_queue_req *mqrq,
1371 1371
1372 if (brq->data.blocks > 1) { 1372 if (brq->data.blocks > 1) {
1373 /* 1373 /*
1374 * Some SD cards in SPI mode return a CRC error or even lock up
1375 * completely when trying to read the last block using a
1376 * multiblock read command.
1377 */
1378 if (mmc_host_is_spi(card->host) && (rq_data_dir(req) == READ) &&
1379 (blk_rq_pos(req) + blk_rq_sectors(req) ==
1380 get_capacity(md->disk)))
1381 brq->data.blocks--;
1382
1383 /*
1374 * After a read error, we redo the request one sector 1384 * After a read error, we redo the request one sector
1375 * at a time in order to accurately determine which 1385 * at a time in order to accurately determine which
1376 * sectors can be read successfully. 1386 * sectors can be read successfully.
diff --git a/drivers/net/wireless/marvell/libertas/if_sdio.c b/drivers/net/wireless/marvell/libertas/if_sdio.c
index 43743c26c071..39bf85d0ade0 100644
--- a/drivers/net/wireless/marvell/libertas/if_sdio.c
+++ b/drivers/net/wireless/marvell/libertas/if_sdio.c
@@ -1317,6 +1317,10 @@ static int if_sdio_suspend(struct device *dev)
1317 if (priv->wol_criteria == EHS_REMOVE_WAKEUP) { 1317 if (priv->wol_criteria == EHS_REMOVE_WAKEUP) {
1318 dev_info(dev, "Suspend without wake params -- powering down card\n"); 1318 dev_info(dev, "Suspend without wake params -- powering down card\n");
1319 if (priv->fw_ready) { 1319 if (priv->fw_ready) {
1320 ret = lbs_suspend(priv);
1321 if (ret)
1322 return ret;
1323
1320 priv->power_up_on_resume = true; 1324 priv->power_up_on_resume = true;
1321 if_sdio_power_off(card); 1325 if_sdio_power_off(card);
1322 } 1326 }