]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
mtd: ubi: Do not zero out EC and VID on ECC-ed NOR flashes
authorTakahiro Kuwano <Takahiro.Kuwano@infineon.com>
Tue, 15 Oct 2024 04:08:31 +0000 (13:08 +0900)
committerTom Rini <trini@konsulko.com>
Tue, 15 Oct 2024 14:57:49 +0000 (08:57 -0600)
For NOR flashes EC and VID are zeroed out before an erase is issued to
make sure UBI does not mistakenly treat the PEB as used and associate it
with an LEB.

But on some flashes, like the Infineon Semper NOR flash family,
multi-pass page programming is not allowed on the default ECC scheme.
This means zeroing out these magic numbers will result in the flash
throwing a page programming error.

Do not zero out EC and VID for such flashes. A writesize > 1 is an
indication of an ECC-ed flash.

This patch replicates the following upstream linux commit:
f669e74be820 ("ubi: Do not zero out EC and VID on ECC-ed NOR flashes")

Acked-by: Tudor Ambarus <tudor.ambarus@linaro.org>
Acked-by: Pratyush Yadav <pratyush@kernel.org>
Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
Reviewed-by: Tudor Ambarus <tudor.ambarus@microchip.com>
drivers/mtd/ubi/build.c
drivers/mtd/ubi/io.c

index cf0d702421ffa4893d7f9197eb1d0340a6dfdf43..104537784abb2ae2f9618c755286a446267a31bd 100644 (file)
@@ -679,10 +679,8 @@ static int io_init(struct ubi_device *ubi, int max_beb_per1024)
                ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024);
        }
 
-       if (ubi->mtd->type == MTD_NORFLASH) {
-               ubi_assert(ubi->mtd->writesize == 1);
+       if (ubi->mtd->type == MTD_NORFLASH)
                ubi->nor_flash = 1;
-       }
 
        ubi->min_io_size = ubi->mtd->writesize;
        ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft;
index 14be95b74bc4b1c72d71a702ac43938d6a94e080..45699b4a4778d92f573426c63fcc1c06e0b911c2 100644 (file)
@@ -563,7 +563,14 @@ int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture)
                return -EROFS;
        }
 
-       if (ubi->nor_flash) {
+       /*
+        * If the flash is ECC-ed then we have to erase the ECC block before we
+        * can write to it. But the write is in preparation to an erase in the
+        * first place. This means we cannot zero out EC and VID before the
+        * erase and we just have to hope the flash starts erasing from the
+        * start of the page.
+        */
+       if (ubi->nor_flash && ubi->mtd->writesize == 1) {
                err = nor_erase_prepare(ubi, pnum);
                if (err)
                        return err;