'mtd erase' command should not erase bad blocks. To force bad block erasing
there is 'mtd erase.dontskipbad' command. Unfortunately nand layer erases
bad blocks unconditionally. This is wrong.

Fix issue by adding bad block checks to do_mtd_erase() function in the case
srub flag is not provided. We can't simplify code by eliminating -EIO result
check of mtd_erase() as it will terminate erasing with CMD_RET_SUCCESS.

Thanks to Dario Binacchi <dario.binac...@amarulasolutions.com> for his patch.

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
 cmd/mtd.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/cmd/mtd.c b/cmd/mtd.c
index ad5cc9827d..a314745e95 100644
--- a/cmd/mtd.c
+++ b/cmd/mtd.c
@@ -434,11 +434,24 @@ static int do_mtd_erase(struct cmd_tbl *cmdtp, int flag, 
int argc,
        erase_op.mtd = mtd;
        erase_op.addr = off;
        erase_op.len = mtd->erasesize;
-       erase_op.scrub = scrub;
 
        while (len) {
-               ret = mtd_erase(mtd, &erase_op);
+               if (!scrub) {
+                       ret = mtd_block_isbad(mtd, erase_op.addr);
+                       if (ret < 0) {
+                               printf("Failed to get bad block at 0x%08llx\n",
+                                      erase_op.addr);
+                               ret = CMD_RET_FAILURE;
+                               goto out_put_mtd;
+                       } else if (ret > 0) {
+                               /* simulate bad block behavior */
+                               ret = -EIO;
+                               goto skip_block_erasing;
+                       }
+               }
 
+               ret = mtd_erase(mtd, &erase_op);
+skip_block_erasing:
                if (ret) {
                        /* Abort if its not a bad block error */
                        if (ret != -EIO)
-- 
2.35.1

Reply via email to