MTD: NAND: Fix bad-block detection for 8-bit NAND
Subsystems (2)
PATCH 1/1 MTD: NAND: Fix bad-block detection for 8-bit NAND
Hi Thomas,
I found the following block in our 128MiB NAND flash:
hexdump vic.img.460
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000800 00ff 0000 0000 0000 0000 0000 0000 0000
0000810 0000 0000 0000 0000 0000 0000 0000 0000
*
0001040 00ff 0000 0000 0000 0000 0000 0000 0000
0001050 0000 0000 0000 0000 0000 0000 0000 0000
*
0021000
According to the specification this is a good block, because the bytes in the 1st two OOB areas at offset 0 are 0xff. Nevertheless it was detected bad because:
static struct nand_bbt_descr largepage_memorybased = {
.options = 0,
.offs = 0,
.len = 2, /* <<<< bytes to check!!! */
.pattern = scan_ff_pattern
};used a len of 2 instead of 1, which I consider to be correct. Here a potential fix for the problem. Please have a look if it matches your understanding of the specification.
--- drivers/mtd/nand/nand_bbt.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
drivers/mtd/nand/nand_bbt.c +17 -3
@@ -1081,7 +1081,14 @@ static struct nand_bbt_descr smallpage_m .pattern = scan_ff_pattern }; -static struct nand_bbt_descr largepage_memorybased = { +static struct nand_bbt_descr largepage_memorybased_8bit = { + .options =0 , + .offs =0 , + .len =1 , + .pattern = scan_ff_pattern +}; + +static struct nand_bbt_descr largepage_memorybased_16bit = { .options =0 , .offs =0 , .len =2 ,
@@ -1179,8 +1186,15 @@ int nand_default_bbt(struct mtd_info *mt this->bbt_td =NULL ; this->bbt_md =NULL ;if (!this->badblock_pattern) { - this->badblock_pattern = (mtd->writesize >512 ) ? - &largepage_memorybased : &smallpage_memorybased; +if (mtd->writesize >512 ) { +if (this->options &NAND_BUSWIDTH_16 ) + this->badblock_pattern = + &largepage_memorybased_16bit; +else + this->badblock_pattern = + &largepage_memorybased_8bit; + }else + this->badblock_pattern = &smallpage_memorybased; } }return nand_scan_bbt (mtd, this->badblock_pattern);
Quoted 26 lines · Frank Haverkamp
Hi Thomas,
I found the following block in our 128MiB NAND flash:
hexdump vic.img.460
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0000800 00ff 0000 0000 0000 0000 0000 0000 0000
0000810 0000 0000 0000 0000 0000 0000 0000 0000
*
0001040 00ff 0000 0000 0000 0000 0000 0000 0000
0001050 0000 0000 0000 0000 0000 0000 0000 0000
*
0021000According to the specification this is a good block, because the bytes in the 1st two OOB areas at offset 0 are
0xff. Nevertheless it was detected bad because:static struct nand_bbt_descr largepage_memorybased = { .options = 0, .offs = 0, .len = 2, /* <<<< bytes to check!!! */ .pattern = scan_ff_pattern };
Quoted 5 lines
used a len of 2 instead of 1, which I consider to be correct. Here a potential fix for the problem. Please have a look if it matches your understanding of the specification.
Signed-off-by Frank Haverkamp <[email protected]>
Quoted 41 lines
--- drivers/mtd/nand/nand_bbt.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)drivers/mtd/nand/nand_bbt.c +17
-3@@ -1081,7 +1081,14 @@ static struct nand_bbt_descr smallpage_m .pattern = scan_ff_pattern }; -static struct nand_bbt_descr largepage_memorybased = { +static struct nand_bbt_descr largepage_memorybased_8bit = { + .options =0 , + .offs =0 , + .len =1 , + .pattern = scan_ff_pattern +}; + +static struct nand_bbt_descr largepage_memorybased_16bit = { .options =0 , .offs =0 , .len =2 ,@@ -1179,8 +1186,15 @@ int nand_default_bbt(struct mtd_info *mt this->bbt_td =NULL ; this->bbt_md =NULL ;if (!this->badblock_pattern) { - this->badblock_pattern = (mtd->writesize >512 ) ? - &largepage_memorybased : &smallpage_memorybased; +if (mtd->writesize >512 ) { +if (this->options &NAND_BUSWIDTH_16 ) + this->badblock_pattern = + &largepage_memorybased_16bit; +else + this->badblock_pattern = + &largepage_memorybased_8bit; + }else + this->badblock_pattern = &smallpage_memorybased; } }return nand_scan_bbt (mtd, this->badblock_pattern);