1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 228fc64afSShawn Lin /* 328fc64afSShawn Lin * This file contains work-arounds for many known SD/MMC 428fc64afSShawn Lin * and SDIO hardware bugs. 528fc64afSShawn Lin * 628fc64afSShawn Lin * Copyright (c) 2011 Andrei Warkentin <andreiw@motorola.com> 728fc64afSShawn Lin * Copyright (c) 2011 Pierre Tardy <tardyp@gmail.com> 828fc64afSShawn Lin * Inspired from pci fixup code: 928fc64afSShawn Lin * Copyright (c) 1999 Martin Mares <mj@ucw.cz> 1028fc64afSShawn Lin * 1128fc64afSShawn Lin */ 1228fc64afSShawn Lin 1328fc64afSShawn Lin #include <linux/mmc/sdio_ids.h> 1428fc64afSShawn Lin 1528fc64afSShawn Lin #include "card.h" 1628fc64afSShawn Lin 17482cedd2SLee Jones static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = { 180e9cfcf4SShawn Lin #define INAND_CMD38_ARG_EXT_CSD 113 190e9cfcf4SShawn Lin #define INAND_CMD38_ARG_ERASE 0x00 200e9cfcf4SShawn Lin #define INAND_CMD38_ARG_TRIM 0x01 210e9cfcf4SShawn Lin #define INAND_CMD38_ARG_SECERASE 0x80 220e9cfcf4SShawn Lin #define INAND_CMD38_ARG_SECTRIM1 0x81 230e9cfcf4SShawn Lin #define INAND_CMD38_ARG_SECTRIM2 0x88 240e9cfcf4SShawn Lin /* CMD38 argument is passed through EXT_CSD[113] */ 250e9cfcf4SShawn Lin MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk, 260e9cfcf4SShawn Lin MMC_QUIRK_INAND_CMD38), 270e9cfcf4SShawn Lin MMC_FIXUP("SEM04G", CID_MANFID_SANDISK, 0x100, add_quirk, 280e9cfcf4SShawn Lin MMC_QUIRK_INAND_CMD38), 290e9cfcf4SShawn Lin MMC_FIXUP("SEM08G", CID_MANFID_SANDISK, 0x100, add_quirk, 300e9cfcf4SShawn Lin MMC_QUIRK_INAND_CMD38), 310e9cfcf4SShawn Lin MMC_FIXUP("SEM16G", CID_MANFID_SANDISK, 0x100, add_quirk, 320e9cfcf4SShawn Lin MMC_QUIRK_INAND_CMD38), 330e9cfcf4SShawn Lin MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk, 340e9cfcf4SShawn Lin MMC_QUIRK_INAND_CMD38), 350e9cfcf4SShawn Lin 360e9cfcf4SShawn Lin /* 370e9cfcf4SShawn Lin * Some MMC cards experience performance degradation with CMD23 380e9cfcf4SShawn Lin * instead of CMD12-bounded multiblock transfers. For now we'll 390e9cfcf4SShawn Lin * black list what's bad... 400e9cfcf4SShawn Lin * - Certain Toshiba cards. 410e9cfcf4SShawn Lin * 420e9cfcf4SShawn Lin * N.B. This doesn't affect SD cards. 430e9cfcf4SShawn Lin */ 440e9cfcf4SShawn Lin MMC_FIXUP("SDMB-32", CID_MANFID_SANDISK, CID_OEMID_ANY, add_quirk_mmc, 450e9cfcf4SShawn Lin MMC_QUIRK_BLK_NO_CMD23), 460e9cfcf4SShawn Lin MMC_FIXUP("SDM032", CID_MANFID_SANDISK, CID_OEMID_ANY, add_quirk_mmc, 470e9cfcf4SShawn Lin MMC_QUIRK_BLK_NO_CMD23), 480e9cfcf4SShawn Lin MMC_FIXUP("MMC08G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc, 490e9cfcf4SShawn Lin MMC_QUIRK_BLK_NO_CMD23), 500e9cfcf4SShawn Lin MMC_FIXUP("MMC16G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc, 510e9cfcf4SShawn Lin MMC_QUIRK_BLK_NO_CMD23), 520e9cfcf4SShawn Lin MMC_FIXUP("MMC32G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc, 530e9cfcf4SShawn Lin MMC_QUIRK_BLK_NO_CMD23), 540e9cfcf4SShawn Lin 550e9cfcf4SShawn Lin /* 5691516a2aSChristoph Fritz * Some SD cards lockup while using CMD23 multiblock transfers. 5791516a2aSChristoph Fritz */ 5891516a2aSChristoph Fritz MMC_FIXUP("AF SD", CID_MANFID_ATP, CID_OEMID_ANY, add_quirk_sd, 5991516a2aSChristoph Fritz MMC_QUIRK_BLK_NO_CMD23), 6091516a2aSChristoph Fritz MMC_FIXUP("APUSD", CID_MANFID_APACER, 0x5048, add_quirk_sd, 6191516a2aSChristoph Fritz MMC_QUIRK_BLK_NO_CMD23), 6291516a2aSChristoph Fritz 6391516a2aSChristoph Fritz /* 640e9cfcf4SShawn Lin * Some MMC cards need longer data read timeout than indicated in CSD. 650e9cfcf4SShawn Lin */ 660e9cfcf4SShawn Lin MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, 670e9cfcf4SShawn Lin MMC_QUIRK_LONG_READ_TIME), 680e9cfcf4SShawn Lin MMC_FIXUP("008GE0", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc, 690e9cfcf4SShawn Lin MMC_QUIRK_LONG_READ_TIME), 700e9cfcf4SShawn Lin 710e9cfcf4SShawn Lin /* 720e9cfcf4SShawn Lin * On these Samsung MoviNAND parts, performing secure erase or 730e9cfcf4SShawn Lin * secure trim can result in unrecoverable corruption due to a 740e9cfcf4SShawn Lin * firmware bug. 750e9cfcf4SShawn Lin */ 760e9cfcf4SShawn Lin MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 770e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 780e9cfcf4SShawn Lin MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 790e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 800e9cfcf4SShawn Lin MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 810e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 820e9cfcf4SShawn Lin MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 830e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 840e9cfcf4SShawn Lin MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 850e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 860e9cfcf4SShawn Lin MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 870e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 880e9cfcf4SShawn Lin MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 890e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 900e9cfcf4SShawn Lin MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, 910e9cfcf4SShawn Lin MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), 920e9cfcf4SShawn Lin 930e9cfcf4SShawn Lin /* 940e9cfcf4SShawn Lin * On Some Kingston eMMCs, performing trim can result in 950e9cfcf4SShawn Lin * unrecoverable data conrruption occasionally due to a firmware bug. 960e9cfcf4SShawn Lin */ 970e9cfcf4SShawn Lin MMC_FIXUP("V10008", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc, 980e9cfcf4SShawn Lin MMC_QUIRK_TRIM_BROKEN), 990e9cfcf4SShawn Lin MMC_FIXUP("V10016", CID_MANFID_KINGSTON, CID_OEMID_ANY, add_quirk_mmc, 1000e9cfcf4SShawn Lin MMC_QUIRK_TRIM_BROKEN), 1010e9cfcf4SShawn Lin 1020e9cfcf4SShawn Lin END_FIXUP 1030e9cfcf4SShawn Lin }; 1040e9cfcf4SShawn Lin 105482cedd2SLee Jones static const struct mmc_fixup __maybe_unused mmc_ext_csd_fixups[] = { 1060e9cfcf4SShawn Lin /* 1070e9cfcf4SShawn Lin * Certain Hynix eMMC 4.41 cards might get broken when HPI feature 1080e9cfcf4SShawn Lin * is used so disable the HPI feature for such buggy cards. 1090e9cfcf4SShawn Lin */ 1100e9cfcf4SShawn Lin MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_HYNIX, 1110e9cfcf4SShawn Lin 0x014a, add_quirk, MMC_QUIRK_BROKEN_HPI, 5), 112dbe7dc6bSDirk Behme /* 113dbe7dc6bSDirk Behme * Certain Micron (Numonyx) eMMC 4.5 cards might get broken when HPI 114dbe7dc6bSDirk Behme * feature is used so disable the HPI feature for such buggy cards. 115dbe7dc6bSDirk Behme */ 116dbe7dc6bSDirk Behme MMC_FIXUP_EXT_CSD_REV(CID_NAME_ANY, CID_MANFID_NUMONYX, 117dbe7dc6bSDirk Behme 0x014e, add_quirk, MMC_QUIRK_BROKEN_HPI, 6), 1180e9cfcf4SShawn Lin 1190e9cfcf4SShawn Lin END_FIXUP 1200e9cfcf4SShawn Lin }; 1210e9cfcf4SShawn Lin 12216568b4aSH. Nikolaus Schaller 123482cedd2SLee Jones static const struct mmc_fixup __maybe_unused sdio_fixup_methods[] = { 12416568b4aSH. Nikolaus Schaller SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, 12516568b4aSH. Nikolaus Schaller add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), 12616568b4aSH. Nikolaus Schaller 12716568b4aSH. Nikolaus Schaller SDIO_FIXUP(SDIO_VENDOR_ID_TI_WL1251, SDIO_DEVICE_ID_TI_WL1251, 12816568b4aSH. Nikolaus Schaller add_quirk, MMC_QUIRK_DISABLE_CD), 12916568b4aSH. Nikolaus Schaller 13028fc64afSShawn Lin SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271, 13128fc64afSShawn Lin add_quirk, MMC_QUIRK_NONSTD_FUNC_IF), 13228fc64afSShawn Lin 13328fc64afSShawn Lin SDIO_FIXUP(SDIO_VENDOR_ID_TI, SDIO_DEVICE_ID_TI_WL1271, 13428fc64afSShawn Lin add_quirk, MMC_QUIRK_DISABLE_CD), 13528fc64afSShawn Lin 13628fc64afSShawn Lin SDIO_FIXUP(SDIO_VENDOR_ID_STE, SDIO_DEVICE_ID_STE_CW1200, 13728fc64afSShawn Lin add_quirk, MMC_QUIRK_BROKEN_BYTE_MODE_512), 13828fc64afSShawn Lin 13928fc64afSShawn Lin SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797_F0, 14028fc64afSShawn Lin add_quirk, MMC_QUIRK_BROKEN_IRQ_POLLING), 14128fc64afSShawn Lin 1424bc90f49SPali Rohár SDIO_FIXUP(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887_F0, 1438ccd66f2SDiwakar Sharma add_limit_rate_quirk, 150000000), 1448ccd66f2SDiwakar Sharma 14528fc64afSShawn Lin END_FIXUP 14628fc64afSShawn Lin }; 14728fc64afSShawn Lin 14828fc64afSShawn Lin static inline void mmc_fixup_device(struct mmc_card *card, 14928fc64afSShawn Lin const struct mmc_fixup *table) 15028fc64afSShawn Lin { 15128fc64afSShawn Lin const struct mmc_fixup *f; 15228fc64afSShawn Lin u64 rev = cid_rev_card(card); 15328fc64afSShawn Lin 15428fc64afSShawn Lin for (f = table; f->vendor_fixup; f++) { 155*f3abe2e5SJérôme Pouiller if (f->manfid != CID_MANFID_ANY && 156*f3abe2e5SJérôme Pouiller f->manfid != card->cid.manfid) 157*f3abe2e5SJérôme Pouiller continue; 158*f3abe2e5SJérôme Pouiller if (f->oemid != CID_OEMID_ANY && 159*f3abe2e5SJérôme Pouiller f->oemid != card->cid.oemid) 160*f3abe2e5SJérôme Pouiller continue; 161*f3abe2e5SJérôme Pouiller if (f->name != CID_NAME_ANY && 162*f3abe2e5SJérôme Pouiller strncmp(f->name, card->cid.prod_name, 163*f3abe2e5SJérôme Pouiller sizeof(card->cid.prod_name))) 164*f3abe2e5SJérôme Pouiller continue; 165*f3abe2e5SJérôme Pouiller if (f->cis_vendor != (u16)SDIO_ANY_ID && 166*f3abe2e5SJérôme Pouiller f->cis_vendor != card->cis.vendor) 167*f3abe2e5SJérôme Pouiller continue; 168*f3abe2e5SJérôme Pouiller if (f->cis_device != (u16)SDIO_ANY_ID && 169*f3abe2e5SJérôme Pouiller f->cis_device != card->cis.device) 170*f3abe2e5SJérôme Pouiller continue; 171*f3abe2e5SJérôme Pouiller if (f->ext_csd_rev != EXT_CSD_REV_ANY && 172*f3abe2e5SJérôme Pouiller f->ext_csd_rev != card->ext_csd.rev) 173*f3abe2e5SJérôme Pouiller continue; 174*f3abe2e5SJérôme Pouiller if (rev < f->rev_start || rev > f->rev_end) 175*f3abe2e5SJérôme Pouiller continue; 176*f3abe2e5SJérôme Pouiller 177d75f773cSSakari Ailus dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup); 17828fc64afSShawn Lin f->vendor_fixup(card, f->data); 17928fc64afSShawn Lin } 18028fc64afSShawn Lin } 181