Commit e3ae3401 authored by Ulf Hansson's avatar Ulf Hansson

mmc: core: Use a minimum 1600ms timeout when enabling CACHE ctrl

Some eMMCs from Micron have been reported to need ~800 ms timeout, while
enabling the CACHE ctrl after running sudden power failure tests. The
needed timeout is greater than what the card specifies as its generic CMD6
timeout, through the EXT_CSD register, hence the problem.

Normally we would introduce a card quirk to extend the timeout for these
specific Micron cards. However, due to the rather complicated debug process
needed to find out the error, let's simply use a minimum timeout of 1600ms,
the double of what has been reported, for all cards when enabling CACHE
ctrl.
Reported-by: default avatarSjoerd Simons <sjoerd.simons@collabora.co.uk>
Reported-by: default avatarAndreas Dannenberg <dannenberg@ti.com>
Reported-by: default avatarFaiz Abbas <faiz_abbas@ti.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent ba9f39a7
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "pwrseq.h" #include "pwrseq.h"
#define DEFAULT_CMD6_TIMEOUT_MS 500 #define DEFAULT_CMD6_TIMEOUT_MS 500
#define MIN_CACHE_EN_TIMEOUT_MS 1600
static const unsigned int tran_exp[] = { static const unsigned int tran_exp[] = {
10000, 100000, 1000000, 10000000, 10000, 100000, 1000000, 10000000,
...@@ -1789,13 +1790,18 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr, ...@@ -1789,13 +1790,18 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
} }
/* /*
* If cache size is higher than 0, this indicates * If cache size is higher than 0, this indicates the existence of cache
* the existence of cache and it can be turned on. * and it can be turned on. Note that some eMMCs from Micron has been
* reported to need ~800 ms timeout, while enabling the cache after
* sudden power failure tests. Let's extend the timeout to a minimum of
* DEFAULT_CACHE_EN_TIMEOUT_MS and do it for all cards.
*/ */
if (card->ext_csd.cache_size > 0) { if (card->ext_csd.cache_size > 0) {
unsigned int timeout_ms = MIN_CACHE_EN_TIMEOUT_MS;
timeout_ms = max(card->ext_csd.generic_cmd6_time, timeout_ms);
err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
EXT_CSD_CACHE_CTRL, 1, EXT_CSD_CACHE_CTRL, 1, timeout_ms);
card->ext_csd.generic_cmd6_time);
if (err && err != -EBADMSG) if (err && err != -EBADMSG)
goto free_card; goto free_card;
......
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