From eebfbe9116a46d504f0912a25cf5ff7eaff96884 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 5 Feb 2015 11:03:59 +0100 Subject: mtd: nand-bb: fix erasing bb devices with bad blocks mtd_erase does not skip bad blocks, we must skip them in nand_bb_erase instead. Signed-off-by: Sascha Hauer --- drivers/mtd/nand/nand-bb.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'drivers/mtd/nand/nand-bb.c') diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c index e38517d983..f134635f2a 100644 --- a/drivers/mtd/nand/nand-bb.c +++ b/drivers/mtd/nand/nand-bb.c @@ -159,16 +159,34 @@ static int nand_bb_erase(struct cdev *cdev, size_t count, loff_t offset) { struct nand_bb *bb = cdev->priv; struct erase_info erase = {}; + int ret; if (offset != 0) { printf("can only erase from beginning of device\n"); return -EINVAL; } - erase.addr = 0; - erase.len = bb->mtd->size; + while (count) { + if (offset + bb->mtd->erasesize > bb->mtd->size) + return 0; + + if (mtd_block_isbad(bb->mtd, offset)) { + offset += bb->mtd->erasesize; + continue; + } - return mtd_erase(bb->mtd, &erase); + erase.addr = offset; + erase.len = bb->mtd->erasesize; + + ret = mtd_erase(bb->mtd, &erase); + if (ret) + return ret; + + offset += bb->mtd->erasesize; + count -= bb->mtd->erasesize; + } + + return 0; } #endif -- cgit v1.2.3