mmc: quirks: add new quirk that allows Cache disable

This change allows us to prevent cache enable for certain
cards that have broken cache functionality.

Change-Id: I81da383315f1ab39f60b51a85c40b3737b058f56
Signed-off-by: Talel Shenhar <tatias@codeaurora.org>
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Ram Prakash Gupta <rampraka@codeaurora.org>
This commit is contained in:
Ram Prakash Gupta
2019-07-22 20:11:45 +05:30
parent 8ba52d5dbe
commit a073798a2b
2 changed files with 39 additions and 19 deletions

View File

@@ -2191,27 +2191,46 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
* If cache size is higher than 0, this indicates
* the existence of cache and it can be turned on.
*/
if (!mmc_card_broken_hpi(card) &&
(card->ext_csd.cache_size > 0) && card->ext_csd.hpi_en) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, 1,
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG) {
pr_err("%s: %s: mmc_switch() for CACHE_CTRL fails %d\n",
if (!mmc_card_broken_hpi(card) && card->ext_csd.cache_size > 0) {
if (card->ext_csd.hpi_en &&
(!(card->quirks & MMC_QUIRK_CACHE_DISABLE))) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, 1,
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG) {
pr_err("%s: %s: fail on CACHE_CTRL ON %d\n",
mmc_hostname(host), __func__, err);
goto free_card;
}
goto free_card;
}
/*
* Only if no error, cache is turned on successfully.
*/
if (err) {
pr_warn("%s: Cache is supported, but failed to turn on (%d)\n",
mmc_hostname(card->host), err);
card->ext_csd.cache_ctrl = 0;
err = 0;
/*
* Only if no error, cache is turned on successfully.
*/
if (err) {
pr_warn("%s: Cache is supported, but failed to turn on (%d)\n",
mmc_hostname(card->host), err);
card->ext_csd.cache_ctrl = 0;
err = 0;
} else {
card->ext_csd.cache_ctrl = 1;
}
} else {
card->ext_csd.cache_ctrl = 1;
/*
* mmc standard doesn't say what is the card default
* value for EXT_CSD_CACHE_CTRL.
* Hence, cache may be enabled by default by
* card vendors.
* Thus, it is best to explicitly disable cache in case
* we want to avoid cache.
*/
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, 0,
card->ext_csd.generic_cmd6_time);
if (err) {
pr_err("%s: %s: fail on CACHE_CTRL OFF %d\n",
mmc_hostname(host), __func__, err);
goto free_card;
}
}
}

View File

@@ -1017,7 +1017,8 @@ int mmc_flush_cache(struct mmc_card *card)
if (mmc_card_mmc(card) &&
(card->ext_csd.cache_size > 0) &&
(card->ext_csd.cache_ctrl & 1)) {
(card->ext_csd.cache_ctrl & 1) &&
(!(card->quirks & MMC_QUIRK_CACHE_DISABLE))) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_FLUSH_CACHE, 1, 0);
if (err)