Commit 8bc0678b authored by Seungwon Jeon's avatar Seungwon Jeon Committed by Chris Ball

mmc: core: Separate the timeout value for cache-ctrl

Turning the cache off implies flushing cache which doesn't define
maximum timeout unlike cache-on. This patch will apply the generic
CMD6 timeout only for cache-on. Additionally the kernel message is
added for checking failure case of cache-on.
Signed-off-by: default avatarSeungwon Jeon <tgih.jun@samsung.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent 984589e5
...@@ -2321,6 +2321,7 @@ EXPORT_SYMBOL(mmc_flush_cache); ...@@ -2321,6 +2321,7 @@ EXPORT_SYMBOL(mmc_flush_cache);
int mmc_cache_ctrl(struct mmc_host *host, u8 enable) int mmc_cache_ctrl(struct mmc_host *host, u8 enable)
{ {
struct mmc_card *card = host->card; struct mmc_card *card = host->card;
unsigned int timeout;
int err = 0; int err = 0;
if (!(host->caps2 & MMC_CAP2_CACHE_CTRL) || if (!(host->caps2 & MMC_CAP2_CACHE_CTRL) ||
...@@ -2331,16 +2332,18 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable) ...@@ -2331,16 +2332,18 @@ int mmc_cache_ctrl(struct mmc_host *host, u8 enable)
(card->ext_csd.cache_size > 0)) { (card->ext_csd.cache_size > 0)) {
enable = !!enable; enable = !!enable;
if (card->ext_csd.cache_ctrl ^ enable) if (card->ext_csd.cache_ctrl ^ enable) {
timeout = enable ? card->ext_csd.generic_cmd6_time : 0;
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, enable, 0); EXT_CSD_CACHE_CTRL, enable, timeout);
if (err) if (err)
pr_err("%s: cache %s error %d\n", pr_err("%s: cache %s error %d\n",
mmc_hostname(card->host), mmc_hostname(card->host),
enable ? "on" : "off", enable ? "on" : "off",
err); err);
else else
card->ext_csd.cache_ctrl = enable; card->ext_csd.cache_ctrl = enable;
}
} }
return err; return err;
......
...@@ -1077,14 +1077,23 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, ...@@ -1077,14 +1077,23 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
if ((host->caps2 & MMC_CAP2_CACHE_CTRL) && if ((host->caps2 & MMC_CAP2_CACHE_CTRL) &&
card->ext_csd.cache_size > 0) { card->ext_csd.cache_size > 0) {
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, 1, 0); EXT_CSD_CACHE_CTRL, 1,
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG) if (err && err != -EBADMSG)
goto free_card; goto free_card;
/* /*
* Only if no error, cache is turned on successfully. * Only if no error, cache is turned on successfully.
*/ */
card->ext_csd.cache_ctrl = err ? 0 : 1; if (err) {
pr_warning("%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;
}
} }
if (!oldcard) if (!oldcard)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment