On Thu, 6 Jun 2024 at 15:12, <linux-mmc@xxxxxxxxx> wrote: > > From: Daniel Kucera <linux-mmc@xxxxxxxxx> > > Locked SD card will not reply to SEND_SCR or SD_STATUS commands > so it was failing to initialize previously. When skipped, > the card will get initialized and CMD42 can be sent using > ioctl to unlock the card or remove password protection. > For eMMC, this is not necessary because all initialization > commands are allowed in locked state. > Until unlocked, all read/write calls will timeout. Skipping the commands above, only means the card gets partially initialized. Leaving a card in that state seems fragile. What will happen to upper block layers and filesystems when trying to access it? Several years ago Al Cooper made an attempt [1] to manage the unlocking of the card during initialization, by finding the password through the "keys" subsystem. The series didn't really make it to the upstream kernel, but overall the approach seemed to make sense to me. It should allow us to complete the initialization of the card inside the kernel and prevent unnecessary complexity for userspace to manage. Perhaps you can have a closer look at that series and see if it's possible to update it? Kind regards Uffe [1] https://lore.kernel.org/linux-mmc/1433526147-25941-1-git-send-email-alcooperx@xxxxxxxxx/ > > Signed-off-by: Daniel Kucera <linux-mmc@xxxxxxxxx> > --- > drivers/mmc/core/sd.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c > index 1c8148cdd..ae821df7d 100644 > --- a/drivers/mmc/core/sd.c > +++ b/drivers/mmc/core/sd.c > @@ -928,8 +928,19 @@ int mmc_sd_setup_card(struct mmc_host *host, struct mmc_card *card, > bool reinit) > { > int err; > + u32 card_status; > > - if (!reinit) { > + err = mmc_send_status(card, &card_status); > + if (err){ > + pr_err("%s: unable to get card status\n", mmc_hostname(host)); > + return err; > + } > + > + if (card_status & R1_CARD_IS_LOCKED){ > + pr_warn("%s: card is locked\n", mmc_hostname(host)); > + } > + > + if (!reinit && !(card_status & R1_CARD_IS_LOCKED)) { > /* > * Fetch SCR from card. > */ > -- > 2.34.1 >