[U-Boot] [PATCH 2/4 v3] cmd: mtd: Don't abort erase operation when a bad block is detected
Stefan Roese
sr at denx.de
Thu Aug 9 06:22:47 UTC 2018
It was noticed, that the erase command (mtd erase spi-nand0) aborts upon
the first bad block. With this change, bad blocks are now skipped and
the erase operation will continue.
Signed-off-by: Stefan Roese <sr at denx.de>
Cc: Miquel Raynal <miquel.raynal at bootlin.com>
Cc: Boris Brezillon <boris.brezillon at bootlin.com>
Cc: Jagan Teki <jagan at openedev.com>
---
v3:
- Handle bad-block skipping completely in cmd/mtd. as suggested by
Boris
- Add message upon bad-block detection
v2:
- Use an U-Boot "mtd" command specific option to skip the bad block
upon erase so that other MTD users are not affected by this change
cmd/mtd.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/cmd/mtd.c b/cmd/mtd.c
index 221b12500f..9f552e7c4a 100644
--- a/cmd/mtd.c
+++ b/cmd/mtd.c
@@ -360,7 +360,21 @@ static int do_mtd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
erase_op.len = len;
erase_op.scrub = scrub;
- ret = mtd_erase(mtd, &erase_op);
+ while (erase_op.len) {
+ ret = mtd_erase(mtd, &erase_op);
+
+ /* Abort if its not an bad block error */
+ if (ret != -EIO)
+ break;
+
+ printf("Skipping bad block at 0x%08llx\n",
+ erase_op.fail_addr);
+
+ /* Skip bad block and continue behind it */
+ erase_op.len -= erase_op.fail_addr - erase_op.addr;
+ erase_op.len -= mtd->erasesize;
+ erase_op.addr = erase_op.fail_addr + mtd->erasesize;
+ }
} else {
return CMD_RET_USAGE;
}
--
2.18.0
More information about the U-Boot
mailing list