mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] nandtest: fix wrong ecc stats and start offset parameter
@ 2024-06-04 10:39 Andreas Helmcke
  2024-06-10 12:42 ` Sascha Hauer
  2024-06-10 12:43 ` Sascha Hauer
  0 siblings, 2 replies; 3+ messages in thread
From: Andreas Helmcke @ 2024-06-04 10:39 UTC (permalink / raw)
  To: barebox; +Cc: Andreas Helmcke

- The -o (start offset on flash) parameter has no effect. The check always
starts at address 0, despite the value given with -o.

- Due to an invalid initialization the ecc error stats sometimes showed invalid values.

Signed-off-by: Andreas Helmcke <ahelmcke@ela-soft.com>
---
 commands/nandtest.c | 62 ++++++++++++++++++++++++++++++---------------
 1 file changed, 42 insertions(+), 20 deletions(-)
 mode change 100644 => 100755 commands/nandtest.c

diff --git a/commands/nandtest.c b/commands/nandtest.c
old mode 100644
new mode 100755
index 4a7db9cc74..c2eed15c50
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -34,11 +34,32 @@ static unsigned int ecc_stats[MAX_ECC_BITS];
 static unsigned int ecc_stats_over;
 static unsigned int ecc_failed_cnt;
 
+/* Helper for progression bar */
+static loff_t pb_len;
+static loff_t pb_start;
+
+static void pb_init(void)
+{
+	init_progression_bar(pb_len);
+}
+
+static void pb_update(const loff_t done)
+{
+	show_progress(done - pb_start);	
+}
+
+static void pb_rewrite(const loff_t done)
+{
+	pb_init();
+	pb_update(done);
+}
+
+
 /*
  * Implementation of pwrite with lseek and write.
  */
 static ssize_t __pwrite(int fd, const void *buf,
-		size_t count, loff_t offset, loff_t length)
+		size_t count, loff_t offset)
 {
 	ssize_t ret;
 
@@ -50,8 +71,7 @@ static ssize_t __pwrite(int fd, const void *buf,
 			printf("\nMark block bad at 0x%08llx\n",
 					offset + memregion.offset);
 			ioctl(fd, MEMSETBADBLOCK, &offset);
-			init_progression_bar(length);
-			show_progress(offset);
+			pb_rewrite(offset);
 		}
 	}
 
@@ -59,7 +79,7 @@ static ssize_t __pwrite(int fd, const void *buf,
 	return ret;
 }
 
-static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
+static int _read_get_stats(loff_t ofs, unsigned char *buf)
 {
 	int ret;
 
@@ -76,8 +96,7 @@ static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
 		printf("\n %d bit(s) ECC corrected at page 0x%08llx\n",
 				newstats.corrected - oldstats.corrected,
 				ofs + memregion.offset);
-		init_progression_bar(totallength);
-		show_progress(ofs);
+		pb_rewrite(ofs);
 		if ((newstats.corrected-oldstats.corrected) >=
 				MAX_ECC_BITS) {
 			/* Increment ECC stats that
@@ -95,8 +114,7 @@ static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
 	if (newstats.failed > oldstats.failed) {
 		printf("\nECC failed at page 0x%08llx\n",
 				ofs + memregion.offset);
-		init_progression_bar(totallength);
-		show_progress(ofs);
+		pb_rewrite(ofs);
 		oldstats.failed = newstats.failed;
 		ecc_failed_cnt++;
 	}
@@ -117,7 +135,7 @@ static int read_corrected(loff_t ofs, unsigned char *rbuf, loff_t length)
 
 	for (i = 0; i < meminfo.erasesize;
 			i += meminfo.writesize) {
-		ret = _read_get_stats(ofs + i, rbuf + i, length);
+		ret = _read_get_stats(ofs + i, rbuf + i);
 		if (ret)
 			return ret;
 	}
@@ -154,9 +172,9 @@ static int erase_and_write(loff_t ofs, unsigned char *data,
 			i += meminfo.writesize) {
 		/* Write data to given offset */
 		__pwrite(fd, data + i, meminfo.writesize,
-				ofs + i, length);
+				ofs + i);
 
-		ret = _read_get_stats(ofs + i, rbuf + i, length);
+		ret = _read_get_stats(ofs + i, rbuf + i);
 		if (ret)
 			return ret;
 	}
