Commit 8360b66bac9567701027a0087274d0c9b2fe8d6b
Committed by
Scott Wood
1 parent
cd84423a09
Exists in
master
and in
54 other branches
nand/onenand: Fix missing argument checking for "markbad" command
The "nand markbad" and "onenand markbad" commands did not check if an argument was passed; if this was forgotten, no error was raised but block 0 was marked as bad. While fixing this bug, clean up the code a bit and allow to pass more than one block address, thus allowing to mark several blocks as bad in a single command invocation. Signed-off-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Scott Wood <scottwood@freescale.com>
Showing 2 changed files with 44 additions and 22 deletions Side-by-side Diff
common/cmd_nand.c
... | ... | @@ -414,18 +414,29 @@ |
414 | 414 | } |
415 | 415 | |
416 | 416 | if (strcmp(cmd, "markbad") == 0) { |
417 | - addr = (ulong)simple_strtoul(argv[2], NULL, 16); | |
417 | + argc -= 2; | |
418 | + argv += 2; | |
418 | 419 | |
419 | - int ret = nand->block_markbad(nand, addr); | |
420 | - if (ret == 0) { | |
421 | - printf("block 0x%08lx successfully marked as bad\n", | |
422 | - (ulong) addr); | |
423 | - return 0; | |
424 | - } else { | |
425 | - printf("block 0x%08lx NOT marked as bad! ERROR %d\n", | |
426 | - (ulong) addr, ret); | |
420 | + if (argc <= 0) | |
421 | + goto usage; | |
422 | + | |
423 | + while (argc > 0) { | |
424 | + addr = simple_strtoul(*argv, NULL, 16); | |
425 | + | |
426 | + if (nand->block_markbad(nand, addr)) { | |
427 | + printf("block 0x%08lx NOT marked " | |
428 | + "as bad! ERROR %d\n", | |
429 | + addr, ret); | |
430 | + ret = 1; | |
431 | + } else { | |
432 | + printf("block 0x%08lx successfully " | |
433 | + "marked as bad\n", | |
434 | + addr); | |
435 | + } | |
436 | + --argc; | |
437 | + ++argv; | |
427 | 438 | } |
428 | - return 1; | |
439 | + return ret; | |
429 | 440 | } |
430 | 441 | |
431 | 442 | if (strcmp(cmd, "biterr") == 0) { |
common/cmd_onenand.c
... | ... | @@ -340,7 +340,7 @@ |
340 | 340 | int blocksize; |
341 | 341 | ulong addr, ofs; |
342 | 342 | size_t len, retlen = 0; |
343 | - int ret; | |
343 | + int ret = 0; | |
344 | 344 | char *cmd, *s; |
345 | 345 | |
346 | 346 | mtd = &onenand_mtd; |
347 | 347 | |
348 | 348 | |
... | ... | @@ -434,18 +434,29 @@ |
434 | 434 | } |
435 | 435 | |
436 | 436 | if (strcmp(cmd, "markbad") == 0) { |
437 | - addr = (ulong)simple_strtoul(argv[2], NULL, 16); | |
437 | + argc -= 2; | |
438 | + argv += 2; | |
438 | 439 | |
439 | - int ret = mtd->block_markbad(mtd, addr); | |
440 | - if (ret == 0) { | |
441 | - printf("block 0x%08lx successfully marked as bad\n", | |
442 | - (ulong) addr); | |
443 | - return 0; | |
444 | - } else { | |
445 | - printf("block 0x%08lx NOT marked as bad! ERROR %d\n", | |
446 | - (ulong) addr, ret); | |
440 | + if (argc <= 0) | |
441 | + goto usage; | |
442 | + | |
443 | + while (argc > 0) { | |
444 | + addr = simple_strtoul(*argv, NULL, 16); | |
445 | + | |
446 | + if (mtd->block_markbad(mtd, addr)) { | |
447 | + printf("block 0x%08lx NOT marked " | |
448 | + "as bad! ERROR %d\n", | |
449 | + addr, ret); | |
450 | + ret = 1; | |
451 | + } else { | |
452 | + printf("block 0x%08lx successfully " | |
453 | + "marked as bad\n", | |
454 | + addr); | |
455 | + } | |
456 | + --argc; | |
457 | + ++argv; | |
447 | 458 | } |
448 | - return 1; | |
459 | + return ret; | |
449 | 460 | } |
450 | 461 | |
451 | 462 | if (strncmp(cmd, "dump", 4) == 0) { |
... | ... | @@ -474,7 +485,7 @@ |
474 | 485 | } |
475 | 486 | |
476 | 487 | U_BOOT_CMD( |
477 | - onenand, 6, 1, do_onenand, | |
488 | + onenand, CONFIG_SYS_MAXARGS, 1, do_onenand, | |
478 | 489 | "OneNAND sub-system", |
479 | 490 | "info - show available OneNAND devices\n" |
480 | 491 | "onenand bad - show bad blocks\n" |