Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston Canvas Go Plus from 11/2019

This microSD card never clears Flush Cache bit after cache flush has
been started in sd_flush_cache(). This leads e.g. to failure to mount
file system. Add a quirk which disables the SD cache for this specific
card from specific manufacturing date of 11/2019, since on newer dated
cards from 05/2023 the cache flush works correctly.

Fixes: 08ebf903af57 ("mmc: core: Fixup support for writeback-cache for eMMC and SD")
Signed-off-by: Marek Vasut <marex@denx.de>
Link: https://lore.kernel.org/r/20230620102713.7701-1-marex@denx.de
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by

Marek Vasut and committed by
Ulf Hansson
c467c8f0 f1738a1f

+38 -8
+23 -7
drivers/mmc/core/card.h
··· 53 53 unsigned int manfid; 54 54 unsigned short oemid; 55 55 56 + /* Manufacturing date */ 57 + unsigned short year; 58 + unsigned char month; 59 + 56 60 /* SDIO-specific fields. You can use SDIO_ANY_ID here of course */ 57 61 u16 cis_vendor, cis_device; 58 62 ··· 72 68 73 69 #define CID_MANFID_ANY (-1u) 74 70 #define CID_OEMID_ANY ((unsigned short) -1) 71 + #define CID_YEAR_ANY ((unsigned short) -1) 72 + #define CID_MONTH_ANY ((unsigned char) -1) 75 73 #define CID_NAME_ANY (NULL) 76 74 77 75 #define EXT_CSD_REV_ANY (-1u) ··· 87 81 #define CID_MANFID_APACER 0x27 88 82 #define CID_MANFID_KINGSTON 0x70 89 83 #define CID_MANFID_HYNIX 0x90 84 + #define CID_MANFID_KINGSTON_SD 0x9F 90 85 #define CID_MANFID_NUMONYX 0xFE 91 86 92 87 #define END_FIXUP { NULL } 93 88 94 - #define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \ 95 - _cis_vendor, _cis_device, \ 96 - _fixup, _data, _ext_csd_rev) \ 89 + #define _FIXUP_EXT(_name, _manfid, _oemid, _year, _month, \ 90 + _rev_start, _rev_end, \ 91 + _cis_vendor, _cis_device, \ 92 + _fixup, _data, _ext_csd_rev) \ 97 93 { \ 98 94 .name = (_name), \ 99 95 .manfid = (_manfid), \ 100 96 .oemid = (_oemid), \ 97 + .year = (_year), \ 98 + .month = (_month), \ 101 99 .rev_start = (_rev_start), \ 102 100 .rev_end = (_rev_end), \ 103 101 .cis_vendor = (_cis_vendor), \ ··· 113 103 114 104 #define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \ 115 105 _fixup, _data, _ext_csd_rev) \ 116 - _FIXUP_EXT(_name, _manfid, \ 117 - _oemid, _rev_start, _rev_end, \ 106 + _FIXUP_EXT(_name, _manfid, _oemid, CID_YEAR_ANY, CID_MONTH_ANY, \ 107 + _rev_start, _rev_end, \ 118 108 SDIO_ANY_ID, SDIO_ANY_ID, \ 119 109 _fixup, _data, _ext_csd_rev) \ 120 110 ··· 128 118 _ext_csd_rev) 129 119 130 120 #define SDIO_FIXUP(_vendor, _device, _fixup, _data) \ 131 - _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \ 132 - CID_OEMID_ANY, 0, -1ull, \ 121 + _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, CID_OEMID_ANY, \ 122 + CID_YEAR_ANY, CID_MONTH_ANY, \ 123 + 0, -1ull, \ 133 124 _vendor, _device, \ 134 125 _fixup, _data, EXT_CSD_REV_ANY) \ 135 126 ··· 273 262 static inline int mmc_card_broken_sd_discard(const struct mmc_card *c) 274 263 { 275 264 return c->quirks & MMC_QUIRK_BROKEN_SD_DISCARD; 265 + } 266 + 267 + static inline int mmc_card_broken_sd_cache(const struct mmc_card *c) 268 + { 269 + return c->quirks & MMC_QUIRK_BROKEN_SD_CACHE; 276 270 } 277 271 278 272 #endif
+13
drivers/mmc/core/quirks.h
··· 54 54 MMC_QUIRK_BLK_NO_CMD23), 55 55 56 56 /* 57 + * Kingston Canvas Go! Plus microSD cards never finish SD cache flush. 58 + * This has so far only been observed on cards from 11/2019, while new 59 + * cards from 2023/05 do not exhibit this behavior. 60 + */ 61 + _FIXUP_EXT("SD64G", CID_MANFID_KINGSTON_SD, 0x5449, 2019, 11, 62 + 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd, 63 + MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY), 64 + 65 + /* 57 66 * Some SD cards lockup while using CMD23 multiblock transfers. 58 67 */ 59 68 MMC_FIXUP("AF SD", CID_MANFID_ATP, CID_OEMID_ANY, add_quirk_sd, ··· 231 222 continue; 232 223 if (f->of_compatible && 233 224 !mmc_fixup_of_compatible_match(card, f->of_compatible)) 225 + continue; 226 + if (f->year != CID_YEAR_ANY && f->year != card->cid.year) 227 + continue; 228 + if (f->month != CID_MONTH_ANY && f->month != card->cid.month) 234 229 continue; 235 230 236 231 dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
+1 -1
drivers/mmc/core/sd.c
··· 1170 1170 card->ext_perf.feature_support |= SD_EXT_PERF_HOST_MAINT; 1171 1171 1172 1172 /* Cache support at bit 0. */ 1173 - if (reg_buf[4] & BIT(0)) 1173 + if ((reg_buf[4] & BIT(0)) && !mmc_card_broken_sd_cache(card)) 1174 1174 card->ext_perf.feature_support |= SD_EXT_PERF_CACHE; 1175 1175 1176 1176 /* Command queue support indicated via queue depth bits (0 to 4). */
+1
include/linux/mmc/card.h
··· 294 294 #define MMC_QUIRK_TRIM_BROKEN (1<<12) /* Skip trim */ 295 295 #define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */ 296 296 #define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14) /* Disable broken SD discard support */ 297 + #define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */ 297 298 298 299 bool reenable_cmdq; /* Re-enable Command Queue */ 299 300