[U-Boot] [PATCH] tools/env: check flash length before probing

Mike Frysinger vapier at gentoo.org
Thu Apr 5 07:29:18 CEST 2012


If we attempt to probe beyond the end of flash, MEMGETBADBLOCK will fail
(as well it should), but we end up erroring out with the distracting:
	Cannot read bad block mark: Invalid argument

Instead of the correct error:
	Too few good blocks within range

Re-order the tests so we check for the end of the flash before probing
so we don't probe blocks that don't exist.

Reported-by: Mark Bishop <Mark.Bishop at cooperindustries.com>
Signed-off-by: Mike Frysinger <vapier at gentoo.org>
---
 tools/env/fw_env.c |   16 ++++++++--------
 1 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index e292d2b..d0fbbb0 100644
--- a/tools/env/fw_env.c
+++ b/tools/env/fw_env.c
@@ -712,10 +712,6 @@ static int flash_read_buf (int dev, int fd, void *buf, size_t count,
 
 	/* This only runs once on NOR flash */
 	while (processed < count) {
-		rc = flash_bad_block (fd, mtd_type, &blockstart);
-		if (rc < 0)		/* block test failed */
-			return -1;
-
 		if (blockstart + block_seek + readlen > top_of_range) {
 			/* End of range is reached */
 			fprintf (stderr,
@@ -723,6 +719,10 @@ static int flash_read_buf (int dev, int fd, void *buf, size_t count,
 			return -1;
 		}
 
+		rc = flash_bad_block (fd, mtd_type, &blockstart);
+		if (rc < 0)		/* block test failed */
+			return -1;
+
 		if (rc) {		/* block is bad */
 			blockstart += blocklen;
 			continue;
@@ -845,15 +845,15 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,
 
 	/* This only runs once on NOR flash and SPI-dataflash */
 	while (processed < write_total) {
-		rc = flash_bad_block (fd, mtd_type, &blockstart);
-		if (rc < 0)		/* block test failed */
-			return rc;
-
 		if (blockstart + erasesize > top_of_range) {
 			fprintf (stderr, "End of range reached, aborting\n");
 			return -1;
 		}
 
+		rc = flash_bad_block (fd, mtd_type, &blockstart);
+		if (rc < 0)		/* block test failed */
+			return rc;
+
 		if (rc) {		/* block is bad */
 			blockstart += blocklen;
 			continue;
-- 
1.7.8.5



More information about the U-Boot mailing list