[PATCH 1/8] nandtest: stat ecc per page not per eraseblock
Alexander Aring
alex.aring at googlemail.com
Mon Oct 22 03:23:25 EDT 2012
Collect ecc statistics per page not per eraseblock.
Signed-off-by: Alexander Aring <alex.aring at 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
More information about the barebox
mailing list