From 608f4fe3b040089b30a019f1a28efeda1ca5809f Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 26 Mar 2014 10:50:09 +0000 Subject: mtd: add support for bad blocks in NAND flash NAND flash is very likely to contain bad blocks. Currently, mtd and therefore sysupgrade fails when it encounters a single bad block, potentially leaving an unbootable system. This patch allows the mtd utility to skip bad blocks in NAND flash and complete sysupgrade successfully. Patch by: Matthew Redfearn Signed-off-by: Felix Fietkau SVN-Revision: 40021 --- package/system/mtd/src/jffs2.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'package/system/mtd/src/jffs2.c') diff --git a/package/system/mtd/src/jffs2.c b/package/system/mtd/src/jffs2.c index 2a83bd47f4..c29fb33e5c 100644 --- a/package/system/mtd/src/jffs2.c +++ b/package/system/mtd/src/jffs2.c @@ -59,6 +59,15 @@ static void pad(int size) } ofs = ofs % erasesize; if (ofs == 0) { + while (mtd_block_is_bad(outfd, mtdofs) && (mtdofs < mtdsize)) { + if (!quiet) + fprintf(stderr, "\nSkipping bad block at 0x%08x ", mtdofs); + + mtdofs += erasesize; + + /* Move the file pointer along over the bad block. */ + lseek(outfd, erasesize, SEEK_CUR); + } mtd_erase_block(outfd, mtdofs); write(outfd, buf, erasesize); mtdofs += erasesize; -- cgit v1.2.3