diff mbox series

mmc: core: Remove obsolete quirk for Sandisk cards

Message ID 20231105102944.1974512-1-avri.altman@wdc.com
State New
Headers show
Series mmc: core: Remove obsolete quirk for Sandisk cards | expand

Commit Message

Avri Altman Nov. 5, 2023, 10:29 a.m. UTC
This quirk applies to an old set of Sandisk cards that are no longer
being sold for many years now, and it is vanishingly unlikely that will
ever meet a V6.7 kernel.

I came across those old cards when I tried to decide what to do with
Sandisk cards that their quirk is designated by OEM id. For many years
we read wrong oemid, reading 16 bits instead of 8. Fixing it however,
turned out to be impractical, and it's better that each eMMC vendor will
handle its own devices.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/mmc/core/block.c  | 32 +-------------------------------
 drivers/mmc/core/quirks.h | 12 ------------
 include/linux/mmc/card.h  |  1 -
 3 files changed, 1 insertion(+), 44 deletions(-)

Comments

Avri Altman Nov. 14, 2023, 11:27 a.m. UTC | #1
Gentle ping.

Thanks,
Avri

> -----Original Message-----
> From: Avri Altman <avri.altman@wdc.com>
> Sent: Sunday, November 5, 2023 12:30 PM
> To: Ulf Hansson <ulf.hansson@linaro.org>; linux-mmc@vger.kernel.org
> Cc: Dominique Martinet <asmadeus@codewreck.org>; Avri Altman
> <Avri.Altman@wdc.com>
> Subject: [PATCH] mmc: core: Remove obsolete quirk for Sandisk cards
> 
> This quirk applies to an old set of Sandisk cards that are no longer being sold
> for many years now, and it is vanishingly unlikely that will ever meet a V6.7
> kernel.
> 
> I came across those old cards when I tried to decide what to do with Sandisk
> cards that their quirk is designated by OEM id. For many years we read
> wrong oemid, reading 16 bits instead of 8. Fixing it however, turned out to be
> impractical, and it's better that each eMMC vendor will handle its own
> devices.
> 
> Signed-off-by: Avri Altman <avri.altman@wdc.com>
> ---
>  drivers/mmc/core/block.c  | 32 +-------------------------------
> drivers/mmc/core/quirks.h | 12 ------------  include/linux/mmc/card.h  |  1 -
>  3 files changed, 1 insertion(+), 44 deletions(-)
> 
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index
> 152dfe593c43..6aa68ac1129e 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1122,17 +1122,7 @@ static void mmc_blk_issue_erase_rq(struct
> mmc_queue *mq, struct request *req,
>  	nr = blk_rq_sectors(req);
> 
>  	do {
> -		err = 0;
> -		if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -			err = mmc_switch(card,
> EXT_CSD_CMD_SET_NORMAL,
> -					 INAND_CMD38_ARG_EXT_CSD,
> -					 erase_arg == MMC_TRIM_ARG ?
> -					 INAND_CMD38_ARG_TRIM :
> -					 INAND_CMD38_ARG_ERASE,
> -					 card->ext_csd.generic_cmd6_time);
> -		}
> -		if (!err)
> -			err = mmc_erase(card, from, nr, erase_arg);
> +		err = mmc_erase(card, from, nr, erase_arg);
>  	} while (err == -EIO && !mmc_blk_reset(md, card->host, type));
>  	if (err)
>  		status = BLK_STS_IOERR;
> @@ -1182,17 +1172,6 @@ static void mmc_blk_issue_secdiscard_rq(struct
> mmc_queue *mq,
>  		arg = MMC_SECURE_ERASE_ARG;
> 
>  retry:
> -	if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> -				 INAND_CMD38_ARG_EXT_CSD,
> -				 arg == MMC_SECURE_TRIM1_ARG ?
> -				 INAND_CMD38_ARG_SECTRIM1 :
> -				 INAND_CMD38_ARG_SECERASE,
> -				 card->ext_csd.generic_cmd6_time);
> -		if (err)
> -			goto out_retry;
> -	}
> -
>  	err = mmc_erase(card, from, nr, arg);
>  	if (err == -EIO)
>  		goto out_retry;
> @@ -1202,15 +1181,6 @@ static void mmc_blk_issue_secdiscard_rq(struct
> mmc_queue *mq,
>  	}
> 
>  	if (arg == MMC_SECURE_TRIM1_ARG) {
> -		if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -			err = mmc_switch(card,
> EXT_CSD_CMD_SET_NORMAL,
> -					 INAND_CMD38_ARG_EXT_CSD,
> -					 INAND_CMD38_ARG_SECTRIM2,
> -					 card->ext_csd.generic_cmd6_time);
> -			if (err)
> -				goto out_retry;
> -		}
> -
>  		err = mmc_erase(card, from, nr,
> MMC_SECURE_TRIM2_ARG);
>  		if (err == -EIO)
>  			goto out_retry;
> diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h index
> cca71867bc4a..028f55f07ba3 100644
> --- a/drivers/mmc/core/quirks.h
> +++ b/drivers/mmc/core/quirks.h
> @@ -22,18 +22,6 @@ static const struct mmc_fixup __maybe_unused
> mmc_blk_fixups[] = {  #define INAND_CMD38_ARG_SECERASE 0x80  #define
> INAND_CMD38_ARG_SECTRIM1 0x81  #define
> INAND_CMD38_ARG_SECTRIM2 0x88
> -	/* CMD38 argument is passed through EXT_CSD[113] */
> -	MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -		  MMC_QUIRK_INAND_CMD38),
> -	MMC_FIXUP("SEM04G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -		  MMC_QUIRK_INAND_CMD38),
> -	MMC_FIXUP("SEM08G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -		  MMC_QUIRK_INAND_CMD38),
> -	MMC_FIXUP("SEM16G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -		  MMC_QUIRK_INAND_CMD38),
> -	MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -		  MMC_QUIRK_INAND_CMD38),
> -
>  	/*
>  	 * Some MMC cards experience performance degradation with
> CMD23
>  	 * instead of CMD12-bounded multiblock transfers. For now we'll diff
> --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index
> 7b12eebc5586..edb27f3c6489 100644
> --- a/include/linux/mmc/card.h
> +++ b/include/linux/mmc/card.h
> @@ -284,7 +284,6 @@ struct mmc_card {
>  						/* (missing CIA registers) */
>  #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4)		/* SDIO card
> has nonstd function interfaces */
>  #define MMC_QUIRK_DISABLE_CD	(1<<5)		/* disconnect
> CD/DAT[3] resistor */
> -#define MMC_QUIRK_INAND_CMD38	(1<<6)		/* iNAND devices
> have broken CMD38 */
>  #define MMC_QUIRK_BLK_NO_CMD23	(1<<7)		/* Avoid
> CMD23 for regular multiblock */
>  #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)	/* Avoid
> sending 512 bytes in */
>  						/* byte mode */
> --
> 2.42.0
Ulf Hansson Nov. 14, 2023, 4:21 p.m. UTC | #2
On Sun, 5 Nov 2023 at 11:29, Avri Altman <avri.altman@wdc.com> wrote:
>
> This quirk applies to an old set of Sandisk cards that are no longer
> being sold for many years now, and it is vanishingly unlikely that will
> ever meet a V6.7 kernel.

Are you really sure about that? The postmarket-os products are being
used in all kinds of different deployments, for example.

>
> I came across those old cards when I tried to decide what to do with
> Sandisk cards that their quirk is designated by OEM id. For many years
> we read wrong oemid, reading 16 bits instead of 8. Fixing it however,
> turned out to be impractical, and it's better that each eMMC vendor will
> handle its own devices.

Right, but I assume the quirk is working as expected for these old
Sandisk eMMCs, no?

>
> Signed-off-by: Avri Altman <avri.altman@wdc.com>

Kind regards
Uffe

> ---
>  drivers/mmc/core/block.c  | 32 +-------------------------------
>  drivers/mmc/core/quirks.h | 12 ------------
>  include/linux/mmc/card.h  |  1 -
>  3 files changed, 1 insertion(+), 44 deletions(-)
>
> diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
> index 152dfe593c43..6aa68ac1129e 100644
> --- a/drivers/mmc/core/block.c
> +++ b/drivers/mmc/core/block.c
> @@ -1122,17 +1122,7 @@ static void mmc_blk_issue_erase_rq(struct mmc_queue *mq, struct request *req,
>         nr = blk_rq_sectors(req);
>
>         do {
> -               err = 0;
> -               if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -                       err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> -                                        INAND_CMD38_ARG_EXT_CSD,
> -                                        erase_arg == MMC_TRIM_ARG ?
> -                                        INAND_CMD38_ARG_TRIM :
> -                                        INAND_CMD38_ARG_ERASE,
> -                                        card->ext_csd.generic_cmd6_time);
> -               }
> -               if (!err)
> -                       err = mmc_erase(card, from, nr, erase_arg);
> +               err = mmc_erase(card, from, nr, erase_arg);
>         } while (err == -EIO && !mmc_blk_reset(md, card->host, type));
>         if (err)
>                 status = BLK_STS_IOERR;
> @@ -1182,17 +1172,6 @@ static void mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
>                 arg = MMC_SECURE_ERASE_ARG;
>
>  retry:
> -       if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -               err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> -                                INAND_CMD38_ARG_EXT_CSD,
> -                                arg == MMC_SECURE_TRIM1_ARG ?
> -                                INAND_CMD38_ARG_SECTRIM1 :
> -                                INAND_CMD38_ARG_SECERASE,
> -                                card->ext_csd.generic_cmd6_time);
> -               if (err)
> -                       goto out_retry;
> -       }
> -
>         err = mmc_erase(card, from, nr, arg);
>         if (err == -EIO)
>                 goto out_retry;
> @@ -1202,15 +1181,6 @@ static void mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
>         }
>
>         if (arg == MMC_SECURE_TRIM1_ARG) {
> -               if (card->quirks & MMC_QUIRK_INAND_CMD38) {
> -                       err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
> -                                        INAND_CMD38_ARG_EXT_CSD,
> -                                        INAND_CMD38_ARG_SECTRIM2,
> -                                        card->ext_csd.generic_cmd6_time);
> -                       if (err)
> -                               goto out_retry;
> -               }
> -
>                 err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG);
>                 if (err == -EIO)
>                         goto out_retry;
> diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
> index cca71867bc4a..028f55f07ba3 100644
> --- a/drivers/mmc/core/quirks.h
> +++ b/drivers/mmc/core/quirks.h
> @@ -22,18 +22,6 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
>  #define INAND_CMD38_ARG_SECERASE 0x80
>  #define INAND_CMD38_ARG_SECTRIM1 0x81
>  #define INAND_CMD38_ARG_SECTRIM2 0x88
> -       /* CMD38 argument is passed through EXT_CSD[113] */
> -       MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -                 MMC_QUIRK_INAND_CMD38),
> -       MMC_FIXUP("SEM04G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -                 MMC_QUIRK_INAND_CMD38),
> -       MMC_FIXUP("SEM08G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -                 MMC_QUIRK_INAND_CMD38),
> -       MMC_FIXUP("SEM16G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -                 MMC_QUIRK_INAND_CMD38),
> -       MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk,
> -                 MMC_QUIRK_INAND_CMD38),
> -
>         /*
>          * Some MMC cards experience performance degradation with CMD23
>          * instead of CMD12-bounded multiblock transfers. For now we'll
> diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
> index 7b12eebc5586..edb27f3c6489 100644
> --- a/include/linux/mmc/card.h
> +++ b/include/linux/mmc/card.h
> @@ -284,7 +284,6 @@ struct mmc_card {
>                                                 /* (missing CIA registers) */
>  #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4)                /* SDIO card has nonstd function interfaces */
>  #define MMC_QUIRK_DISABLE_CD   (1<<5)          /* disconnect CD/DAT[3] resistor */
> -#define MMC_QUIRK_INAND_CMD38  (1<<6)          /* iNAND devices have broken CMD38 */
>  #define MMC_QUIRK_BLK_NO_CMD23 (1<<7)          /* Avoid CMD23 for regular multiblock */
>  #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)  /* Avoid sending 512 bytes in */
>                                                 /* byte mode */
> --
> 2.42.0
>
Linus Walleij Nov. 17, 2023, 8:49 a.m. UTC | #3
On Sun, Nov 5, 2023 at 11:30 AM Avri Altman <avri.altman@wdc.com> wrote:

> This quirk applies to an old set of Sandisk cards that are no longer
> being sold for many years now, and it is vanishingly unlikely that will
> ever meet a V6.7 kernel.
>
> I came across those old cards when I tried to decide what to do with
> Sandisk cards that their quirk is designated by OEM id. For many years
> we read wrong oemid, reading 16 bits instead of 8. Fixing it however,
> turned out to be impractical, and it's better that each eMMC vendor will
> handle its own devices.
>
> Signed-off-by: Avri Altman <avri.altman@wdc.com>

NAK why are you assuming these are not in use with v6.7?

One of these eMMC cards is in use on Nokia n900 which has an
active user community:
https://wiki.postmarketos.org/wiki/Nokia_N900_(nokia-n900)

I am using several of them on different ST-Ericsson U8500-based
systems, including the HREF reference design that even Ulf is
using now and then.

Yours,
Linus Walleij
diff mbox series

Patch

diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 152dfe593c43..6aa68ac1129e 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -1122,17 +1122,7 @@  static void mmc_blk_issue_erase_rq(struct mmc_queue *mq, struct request *req,
 	nr = blk_rq_sectors(req);
 
 	do {
-		err = 0;
-		if (card->quirks & MMC_QUIRK_INAND_CMD38) {
-			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
-					 INAND_CMD38_ARG_EXT_CSD,
-					 erase_arg == MMC_TRIM_ARG ?
-					 INAND_CMD38_ARG_TRIM :
-					 INAND_CMD38_ARG_ERASE,
-					 card->ext_csd.generic_cmd6_time);
-		}
-		if (!err)
-			err = mmc_erase(card, from, nr, erase_arg);
+		err = mmc_erase(card, from, nr, erase_arg);
 	} while (err == -EIO && !mmc_blk_reset(md, card->host, type));
 	if (err)
 		status = BLK_STS_IOERR;
@@ -1182,17 +1172,6 @@  static void mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
 		arg = MMC_SECURE_ERASE_ARG;
 
 retry:
-	if (card->quirks & MMC_QUIRK_INAND_CMD38) {
-		err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
-				 INAND_CMD38_ARG_EXT_CSD,
-				 arg == MMC_SECURE_TRIM1_ARG ?
-				 INAND_CMD38_ARG_SECTRIM1 :
-				 INAND_CMD38_ARG_SECERASE,
-				 card->ext_csd.generic_cmd6_time);
-		if (err)
-			goto out_retry;
-	}
-
 	err = mmc_erase(card, from, nr, arg);
 	if (err == -EIO)
 		goto out_retry;
@@ -1202,15 +1181,6 @@  static void mmc_blk_issue_secdiscard_rq(struct mmc_queue *mq,
 	}
 
 	if (arg == MMC_SECURE_TRIM1_ARG) {
-		if (card->quirks & MMC_QUIRK_INAND_CMD38) {
-			err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
-					 INAND_CMD38_ARG_EXT_CSD,
-					 INAND_CMD38_ARG_SECTRIM2,
-					 card->ext_csd.generic_cmd6_time);
-			if (err)
-				goto out_retry;
-		}
-
 		err = mmc_erase(card, from, nr, MMC_SECURE_TRIM2_ARG);
 		if (err == -EIO)
 			goto out_retry;
diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
index cca71867bc4a..028f55f07ba3 100644
--- a/drivers/mmc/core/quirks.h
+++ b/drivers/mmc/core/quirks.h
@@ -22,18 +22,6 @@  static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = {
 #define INAND_CMD38_ARG_SECERASE 0x80
 #define INAND_CMD38_ARG_SECTRIM1 0x81
 #define INAND_CMD38_ARG_SECTRIM2 0x88
-	/* CMD38 argument is passed through EXT_CSD[113] */
-	MMC_FIXUP("SEM02G", CID_MANFID_SANDISK, 0x100, add_quirk,
-		  MMC_QUIRK_INAND_CMD38),
-	MMC_FIXUP("SEM04G", CID_MANFID_SANDISK, 0x100, add_quirk,
-		  MMC_QUIRK_INAND_CMD38),
-	MMC_FIXUP("SEM08G", CID_MANFID_SANDISK, 0x100, add_quirk,
-		  MMC_QUIRK_INAND_CMD38),
-	MMC_FIXUP("SEM16G", CID_MANFID_SANDISK, 0x100, add_quirk,
-		  MMC_QUIRK_INAND_CMD38),
-	MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk,
-		  MMC_QUIRK_INAND_CMD38),
-
 	/*
 	 * Some MMC cards experience performance degradation with CMD23
 	 * instead of CMD12-bounded multiblock transfers. For now we'll
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
index 7b12eebc5586..edb27f3c6489 100644
--- a/include/linux/mmc/card.h
+++ b/include/linux/mmc/card.h
@@ -284,7 +284,6 @@  struct mmc_card {
 						/* (missing CIA registers) */
 #define MMC_QUIRK_NONSTD_FUNC_IF (1<<4)		/* SDIO card has nonstd function interfaces */
 #define MMC_QUIRK_DISABLE_CD	(1<<5)		/* disconnect CD/DAT[3] resistor */
-#define MMC_QUIRK_INAND_CMD38	(1<<6)		/* iNAND devices have broken CMD38 */
 #define MMC_QUIRK_BLK_NO_CMD23	(1<<7)		/* Avoid CMD23 for regular multiblock */
 #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)	/* Avoid sending 512 bytes in */
 						/* byte mode */