@@ -201,7 +219,7 @@ static void print_stats(int nr_passes, loff_t length)
 static int do_nandtest(int argc, char *argv[])
 {
 	int opt, do_nandtest_dev = -1, do_nandtest_ro = 0, ret = -1;
-	loff_t flash_offset = 0, test_ofs, length = 0;
+	loff_t flash_offset = 0, test_ofs, length = 0, flash_end = 0;
 	unsigned int nr_iterations = 1, iter;
 	unsigned char *wbuf, *rbuf;
 
@@ -210,7 +228,7 @@ static int do_nandtest(int argc, char *argv[])
 	markbad = 0;
 	fd = -1;
 
-	memset(ecc_stats, 0, sizeof(*ecc_stats));
+	memset(ecc_stats, 0, sizeof(ecc_stats));
 
 	while ((opt = getopt(argc, argv, "ms:i:o:l:tr")) > 0) {
 		switch (opt) {
@@ -315,6 +333,8 @@ static int do_nandtest(int argc, char *argv[])
 		goto err;
 	}
 
+	flash_end = length + flash_offset;
+	
 	wbuf = malloc(meminfo.erasesize * 2);
 	if (!wbuf) {
 		printf("Could not allocate %d bytes for buffer\n",
@@ -323,20 +343,22 @@ static int do_nandtest(int argc, char *argv[])
 	}
 	rbuf = wbuf + meminfo.erasesize;
 
+	pb_start = flash_offset;
+	pb_len = length;
+	
 	for (iter = 0; iter < nr_iterations; iter++) {
-		init_progression_bar(length);
-		for (test_ofs = 0;
-				test_ofs < length;
+		pb_init();
+		for (test_ofs = flash_offset;
+				test_ofs < flash_end;
 				test_ofs += meminfo.erasesize) {
-			show_progress(test_ofs);
+			pb_update(test_ofs);
 			srand(seed);
 			seed = rand();
 
 			if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
 				printf("\nBad block at 0x%08llx\n",
 						test_ofs + memregion.offset);
-				init_progression_bar(length);
-				show_progress(test_ofs);
+				pb_rewrite(test_ofs);
 				continue;
 			}
 			if (do_nandtest_ro) {
@@ -349,7 +371,7 @@ static int do_nandtest(int argc, char *argv[])
 			if (ret < 0)
 				goto err2;
 		}
-		show_progress(test_ofs);
+		pb_update(test_ofs);
 		printf("\nFinished pass %d successfully\n", iter + 1);
 	}
 
-- 
2.43.0




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

* Re: [PATCH] nandtest: fix wrong ecc stats and start offset parameter
  2024-06-04 10:39 [PATCH] nandtest: fix wrong ecc stats and start offset parameter Andreas Helmcke
@ 2024-06-10 12:42 ` Sascha Hauer
  2024-06-10 12:43 ` Sascha Hauer
  1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2024-06-10 12:42 UTC (permalink / raw)
  To: barebox, Andreas Helmcke


On Tue, 04 Jun 2024 12:39:30 +0200, Andreas Helmcke wrote:
> - The -o (start offset on flash) parameter has no effect. The check always
> starts at address 0, despite the value given with -o.
> 
> - Due to an invalid initialization the ecc error stats sometimes showed invalid values.
> 
> 

Applied, thanks!

[1/1] nandtest: fix wrong ecc stats and start offset parameter
      https://git.pengutronix.de/cgit/barebox/commit/?id=adbaf9d8673f (link may not be stable)

Best regards,
-- 
Sascha Hauer <s.hauer@pengutronix.de>




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

* Re: [PATCH] nandtest: fix wrong ecc stats and start offset parameter
  2024-06-04 10:39 [PATCH] nandtest: fix wrong ecc stats and start offset parameter Andreas Helmcke
  2024-06-10 12:42 ` Sascha Hauer
@ 2024-06-10 12:43 ` Sascha Hauer
  1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2024-06-10 12:43 UTC (permalink / raw)
  To: Andreas Helmcke; +Cc: barebox

Hi Andreas,

On Tue, Jun 04, 2024 at 12:39:30PM +0200, Andreas Helmcke wrote:
> - The -o (start offset on flash) parameter has no effect. The check always
> starts at address 0, despite the value given with -o.
> 
> - Due to an invalid initialization the ecc error stats sometimes showed invalid values.

There should be only one logical change per patch. I separated out the
sizeof() issue to an extra patch.

> 
> Signed-off-by: Andreas Helmcke <ahelmcke@ela-soft.com>
> ---
>  commands/nandtest.c | 62 ++++++++++++++++++++++++++++++---------------
>  1 file changed, 42 insertions(+), 20 deletions(-)
>  mode change 100644 => 100755 commands/nandtest.c
> 
> diff --git a/commands/nandtest.c b/commands/nandtest.c
> old mode 100644
> new mode 100755

Dropped this change and a few trailing whitespaces introduced with this
patch.

Sascha

> index 4a7db9cc74..c2eed15c50
> --- a/commands/nandtest.c
> +++ b/commands/nandtest.c
> @@ -34,11 +34,32 @@ static unsigned int ecc_stats[MAX_ECC_BITS];
>  static unsigned int ecc_stats_over;
>  static unsigned int ecc_failed_cnt;
>  
> +/* Helper for progression bar */
> +static loff_t pb_len;
> +static loff_t pb_start;
> +
> +static void pb_init(void)
> +{
> +	init_progression_bar(pb_len);
> +}
> +
> +static void pb_update(const loff_t done)
> +{
> +	show_progress(done - pb_start);	
> +}
> +
> +static void pb_rewrite(const loff_t done)
> +{
> +	pb_init();
> +	pb_update(done);
> +}
> +
> +
>  /*
>   * Implementation of pwrite with lseek and write.
>   */
>  static ssize_t __pwrite(int fd, const void *buf,
> -		size_t count, loff_t offset, loff_t length)
> +		size_t count, loff_t offset)
>  {
>  	ssize_t ret;
>  
> @@ -50,8 +71,7 @@ static ssize_t __pwrite(int fd, const void *buf,
>  			printf("\nMark block bad at 0x%08llx\n",
>  					offset + memregion.offset);
>  			ioctl(fd, MEMSETBADBLOCK, &offset);
> -			init_progression_bar(length);
> -			show_progress(offset);
> +			pb_rewrite(offset);
>  		}
>  	}
>  
> @@ -59,7 +79,7 @@ static ssize_t __pwrite(int fd, const void *buf,
>  	return ret;
>  }
>  
> -static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
> +static int _read_get_stats(loff_t ofs, unsigned char *buf)
>  {
>  	int ret;
>  
> @@ -76,8 +96,7 @@ static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
>  		printf("\n %d bit(s) ECC corrected at page 0x%08llx\n",
>  				newstats.corrected - oldstats.corrected,
>  				ofs + memregion.offset);
> -		init_progression_bar(totallength);
> -		show_progress(ofs);
> +		pb_rewrite(ofs);
>  		if ((newstats.corrected-oldstats.corrected) >=
>  				MAX_ECC_BITS) {
>  			/* Increment ECC stats that
> @@ -95,8 +114,7 @@ static int _read_get_stats(loff_t ofs, unsigned char *buf, loff_t totallength)
>  	if (newstats.failed > oldstats.failed) {
>  		printf("\nECC failed at page 0x%08llx\n",
>  				ofs + memregion.offset);
> -		init_progression_bar(totallength);
> -		show_progress(ofs);
> +		pb_rewrite(ofs);
>  		oldstats.failed = newstats.failed;
>  		ecc_failed_cnt++;
>  	}
> @@ -117,7 +135,7 @@ static int read_corrected(loff_t ofs, unsigned char *rbuf, loff_t length)
>  
>  	for (i = 0; i < meminfo.erasesize;
>  			i += meminfo.writesize) {
> -		ret = _read_get_stats(ofs + i, rbuf + i, length);
> +		ret = _read_get_stats(ofs + i, rbuf + i);
>  		if (ret)
>  			return ret;
>  	}
> @@ -154,9 +172,9 @@ static int erase_and_write(loff_t ofs, unsigned char *data,
>  			i += meminfo.writesize) {
>  		/* Write data to given offset */
>  		__pwrite(fd, data + i, meminfo.writesize,
> -				ofs + i, length);
> +				ofs + i);
>  
> -		ret = _read_get_stats(ofs + i, rbuf + i, length);
> +		ret = _read_get_stats(ofs + i, rbuf + i);
>  		if (ret)
>  			return ret;
>  	}
> @@ -201,7 +219,7 @@ static void print_stats(int nr_passes, loff_t length)
>  static int do_nandtest(int argc, char *argv[])
>  {
>  	int opt, do_nandtest_dev = -1, do_nandtest_ro = 0, ret = -1;
> -	loff_t flash_offset = 0, test_ofs, length = 0;
> +	loff_t flash_offset = 0, test_ofs, length = 0, flash_end = 0;
>  	unsigned int nr_iterations = 1, iter;
>  	unsigned char *wbuf, *rbuf;
>  
> @@ -210,7 +228,7 @@ static int do_nandtest(int argc, char *argv[])
>  	markbad = 0;
>  	fd = -1;
>  
> -	memset(ecc_stats, 0, sizeof(*ecc_stats));
> +	memset(ecc_stats, 0, sizeof(ecc_stats));
>  
>  	while ((opt = getopt(argc, argv, "ms:i:o:l:tr")) > 0) {
>  		switch (opt) {
> @@ -315,6 +333,8 @@ static int do_nandtest(int argc, char *argv[])
>  		goto err;
>  	}
>  
> +	flash_end = length + flash_offset;
> +	
>  	wbuf = malloc(meminfo.erasesize * 2);
>  	if (!wbuf) {
>  		printf("Could not allocate %d bytes for buffer\n",
> @@ -323,20 +343,22 @@ static int do_nandtest(int argc, char *argv[])
>  	}
>  	rbuf = wbuf + meminfo.erasesize;
>  
> +	pb_start = flash_offset;
> +	pb_len = length;
> +	
>  	for (iter = 0; iter < nr_iterations; iter++) {
> -		init_progression_bar(length);
> -		for (test_ofs = 0;
> -				test_ofs < length;
> +		pb_init();
> +		for (test_ofs = flash_offset;
> +				test_ofs < flash_end;
>  				test_ofs += meminfo.erasesize) {
> -			show_progress(test_ofs);
> +			pb_update(test_ofs);
>  			srand(seed);
>  			seed = rand();
>  
>  			if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
>  				printf("\nBad block at 0x%08llx\n",
>  						test_ofs + memregion.offset);
> -				init_progression_bar(length);
> -				show_progress(test_ofs);
> +				pb_rewrite(test_ofs);
>  				continue;
>  			}
>  			if (do_nandtest_ro) {
> @@ -349,7 +371,7 @@ static int do_nandtest(int argc, char *argv[])
>  			if (ret < 0)
>  				goto err2;
>  		}
> -		show_progress(test_ofs);
> +		pb_update(test_ofs);
>  		printf("\nFinished pass %d successfully\n", iter + 1);
>  	}
>  
> -- 
> 2.43.0
> 
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



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

end of thread, other threads:[~2024-06-10 12:44 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-04 10:39 [PATCH] nandtest: fix wrong ecc stats and start offset parameter Andreas Helmcke
2024-06-10 12:42 ` Sascha Hauer
2024-06-10 12:43 ` Sascha Hauer

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