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