[PATCH 1/2] mtd: spinand: core: fix Winbond W25N bad block marker (1 byte BBM)

Zunyi Hu roberhu001 at 163.com
Fri Jun 5 17:23:46 CEST 2026


According to the Winbond datasheet, the factory Bad Block Marker
is strictly a single non-0xFF byte located at spare byte 0.
The default spinand core assumes a 2-byte marker (byte 0 and 1).

However, after programming, upper-layer file systems (such as UBI)
may utilize byte 1 for metadata. The default 2-byte check leads to
false-positive bad block detections on valid blocks. Introduce a
manufacturer-specific check (Winbond ID: 0xEF) to strictly evaluate
only marker[0].

Signed-off-by: Zunyi Hu <roberhu001 at 163.com>
---
 drivers/mtd/nand/spi/core.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
index e5330958c7e..5395a1bdf68 100644
--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -676,6 +676,17 @@ static bool spinand_isbad(struct nand_device *nand, const struct nand_pos *pos)
 	if (ret)
 		return ret;
 
+	/*
+	 * Winbond W25N (incl. W25N01G/GV): factory BBM is a single non-0xFF
+	 * byte at spare byte 0 (see datasheet).  Byte 1 may hold ECC or file
+	 * system markers after programming — do not treat it as BBM.
+	 */
+	if (spinand->id.data[1] == 0xEF) {
+		if (marker[0] != 0xff)
+			return true;
+		return false;
+	}
+
 	if (marker[0] != 0xff || marker[1] != 0xff)
 		return true;
 
-- 
2.17.1



More information about the U-Boot mailing list