Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: core: Add quirk for long data read time

Adds a quirk that sets the data read timeout to a fixed value instead
of relying on the information in the CSD. The timeout value chosen
is 300ms since that has proven enough for the problematic cards found,
but could be increased if other cards require this.

This patch also enables this quirk for certain Micron cards known to
have this problem.

Signed-off-by: Stefan Nilsson XK <stefan.xk.nilsson@stericsson.com>
Signed-off-by: Ulf Hansson <ulf.hansson@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Cc: <stable@kernel.org>
Signed-off-by: Chris Ball <cjb@laptop.org>

authored by

Stefan Nilsson XK and committed by
Chris Ball
6de5fc9c 7833c66b

+26
+8
drivers/mmc/card/block.c
··· 1606 1606 MMC_QUIRK_BLK_NO_CMD23), 1607 1607 MMC_FIXUP("MMC32G", 0x11, CID_OEMID_ANY, add_quirk_mmc, 1608 1608 MMC_QUIRK_BLK_NO_CMD23), 1609 + 1610 + /* 1611 + * Some Micron MMC cards needs longer data read timeout than 1612 + * indicated in CSD. 1613 + */ 1614 + MMC_FIXUP(CID_NAME_ANY, 0x13, 0x200, add_quirk_mmc, 1615 + MMC_QUIRK_LONG_READ_TIME), 1616 + 1609 1617 END_FIXUP 1610 1618 }; 1611 1619
+12
drivers/mmc/core/core.c
··· 529 529 data->timeout_clks = 0; 530 530 } 531 531 } 532 + 533 + /* 534 + * Some cards require longer data read timeout than indicated in CSD. 535 + * Address this by setting the read timeout to a "reasonably high" 536 + * value. For the cards tested, 300ms has proven enough. If necessary, 537 + * this value can be increased if other problematic cards require this. 538 + */ 539 + if (mmc_card_long_read_time(card) && data->flags & MMC_DATA_READ) { 540 + data->timeout_ns = 300000000; 541 + data->timeout_clks = 0; 542 + } 543 + 532 544 /* 533 545 * Some cards need very high timeouts if driven in SPI mode. 534 546 * The worst observed timeout was 900ms after writing a
+6
include/linux/mmc/card.h
··· 218 218 #define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */ 219 219 #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ 220 220 #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ 221 + #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ 221 222 /* byte mode */ 222 223 unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ 223 224 #define MMC_NO_POWER_NOTIFICATION 0 ··· 432 431 static inline int mmc_card_broken_byte_mode_512(const struct mmc_card *c) 433 432 { 434 433 return c->quirks & MMC_QUIRK_BROKEN_BYTE_MODE_512; 434 + } 435 + 436 + static inline int mmc_card_long_read_time(const struct mmc_card *c) 437 + { 438 + return c->quirks & MMC_QUIRK_LONG_READ_TIME; 435 439 } 436 440 437 441 #define mmc_card_name(c) ((c)->cid.prod_name)