forked from luck/tmp_suning_uos_patched
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@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
152b861622
commit
009184296d
@ -394,6 +394,17 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
|
|||||||
uint8_t buf[2] = { 0, 0 };
|
uint8_t buf[2] = { 0, 0 };
|
||||||
int block, ret, i = 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)
|
if (chip->bbt_options & NAND_BBT_SCANLASTPAGE)
|
||||||
ofs += mtd->erasesize - mtd->writesize;
|
ofs += mtd->erasesize - mtd->writesize;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user