[PATCH 4/4] mtd: nand: bb: fix erasing bb devices with bad blocks
Sascha Hauer
s.hauer at pengutronix.de
Thu Feb 5 02:09:58 PST 2015
mtd_erase does not skip bad blocks, we must skip them in nand_bb_erase
instead.
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/mtd/nand/nand-bb.c | 24 +++++++++++++++++++++---
1 file changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
index e38517d..853c617 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
--
2.1.4
More information about the barebox
mailing list