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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user