|
@@ -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,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
- * If cache size is higher than 0, this indicates
|
|
|
|
|
- * the existence of cache and it can be turned on.
|
|
|
|
|
|
|
+ * If cache size is higher than 0, this indicates the existence of cache
|
|
|
|
|
+ * 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,
|
|
|
|
|
- card->ext_csd.generic_cmd6_time);
|
|
|
|
|
|
|
+ EXT_CSD_CACHE_CTRL, 1, timeout_ms);
|
|
|
if (err && err != -EBADMSG)
|
|
if (err && err != -EBADMSG)
|
|
|
goto free_card;
|
|
goto free_card;
|
|
|
|
|
|