]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: core: Set read only for SD cards with permanent write protect bit
authorSeunghui Lee <sh043.lee@samsung.com>
Mon, 22 Feb 2021 08:31:56 +0000 (17:31 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 May 2021 08:40:15 +0000 (10:40 +0200)
commit 917a5336f2c27928be270226ab374ed0cbf3805d upstream.

Some of SD cards sets permanent write protection bit in their CSD register,
due to lifespan or internal problem. To avoid unnecessary I/O write
operations, let's parse the bits in the CSD during initialization and mark
the card as read only for this case.

Signed-off-by: Seunghui Lee <sh043.lee@samsung.com>
Link: https://lore.kernel.org/r/20210222083156.19158-1-sh043.lee@samsung.com
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/core/sd.c

index 7f654c714fffcdab78866a83532fac7bb3d03b9a..bb17027c283e9f59938f134dec3b375416d3ac11 100644 (file)
@@ -136,6 +136,9 @@ static int mmc_decode_csd(struct mmc_card *card)
                        csd->erase_size = UNSTUFF_BITS(resp, 39, 7) + 1;
                        csd->erase_size <<= csd->write_blkbits - 9;
                }
+
+               if (UNSTUFF_BITS(resp, 13, 1))
+                       mmc_card_set_readonly(card);
                break;
        case 1:
                /*
@@ -170,6 +173,9 @@ static int mmc_decode_csd(struct mmc_card *card)
                csd->write_blkbits = 9;
                csd->write_partial = 0;
                csd->erase_size = 1;
+
+               if (UNSTUFF_BITS(resp, 13, 1))
+                       mmc_card_set_readonly(card);
                break;
        default:
                pr_err("%s: unrecognised CSD structure version %d\n",