diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index 6db1c6db3..534b4041e 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -146,6 +146,7 @@ static int mtd_op_erase(struct cdev *cdev, size_t count, loff_t offset) { struct mtd_info *mtd = cdev->priv; struct erase_info erase; + uint32_t addr; int ret; ret = mtd_erase_align(mtd, &count, &offset); @@ -154,9 +155,10 @@ static int mtd_op_erase(struct cdev *cdev, size_t count, loff_t offset) memset(&erase, 0, sizeof(erase)); erase.mtd = mtd; - erase.addr = offset; + addr = offset; if (!mtd->block_isbad) { + erase.addr = addr; erase.len = count; return mtd_erase(mtd, &erase); } @@ -164,22 +166,24 @@ static int mtd_op_erase(struct cdev *cdev, size_t count, loff_t offset) erase.len = mtd->erasesize; while (count > 0) { - dev_dbg(cdev->dev, "erase %d %d\n", erase.addr, erase.len); + dev_dbg(cdev->dev, "erase %d %d\n", addr, erase.len); if (!mtd->allow_erasebad) - ret = mtd_block_isbad(mtd, erase.addr); + ret = mtd_block_isbad(mtd, addr); else ret = 0; + erase.addr = addr; + if (ret > 0) { - printf("Skipping bad block at 0x%08x\n", erase.addr); + printf("Skipping bad block at 0x%08x\n", addr); } else { ret = mtd_erase(mtd, &erase); if (ret) return ret; } - erase.addr += mtd->erasesize; + addr += mtd->erasesize; count -= count > mtd->erasesize ? mtd->erasesize : count; }