nandwrite: always check the first erase block

Current code does not check the first erase block when mtdoffset is not erase
block aligned. Fix this.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Baruch Siach 2010-08-29 10:36:50 +03:00 committed by Denys Vlasenko
parent b32a543663
commit 7715b48c36

View File

@ -52,7 +52,7 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
unsigned opts; unsigned opts;
int fd; int fd;
ssize_t cnt; ssize_t cnt;
unsigned mtdoffset, meminfo_writesize; unsigned mtdoffset, meminfo_writesize, blockstart;
struct mtd_info_user meminfo; struct mtd_info_user meminfo;
unsigned char *filebuf; unsigned char *filebuf;
const char *opt_s = "0"; const char *opt_s = "0";
@ -83,9 +83,21 @@ int nandwrite_main(int argc UNUSED_PARAM, char **argv)
filebuf = xmalloc(meminfo_writesize); filebuf = xmalloc(meminfo_writesize);
blockstart = mtdoffset & ~(meminfo.erasesize - 1);
if (blockstart != mtdoffset) {
unsigned tmp;
/* mtdoffset is in the middle of an erase block, verify that
* this block is OK. Advance mtdoffset only if this block is
* bad.
*/
tmp = next_good_eraseblock(fd, &meminfo, blockstart);
if (tmp != blockstart) /* bad block(s), advance mtdoffset */
mtdoffset = tmp;
}
cnt = -1; cnt = -1;
while (mtdoffset < meminfo.size) { while (mtdoffset < meminfo.size) {
unsigned blockstart = mtdoffset & ~(meminfo.erasesize - 1); blockstart = mtdoffset & ~(meminfo.erasesize - 1);
if (blockstart == mtdoffset) { if (blockstart == mtdoffset) {
/* starting a new eraseblock */ /* starting a new eraseblock */
mtdoffset = next_good_eraseblock(fd, &meminfo, blockstart); mtdoffset = next_good_eraseblock(fd, &meminfo, blockstart);