diff options
Diffstat (limited to 'nand-utils')
-rw-r--r-- | nand-utils/nandwrite.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/nand-utils/nandwrite.c b/nand-utils/nandwrite.c index 22c741d..c7a53d1 100644 --- a/nand-utils/nandwrite.c +++ b/nand-utils/nandwrite.c @@ -235,6 +235,20 @@ static void erase_buffer(void *buffer, size_t size) memset(buffer, kEraseByte, size); } +static int is_virt_block_bad(struct mtd_dev_info *mtd, int fd, + long long offset) +{ + int i, ret = 0; + + for (i = 0; i < blockalign; ++i) { + ret = mtd_is_bad(mtd, fd, offset / mtd->eb_size + i); + if (ret) + break; + } + + return ret; +} + /* * Main program */ @@ -246,10 +260,8 @@ int main(int argc, char * const argv[]) int ifd = -1; int pagelen; long long imglen = 0; - bool baderaseblock = false; long long blockstart = -1; struct mtd_dev_info mtd; - long long offs; int ret; bool failed = true; /* contains all the data read from the file so far for the current eraseblock */ @@ -391,7 +403,6 @@ int main(int argc, char * const argv[]) */ while (blockstart != (mtdoffset & (~ebsize_aligned + 1))) { blockstart = mtdoffset & (~ebsize_aligned + 1); - offs = blockstart; /* * if writebuf == filebuf, we are rewinding so we must @@ -403,40 +414,32 @@ int main(int argc, char * const argv[]) writebuf = filebuf; } - baderaseblock = false; if (!quiet) fprintf(stdout, "Writing data to block %lld at offset 0x%llx\n", blockstart / ebsize_aligned, blockstart); - /* Check all the blocks in an erase block for bad blocks */ if (noskipbad) continue; - do { - ret = mtd_is_bad(&mtd, fd, offs / ebsize_aligned); - if (ret < 0) { - sys_errmsg("%s: MTD get bad block failed", mtd_device); - goto closeall; - } else if (ret == 1) { - baderaseblock = true; - if (!quiet) - fprintf(stderr, "Bad block at %llx, %u block(s) " - "from %llx will be skipped\n", - offs, blockalign, blockstart); - } + ret = is_virt_block_bad(&mtd, fd, blockstart); - if (baderaseblock) { - mtdoffset = blockstart + ebsize_aligned; - - if (mtdoffset > mtd.size) { - errmsg("too many bad blocks, cannot complete request"); - goto closeall; - } - } + if (ret < 0) { + sys_errmsg("%s: MTD get bad block failed", mtd_device); + goto closeall; + } else if (ret == 1) { + if (!quiet) + fprintf(stderr, + "Bad block at %llx, %u block(s) " + "will be skipped\n", + blockstart, blockalign); - offs += ebsize_aligned / blockalign; - } while (offs < blockstart + ebsize_aligned); + mtdoffset = blockstart + ebsize_aligned; + if (mtdoffset > mtd.size) { + errmsg("too many bad blocks, cannot complete request"); + goto closeall; + } + } } /* Read more data from the input if there isn't enough in the buffer */ |