NAND: Always skip blocks on read/write/boot.
authorScott Wood <scottwood@freescale.com>
Thu, 12 Jun 2008 18:13:23 +0000 (13:13 -0500)
committerScott Wood <scottwood@freescale.com>
Tue, 12 Aug 2008 16:31:27 +0000 (11:31 -0500)
Use of the non-skipping versions was almost always (if not always)
an error, and no valid use case has been identified.

Signed-off-by: Scott Wood <scottwood@freescale.com>
common/cmd_nand.c
doc/README.nand

index 710ba8f9460fafd058d9185eacf1bd13700d60b4..2c421e948ed99593b78b9d368567012c0b8dcd62 100644 (file)
@@ -332,8 +332,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
                        return 1;
 
                s = strchr(cmd, '.');
-               if (s != NULL &&
-                   (!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))) {
+               if (!s || !strcmp(s, ".jffs2") ||
+                   !strcmp(s, ".e") || !strcmp(s, ".i")) {
                        if (read) {
                                /* read */
                                nand_read_options_t opts;
@@ -372,10 +372,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
                        else
                                ret = nand->write_oob(nand, off, &ops);
                } else {
-                       if (read)
-                               ret = nand_read(nand, off, &size, (u_char *)addr);
-                       else
-                               ret = nand_write(nand, off, &size, (u_char *)addr);
+                       printf("Unknown nand command suffix '%s'.\n", s);
+                       return 1;
                }
 
                printf(" %d bytes %s: %s\n", size,
@@ -492,10 +490,10 @@ U_BOOT_CMD(nand, 5, 1, do_nand,
            "nand - NAND sub-system\n",
            "info - show available NAND devices\n"
            "nand device [dev] - show or set current device\n"
-           "nand read[.jffs2] - addr off|partition size\n"
-           "nand write[.jffs2] - addr off|partition size\n"
+           "nand read - addr off|partition size\n"
+           "nand write - addr off|partition size\n"
            "    read/write 'size' bytes starting at offset 'off'\n"
-           "    to/from memory address 'addr'\n"
+           "    to/from memory address 'addr', skipping bad blocks.\n"
            "nand erase [clean] [off size] - erase 'size' bytes from\n"
            "    offset 'off' (entire device if not specified)\n"
            "nand bad - show bad blocks\n"
@@ -514,15 +512,17 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
        char *ep, *s;
        size_t cnt;
        image_header_t *hdr;
-       int jffs2 = 0;
 #if defined(CONFIG_FIT)
        const void *fit_hdr = NULL;
 #endif
 
        s = strchr(cmd, '.');
        if (s != NULL &&
-           (!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")))
-               jffs2 = 1;
+           (strcmp(s, ".jffs2") && !strcmp(s, ".e") && !strcmp(s, ".i"))) {
+               printf("Unknown nand load suffix '%s'\n", s);
+               show_boot_progress(-53);
+               return 1;
+       }
 
        printf("\nLoading from %s, offset 0x%lx\n", nand->name, offset);
 
@@ -559,6 +559,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
        }
        show_boot_progress (57);
 
+       /* FIXME: skip bad blocks */
        r = nand_read(nand, offset, &cnt, (u_char *) addr);
        if (r) {
                puts("** Read error\n");
@@ -680,7 +681,7 @@ usage:
 
 U_BOOT_CMD(nboot, 4, 1, do_nandboot,
        "nboot   - boot from NAND device\n",
-       "[.jffs2] [partition] | [[[loadAddr] dev] offset]\n");
+       "[partition] | [[[loadAddr] dev] offset]\n");
 
 #endif
 
index 647a6b8e67fa7cf726b74a39f2df2a89d419330d..0ad5e18dd396bd85877ea4140d59c344a57b93b1 100644 (file)
@@ -57,14 +57,9 @@ Commands:
       Print information about all of the NAND devices found.
 
    nand read addr ofs|partition size
-      Read `size' bytes from `ofs' in NAND flash to `addr'. If a page
-      cannot be read because it is marked bad or an uncorrectable data
-      error is found the command stops with an error.
-
-   nand read.jffs2 addr ofs|partition size
-      Like `read', but the data for blocks that are marked bad is read as
-      0xff. This gives a readable JFFS2 image that can be processed by
-      the JFFS2 commands such as ls and fsload.
+      Read `size' bytes from `ofs' in NAND flash to `addr'.  Blocks that
+      are marked bad are skipped.  If a page cannot be read because an
+      uncorrectable data error is found, the command stops with an error.
 
    nand read.oob addr ofs|partition size
       Read `size' bytes from the out-of-band data area corresponding to
@@ -73,17 +68,15 @@ Commands:
       for bad blocks or ECC errors.
 
    nand write addr ofs|partition size
-      Write `size' bytes from `addr' to `ofs' in NAND flash. If a page
-      cannot be written because it is marked bad or the write fails the
-      command stops with an error.
-
-   nand write.jffs2 addr ofs|partition size
-      Like `write', but blocks that are marked bad are skipped and the
-      data is written to the next block instead. This allows writing
-      a JFFS2 image, as long as the image is short enough to fit even
-      after skipping the bad blocks. Compact images, such as those
-      produced by mkfs.jffs2 should work well, but loading an image copied
-      from another flash is going to be trouble if there are any bad blocks.
+      Write `size' bytes from `addr' to `ofs' in NAND flash.  Blocks that
+      are marked bad are skipped.  If a page cannot be read because an
+      uncorrectable data error is found, the command stops with an error.
+
+      As JFFS2 skips blocks similarly, this allows writing a JFFS2 image,
+      as long as the image is short enough to fit even after skipping the
+      bad blocks.  Compact images, such as those produced by mkfs.jffs2
+      should work well, but loading an image copied from another flash is
+      going to be trouble if there are any bad blocks.
 
    nand write.oob addr ofs|partition size
       Write `size' bytes from `addr' to the out-of-band data area
@@ -215,12 +208,6 @@ JFFS2 related commands:
   using both the new code which is able to skip bad blocks
   "nand erase clean" additionally writes JFFS2-cleanmarkers in the oob.
 
-  "nand write.jffs2"
-  like "nand write" but skip found bad eraseblocks
-
-  "nand read.jffs2"
-  like "nand read" but skip found bad eraseblocks
-
 Miscellaneous and testing commands:
   "markbad [offset]"
   create an artificial bad block (for testing bad block handling)