[U-Boot] [PATCH] mtd: BBT_CUSTOM_SCAN for NAND BBT

Joshua Scott joshua.scott at alliedtelesis.co.nz
Mon May 22 05:12:37 UTC 2017


This patch introduces support for a custom BBT scan based on code from
Marvell's U-Boot:
    https://github.com/MarvellEmbeddedProcessors/u-boot-marvell

Using a Marvell NAND Flash Controller (NFC), we found this change was
needed to initialize a new NAND chip with the nand erase.chip command.
Without the change, a timeout would occur when trying to read the OOB
area to when constructing the bad-block table.

The changes are enabled by defining BBT_CUSTOM_SCAN.

Signed-off-by: Joshua Scott <joshua.scott at alliedtelesis.co.nz>
---
 drivers/mtd/nand/nand_bbt.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/drivers/mtd/nand/nand_bbt.c b/drivers/mtd/nand/nand_bbt.c
index 74c4c9a3c8..545d43dad4 100644
--- a/drivers/mtd/nand/nand_bbt.c
+++ b/drivers/mtd/nand/nand_bbt.c
@@ -438,6 +438,37 @@ static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd,
 	return 0;
 }
 
+#ifdef BBT_CUSTOM_SCAN
+/*
+ * Scan a given block in the custom location based on Naked symantics
+ * BBT_CUSTOM_SCAN_PAGE selects the page within the erase-block to use
+ * BBT_CUSTOM_SCAN_POSITION selects the byte within the page to check
+ */
+static int scan_block_custom(struct mtd_info *mtd, struct nand_bbt_descr *bd,
+			uint64_t offs, uint8_t *buf)
+{
+	int ret;
+	struct mtd_oob_ops ops;
+
+	ops.mode = MTD_OPS_RAW;
+	ops.ooboffs = 0;
+	ops.ooblen = mtd->oobsize;
+	ops.oobbuf = (buf + mtd->writesize);
+	ops.datbuf = buf;
+	ops.len = mtd->writesize;
+
+	ret = mtd_read_oob(mtd,
+		(offs + (mtd->writesize * BBT_CUSTOM_SCAN_PAGE)), &ops);
+	if (ret)
+		return ret;
+
+	if (buf[BBT_CUSTOM_SCAN_POSITION] != 0xff)
+		return 1;
+
+	return 0;
+}
+#endif
+
 /**
  * create_bbt - [GENERIC] Create a bad block table by scanning the device
  * @mtd: MTD device structure
@@ -488,7 +519,11 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf,
 
 		BUG_ON(bd->options & NAND_BBT_NO_OOB);
 
+#ifdef BBT_CUSTOM_SCAN
+		ret = scan_block_custom(mtd, bd, from, buf);
+#else
 		ret = scan_block_fast(mtd, bd, from, buf, numpages);
+#endif
 		if (ret < 0)
 			return ret;
 
-- 
2.13.0



More information about the U-Boot mailing list