diff options
author | Alexander Aring <alex.aring@googlemail.com> | 2012-10-22 09:23:25 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-10-23 08:27:33 +0200 |
commit | f3781cb7b37dd9095e7a405563f138040aab60d1 (patch) | |
tree | 1f4573036569b947684f649e237b1803ba597cdf | |
parent | 346b16ba0a12bf88150fd6a63f6000dd981dd93d (diff) | |
download | barebox-f3781cb7b37dd9095e7a405563f138040aab60d1.tar.gz barebox-f3781cb7b37dd9095e7a405563f138040aab60d1.tar.xz |
nandtest: stat ecc per page not per eraseblock
Collect ecc statistics per page not per eraseblock.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | commands/nandtest.c | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/commands/nandtest.c b/commands/nandtest.c index d683b24165..cdb837f6b4 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. |