[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