summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@googlemail.com>2012-10-22 09:23:25 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2012-10-23 08:27:33 +0200
commitf3781cb7b37dd9095e7a405563f138040aab60d1 (patch)
tree1f4573036569b947684f649e237b1803ba597cdf
parent346b16ba0a12bf88150fd6a63f6000dd981dd93d (diff)
downloadbarebox-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.c70
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.