Add test patch for reboot issue
This commit is contained in:
parent
2bb33e11af
commit
f830ebb8c2
@ -0,0 +1,81 @@
|
|||||||
|
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
|
||||||
|
index 38a7586b..0e856ff6 100644
|
||||||
|
--- a/drivers/mmc/core/block.c
|
||||||
|
+++ b/drivers/mmc/core/block.c
|
||||||
|
@@ -1237,7 +1237,7 @@ static void mmc_blk_issue_flush(struct mmc_queue *mq, struct request *req)
|
||||||
|
struct mmc_card *card = md->queue.card;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
- ret = mmc_flush_cache(card);
|
||||||
|
+ ret = mmc_flush_cache(card, false);
|
||||||
|
blk_mq_end_request(req, ret ? BLK_STS_IOERR : BLK_STS_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
|
||||||
|
index 6f8ebd6c..cc9cb5ce 100644
|
||||||
|
--- a/drivers/mmc/core/mmc.c
|
||||||
|
+++ b/drivers/mmc/core/mmc.c
|
||||||
|
@@ -1985,7 +1985,7 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = mmc_flush_cache(host->card);
|
||||||
|
+ err = mmc_flush_cache(host->card, false);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
@@ -2125,7 +2125,7 @@ static int mmc_reset(struct mmc_host *host)
|
||||||
|
* In the case of recovery, we can't expect flushing the cache to work
|
||||||
|
* always, but we have a go and ignore errors.
|
||||||
|
*/
|
||||||
|
- mmc_flush_cache(host->card);
|
||||||
|
+ mmc_flush_cache(host->card, true);
|
||||||
|
|
||||||
|
if ((host->caps & MMC_CAP_HW_RESET) && host->ops->hw_reset &&
|
||||||
|
mmc_can_reset(card)) {
|
||||||
|
diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c
|
||||||
|
index 42d6aa89..957e8a20 100644
|
||||||
|
--- a/drivers/mmc/core/mmc_ops.c
|
||||||
|
+++ b/drivers/mmc/core/mmc_ops.c
|
||||||
|
@@ -1005,18 +1005,23 @@ void mmc_start_bkops(struct mmc_card *card, bool from_exception)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mmc_start_bkops);
|
||||||
|
|
||||||
|
-/*
|
||||||
|
- * Flush the cache to the non-volatile storage.
|
||||||
|
+/**
|
||||||
|
+ * mmc_flush_cache - Flush (write) the cache to the non-volatile storage.
|
||||||
|
+ * @card: the MMC card to flush
|
||||||
|
+ * @ignore_err: Ignore any associated errors, also skips polling for the
|
||||||
|
+ * command status in case card is in bad state
|
||||||
|
*/
|
||||||
|
-int mmc_flush_cache(struct mmc_card *card)
|
||||||
|
+int mmc_flush_cache(struct mmc_card *card, bool ignore_err )
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
+ bool use_busy_signal = !ignore_err;
|
||||||
|
|
||||||
|
if (mmc_card_mmc(card) &&
|
||||||
|
(card->ext_csd.cache_size > 0) &&
|
||||||
|
(card->ext_csd.cache_ctrl & 1)) {
|
||||||
|
- err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||||
|
- EXT_CSD_FLUSH_CACHE, 1, 0);
|
||||||
|
+ err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
|
||||||
|
+ EXT_CSD_FLUSH_CACHE, 1, 0, 0, use_busy_signal,
|
||||||
|
+ true, false);
|
||||||
|
if (err)
|
||||||
|
pr_err("%s: cache flush error %d\n",
|
||||||
|
mmc_hostname(card->host), err);
|
||||||
|
diff --git a/drivers/mmc/core/mmc_ops.h b/drivers/mmc/core/mmc_ops.h
|
||||||
|
index a1390d48..47cdf920 100644
|
||||||
|
--- a/drivers/mmc/core/mmc_ops.h
|
||||||
|
+++ b/drivers/mmc/core/mmc_ops.h
|
||||||
|
@@ -42,7 +42,7 @@ int mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
|
||||||
|
unsigned int timeout_ms);
|
||||||
|
int mmc_stop_bkops(struct mmc_card *card);
|
||||||
|
void mmc_start_bkops(struct mmc_card *card, bool from_exception);
|
||||||
|
-int mmc_flush_cache(struct mmc_card *card);
|
||||||
|
+int mmc_flush_cache(struct mmc_card *card, bool ignore_err);
|
||||||
|
int mmc_cmdq_enable(struct mmc_card *card);
|
||||||
|
int mmc_cmdq_disable(struct mmc_card *card);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user