nand: force BBT scan for controllers which need it
Subsystems (3)
PATCH 1/1 nand: force BBT scan for controllers which need it
From: Stefan Agner <[email protected]>
Commit 35c204d8a9d0 ("nand: reinstate lazy bad block scanning") introduced lazy BBT scanning. However, some controller do parts of the initialization (mxs_nand.c) during scan_bbt, hence for those controllers the BBT must be scanned at initialization time.
In most situation the U-Boot environment gets read first, and the U-Boot environment code checks for bad blocks first. Checking for bad blocks will ask for scan_bbt before reading the first page, hence in most situation the issue does not appear in practice. However, when there is no environment configured, other code might access NAND first which does not explicitly checks for bad blocks, in those cases ECC reads will fail always.
---
Not sure if this solution is a nice solution as we diverge more and more from the kernel...
drivers/mtd/nand/mxs_nand.c | 2 +- drivers/mtd/nand/nand_base.c | 5 +++++ include/linux/mtd/nand.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-)
drivers/mtd/nand/mxs_nand.c +1 -1
@@ -1181,7 +1181,7 @@ int board_nand_init(struct nand_chip *nand)memset (&fake_ecc_layout,0 ,sizeof (fake_ecc_layout));nand_set_controller_data (nand, nand_info); - nand->options |=NAND_NO_SUBPAGE_WRITE ; + nand->options |=NAND_NO_SUBPAGE_WRITE |NAND_NEED_BBTSCAN ; nand->cmd_ctrl = mxs_nand_cmd_ctrl;
drivers/mtd/nand/nand_base.c +5 -0
@@ -4216,6 +4216,11 @@ int nand_scan_tail(struct mtd_info *mtd)if (!mtd->bitflip_threshold) mtd->bitflip_threshold =DIV_ROUND_UP (mtd->ecc_strength *3 ,4 ); +if (chip->options &NAND_NEED_BBTSCAN ) { + chip->options |=NAND_BBT_SCANNED ; +return chip->scan_bbt (mtd); + } +return 0 ; }EXPORT_SYMBOL (nand_scan_tail);
include/linux/mtd/nand.h +2 -0
@@ -224,6 +224,8 @@ typedef enum {* kmap'ed, vmalloc'ed highmem buffers being passed from upper layers */ #define NAND_USE_BOUNCE_BUFFER 0x00100000 +/* Chip needs BBT scan */ +#define NAND_NEED_BBTSCAN 0x00200000/* Options set by nand scan */ /* bbt has already been read */
Signature · 1 line
2.10.0
PATCH 1/1 nand: force BBT scan for controllers which need it
Quoted 15 lines · Stefan Agner
From: Stefan Agner <[email protected]>
Commit
35c204d8a9d0("nand: reinstate lazy bad block scanning") introduced lazy BBT scanning. However, some controller do parts of the initialization (mxs_nand.c) duringscan_bbt, hence for those controllers the BBT must be scanned at initialization time.In most situation the U-Boot environment gets read first, and the U-Boot environment code checks for bad blocks first. Checking for bad blocks will ask for
scan_bbtbefore reading the first page, hence in most situation the issue does not appear in practice. However, when there is no environment configured, other code might access NAND first which does not explicitly checks for bad blocks, in those cases ECC reads will fail always.
Quoted 5 lines
Cc Rostislav Lisovy <[email protected]>Signed-off-by Stefan Agner <[email protected]>---
Not sure if this solution is a nice solution as we diverge more and more from the kernel...
Why does this init code need to run at the end of nand_scan_tail()? ?If it can run in between nand_scan_ident() and nand_scan_tail(), then use CONFIG_SYS_NAND_SELF_INIT to allow the driver to run its init at that time.
-Scott
PATCH 1/1 nand: force BBT scan for controllers which need it
Quoted 22 lines · Scott Wood
Quoted 15 lines · Stefan Agner
From: Stefan Agner <[email protected]>
Commit
35c204d8a9d0("nand: reinstate lazy bad block scanning") introduced lazy BBT scanning. However, some controller do parts of the initialization (mxs_nand.c) duringscan_bbt, hence for those controllers the BBT must be scanned at initialization time.In most situation the U-Boot environment gets read first, and the U-Boot environment code checks for bad blocks first. Checking for bad blocks will ask for
scan_bbtbefore reading the first page, hence in most situation the issue does not appear in practice. However, when there is no environment configured, other code might access NAND first which does not explicitly checks for bad blocks, in those cases ECC reads will fail always.Quoted 5 lines
Cc Rostislav Lisovy <[email protected]>Signed-off-by Stefan Agner <[email protected]>---
Not sure if this solution is a nice solution as we diverge more and more from the kernel...
Quoted 3 lines
Why does this init code need to run at the end of
nand_scan_tail()? ?If it can run in betweennand_scan_ident()andnand_scan_tail(), then useCONFIG_SYS_NAND_SELF_INITto allow the driver to run its init at that time.
Hm, the comment in mxs_nand.c claims that we don't have formal mechanism for this, but that has been written in 2011 and CONFIG_SYS_NAND_SELF_INIT has been added in 2012, hence I guess we could get rid of that hack.
Will check if your suggestion...
--
Stefan