Skip to content

Commit c467c8f

Browse files
Marek Vasutstorulf
authored andcommitted
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: 08ebf90 ("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>
1 parent f1738a1 commit c467c8f

File tree

4 files changed

+38
-8
lines changed

4 files changed

+38
-8
lines changed

drivers/mmc/core/card.h

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ struct mmc_fixup {
5353
unsigned int manfid;
5454
unsigned short oemid;
5555

56+
/* Manufacturing date */
57+
unsigned short year;
58+
unsigned char month;
59+
5660
/* SDIO-specific fields. You can use SDIO_ANY_ID here of course */
5761
u16 cis_vendor, cis_device;
5862

@@ -68,6 +72,8 @@ struct mmc_fixup {
6872

6973
#define CID_MANFID_ANY (-1u)
7074
#define CID_OEMID_ANY ((unsigned short) -1)
75+
#define CID_YEAR_ANY ((unsigned short) -1)
76+
#define CID_MONTH_ANY ((unsigned char) -1)
7177
#define CID_NAME_ANY (NULL)
7278

7379
#define EXT_CSD_REV_ANY (-1u)
@@ -81,17 +87,21 @@ struct mmc_fixup {
8187
#define CID_MANFID_APACER 0x27
8288
#define CID_MANFID_KINGSTON 0x70
8389
#define CID_MANFID_HYNIX 0x90
90+
#define CID_MANFID_KINGSTON_SD 0x9F
8491
#define CID_MANFID_NUMONYX 0xFE
8592

8693
#define END_FIXUP { NULL }
8794

88-
#define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \
89-
_cis_vendor, _cis_device, \
90-
_fixup, _data, _ext_csd_rev) \
95+
#define _FIXUP_EXT(_name, _manfid, _oemid, _year, _month, \
96+
_rev_start, _rev_end, \
97+
_cis_vendor, _cis_device, \
98+
_fixup, _data, _ext_csd_rev) \
9199
{ \
92100
.name = (_name), \
93101
.manfid = (_manfid), \
94102
.oemid = (_oemid), \
103+
.year = (_year), \
104+
.month = (_month), \
95105
.rev_start = (_rev_start), \
96106
.rev_end = (_rev_end), \
97107
.cis_vendor = (_cis_vendor), \
@@ -103,8 +113,8 @@ struct mmc_fixup {
103113

104114
#define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \
105115
_fixup, _data, _ext_csd_rev) \
106-
_FIXUP_EXT(_name, _manfid, \
107-
_oemid, _rev_start, _rev_end, \
116+
_FIXUP_EXT(_name, _manfid, _oemid, CID_YEAR_ANY, CID_MONTH_ANY, \
117+
_rev_start, _rev_end, \
108118
SDIO_ANY_ID, SDIO_ANY_ID, \
109119
_fixup, _data, _ext_csd_rev) \
110120

@@ -118,8 +128,9 @@ struct mmc_fixup {
118128
_ext_csd_rev)
119129

120130
#define SDIO_FIXUP(_vendor, _device, _fixup, _data) \
121-
_FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \
122-
CID_OEMID_ANY, 0, -1ull, \
131+
_FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, CID_OEMID_ANY, \
132+
CID_YEAR_ANY, CID_MONTH_ANY, \
133+
0, -1ull, \
123134
_vendor, _device, \
124135
_fixup, _data, EXT_CSD_REV_ANY) \
125136

@@ -264,4 +275,9 @@ static inline int mmc_card_broken_sd_discard(const struct mmc_card *c)
264275
return c->quirks & MMC_QUIRK_BROKEN_SD_DISCARD;
265276
}
266277

278+
static inline int mmc_card_broken_sd_cache(const struct mmc_card *c)
279+
{
280+
return c->quirks & MMC_QUIRK_BROKEN_SD_CACHE;
281+
}
282+
267283
#endif

drivers/mmc/core/quirks.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,15 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
5353
MMC_FIXUP("MMC32G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
5454
MMC_QUIRK_BLK_NO_CMD23),
5555

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+
5665
/*
5766
* Some SD cards lockup while using CMD23 multiblock transfers.
5867
*/
@@ -223,6 +232,10 @@ static inline void mmc_fixup_device(struct mmc_card *card,
223232
if (f->of_compatible &&
224233
!mmc_fixup_of_compatible_match(card, f->of_compatible))
225234
continue;
235+
if (f->year != CID_YEAR_ANY && f->year != card->cid.year)
236+
continue;
237+
if (f->month != CID_MONTH_ANY && f->month != card->cid.month)
238+
continue;
226239

227240
dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
228241
f->vendor_fixup(card, f->data);

drivers/mmc/core/sd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ static int sd_parse_ext_reg_perf(struct mmc_card *card, u8 fno, u8 page,
11701170
card->ext_perf.feature_support |= SD_EXT_PERF_HOST_MAINT;
11711171

11721172
/* 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))
11741174
card->ext_perf.feature_support |= SD_EXT_PERF_CACHE;
11751175

11761176
/* Command queue support indicated via queue depth bits (0 to 4). */

include/linux/mmc/card.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ struct mmc_card {
294294
#define MMC_QUIRK_TRIM_BROKEN (1<<12) /* Skip trim */
295295
#define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */
296296
#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 */
297298

298299
bool reenable_cmdq; /* Re-enable Command Queue */
299300

0 commit comments

Comments
 (0)