quirks.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * This file contains work-arounds for many known SD/MMC
  3. * and SDIO hardware bugs.
  4. *
  5. * Copyright (c) 2011 Andrei Warkentin <andreiw@motorola.com>
  6. * Copyright (c) 2011 Pierre Tardy <tardyp@gmail.com>
  7. * Inspired from pci fixup code:
  8. * Copyright (c) 1999 Martin Mares <mj@ucw.cz>
  9. *
  10. */
  11. #include <linux/mmc/sdio_ids.h>
  12. #include "card.h"
  13. static const struct mmc_fixup mmc_blk_fixups[] = {
  14. #define INAND_CMD38_ARG_EXT_CSD 113
  15. #define INAND_CMD38_ARG_ERASE 0x00
  16. #define INAND_CMD38_ARG_TRIM 0x01
  17. #define INAND_CMD38_ARG_SECERASE 0x80
  18. #define INAND_CMD38_ARG_SECTRIM1 0x81
  19. #define INAND_CMD38_ARG_SECTRIM2 0x88
  20. /* CMD38 argument is passed through EXT_CSD[113] */
  21. MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk,
  22. MMC_QUIRK_INAND_CMD38),
  23. MMC_FIXUP("SEM04G", CID_MANFID_SANDISK, 0x100, add_quirk,
  24. MMC_QUIRK_INAND_CMD38),
  25. MMC_FIXUP("SEM08G", CID_MANFID_SANDISK, 0x100, add_quirk,
  26. MMC_QUIRK_INAND_CMD38),
  27. MMC_FIXUP("SEM16G", CID_MANFID_SANDISK, 0x100, add_quirk,
  28. MMC_QUIRK_INAND_CMD38),
  29. MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk,
  30. MMC_QUIRK_INAND_CMD38),
  31. /*
  32. * Some MMC cards experience performance degradation with CMD23
  33. * instead of CMD12-bounded multiblock transfers. For now we'll
  34. * black list what's bad...
  35. * - Certain Toshiba cards.
  36. *
  37. * N.B. This doesn't affect SD cards.
  38. */
  39. MMC_FIXUP("SDMB-32", CID_MANFID_SANDISK, CID_OEMID_ANY, add_quirk_mmc,
  40. MMC_QUIRK_BLK_NO_CMD23),
  41. MMC_FIXUP("SDM032", CID_MANFID_SANDISK, CID_OEMID_ANY, add_quirk_mmc,
  42. MMC_QUIRK_BLK_NO_CMD23),
  43. MMC_FIXUP("MMC08G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
  44. MMC_QUIRK_BLK_NO_CMD23),
  45. MMC_FIXUP("MMC16G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
  46. MMC_QUIRK_BLK_NO_CMD23),
  47. MMC_FIXUP("MMC32G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
  48. MMC_QUIRK_BLK_NO_CMD23),
  49. /*
  50. * Some MMC cards need longer data read timeout than indicated in CSD.
  51. */
  52. MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc,
  53. MMC_QUIRK_LONG_READ_TIME),
  54. MMC_FIXUP("008GE0", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
  55. MMC_QUIRK_LONG_READ_TIME),
  56. /*
  57. * On these Samsung MoviNAND parts, performing secure erase or
  58. * secure trim can result in unrecoverable corruption due to a
  59. * firmware bug.
  60. */
  61. MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  62. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  63. MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  64. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  65. MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  66. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  67. MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  68. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  69. MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  70. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  71. MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  72. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  73. MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  74. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  75. MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  76. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  77. /*
  78. * On Some Kingston eMMCs, performing trim can result in
  79. * unrecoverable data conrruption occasionally due to a firmware bug.
  80. */
  81. MMC_FIXUP("V10008", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
  82. MMC_QUIRK_TRIM_BROKEN),
  83. MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
  84. MMC_QUIRK_TRIM_BROKEN),
  85. END_FIXUP
  86. };
  87. static const struct mmc_fixup mmc_ext_csd_fixups[] = {
  88. /*
  89. * Certain Hynix eMMC 4.41 cards might get broken when HPI feature
  90. * is used so disable the HPI feature for such buggy cards.
  91. */
  92. MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX,
  93. 0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5),
  94. END_FIXUP
  95. };
  96. static const struct mmc_fixup sdio_fixup_methods[] = {
  97. SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
  98. add_quirk, MMC_QUIRK_NONSTD_FUNC_IF),
  99. SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
  100. add_quirk, MMC_QUIRK_DISABLE_CD),
  101. SDIO_FIXUP(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200,
  102. add_quirk, MMC_QUIRK_BROKEN_BYTE_MODE_512),
  103. SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_F0,
  104. add_quirk, MMC_QUIRK_BROKEN_IRQ_POLLING),
  105. END_FIXUP
  106. };
  107. static inline void mmc_fixup_device(struct mmc_card *card,
  108. const struct mmc_fixup *table)
  109. {
  110. const struct mmc_fixup *f;
  111. u64 rev = cid_rev_card(card);
  112. for (f = table; f->vendor_fixup; f++) {
  113. if ((f->manfid == CID_MANFID_ANY ||
  114. f->manfid == card->cid.manfid) &&
  115. (f->oemid == CID_OEMID_ANY ||
  116. f->oemid == card->cid.oemid) &&
  117. (f->name == CID_NAME_ANY ||
  118. !strncmp(f->name, card->cid.prod_name,
  119. sizeof(card->cid.prod_name))) &&
  120. (f->cis_vendor == card->cis.vendor ||
  121. f->cis_vendor == (u16) SDIO_ANY_ID) &&
  122. (f->cis_device == card->cis.device ||
  123. f->cis_device == (u16) SDIO_ANY_ID) &&
  124. (f->ext_csd_rev == EXT_CSD_REV_ANY ||
  125. f->ext_csd_rev == card->ext_csd.rev) &&
  126. rev >= f->rev_start && rev <= f->rev_end) {
  127. dev_dbg(&card->dev, "calling %pf\n", f->vendor_fixup);
  128. f->vendor_fixup(card, f->data);
  129. }
  130. }
  131. }