mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/8] improve nandtest command
@ 2012-10-22  7:23 Alexander Aring
  2012-10-22  7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Small Summary:
	- The old nandtest do a ecc statistic per eraseblock, it's better to
	  do this per page. I don't know how this works with subpages.
	
	- Add a progressbar instead of prints of current flash offset.

	- Rename command argument 'passes' to 'iterations', which makes more
	  sense.

	- use builtin function 'get_random_bytes' to generate random buffer.

	- use loff_t instead of off_t. To handle flash >4GB.

	- add another constraints check for writesize.

Alexander Aring (8):
  nandtest: stat ecc per page not per eraseblock
  nandtest: add progressbar instead of offset print
  nandtest: rename command argument p to i
  nandtest: change flash length variable type
  nandtest: use get_random_bytes instead of for loop
  nandtest: clean up code
  nandtest: use loff_t instead off_t
  nandtest: add another constraints check

 commands/nandtest.c | 190 ++++++++++++++++++++++++++++------------------------
 1 file changed, 103 insertions(+), 87 deletions(-)

-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/8] nandtest: stat ecc per page not per eraseblock
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Collect ecc statistics per page not per eraseblock.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 70 +++++++++++++++++++++++++++++------------------------
 1 file changed, 39 insertions(+), 31 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index d683b24..cdb837f 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -96,7 +96,8 @@ static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
 static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
 {
 	struct erase_info_user er;
-	int i, ret;
+	unsigned int i;
+	int ret;
 
 	printf("\r0x%08x: erasing... ", (unsigned)(ofs + memregion.offset));
 
@@ -111,43 +112,50 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
 		return ret;
 	}
 
