quirks.h 6.0 KB

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