summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2008-06-12 13:13:23 -0500
committerScott Wood <scottwood@freescale.com>2008-08-12 11:31:27 -0500
commit984e03cdf1431bb593aeaa1b74c445d616f955d3 (patch)
tree9ca147809a8266bd016050a0789d4b19913d7e40
parente1c3dbada349992875934575c97b328ab2cb33ca (diff)
downloadu-boot-imx-984e03cdf1431bb593aeaa1b74c445d616f955d3.zip
u-boot-imx-984e03cdf1431bb593aeaa1b74c445d616f955d3.tar.gz
u-boot-imx-984e03cdf1431bb593aeaa1b74c445d616f955d3.tar.bz2
NAND: Always skip blocks on read/write/boot.
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>
-rw-r--r--common/cmd_nand.c27
-rw-r--r--doc/README.nand37
2 files changed, 26 insertions, 38 deletions
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 710ba8f..2c421e9 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -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
diff --git a/doc/README.nand b/doc/README.nand
index 647a6b8..0ad5e18 100644
--- a/doc/README.nand
+++ b/doc/README.nand
@@ -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)