+++ /dev/null
-From eca9c82eb96260dadb426749f2a3c45a5fbcefab Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 20 Jun 2023 12:27:13 +0200
-Subject: mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston Canvas Go Plus from
- 11/2019
-
-From: Marek Vasut <marex@denx.de>
-
-[ Upstream commit c467c8f081859d4f4ca4eee4fba54bb5d85d6c97 ]
-
-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>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/mmc/core/card.h | 30 +++++++++++++++++++++++-------
- drivers/mmc/core/quirks.h | 13 +++++++++++++
- drivers/mmc/core/sd.c | 2 +-
- include/linux/mmc/card.h | 1 +
- 4 files changed, 38 insertions(+), 8 deletions(-)
-
-diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h
-index 3c0ccb37ba36e..3431db49f3fbe 100644
---- a/drivers/mmc/core/card.h
-+++ b/drivers/mmc/core/card.h
-@@ -53,6 +53,10 @@ struct mmc_fixup {
- unsigned int manfid;
- unsigned short oemid;
-
-+ /* Manufacturing date */
-+ unsigned short year;
-+ unsigned char month;
-+
- /* SDIO-specific fields. You can use SDIO_ANY_ID here of course */
- u16 cis_vendor, cis_device;
-
-@@ -68,6 +72,8 @@ struct mmc_fixup {
-
- #define CID_MANFID_ANY (-1u)
- #define CID_OEMID_ANY ((unsigned short) -1)
-+#define CID_YEAR_ANY ((unsigned short) -1)
-+#define CID_MONTH_ANY ((unsigned char) -1)
- #define CID_NAME_ANY (NULL)
-
- #define EXT_CSD_REV_ANY (-1u)
-@@ -81,17 +87,21 @@ struct mmc_fixup {
- #define CID_MANFID_APACER 0x27
- #define CID_MANFID_KINGSTON 0x70
- #define CID_MANFID_HYNIX 0x90
-+#define CID_MANFID_KINGSTON_SD 0x9F
- #define CID_MANFID_NUMONYX 0xFE
-
- #define END_FIXUP { NULL }
-
--#define _FIXUP_EXT(_name, _manfid, _oemid, _rev_start, _rev_end, \
-- _cis_vendor, _cis_device, \
-- _fixup, _data, _ext_csd_rev) \
-+#define _FIXUP_EXT(_name, _manfid, _oemid, _year, _month, \
-+ _rev_start, _rev_end, \
-+ _cis_vendor, _cis_device, \
-+ _fixup, _data, _ext_csd_rev) \
- { \
- .name = (_name), \
- .manfid = (_manfid), \
- .oemid = (_oemid), \
-+ .year = (_year), \
-+ .month = (_month), \
- .rev_start = (_rev_start), \
- .rev_end = (_rev_end), \
- .cis_vendor = (_cis_vendor), \
-@@ -103,8 +113,8 @@ struct mmc_fixup {
-
- #define MMC_FIXUP_REV(_name, _manfid, _oemid, _rev_start, _rev_end, \
- _fixup, _data, _ext_csd_rev) \
-- _FIXUP_EXT(_name, _manfid, \
-- _oemid, _rev_start, _rev_end, \
-+ _FIXUP_EXT(_name, _manfid, _oemid, CID_YEAR_ANY, CID_MONTH_ANY, \
-+ _rev_start, _rev_end, \
- SDIO_ANY_ID, SDIO_ANY_ID, \
- _fixup, _data, _ext_csd_rev) \
-
-@@ -118,8 +128,9 @@ struct mmc_fixup {
- _ext_csd_rev)
-
- #define SDIO_FIXUP(_vendor, _device, _fixup, _data) \
-- _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, \
-- CID_OEMID_ANY, 0, -1ull, \
-+ _FIXUP_EXT(CID_NAME_ANY, CID_MANFID_ANY, CID_OEMID_ANY, \
-+ CID_YEAR_ANY, CID_MONTH_ANY, \
-+ 0, -1ull, \
- _vendor, _device, \
- _fixup, _data, EXT_CSD_REV_ANY) \
-
-@@ -231,4 +242,9 @@ static inline int mmc_card_broken_sd_discard(const struct mmc_card *c)
- return c->quirks & MMC_QUIRK_BROKEN_SD_DISCARD;
- }
-
-+static inline int mmc_card_broken_sd_cache(const struct mmc_card *c)
-+{
-+ return c->quirks & MMC_QUIRK_BROKEN_SD_CACHE;
-+}
-+
- #endif
-diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
-index 15ecd839a42f0..7cb861bf6b308 100644
---- a/drivers/mmc/core/quirks.h
-+++ b/drivers/mmc/core/quirks.h
-@@ -53,6 +53,15 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
- MMC_FIXUP("MMC32G", CID_MANFID_TOSHIBA, CID_OEMID_ANY, add_quirk_mmc,
- MMC_QUIRK_BLK_NO_CMD23),
-
-+ /*
-+ * Kingston Canvas Go! Plus microSD cards never finish SD cache flush.
-+ * This has so far only been observed on cards from 11/2019, while new
-+ * cards from 2023/05 do not exhibit this behavior.
-+ */
-+ _FIXUP_EXT("SD64G", CID_MANFID_KINGSTON_SD, 0x5449, 2019, 11,
-+ 0, -1ull, SDIO_ANY_ID, SDIO_ANY_ID, add_quirk_sd,
-+ MMC_QUIRK_BROKEN_SD_CACHE, EXT_CSD_REV_ANY),
-+
- /*
- * Some SD cards lockup while using CMD23 multiblock transfers.
- */
-@@ -196,6 +205,10 @@ static inline void mmc_fixup_device(struct mmc_card *card,
- if (f->of_compatible &&
- !mmc_fixup_of_compatible_match(card, f->of_compatible))
- continue;
-+ if (f->year != CID_YEAR_ANY && f->year != card->cid.year)
-+ continue;
-+ if (f->month != CID_MONTH_ANY && f->month != card->cid.month)
-+ continue;
-
- dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
- f->vendor_fixup(card, f->data);
-diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
-index 592166e53dce8..ee15da61f8421 100644
---- a/drivers/mmc/core/sd.c
-+++ b/drivers/mmc/core/sd.c
-@@ -1163,7 +1163,7 @@ static int sd_parse_ext_reg_perf(struct mmc_card *card, u8 fno, u8 page,
- card->ext_perf.feature_support |= SD_EXT_PERF_HOST_MAINT;
-
- /* Cache support at bit 0. */
-- if (reg_buf[4] & BIT(0))
-+ if ((reg_buf[4] & BIT(0)) && !mmc_card_broken_sd_cache(card))
- card->ext_perf.feature_support |= SD_EXT_PERF_CACHE;
-
- /* Command queue support indicated via queue depth bits (0 to 4). */
-diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
-index 12c7f2d3e2107..7a45edf6ce46a 100644
---- a/include/linux/mmc/card.h
-+++ b/include/linux/mmc/card.h
-@@ -293,6 +293,7 @@ struct mmc_card {
- #define MMC_QUIRK_TRIM_BROKEN (1<<12) /* Skip trim */
- #define MMC_QUIRK_BROKEN_HPI (1<<13) /* Disable broken HPI support */
- #define MMC_QUIRK_BROKEN_SD_DISCARD (1<<14) /* Disable broken SD discard support */
-+#define MMC_QUIRK_BROKEN_SD_CACHE (1<<15) /* Disable broken SD cache support */
-
- bool reenable_cmdq; /* Re-enable Command Queue */
-
---
-2.39.2
-
+++ /dev/null
-From 0f24dd438692b853427b177b5a527987792a3df8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Nov 2021 18:17:07 +0100
-Subject: mmc: core: allow to match the device tree to apply quirks
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Jérôme Pouiller <jerome.pouiller@silabs.com>
-
-[ Upstream commit b360b11026705369f7ea51653f75dbe611322338 ]
-
-MMC subsystem provides a way to apply quirks when a device match some
-properties (VID, PID, etc...) Unfortunately, some SDIO devices do not
-comply with the SDIO specification and does not provide reliable VID/PID
-(eg. Silabs WF200).
-
-So, the drivers for these devices rely on device tree to identify the
-device.
-
-This patch allows the MMC to also rely on the device tree to apply a
-quirk.
-
-Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
-Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
-Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
-Link: https://lore.kernel.org/r/9e68e3d23e62a78527aabc1281f89e15200c7d09.1636564631.git.hns@goldelico.com
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Stable-dep-of: c467c8f08185 ("mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston Canvas Go Plus from 11/2019")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/mmc/core/card.h | 3 +++
- drivers/mmc/core/quirks.h | 17 +++++++++++++++++
- 2 files changed, 20 insertions(+)
-
-diff --git a/drivers/mmc/core/card.h b/drivers/mmc/core/card.h
-index 5c6986131faff..3c0ccb37ba36e 100644
---- a/drivers/mmc/core/card.h
-+++ b/drivers/mmc/core/card.h
-@@ -59,6 +59,9 @@ struct mmc_fixup {
- /* for MMC cards */
- unsigned int ext_csd_rev;
-
-+ /* Match against functions declared in device tree */
-+ const char *of_compatible;
-+
- void (*vendor_fixup)(struct mmc_card *card, int data);
- int data;
- };
-diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
-index 5a936f1ec3cb4..15ecd839a42f0 100644
---- a/drivers/mmc/core/quirks.h
-+++ b/drivers/mmc/core/quirks.h
-@@ -10,6 +10,7 @@
- *
- */
-
-+#include <linux/of.h>
- #include <linux/mmc/sdio_ids.h>
-
- #include "card.h"
-@@ -151,6 +152,19 @@ static const struct mmc_fixup __maybe_unused sdio_fixup_methods[] = {
- END_FIXUP
- };
-
-+static inline bool mmc_fixup_of_compatible_match(struct mmc_card *card,
-+ const char *compatible)
-+{
-+ struct device_node *np;
-+
-+ for_each_child_of_node(mmc_dev(card->host)->of_node, np) {
-+ if (of_device_is_compatible(np, compatible))
-+ return true;
-+ }
-+
-+ return false;
-+}
-+
- static inline void mmc_fixup_device(struct mmc_card *card,
- const struct mmc_fixup *table)
- {
-@@ -179,6 +193,9 @@ static inline void mmc_fixup_device(struct mmc_card *card,
- continue;
- if (rev < f->rev_start || rev > f->rev_end)
- continue;
-+ if (f->of_compatible &&
-+ !mmc_fixup_of_compatible_match(card, f->of_compatible))
-+ continue;
-
- dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
- f->vendor_fixup(card, f->data);
---
-2.39.2
-
+++ /dev/null
-From 3425059f45152954d8a8f2f574aebe0f3a6593f5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Nov 2021 18:17:06 +0100
-Subject: mmc: core: rewrite mmc_fixup_device()
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Jérôme Pouiller <jerome.pouiller@silabs.com>
-
-[ Upstream commit f3abe2e509387907dd36886c1008445559ff4d91 ]
-
-Currently, mmc_fixup_device() is a bit difficult to read because of
-particularly long condition.
-
-Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
-Signed-off-by: H. Nikolaus Schaller <hns@goldelico.com>
-Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
-Link: https://lore.kernel.org/r/6515c1e8b3aa69ad273726f6e877d85c20f286ad.1636564631.git.hns@goldelico.com
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Stable-dep-of: c467c8f08185 ("mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston Canvas Go Plus from 11/2019")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/mmc/core/quirks.h | 41 +++++++++++++++++++++++----------------
- 1 file changed, 24 insertions(+), 17 deletions(-)
-
-diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
-index c8c0f50a2076d..5a936f1ec3cb4 100644
---- a/drivers/mmc/core/quirks.h
-+++ b/drivers/mmc/core/quirks.h
-@@ -158,22 +158,29 @@ static inline void mmc_fixup_device(struct mmc_card *card,
- u64 rev = cid_rev_card(card);
-
- for (f = table; f->vendor_fixup; f++) {
-- if ((f->manfid == CID_MANFID_ANY ||
-- f->manfid == card->cid.manfid) &&
-- (f->oemid == CID_OEMID_ANY ||
-- f->oemid == card->cid.oemid) &&
-- (f->name == CID_NAME_ANY ||
-- !strncmp(f->name, card->cid.prod_name,
-- sizeof(card->cid.prod_name))) &&
-- (f->cis_vendor == card->cis.vendor ||
-- f->cis_vendor == (u16) SDIO_ANY_ID) &&
-- (f->cis_device == card->cis.device ||
-- f->cis_device == (u16) SDIO_ANY_ID) &&
-- (f->ext_csd_rev == EXT_CSD_REV_ANY ||
-- f->ext_csd_rev == card->ext_csd.rev) &&
-- rev >= f->rev_start && rev <= f->rev_end) {
-- dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
-- f->vendor_fixup(card, f->data);
-- }
-+ if (f->manfid != CID_MANFID_ANY &&
-+ f->manfid != card->cid.manfid)
-+ continue;
-+ if (f->oemid != CID_OEMID_ANY &&
-+ f->oemid != card->cid.oemid)
-+ continue;
-+ if (f->name != CID_NAME_ANY &&
-+ strncmp(f->name, card->cid.prod_name,
-+ sizeof(card->cid.prod_name)))
-+ continue;
-+ if (f->cis_vendor != (u16)SDIO_ANY_ID &&
-+ f->cis_vendor != card->cis.vendor)
-+ continue;
-+ if (f->cis_device != (u16)SDIO_ANY_ID &&
-+ f->cis_device != card->cis.device)
-+ continue;
-+ if (f->ext_csd_rev != EXT_CSD_REV_ANY &&
-+ f->ext_csd_rev != card->ext_csd.rev)
-+ continue;
-+ if (rev < f->rev_start || rev > f->rev_end)
-+ continue;
-+
-+ dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup);
-+ f->vendor_fixup(card, f->data);
- }
- }
---
-2.39.2
-
+++ /dev/null
-From e71c90bcc65727d323b9a3cb40b263db7be5ee4c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 29 Apr 2022 17:21:18 +0200
-Subject: mmc: core: Support zeroout using TRIM for eMMC
-
-From: Vincent Whitchurch <vincent.whitchurch@axis.com>
-
-[ Upstream commit f7b6fc327327698924ef3afa0c3e87a5b7466af3 ]
-
-If an eMMC card supports TRIM and indicates that it erases to zeros, we can
-use it to support hardware offloading of REQ_OP_WRITE_ZEROES, so let's add
-support for this.
-
-Signed-off-by: Vincent Whitchurch <vincent.whitchurch@axis.com>
-Reviewed-by: Avri Altman <Avri.Altman@wdc.com>
-Link: https://lore.kernel.org/r/20220429152118.3617303-1-vincent.whitchurch@axis.com
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Stable-dep-of: c467c8f08185 ("mmc: Add MMC_QUIRK_BROKEN_SD_CACHE for Kingston Canvas Go Plus from 11/2019")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/mmc/core/block.c | 24 +++++++++++++++++++++---
- drivers/mmc/core/queue.c | 2 ++
- 2 files changed, 23 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
-index 0b72096f10e62..8105b8ef7cf40 100644
---- a/drivers/mmc/core/block.c
-+++ b/drivers/mmc/core/block.c
-@@ -126,6 +126,7 @@ struct mmc_blk_data {
- #define MMC_BLK_DISCARD BIT(2)
- #define MMC_BLK_SECDISCARD BIT(3)
- #define MMC_BLK_CQE_RECOVERY BIT(4)
-+#define MMC_BLK_TRIM BIT(5)
-
- /*
- * Only set in main mmc_blk_data associated
-@@ -1100,12 +1101,13 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
- blk_mq_end_request(req, ret ? BLK_STS_IOERR : BLK_STS_OK);
- }
-
--static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
-+static void mmc_blk_issue_erase_rq(struct mmc_queue *mq, struct request *req,
-+ int type, unsigned int erase_arg)
- {
- struct mmc_blk_data *md = mq->blkdata;
- struct mmc_card *card = md->queue.card;
- unsigned int from, nr;
-- int err = 0, type = MMC_BLK_DISCARD;
-+ int err = 0;
- blk_status_t status = BLK_STS_OK;
-
- if (!mmc_can_erase(card)) {
-@@ -1126,7 +1128,7 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
- if (card->quirks & MMC_QUIRK_INAND_CMD38) {
- err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
- INAND_CMD38_ARG_EXT_CSD,
-- card->erase_arg == MMC_TRIM_ARG ?
-+ erase_arg == MMC_TRIM_ARG ?
- INAND_CMD38_ARG_TRIM :
- INAND_CMD38_ARG_ERASE,
- card->ext_csd.generic_cmd6_time);
-@@ -1142,6 +1144,19 @@ static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
- blk_mq_end_request(req, status);
- }
-
-+static void mmc_blk_issue_trim_rq(struct mmc_queue *mq, struct request *req)
-+{
-+ mmc_blk_issue_erase_rq(mq, req, MMC_BLK_TRIM, MMC_TRIM_ARG);
-+}
-+
-+static void mmc_blk_issue_discard_rq(struct mmc_queue *mq, struct request *req)
-+{
-+ struct mmc_blk_data *md = mq->blkdata;
-+ struct mmc_card *card = md->queue.card;
-+
-+ mmc_blk_issue_erase_rq(mq, req, MMC_BLK_DISCARD, card->erase_arg);
-+}
-+
- static void mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
- struct request *req)
- {
-@@ -2336,6 +2351,9 @@ enum mmc_issued mmc_blk_mq_issue_rq(struct mmc_queue *mq, struct request *req)
- case REQ_OP_SECURE_ERASE:
- mmc_blk_issue_secdiscard_rq(mq, req);
- break;
-+ case REQ_OP_WRITE_ZEROES:
-+ mmc_blk_issue_trim_rq(mq, req);
-+ break;
- case REQ_OP_FLUSH:
- mmc_blk_issue_flush(mq, req);
- break;
-diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c
-index b15c034b42fb5..a72431703e527 100644
---- a/drivers/mmc/core/queue.c
-+++ b/drivers/mmc/core/queue.c
-@@ -191,6 +191,8 @@ static void mmc_queue_setup_discard(struct request_queue *q,
- q->limits.discard_granularity = SECTOR_SIZE;
- if (mmc_can_secure_erase_trim(card))
- blk_queue_flag_set(QUEUE_FLAG_SECERASE, q);
-+ if (mmc_can_trim(card) && card->erased_byte == 0)
-+ blk_queue_max_write_zeroes_sectors(q, max_discard);
- }
-
- static unsigned short mmc_get_max_segments(struct mmc_host *host)
---
-2.39.2
-
iwlwifi-don-t-dump_stack-when-we-get-an-unexpected-i.patch
wifi-iwlwifi-pcie-fix-null-pointer-dereference-in-iw.patch
wifi-cfg80211-rewrite-merging-of-inherited-elements.patch
-mmc-core-support-zeroout-using-trim-for-emmc.patch
wifi-iwlwifi-mvm-indicate-hw-decrypt-for-beacon-prot.patch
wifi-ath9k-convert-msecs-to-jiffies-where-needed.patch
bpf-omit-superfluous-address-family-check-in-__bpf_s.patch
netfilter-nf_conntrack_sip-fix-the-ct_sip_parse_nume.patch
ipvlan-fix-return-value-of-ipvlan_queue_xmit.patch
netlink-add-__sock_i_ino-for-__netlink_diag_dump.patch
-mmc-core-rewrite-mmc_fixup_device.patch
-mmc-core-allow-to-match-the-device-tree-to-apply-qui.patch
-mmc-add-mmc_quirk_broken_sd_cache-for-kingston-canva.patch
drm-amd-display-add-logging-for-display-mall-refresh.patch
radeon-avoid-double-free-in-ci_dpm_init.patch
drm-amd-display-explicitly-specify-update-type-per-p.patch