Commit 8360b66bac9567701027a0087274d0c9b2fe8d6b

Authored by Wolfgang Denk
Committed by Scott Wood
1 parent cd84423a09

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

... ... @@ -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"