write bad block marker even with BBT
Subsystems (2)
PATCH 1/1 write bad block marker even with BBT
Add a new flag to force writing bad block marker if we use bad block table. This allow to solve problem where bootloader don't support reading BBT.
drivers/mtd/nand/nand_base.c +7 -2
@@ -396,7 +396,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) {struct nand_chip *chip = mtd->priv;uint8_t buf[2 ] = {0 ,0 }; -int block, ret, i =0 ; +int block, ret =0 , i =0 ;if (chip->options &NAND_BBT_SCANLASTPAGE ) ofs += mtd->erasesize - mtd->writesize;
@@ -409,7 +409,12 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)/* Do we have a flash based bad block table ? */ if (chip->options &NAND_USE_FLASH_BBT ) ret =nand_update_bbt (mtd, ofs); -else { + +/* Write the bad block marker if we don't have BBT, or driver +* request it (in case the bootloader doesn't support reading it +* or we loose BBT). +*/ +if (!(chip->options &NAND_USE_FLASH_BBT ) || chip->options &NAND_WRITE_BB ) {nand_get_device (chip, mtd,FL_WRITING );/* Write to first two pages and to byte 1 and 6 if necessary.
include/linux/mtd/nand.h +2 -0
@@ -215,6 +215,8 @@ typedef enum {#define NAND_OWN_BUFFERS 0x00040000/* Chip may not exist, so silence any errors in scan */ #define NAND_SCAN_SILENT_NODEV 0x00080000 +/* in case of NAND_USE_FLASH_BBT, write also bad block marker */ +#define NAND_WRITE_BB 0x00100000/* Options set by nand scan */ /* Nand scan has allocated controller struct */
Sorry for being PITA, but
drivers/mtd/nand/nand_base.c static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) · line 416
Quoted 5 lines · Matthieu CASTET
drivers/mtd/nand/nand_base.c +5
-0+ +/* Write the bad block marker if we don't have BBT, or driver +* request it (in case the bootloader doesn't support reading it +* or we loose BBT). +*/
Still not proper comment :-)
Quoted 9 lines
drivers/mtd/nand/nand_base.c +1
-0+if (!(chip->options &NAND_USE_FLASH_BBT ) || chip->options &NAND_WRITE_BB ) {nand_get_device (chip, mtd,FL_WRITING );/* Write to first two pages and to byte 1 and 6 if necessary. include/linux/mtd/nand.h +0
-0
include/linux/mtd/nand.h typedef enum { · line 219
Quoted 5 lines
include/linux/mtd/nand.h +2
-0@@ -215,6 +215,8 @@ typedef enum {#define NAND_OWN_BUFFERS 0x00040000/* Chip may not exist, so silence any errors in scan */ #define NAND_SCAN_SILENT_NODEV 0x00080000 +/* in case of NAND_USE_FLASH_BBT, write also bad block marker */ +#define NAND_WRITE_BB 0x00100000
I think the comment should be a bit more descriptive and tell that this is about using BBT _and_ writing BB marker to OOB area. Use proper comment style, start with capital letter.
Also, add a BUG_ON to catch misuse cases when NAND_WRITE_BB is used without NAND_USE_FLASH_BBT - they should go in pair.
And also, how about cases when BBT is updated, but OOB did not because of a power cut :-)) ?
Signature · 2 lines
Best Regards, Artem Bityutskiy (Битюцкий Артём)