- 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 <[email protected]>
---
 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


Reply via email to