-	printf("\r0x%08x: writing...", (unsigned)(ofs + memregion.offset));
+	for (i = 0; i < meminfo.erasesize;
+			i += meminfo.writesize) {
+		printf("\r0x%08x: writing...", (unsigned)
+				(ofs + i + memregion.offset));
 
-	/* Write data to given offset */
-	pwrite(fd, data, meminfo.erasesize, ofs);
+		/* Write data to given offset */
+		pwrite(fd, data + i, meminfo.writesize, ofs + i);
 
-	printf("\r0x%08x: reading...", (unsigned)(ofs + memregion.offset));
+		printf("\r0x%08x: reading...", (unsigned)
+				(ofs + i + memregion.offset));
 
-	/* Read data from offset */
-	pread(fd, rbuf, meminfo.erasesize, ofs);
+		/* Read data from offset */
+		pread(fd, rbuf + i, meminfo.writesize, ofs + i);
 
-	ret = ioctl(fd, ECCGETSTATS, &newstats);
-	if (ret < 0) {
-		perror("ECCGETSTATS");
-		return ret;
-	}
+		ret = ioctl(fd, ECCGETSTATS, &newstats);
+		if (ret < 0) {
+			perror("ECCGETSTATS");
+			return ret;
+		}
 
-	if (newstats.corrected > oldstats.corrected) {
-		printf("\n %d bit(s) ECC corrected at 0x%08x\n",
-				newstats.corrected - oldstats.corrected,
-				(unsigned)(ofs + memregion.offset));
-		if ((newstats.corrected-oldstats.corrected) >= MAX_ECC_BITS) {
-			/* Increment ECC stats that are over MAX_ECC_BITS */
-			ecc_stats_over++;
-		} else {
-			/* Increment ECC stat value */
-			ecc_stats[(newstats.corrected-oldstats.corrected)-1]++;
+		if (newstats.corrected > oldstats.corrected) {
+			printf("\n %d bit(s) ECC corrected at page 0x%08x\n",
+					newstats.corrected - oldstats.corrected,
+					(unsigned)(ofs + memregion.offset + i));
+			if ((newstats.corrected-oldstats.corrected) >=
+					MAX_ECC_BITS) {
+				/* Increment ECC stats that
+				 * are over MAX_ECC_BITS */
+				ecc_stats_over++;
+			} else {
+				/* Increment ECC stat value */
+				ecc_stats[(newstats.corrected-
+						oldstats.corrected)-1]++;
+			}
+			/* Set oldstats to newstats */
+			oldstats.corrected = newstats.corrected;
+		}
+		if (newstats.failed > oldstats.failed) {
+			printf("\nECC failed at page 0x%08x\n",
+					(unsigned)(ofs + memregion.offset + i));
+			oldstats.failed = newstats.failed;
+			ecc_failed_cnt++;
 		}
-		/* Set oldstats to newstats */
-		oldstats.corrected = newstats.corrected;
-	}
-	if (newstats.failed > oldstats.failed) {
-		printf("\nECC failed at 0x%08x\n",
-				(unsigned)(ofs + memregion.offset));
-		oldstats.failed = newstats.failed;
-		ecc_failed_cnt++;
 	}
-
 	printf("\r0x%08x: checking...", (unsigned)(ofs + memregion.offset));
 
 	/* Compared written data with read data.
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/8] nandtest: add progressbar instead of offset print
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
  2012-10-22  7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Add progressbar and remove other outputs of current flash offset.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 42 +++++++++++++++++++++++++-----------------
 1 file changed, 25 insertions(+), 17 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index cdb837f..f614cd5 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -21,6 +21,7 @@
 #include <linux/mtd/mtd-abi.h>
 #include <fcntl.h>
 #include <stdlib.h>
+#include <progress.h>
 
 /* Max ECC Bits that can be corrected */
 #define MAX_ECC_BITS 8
@@ -64,7 +65,8 @@ static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
 /*
  * Implementation of pwrite with lseek and write.
  */
-static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
+static ssize_t pwrite(int fd, const void *buf,
+		size_t count, off_t offset, off_t length)
 {
 	int ret;
 
@@ -77,9 +79,11 @@ static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
 	if (ret < 0) {
 		perror("write");
 		if (markbad) {
-			printf("Mark block bad at 0x%08x\n",
+			printf("\nMark block bad at 0x%08x\n",
 					(unsigned)(offset + memregion.offset));
 			ioctl(fd, MEMSETBADBLOCK, &offset);
+			init_progression_bar(length);
+			show_progress(offset);
 		}
 	}
 
@@ -92,21 +96,21 @@ static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
  * Param ofs: offset on flash_device.
  * Param data: data to write on flash.
  * Param rbuf: pointer to allocated buffer to copy readed data.
+ * Param length: length of testing area
  */
-static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
+static int erase_and_write(off_t ofs, unsigned char *data,
+		unsigned char *rbuf, off_t length)
 {
 	struct erase_info_user er;
 	unsigned int i;
 	int ret;
 
-	printf("\r0x%08x: erasing... ", (unsigned)(ofs + memregion.offset));
-
 	er.start = ofs;
 	er.length = meminfo.erasesize;
 
 	ret = erase(fd, er.length, er.start);
 	if (ret < 0) {
-		perror("erase");
+		perror("\nerase");
 		printf("Could't not erase flash at 0x%08x length 0x%08x.\n",
 			   er.start, er.length);
 		return ret;
@@ -114,21 +118,16 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
 
 	for (i = 0; i < meminfo.erasesize;
 			i += meminfo.writesize) {
-		printf("\r0x%08x: writing...", (unsigned)
-				(ofs + i + memregion.offset));
-
 		/* Write data to given offset */
-		pwrite(fd, data + i, meminfo.writesize, ofs + i);
-
-		printf("\r0x%08x: reading...", (unsigned)
-				(ofs + i + memregion.offset));
+		pwrite(fd, data + i, meminfo.writesize,
+				ofs + i, length);
 
 		/* Read data from offset */
 		pread(fd, rbuf + i, meminfo.writesize, ofs + i);
 
 		ret = ioctl(fd, ECCGETSTATS, &newstats);
 		if (ret < 0) {
-			perror("ECCGETSTATS");
+			perror("\nECCGETSTATS");
 			return ret;
 		}
 
@@ -136,6 +135,8 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
 			printf("\n %d bit(s) ECC corrected at page 0x%08x\n",
 					newstats.corrected - oldstats.corrected,
 					(unsigned)(ofs + memregion.offset + i));
+			init_progression_bar(length);
+			show_progress(ofs);
 			if ((newstats.corrected-oldstats.corrected) >=
 					MAX_ECC_BITS) {
 				/* Increment ECC stats that
@@ -152,11 +153,12 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
 		if (newstats.failed > oldstats.failed) {
 			printf("\nECC failed at page 0x%08x\n",
 					(unsigned)(ofs + memregion.offset + i));
+			init_progression_bar(length);
+			show_progress(ofs);
 			oldstats.failed = newstats.failed;
 			ecc_failed_cnt++;
 		}
 	}
-	printf("\r0x%08x: checking...", (unsigned)(ofs + memregion.offset));
 
 	/* Compared written data with read data.
 	 * If data is not identical, display a detailed
@@ -309,27 +311,33 @@ static int do_nandtest(int argc, char *argv[])
 	rbuf = wbuf + meminfo.erasesize;
 
 	for (pass = 0; pass < nr_passes; pass++) {
+		init_progression_bar(length);
 		for (test_ofs = flash_offset;
 				test_ofs < flash_offset+length;
 				test_ofs += meminfo.erasesize) {
 			loff_t __test_ofs = test_ofs;
+			show_progress(test_ofs);
 			srand(seed);
 			seed = rand();
 
 			if (ioctl(fd, MEMGETBADBLOCK, &__test_ofs)) {
-				printf("\rBad block at 0x%08x\n",
+				printf("\nBad block at 0x%08x\n",
 						(unsigned)(test_ofs +
 							memregion.offset));
+				init_progression_bar(length);
+				show_progress(test_ofs);
 				continue;
 			}
 
 			for (i = 0; i < meminfo.erasesize; i++)
 				wbuf[i] = rand();
 
-			ret = erase_and_write(test_ofs, wbuf, rbuf);
+			ret = erase_and_write(test_ofs, wbuf,
+					rbuf, length);
 			if (ret < 0)
 				goto err2;
 		}
+		show_progress(test_ofs);
 		printf("\nFinished pass %d successfully\n", pass+1);
 	}
 
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 3/8] nandtest: rename command argument p to i
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
  2012-10-22  7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
  2012-10-22  7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Rename command argument p for 'passes' to 'i' iteration.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index f614cd5..656fb65 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -198,7 +198,7 @@ static int do_nandtest(int argc, char *argv[])
 	int opt, length = -1, do_nandtest_dev = -1;
 	off_t flash_offset = 0;
 	off_t test_ofs;
-	unsigned int nr_passes = 1, pass;
+	unsigned int nr_iterations = 1, iter;
 	int i;
 	int ret = -1;
 	unsigned char *wbuf, *rbuf;
@@ -210,7 +210,7 @@ static int do_nandtest(int argc, char *argv[])
 
 	memset(ecc_stats, 0, MAX_ECC_BITS);
 
-	while ((opt = getopt(argc, argv, "ms:p:o:l:t")) > 0) {
+	while ((opt = getopt(argc, argv, "ms:i:o:l:t")) > 0) {
 		switch (opt) {
 		case 'm':
 			markbad = 1;
@@ -218,8 +218,8 @@ static int do_nandtest(int argc, char *argv[])
 		case 's':
 			seed = simple_strtoul(optarg, NULL, 0);
 			break;
-		case 'p':
-			nr_passes = simple_strtoul(optarg, NULL, 0);
+		case 'i':
+			nr_iterations = simple_strtoul(optarg, NULL, 0);
 			break;
 		case 'o':
 			flash_offset = simple_strtoul(optarg, NULL, 0);
@@ -310,7 +310,7 @@ static int do_nandtest(int argc, char *argv[])
 	}
 	rbuf = wbuf + meminfo.erasesize;
 
-	for (pass = 0; pass < nr_passes; pass++) {
+	for (iter = 0; iter < nr_iterations; iter++) {
 		init_progression_bar(length);
 		for (test_ofs = flash_offset;
 				test_ofs < flash_offset+length;
@@ -338,10 +338,10 @@ static int do_nandtest(int argc, char *argv[])
 				goto err2;
 		}
 		show_progress(test_ofs);
-		printf("\nFinished pass %d successfully\n", pass+1);
+		printf("\nFinished pass %d successfully\n", iter+1);
 	}
 
-	print_stats(nr_passes, length);
+	print_stats(nr_iterations, length);
 
 	ret = close(fd);
 	if (ret < 0) {
@@ -366,7 +366,7 @@ static const __maybe_unused char cmd_nandtest_help[] =
 		"  -t,	Really do a nandtest on device.\n"
 		"  -m,	Mark blocks bad if they appear so.\n"
 		"  -s	<seed>,	Supply random seed.\n"
-		"  -p	<passes>, Number of passes.\n"
+		"  -i	<iterations>, Number of iterations.\n"
 		"  -o	<offset>, Start offset on flash.\n"
 		"  -l	<length>, Length of flash to test.\n";
 
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 4/8] nandtest: change flash length variable type
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (2 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Change flash 'length' variable type to off_t instead of int.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index 656fb65..e25f062 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -195,9 +195,8 @@ static void print_stats(int nr_passes, int length)
 /* Main program. */
 static int do_nandtest(int argc, char *argv[])
 {
-	int opt, length = -1, do_nandtest_dev = -1;
-	off_t flash_offset = 0;
-	off_t test_ofs;
+	int opt, do_nandtest_dev = -1;
+	off_t flash_offset = 0, test_ofs, length = 0;
 	unsigned int nr_iterations = 1, iter;
 	int i;
 	int ret = -1;
@@ -272,7 +271,7 @@ static int do_nandtest(int argc, char *argv[])
 		goto err;
 	}
 
-	if (length == -1) {
+	if (!length) {
 		length = meminfo.size;
 		length -= flash_offset;
 	}
@@ -292,13 +291,13 @@ static int do_nandtest(int argc, char *argv[])
 	}
 	if (length % meminfo.erasesize) {
 		printf("Length 0x%08x not multiple of erase size 0x%08x\n",
-			length, meminfo.erasesize);
+			(unsigned)length, meminfo.erasesize);
 		goto err;
 	}
 	if (length + flash_offset > meminfo.size) {
 		printf("Length 0x%08x + offset 0x%08x exceeds "
-				"device size 0x%08x\n",
-			length, (unsigned)flash_offset, meminfo.size);
+				"device size 0x%08x\n", (unsigned)length,
+				(unsigned)flash_offset, meminfo.size);
 		goto err;
 	}
 
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 5/8] nandtest: use get_random_bytes instead of for loop
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (3 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Use already builtin get_random_bytes instead of for loop.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index e25f062..cdf9c31 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -198,7 +198,6 @@ static int do_nandtest(int argc, char *argv[])
 	int opt, do_nandtest_dev = -1;
 	off_t flash_offset = 0, test_ofs, length = 0;
 	unsigned int nr_iterations = 1, iter;
-	int i;
 	int ret = -1;
 	unsigned char *wbuf, *rbuf;
 
@@ -328,9 +327,7 @@ static int do_nandtest(int argc, char *argv[])
 				continue;
 			}
 
-			for (i = 0; i < meminfo.erasesize; i++)
-				wbuf[i] = rand();
-
+			get_random_bytes(wbuf, meminfo.erasesize);
 			ret = erase_and_write(test_ofs, wbuf,
 					rbuf, length);
 			if (ret < 0)
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 6/8] nandtest: clean up code
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (4 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Clean up code:

	- change 'i+i' to 'i + i'.
	- change counter variable to unsigned int.
	- use spaces instead of tabs in help text.
	- remove __test_ofs variable.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index cdf9c31..ead728b 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -144,8 +144,8 @@ static int erase_and_write(off_t ofs, unsigned char *data,
 				ecc_stats_over++;
 			} else {
 				/* Increment ECC stat value */
-				ecc_stats[(newstats.corrected-
-						oldstats.corrected)-1]++;
+				ecc_stats[(newstats.corrected -
+						oldstats.corrected) - 1]++;
 			}
 			/* Set oldstats to newstats */
 			oldstats.corrected = newstats.corrected;
@@ -179,13 +179,13 @@ static int erase_and_write(off_t ofs, unsigned char *data,
 /* Print stats of nandtest. */
 static void print_stats(int nr_passes, int length)
 {
-	int i;
+	unsigned int i;
 	printf("-------- Summary --------\n");
 	printf("Tested blocks		: %d\n", (length/meminfo.erasesize)
 			* nr_passes);
 
 	for (i = 0; i < MAX_ECC_BITS; i++)
-		printf("ECC %d bit error(s)	: %d\n", i+1, ecc_stats[i]);
+		printf("ECC %d bit error(s)	: %d\n", i + 1, ecc_stats[i]);
 
 	printf("ECC >%d bit error(s)	: %d\n", MAX_ECC_BITS, ecc_stats_over);
 	printf("ECC corrections failed	: %d\n", ecc_failed_cnt);
@@ -195,10 +195,9 @@ static void print_stats(int nr_passes, int length)
 /* Main program. */
 static int do_nandtest(int argc, char *argv[])
 {
-	int opt, do_nandtest_dev = -1;
+	int opt, do_nandtest_dev = -1, ret = -1;
 	off_t flash_offset = 0, test_ofs, length = 0;
 	unsigned int nr_iterations = 1, iter;
-	int ret = -1;
 	unsigned char *wbuf, *rbuf;
 
 	ecc_failed_cnt = 0;
@@ -276,10 +275,10 @@ static int do_nandtest(int argc, char *argv[])
 	}
 
 	printf("Flash offset: 0x%08x\n",
-			(unsigned)(flash_offset+memregion.offset));
+			(unsigned)(flash_offset + memregion.offset));
 	printf("Length: 0x%08x\n", (unsigned)length);
 	printf("End address: 0x%08x\n",
-			(unsigned)(flash_offset+length+memregion.offset));
+			(unsigned)(flash_offset + length + memregion.offset));
 	printf("Erasesize: 0x%08x\n", (unsigned)(meminfo.erasesize));
 	printf("Starting nandtest...\n");
 
@@ -311,14 +310,13 @@ static int do_nandtest(int argc, char *argv[])
 	for (iter = 0; iter < nr_iterations; iter++) {
 		init_progression_bar(length);
 		for (test_ofs = flash_offset;
-				test_ofs < flash_offset+length;
+				test_ofs < flash_offset + length;
 				test_ofs += meminfo.erasesize) {
-			loff_t __test_ofs = test_ofs;
 			show_progress(test_ofs);
 			srand(seed);
 			seed = rand();
 
-			if (ioctl(fd, MEMGETBADBLOCK, &__test_ofs)) {
+			if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
 				printf("\nBad block at 0x%08x\n",
 						(unsigned)(test_ofs +
 							memregion.offset));
@@ -334,7 +332,7 @@ static int do_nandtest(int argc, char *argv[])
 				goto err2;
 		}
 		show_progress(test_ofs);
-		printf("\nFinished pass %d successfully\n", iter+1);
+		printf("\nFinished pass %d successfully\n", iter + 1);
 	}
 
 	print_stats(nr_iterations, length);
@@ -359,12 +357,12 @@ err:
 /* String for usage of nandtest */
 static const __maybe_unused char cmd_nandtest_help[] =
 "Usage: nandtest [OPTION] <device>\n"
-		"  -t,	Really do a nandtest on device.\n"
-		"  -m,	Mark blocks bad if they appear so.\n"
-		"  -s	<seed>,	Supply random seed.\n"
-		"  -i	<iterations>, Number of iterations.\n"
-		"  -o	<offset>, Start offset on flash.\n"
-		"  -l	<length>, Length of flash to test.\n";
+		"  -t,  Really do a nandtest on device.\n"
+		"  -m,  Mark blocks bad if they appear so.\n"
+		"  -s   <seed>, Supply random seed.\n"
+		"  -i   <iterations>, Number of iterations.\n"
+		"  -o   <offset>, Start offset on flash.\n"
+		"  -l   <length>, Length of flash to test.\n";
 
 BAREBOX_CMD_START(nandtest)
 	.cmd		= do_nandtest,
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 7/8] nandtest: use loff_t instead off_t
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (5 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-22  7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
  2012-10-23  6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Use the same offset type like mtd interface.
Replace modulo operation with IS_ALIGNED macro.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 57 ++++++++++++++++++++++++++---------------------------
 1 file changed, 28 insertions(+), 29 deletions(-)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index ead728b..f9c9318 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -45,7 +45,7 @@ static unsigned int ecc_failed_cnt;
 /*
  * Implementation of pread with lseek and read.
  */
-static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
+static ssize_t pread(int fd, void *buf, size_t count, loff_t offset)
 {
 	int ret;
 
@@ -66,7 +66,7 @@ static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
  * Implementation of pwrite with lseek and write.
  */
 static ssize_t pwrite(int fd, const void *buf,
-		size_t count, off_t offset, off_t length)
+		size_t count, loff_t offset, loff_t length)
 {
 	int ret;
 
@@ -79,8 +79,8 @@ static ssize_t pwrite(int fd, const void *buf,
 	if (ret < 0) {
 		perror("write");
 		if (markbad) {
-			printf("\nMark block bad at 0x%08x\n",
-					(unsigned)(offset + memregion.offset));
+			printf("\nMark block bad at 0x%08llx\n",
+					offset + memregion.offset);
 			ioctl(fd, MEMSETBADBLOCK, &offset);
 			init_progression_bar(length);
 			show_progress(offset);
@@ -98,8 +98,8 @@ static ssize_t pwrite(int fd, const void *buf,
  * Param rbuf: pointer to allocated buffer to copy readed data.
  * Param length: length of testing area
  */
-static int erase_and_write(off_t ofs, unsigned char *data,
-		unsigned char *rbuf, off_t length)
+static int erase_and_write(loff_t ofs, unsigned char *data,
+		unsigned char *rbuf, loff_t length)
 {
 	struct erase_info_user er;
 	unsigned int i;
@@ -132,9 +132,9 @@ static int erase_and_write(off_t ofs, unsigned char *data,
 		}
 
 		if (newstats.corrected > oldstats.corrected) {
-			printf("\n %d bit(s) ECC corrected at page 0x%08x\n",
+			printf("\n %d bit(s) ECC corrected at page 0x%08llx\n",
 					newstats.corrected - oldstats.corrected,
-					(unsigned)(ofs + memregion.offset + i));
+					ofs + memregion.offset + i);
 			init_progression_bar(length);
 			show_progress(ofs);
 			if ((newstats.corrected-oldstats.corrected) >=
@@ -151,8 +151,8 @@ static int erase_and_write(off_t ofs, unsigned char *data,
 			oldstats.corrected = newstats.corrected;
 		}
 		if (newstats.failed > oldstats.failed) {
-			printf("\nECC failed at page 0x%08x\n",
-					(unsigned)(ofs + memregion.offset + i));
+			printf("\nECC failed at page 0x%08llx\n",
+					ofs + memregion.offset + i);
 			init_progression_bar(length);
 			show_progress(ofs);
 			oldstats.failed = newstats.failed;
@@ -196,7 +196,7 @@ static void print_stats(int nr_passes, int length)
 static int do_nandtest(int argc, char *argv[])
 {
 	int opt, do_nandtest_dev = -1, ret = -1;
-	off_t flash_offset = 0, test_ofs, length = 0;
+	loff_t flash_offset = 0, test_ofs, length = 0;
 	unsigned int nr_iterations = 1, iter;
 	unsigned char *wbuf, *rbuf;
 
@@ -274,28 +274,28 @@ static int do_nandtest(int argc, char *argv[])
 		length -= flash_offset;
 	}
 
-	printf("Flash offset: 0x%08x\n",
-			(unsigned)(flash_offset + memregion.offset));
-	printf("Length: 0x%08x\n", (unsigned)length);
-	printf("End address: 0x%08x\n",
-			(unsigned)(flash_offset + length + memregion.offset));
-	printf("Erasesize: 0x%08x\n", (unsigned)(meminfo.erasesize));
+	printf("Flash offset: 0x%08llx\n",
+			flash_offset + memregion.offset);
+	printf("Length: 0x%08llx\n", length);
+	printf("End address: 0x%08llx\n",
+			flash_offset + length + memregion.offset);
+	printf("Erasesize: 0x%08x\n", meminfo.erasesize);
 	printf("Starting nandtest...\n");
 
-	if (flash_offset % meminfo.erasesize) {
-		printf("Offset 0x%08x not multiple of erase size 0x%08x\n",
-			(unsigned)flash_offset, meminfo.erasesize);
+	if (!IS_ALIGNED(flash_offset, meminfo.erasesize)) {
+		printf("Offset 0x%08llx not multiple of erase size 0x%08x\n",
+			flash_offset, meminfo.erasesize);
 		goto err;
 	}
-	if (length % meminfo.erasesize) {
-		printf("Length 0x%08x not multiple of erase size 0x%08x\n",
-			(unsigned)length, meminfo.erasesize);
+	if (!IS_ALIGNED(length, meminfo.erasesize)) {
+		printf("Length 0x%08llx not multiple of erase size 0x%08x\n",
+			length, meminfo.erasesize);
 		goto err;
 	}
 	if (length + flash_offset > meminfo.size) {
-		printf("Length 0x%08x + offset 0x%08x exceeds "
-				"device size 0x%08x\n", (unsigned)length,
-				(unsigned)flash_offset, meminfo.size);
+		printf("Length 0x%08llx + offset 0x%08llx exceeds "
+				"device size 0x%08x\n", length,
+				flash_offset, meminfo.size);
 		goto err;
 	}
 
@@ -317,9 +317,8 @@ static int do_nandtest(int argc, char *argv[])
 			seed = rand();
 
 			if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
-				printf("\nBad block at 0x%08x\n",
-						(unsigned)(test_ofs +
-							memregion.offset));
+				printf("\nBad block at 0x%08llx\n",
+						test_ofs + memregion.offset);
 				init_progression_bar(length);
 				show_progress(test_ofs);
 				continue;
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 8/8] nandtest: add another constraints check
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (6 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
@ 2012-10-22  7:23 ` Alexander Aring
  2012-10-23  6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer
  8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22  7:23 UTC (permalink / raw)
  To: barebox

Add check if writesize is a multiple of erasesize.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
 commands/nandtest.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/commands/nandtest.c b/commands/nandtest.c
index f9c9318..f08f8eb 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -282,6 +282,13 @@ static int do_nandtest(int argc, char *argv[])
 	printf("Erasesize: 0x%08x\n", meminfo.erasesize);
 	printf("Starting nandtest...\n");
 
+	if (!IS_ALIGNED(meminfo.erasesize, meminfo.writesize)) {
+		printf("Erasesize 0x%08x is not a multiple "
+				"of writesize 0x%08x.\n"
+				"Please check driver implementation\n",
+				meminfo.erasesize, meminfo.writesize);
+		goto err;
+	}
 	if (!IS_ALIGNED(flash_offset, meminfo.erasesize)) {
 		printf("Offset 0x%08llx not multiple of erase size 0x%08x\n",
 			flash_offset, meminfo.erasesize);
-- 
1.7.12.4


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 0/8] improve nandtest command
  2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
                   ` (7 preceding siblings ...)
  2012-10-22  7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
@ 2012-10-23  6:27 ` Sascha Hauer
  8 siblings, 0 replies; 10+ messages in thread
From: Sascha Hauer @ 2012-10-23  6:27 UTC (permalink / raw)
  To: Alexander Aring; +Cc: barebox

On Mon, Oct 22, 2012 at 09:23:24AM +0200, Alexander Aring wrote:
> Small Summary:
> 	- The old nandtest do a ecc statistic per eraseblock, it's better to
> 	  do this per page. I don't know how this works with subpages.
> 	
> 	- Add a progressbar instead of prints of current flash offset.
> 
> 	- Rename command argument 'passes' to 'iterations', which makes more
> 	  sense.
> 
> 	- use builtin function 'get_random_bytes' to generate random buffer.
> 
> 	- use loff_t instead of off_t. To handle flash >4GB.
> 
> 	- add another constraints check for writesize.

Applied, thanks

Sascha

> 
> Alexander Aring (8):
>   nandtest: stat ecc per page not per eraseblock
>   nandtest: add progressbar instead of offset print
>   nandtest: rename command argument p to i
>   nandtest: change flash length variable type
>   nandtest: use get_random_bytes instead of for loop
>   nandtest: clean up code
>   nandtest: use loff_t instead off_t
>   nandtest: add another constraints check
> 
>  commands/nandtest.c | 190 ++++++++++++++++++++++++++++------------------------
>  1 file changed, 103 insertions(+), 87 deletions(-)
> 
> -- 
> 1.7.12.4
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-10-23  6:27 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-22  7:23 [PATCH 0/8] improve nandtest command Alexander Aring
2012-10-22  7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
2012-10-22  7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
2012-10-22  7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
2012-10-22  7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
2012-10-22  7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
2012-10-22  7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
2012-10-22  7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
2012-10-22  7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
2012-10-23  6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox