mtd: nand: erase block before marking bad

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Mon Mar 26 20:59:03 EDT 2012


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=009184296d957d864d6fa9ac2dd192d29e069878
Commit:     009184296d957d864d6fa9ac2dd192d29e069878
Parent:     152b861622d55f7b17cb6069bd0b275fb559c29a
Author:     Brian Norris <computersforpeace at gmail.com>
AuthorDate: Fri Jan 13 18:11:47 2012 -0800
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Tue Mar 27 00:11:34 2012 +0100

    mtd: nand: erase block before marking bad
    
    Many NAND flash systems (especially those with MLC NAND) cannot be
    reliably written twice in a row. For instance, when marking a bad block,
    the block may already have data written to it, and so we should attempt
    to erase the block before writing a bad block marker to its OOB region.
    
    We can ignore erase failures, since the block may be bad such that it
    cannot be erased properly; we still attempt to write zeros to its spare
    area.
    
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 drivers/mtd/nand/nand_base.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 8a393f9..cd827d5 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -394,6 +394,17 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
 	uint8_t buf[2] = { 0, 0 };
 	int block, ret, i = 0;
 
+	if (!(chip->bbt_options & NAND_BBT_USE_FLASH)) {
+		struct erase_info einfo;
+
+		/* Attempt erase before marking OOB */
+		memset(&einfo, 0, sizeof(einfo));
+		einfo.mtd = mtd;
+		einfo.addr = ofs;
+		einfo.len = 1 << chip->phys_erase_shift;
+		nand_erase_nand(mtd, &einfo, 0);
+	}
+
 	if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
 		ofs += mtd->erasesize - mtd->writesize;
 



More information about the linux-mtd-cvs mailing list