diff mbox series

mmc: core: allow detection of locked cards

Message ID 20240521210455.543587-1-linux-mmc@danman.eu (mailing list archive)
State New, archived
Headers show
Series mmc: core: allow detection of locked cards | expand

Commit Message

Daniel Kucera May 21, 2024, 9:04 p.m. UTC
From: Daniel Kucera <linux-mmc@danman.eu>

Signed-off-by: Daniel Kucera <linux-mmc@danman.eu>
---
 drivers/mmc/core/sd.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

Comments

Avri Altman May 23, 2024, 3:41 a.m. UTC | #1
> 
> From: Daniel Kucera <linux-mmc@danman.eu>
Please don't leave the commit log empty.

> 
> Signed-off-by: Daniel Kucera <linux-mmc@danman.eu>
> ---
>  drivers/mmc/core/sd.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index
> 1c8148cdd..b22c30348 100644
> --- a/drivers/mmc/core/sd.c
> +++ b/drivers/mmc/core/sd.c
> @@ -1475,9 +1475,22 @@ static int mmc_sd_init_card(struct mmc_host
> *host, u32 ocr,
Aren't you be needing a similar handling for the eMMC side as well?

Thanks,
Avri
>                         goto free_card;
>         }
> 
> -       err = mmc_sd_setup_card(host, card, oldcard != NULL);
> -       if (err)
> -               goto free_card;
> +        u32 card_status;
> +
> +        err = mmc_send_status(card, &card_status);
> +        if (err){
> +                pr_err("%s: unable to get card status\n",
> +                        mmc_hostname(host));
> +                goto free_card;
> +        }
> +
> +        if (card_status & R1_CARD_IS_LOCKED){
> +                pr_warn("%s: card is locked\n", mmc_hostname(host));
> +        } else {
> +                err = mmc_sd_setup_card(host, card, oldcard != NULL);
> +                if (err)
> +                        goto free_card;
> +        }
> 
>         /*
>          * If the card has not been power cycled, it may still be using 1.8V
> --
> 2.34.1
>
Christian Loehle May 23, 2024, 8:29 a.m. UTC | #2
On 5/21/24 22:04, linux-mmc@danman.eu wrote:
> From: Daniel Kucera <linux-mmc@danman.eu>
> 
> Signed-off-by: Daniel Kucera <linux-mmc@danman.eu>
> ---
>  drivers/mmc/core/sd.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
> index 1c8148cdd..b22c30348 100644
> --- a/drivers/mmc/core/sd.c
> +++ b/drivers/mmc/core/sd.c
> @@ -1475,9 +1475,22 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
>  			goto free_card;
>  	}
>  
> -	err = mmc_sd_setup_card(host, card, oldcard != NULL);
> -	if (err)
> -		goto free_card;
> +        u32 card_status;
> +
> +        err = mmc_send_status(card, &card_status);
> +        if (err){
> +                pr_err("%s: unable to get card status\n",
> +                        mmc_hostname(host));
> +                goto free_card;
> +        }
> +
> +        if (card_status & R1_CARD_IS_LOCKED){
> +                pr_warn("%s: card is locked\n", mmc_hostname(host));
> +        } else {
> +                err = mmc_sd_setup_card(host, card, oldcard != NULL);
> +                if (err)
> +                        goto free_card;
> +        }
>  
>  	/*
>  	 * If the card has not been power cycled, it may still be using 1.8V

Does that work for you?
I vaguely remember adding some checks before the block device setup and some
recovery as well since the partition scan (will fail) already triggered resets.
Christian Loehle May 23, 2024, 8:30 a.m. UTC | #3
On 5/21/24 22:04, linux-mmc@danman.eu wrote:
> From: Daniel Kucera <linux-mmc@danman.eu>
> 
> Signed-off-by: Daniel Kucera <linux-mmc@danman.eu>
> ---
>  drivers/mmc/core/sd.c | 19 ++++++++++++++++---
>  1 file changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
> index 1c8148cdd..b22c30348 100644
> --- a/drivers/mmc/core/sd.c
> +++ b/drivers/mmc/core/sd.c
> @@ -1475,9 +1475,22 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
>  			goto free_card;
>  	}
>  
> -	err = mmc_sd_setup_card(host, card, oldcard != NULL);
> -	if (err)
> -		goto free_card;
> +        u32 card_status;
> +
> +        err = mmc_send_status(card, &card_status);
> +        if (err){
> +                pr_err("%s: unable to get card status\n",
> +                        mmc_hostname(host));
> +                goto free_card;
> +        }
> +
> +        if (card_status & R1_CARD_IS_LOCKED){
> +                pr_warn("%s: card is locked\n", mmc_hostname(host));
> +        } else {
> +                err = mmc_sd_setup_card(host, card, oldcard != NULL);
> +                if (err)
> +                        goto free_card;
> +        }
>  
>  	/*
>  	 * If the card has not been power cycled, it may still be using 1.8V
Daniel Kucera May 23, 2024, 1:17 p.m. UTC | #4
On 2024-05-23 10:29, Christian Loehle wrote:
> On 5/21/24 22:04, linux-mmc@danman.eu wrote:
>> From: Daniel Kucera <linux-mmc@danman.eu>
>> 
>> Signed-off-by: Daniel Kucera <linux-mmc@danman.eu>
>> ---
>>  drivers/mmc/core/sd.c | 19 ++++++++++++++++---
>>  1 file changed, 16 insertions(+), 3 deletions(-)
>> 
>> diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
>> index 1c8148cdd..b22c30348 100644
>> --- a/drivers/mmc/core/sd.c
>> +++ b/drivers/mmc/core/sd.c
>> @@ -1475,9 +1475,22 @@ static int mmc_sd_init_card(struct mmc_host 
>> *host, u32 ocr,
>>  			goto free_card;
>>  	}
>> 
>> -	err = mmc_sd_setup_card(host, card, oldcard != NULL);
>> -	if (err)
>> -		goto free_card;
>> +        u32 card_status;
>> +
>> +        err = mmc_send_status(card, &card_status);
>> +        if (err){
>> +                pr_err("%s: unable to get card status\n",
>> +                        mmc_hostname(host));
>> +                goto free_card;
>> +        }
>> +
>> +        if (card_status & R1_CARD_IS_LOCKED){
>> +                pr_warn("%s: card is locked\n", mmc_hostname(host));
>> +        } else {
>> +                err = mmc_sd_setup_card(host, card, oldcard != NULL);
>> +                if (err)
>> +                        goto free_card;
>> +        }
>> 
>>  	/*
>>  	 * If the card has not been power cycled, it may still be using 1.8V
> 
> Does that work for you?
> I vaguely remember adding some checks before the block device setup and 
> some
> recovery as well since the partition scan (will fail) already triggered 
> resets.

Yes, it does, it shows a few read errors but then I run the unlock and 
mount without problems.
See:

[819348.273781] mmc1: card is locked
[819348.275379] mmc1: new SD card at address 0001
[819348.276149] mmcblk1: mmc1:0001 00000 1.89 GiB
[819351.379473] mmc1: card is locked
[819351.983845] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819351.983861] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819355.631723] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819355.631734] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819359.279802] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819359.279813] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819359.279827] ldm_validate_partition_table(): Disk read failed.
[819362.927837] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819362.927863] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819366.575712] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819366.575724] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819370.223933] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819370.223958] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819373.875932] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819373.875952] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819373.875978] Dev mmcblk1: unable to read RDB block 0
[819377.520037] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819377.520062] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819381.167907] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819381.167933] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819384.815750] I/O error, dev mmcblk1, sector 24 op 0x0:(READ) flags 
0x0 phys_seg 1 prio class 2
[819384.815776] Buffer I/O error on dev mmcblk1, logical block 3, async 
page read
[819388.463981] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819388.464007] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819392.111760] I/O error, dev mmcblk1, sector 0 op 0x0:(READ) flags 0x0 
phys_seg 1 prio class 2
[819392.111770] Buffer I/O error on dev mmcblk1, logical block 0, async 
page read
[819392.111786]  mmcblk1: unable to read partition table
[819395.759713] I/O error, dev mmcblk1, sector 3964800 op 0x0:(READ) 
flags 0x80700 phys_seg 1 prio class 2
[819399.408666] I/O error, dev mmcblk1, sector 3964800 op 0x0:(READ) 
flags 0x0 phys_seg 1 prio class 2
[819399.408691] Buffer I/O error on dev mmcblk1, logical block 495600, 
async page read

I waited several minutes and then I run the unlock and the partition is 
detected automatically:

[820514.276616]  mmcblk1: p1
diff mbox series

Patch

diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
index 1c8148cdd..b22c30348 100644
--- a/drivers/mmc/core/sd.c
+++ b/drivers/mmc/core/sd.c
@@ -1475,9 +1475,22 @@  static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
 			goto free_card;
 	}
 
-	err = mmc_sd_setup_card(host, card, oldcard != NULL);
-	if (err)
-		goto free_card;
+        u32 card_status;
+
+        err = mmc_send_status(card, &card_status);
+        if (err){
+                pr_err("%s: unable to get card status\n",
+                        mmc_hostname(host));
+                goto free_card;
+        }
+
+        if (card_status & R1_CARD_IS_LOCKED){
+                pr_warn("%s: card is locked\n", mmc_hostname(host));
+        } else {
+                err = mmc_sd_setup_card(host, card, oldcard != NULL);
+                if (err)
+                        goto free_card;
+        }
 
 	/*
 	 * If the card has not been power cycled, it may still be using 1.8V