quirks.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 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 MMC cards need longer data read timeout than indicated in CSD.
  52. */
  53. MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc,
  54. MMC_QUIRK_LONG_READ_TIME),
  55. MMC_FIXUP("008GE0", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
  56. MMC_QUIRK_LONG_READ_TIME),
  57. /*
  58. * On these Samsung MoviNAND parts, performing secure erase or
  59. * secure trim can result in unrecoverable corruption due to a
  60. * firmware bug.
  61. */
  62. MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  63. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  64. MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  65. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  66. MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  67. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  68. MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  69. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  70. MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  71. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  72. MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  73. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  74. MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  75. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  76. MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
  77. MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
  78. /*
  79. * On Some Kingston eMMCs, performing trim can result in
  80. * unrecoverable data conrruption occasionally due to a firmware bug.
  81. */
  82. MMC_FIXUP("V10008", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
  83. MMC_QUIRK_TRIM_BROKEN),
  84. MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc,
  85. MMC_QUIRK_TRIM_BROKEN),
  86. END_FIXUP
  87. };
  88. static const struct mmc_fixup mmc_ext_csd_fixups[] = {
  89. /*
  90. * Certain Hynix eMMC 4.41 cards might get broken when HPI feature
  91. * is used so disable the HPI feature for such buggy cards.
  92. */
  93. MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX,
  94. 0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5),
  95. END_FIXUP
  96. };
  97. static const struct mmc_fixup sdio_fixup_methods[] = {
  98. SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
  99. add_quirk, MMC_QUIRK_NONSTD_FUNC_IF),
  100. SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271,
  101. add_quirk, MMC_QUIRK_DISABLE_CD),
  102. SDIO_FIXUP(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200,
  103. add_quirk, MMC_QUIRK_BROKEN_BYTE_MODE_512),
  104. SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_F0,
  105. add_quirk, MMC_QUIRK_BROKEN_IRQ_POLLING),
  106. END_FIXUP
  107. };
  108. static inline void mmc_fixup_device(struct mmc_card *card,
  109. const struct mmc_fixup *table)
  110. {
  111. const struct mmc_fixup *f;
  112. u64 rev = cid_rev_card(card);
  113. for (f = table; f->vendor_fixup; f++) {
  114. if ((f->manfid == CID_MANFID_ANY ||
  115. f->manfid == card->cid.manfid) &&
  116. (f->oemid == CID_OEMID_ANY ||
  117. f->oemid == card->cid.oemid) &&
  118. (f->name == CID_NAME_ANY ||
  119. !strncmp(f->name, card->cid.prod_name,
  120. sizeof(card->cid.prod_name))) &&
  121. (f->cis_vendor == card->cis.vendor ||
  122. f->cis_vendor == (u16) SDIO_ANY_ID) &&
  123. (f->cis_device == card->cis.device ||
  124. f->cis_device == (u16) SDIO_ANY_ID) &&
  125. (f->ext_csd_rev == EXT_CSD_REV_ANY ||
  126. f->ext_csd_rev == card->ext_csd.rev) &&
  127. rev >= f->rev_start && rev <= f->rev_end) {
  128. dev_dbg(&card->dev, "calling %pf\n", f->vendor_fixup);
  129. f->vendor_fixup(card, f->data);
  130. }
  131. }
  132. }