Skip to contentSkip to conversation

write bad block marker even with BBT

PATCH In review Matthieu CASTET 2 participants 2 messages Oct 25, 2010 – Oct 27, 2010

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

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
index ddffe76..4d79a8d 100644
@@ -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
index 102e12c..2efd2f9 100644
@@ -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 */
#1 lore raw

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
index 102e12c..2efd2f9 100644

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 (Битюцкий Артём)