* [PATCH 0/8] improve nandtest command
@ 2012-10-22 7:23 Alexander Aring
2012-10-22 7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Small Summary:
- The old nandtest do a ecc statistic per eraseblock, it's better to
do this per page. I don't know how this works with subpages.
- Add a progressbar instead of prints of current flash offset.
- Rename command argument 'passes' to 'iterations', which makes more
sense.
- use builtin function 'get_random_bytes' to generate random buffer.
- use loff_t instead of off_t. To handle flash >4GB.
- add another constraints check for writesize.
Alexander Aring (8):
nandtest: stat ecc per page not per eraseblock
nandtest: add progressbar instead of offset print
nandtest: rename command argument p to i
nandtest: change flash length variable type
nandtest: use get_random_bytes instead of for loop
nandtest: clean up code
nandtest: use loff_t instead off_t
nandtest: add another constraints check
commands/nandtest.c | 190 ++++++++++++++++++++++++++++------------------------
1 file changed, 103 insertions(+), 87 deletions(-)
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/8] nandtest: stat ecc per page not per eraseblock
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Collect ecc statistics per page not per eraseblock.
Signed-off-by: Alexander Aring <alex.aring@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
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/8] nandtest: add progressbar instead of offset print
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
2012-10-22 7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Add progressbar and remove other outputs of current flash offset.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 42 +++++++++++++++++++++++++-----------------
1 file changed, 25 insertions(+), 17 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index cdb837f..f614cd5 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -21,6 +21,7 @@
#include <linux/mtd/mtd-abi.h>
#include <fcntl.h>
#include <stdlib.h>
+#include <progress.h>
/* Max ECC Bits that can be corrected */
#define MAX_ECC_BITS 8
@@ -64,7 +65,8 @@ static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
/*
* Implementation of pwrite with lseek and write.
*/
-static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
+static ssize_t pwrite(int fd, const void *buf,
+ size_t count, off_t offset, off_t length)
{
int ret;
@@ -77,9 +79,11 @@ static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
if (ret < 0) {
perror("write");
if (markbad) {
- printf("Mark block bad at 0x%08x\n",
+ printf("\nMark block bad at 0x%08x\n",
(unsigned)(offset + memregion.offset));
ioctl(fd, MEMSETBADBLOCK, &offset);
+ init_progression_bar(length);
+ show_progress(offset);
}
}
@@ -92,21 +96,21 @@ static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
* Param ofs: offset on flash_device.
* Param data: data to write on flash.
* Param rbuf: pointer to allocated buffer to copy readed data.
+ * Param length: length of testing area
*/
-static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
+static int erase_and_write(off_t ofs, unsigned char *data,
+ unsigned char *rbuf, off_t length)
{
struct erase_info_user er;
unsigned int i;
int ret;
- printf("\r0x%08x: erasing... ", (unsigned)(ofs + memregion.offset));
-
er.start = ofs;
er.length = meminfo.erasesize;
ret = erase(fd, er.length, er.start);
if (ret < 0) {
- perror("erase");
+ perror("\nerase");
printf("Could't not erase flash at 0x%08x length 0x%08x.\n",
er.start, er.length);
return ret;
@@ -114,21 +118,16 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
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 + i, meminfo.writesize, ofs + i);
-
- printf("\r0x%08x: reading...", (unsigned)
- (ofs + i + memregion.offset));
+ pwrite(fd, data + i, meminfo.writesize,
+ ofs + i, length);
/* Read data from offset */
pread(fd, rbuf + i, meminfo.writesize, ofs + i);
ret = ioctl(fd, ECCGETSTATS, &newstats);
if (ret < 0) {
- perror("ECCGETSTATS");
+ perror("\nECCGETSTATS");
return ret;
}
@@ -136,6 +135,8 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
printf("\n %d bit(s) ECC corrected at page 0x%08x\n",
newstats.corrected - oldstats.corrected,
(unsigned)(ofs + memregion.offset + i));
+ init_progression_bar(length);
+ show_progress(ofs);
if ((newstats.corrected-oldstats.corrected) >=
MAX_ECC_BITS) {
/* Increment ECC stats that
@@ -152,11 +153,12 @@ static int erase_and_write(off_t ofs, unsigned char *data, unsigned char *rbuf)
if (newstats.failed > oldstats.failed) {
printf("\nECC failed at page 0x%08x\n",
(unsigned)(ofs + memregion.offset + i));
+ init_progression_bar(length);
+ show_progress(ofs);
oldstats.failed = newstats.failed;
ecc_failed_cnt++;
}
}
- printf("\r0x%08x: checking...", (unsigned)(ofs + memregion.offset));
/* Compared written data with read data.
* If data is not identical, display a detailed
@@ -309,27 +311,33 @@ static int do_nandtest(int argc, char *argv[])
rbuf = wbuf + meminfo.erasesize;
for (pass = 0; pass < nr_passes; pass++) {
+ init_progression_bar(length);
for (test_ofs = flash_offset;
test_ofs < flash_offset+length;
test_ofs += meminfo.erasesize) {
loff_t __test_ofs = test_ofs;
+ show_progress(test_ofs);
srand(seed);
seed = rand();
if (ioctl(fd, MEMGETBADBLOCK, &__test_ofs)) {
- printf("\rBad block at 0x%08x\n",
+ printf("\nBad block at 0x%08x\n",
(unsigned)(test_ofs +
memregion.offset));
+ init_progression_bar(length);
+ show_progress(test_ofs);
continue;
}
for (i = 0; i < meminfo.erasesize; i++)
wbuf[i] = rand();
- ret = erase_and_write(test_ofs, wbuf, rbuf);
+ ret = erase_and_write(test_ofs, wbuf,
+ rbuf, length);
if (ret < 0)
goto err2;
}
+ show_progress(test_ofs);
printf("\nFinished pass %d successfully\n", pass+1);
}
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 3/8] nandtest: rename command argument p to i
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
2012-10-22 7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
2012-10-22 7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Rename command argument p for 'passes' to 'i' iteration.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index f614cd5..656fb65 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -198,7 +198,7 @@ static int do_nandtest(int argc, char *argv[])
int opt, length = -1, do_nandtest_dev = -1;
off_t flash_offset = 0;
off_t test_ofs;
- unsigned int nr_passes = 1, pass;
+ unsigned int nr_iterations = 1, iter;
int i;
int ret = -1;
unsigned char *wbuf, *rbuf;
@@ -210,7 +210,7 @@ static int do_nandtest(int argc, char *argv[])
memset(ecc_stats, 0, MAX_ECC_BITS);
- while ((opt = getopt(argc, argv, "ms:p:o:l:t")) > 0) {
+ while ((opt = getopt(argc, argv, "ms:i:o:l:t")) > 0) {
switch (opt) {
case 'm':
markbad = 1;
@@ -218,8 +218,8 @@ static int do_nandtest(int argc, char *argv[])
case 's':
seed = simple_strtoul(optarg, NULL, 0);
break;
- case 'p':
- nr_passes = simple_strtoul(optarg, NULL, 0);
+ case 'i':
+ nr_iterations = simple_strtoul(optarg, NULL, 0);
break;
case 'o':
flash_offset = simple_strtoul(optarg, NULL, 0);
@@ -310,7 +310,7 @@ static int do_nandtest(int argc, char *argv[])
}
rbuf = wbuf + meminfo.erasesize;
- for (pass = 0; pass < nr_passes; pass++) {
+ for (iter = 0; iter < nr_iterations; iter++) {
init_progression_bar(length);
for (test_ofs = flash_offset;
test_ofs < flash_offset+length;
@@ -338,10 +338,10 @@ static int do_nandtest(int argc, char *argv[])
goto err2;
}
show_progress(test_ofs);
- printf("\nFinished pass %d successfully\n", pass+1);
+ printf("\nFinished pass %d successfully\n", iter+1);
}
- print_stats(nr_passes, length);
+ print_stats(nr_iterations, length);
ret = close(fd);
if (ret < 0) {
@@ -366,7 +366,7 @@ static const __maybe_unused char cmd_nandtest_help[] =
" -t, Really do a nandtest on device.\n"
" -m, Mark blocks bad if they appear so.\n"
" -s <seed>, Supply random seed.\n"
- " -p <passes>, Number of passes.\n"
+ " -i <iterations>, Number of iterations.\n"
" -o <offset>, Start offset on flash.\n"
" -l <length>, Length of flash to test.\n";
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 4/8] nandtest: change flash length variable type
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (2 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Change flash 'length' variable type to off_t instead of int.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 13 ++++++-------
1 file changed, 6 insertions(+), 7 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index 656fb65..e25f062 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -195,9 +195,8 @@ static void print_stats(int nr_passes, int length)
/* Main program. */
static int do_nandtest(int argc, char *argv[])
{
- int opt, length = -1, do_nandtest_dev = -1;
- off_t flash_offset = 0;
- off_t test_ofs;
+ int opt, do_nandtest_dev = -1;
+ off_t flash_offset = 0, test_ofs, length = 0;
unsigned int nr_iterations = 1, iter;
int i;
int ret = -1;
@@ -272,7 +271,7 @@ static int do_nandtest(int argc, char *argv[])
goto err;
}
- if (length == -1) {
+ if (!length) {
length = meminfo.size;
length -= flash_offset;
}
@@ -292,13 +291,13 @@ static int do_nandtest(int argc, char *argv[])
}
if (length % meminfo.erasesize) {
printf("Length 0x%08x not multiple of erase size 0x%08x\n",
- length, meminfo.erasesize);
+ (unsigned)length, meminfo.erasesize);
goto err;
}
if (length + flash_offset > meminfo.size) {
printf("Length 0x%08x + offset 0x%08x exceeds "
- "device size 0x%08x\n",
- length, (unsigned)flash_offset, meminfo.size);
+ "device size 0x%08x\n", (unsigned)length,
+ (unsigned)flash_offset, meminfo.size);
goto err;
}
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 5/8] nandtest: use get_random_bytes instead of for loop
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (3 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Use already builtin get_random_bytes instead of for loop.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index e25f062..cdf9c31 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -198,7 +198,6 @@ static int do_nandtest(int argc, char *argv[])
int opt, do_nandtest_dev = -1;
off_t flash_offset = 0, test_ofs, length = 0;
unsigned int nr_iterations = 1, iter;
- int i;
int ret = -1;
unsigned char *wbuf, *rbuf;
@@ -328,9 +327,7 @@ static int do_nandtest(int argc, char *argv[])
continue;
}
- for (i = 0; i < meminfo.erasesize; i++)
- wbuf[i] = rand();
-
+ get_random_bytes(wbuf, meminfo.erasesize);
ret = erase_and_write(test_ofs, wbuf,
rbuf, length);
if (ret < 0)
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 6/8] nandtest: clean up code
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (4 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Clean up code:
- change 'i+i' to 'i + i'.
- change counter variable to unsigned int.
- use spaces instead of tabs in help text.
- remove __test_ofs variable.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 34 ++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index cdf9c31..ead728b 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -144,8 +144,8 @@ static int erase_and_write(off_t ofs, unsigned char *data,
ecc_stats_over++;
} else {
/* Increment ECC stat value */
- ecc_stats[(newstats.corrected-
- oldstats.corrected)-1]++;
+ ecc_stats[(newstats.corrected -
+ oldstats.corrected) - 1]++;
}
/* Set oldstats to newstats */
oldstats.corrected = newstats.corrected;
@@ -179,13 +179,13 @@ static int erase_and_write(off_t ofs, unsigned char *data,
/* Print stats of nandtest. */
static void print_stats(int nr_passes, int length)
{
- int i;
+ unsigned int i;
printf("-------- Summary --------\n");
printf("Tested blocks : %d\n", (length/meminfo.erasesize)
* nr_passes);
for (i = 0; i < MAX_ECC_BITS; i++)
- printf("ECC %d bit error(s) : %d\n", i+1, ecc_stats[i]);
+ printf("ECC %d bit error(s) : %d\n", i + 1, ecc_stats[i]);
printf("ECC >%d bit error(s) : %d\n", MAX_ECC_BITS, ecc_stats_over);
printf("ECC corrections failed : %d\n", ecc_failed_cnt);
@@ -195,10 +195,9 @@ static void print_stats(int nr_passes, int length)
/* Main program. */
static int do_nandtest(int argc, char *argv[])
{
- int opt, do_nandtest_dev = -1;
+ int opt, do_nandtest_dev = -1, ret = -1;
off_t flash_offset = 0, test_ofs, length = 0;
unsigned int nr_iterations = 1, iter;
- int ret = -1;
unsigned char *wbuf, *rbuf;
ecc_failed_cnt = 0;
@@ -276,10 +275,10 @@ static int do_nandtest(int argc, char *argv[])
}
printf("Flash offset: 0x%08x\n",
- (unsigned)(flash_offset+memregion.offset));
+ (unsigned)(flash_offset + memregion.offset));
printf("Length: 0x%08x\n", (unsigned)length);
printf("End address: 0x%08x\n",
- (unsigned)(flash_offset+length+memregion.offset));
+ (unsigned)(flash_offset + length + memregion.offset));
printf("Erasesize: 0x%08x\n", (unsigned)(meminfo.erasesize));
printf("Starting nandtest...\n");
@@ -311,14 +310,13 @@ static int do_nandtest(int argc, char *argv[])
for (iter = 0; iter < nr_iterations; iter++) {
init_progression_bar(length);
for (test_ofs = flash_offset;
- test_ofs < flash_offset+length;
+ test_ofs < flash_offset + length;
test_ofs += meminfo.erasesize) {
- loff_t __test_ofs = test_ofs;
show_progress(test_ofs);
srand(seed);
seed = rand();
- if (ioctl(fd, MEMGETBADBLOCK, &__test_ofs)) {
+ if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
printf("\nBad block at 0x%08x\n",
(unsigned)(test_ofs +
memregion.offset));
@@ -334,7 +332,7 @@ static int do_nandtest(int argc, char *argv[])
goto err2;
}
show_progress(test_ofs);
- printf("\nFinished pass %d successfully\n", iter+1);
+ printf("\nFinished pass %d successfully\n", iter + 1);
}
print_stats(nr_iterations, length);
@@ -359,12 +357,12 @@ err:
/* String for usage of nandtest */
static const __maybe_unused char cmd_nandtest_help[] =
"Usage: nandtest [OPTION] <device>\n"
- " -t, Really do a nandtest on device.\n"
- " -m, Mark blocks bad if they appear so.\n"
- " -s <seed>, Supply random seed.\n"
- " -i <iterations>, Number of iterations.\n"
- " -o <offset>, Start offset on flash.\n"
- " -l <length>, Length of flash to test.\n";
+ " -t, Really do a nandtest on device.\n"
+ " -m, Mark blocks bad if they appear so.\n"
+ " -s <seed>, Supply random seed.\n"
+ " -i <iterations>, Number of iterations.\n"
+ " -o <offset>, Start offset on flash.\n"
+ " -l <length>, Length of flash to test.\n";
BAREBOX_CMD_START(nandtest)
.cmd = do_nandtest,
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 7/8] nandtest: use loff_t instead off_t
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (5 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-22 7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
2012-10-23 6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Use the same offset type like mtd interface.
Replace modulo operation with IS_ALIGNED macro.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 57 ++++++++++++++++++++++++++---------------------------
1 file changed, 28 insertions(+), 29 deletions(-)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index ead728b..f9c9318 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -45,7 +45,7 @@ static unsigned int ecc_failed_cnt;
/*
* Implementation of pread with lseek and read.
*/
-static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
+static ssize_t pread(int fd, void *buf, size_t count, loff_t offset)
{
int ret;
@@ -66,7 +66,7 @@ static ssize_t pread(int fd, void *buf, size_t count, off_t offset)
* Implementation of pwrite with lseek and write.
*/
static ssize_t pwrite(int fd, const void *buf,
- size_t count, off_t offset, off_t length)
+ size_t count, loff_t offset, loff_t length)
{
int ret;
@@ -79,8 +79,8 @@ static ssize_t pwrite(int fd, const void *buf,
if (ret < 0) {
perror("write");
if (markbad) {
- printf("\nMark block bad at 0x%08x\n",
- (unsigned)(offset + memregion.offset));
+ printf("\nMark block bad at 0x%08llx\n",
+ offset + memregion.offset);
ioctl(fd, MEMSETBADBLOCK, &offset);
init_progression_bar(length);
show_progress(offset);
@@ -98,8 +98,8 @@ static ssize_t pwrite(int fd, const void *buf,
* Param rbuf: pointer to allocated buffer to copy readed data.
* Param length: length of testing area
*/
-static int erase_and_write(off_t ofs, unsigned char *data,
- unsigned char *rbuf, off_t length)
+static int erase_and_write(loff_t ofs, unsigned char *data,
+ unsigned char *rbuf, loff_t length)
{
struct erase_info_user er;
unsigned int i;
@@ -132,9 +132,9 @@ static int erase_and_write(off_t ofs, unsigned char *data,
}
if (newstats.corrected > oldstats.corrected) {
- printf("\n %d bit(s) ECC corrected at page 0x%08x\n",
+ printf("\n %d bit(s) ECC corrected at page 0x%08llx\n",
newstats.corrected - oldstats.corrected,
- (unsigned)(ofs + memregion.offset + i));
+ ofs + memregion.offset + i);
init_progression_bar(length);
show_progress(ofs);
if ((newstats.corrected-oldstats.corrected) >=
@@ -151,8 +151,8 @@ static int erase_and_write(off_t ofs, unsigned char *data,
oldstats.corrected = newstats.corrected;
}
if (newstats.failed > oldstats.failed) {
- printf("\nECC failed at page 0x%08x\n",
- (unsigned)(ofs + memregion.offset + i));
+ printf("\nECC failed at page 0x%08llx\n",
+ ofs + memregion.offset + i);
init_progression_bar(length);
show_progress(ofs);
oldstats.failed = newstats.failed;
@@ -196,7 +196,7 @@ static void print_stats(int nr_passes, int length)
static int do_nandtest(int argc, char *argv[])
{
int opt, do_nandtest_dev = -1, ret = -1;
- off_t flash_offset = 0, test_ofs, length = 0;
+ loff_t flash_offset = 0, test_ofs, length = 0;
unsigned int nr_iterations = 1, iter;
unsigned char *wbuf, *rbuf;
@@ -274,28 +274,28 @@ static int do_nandtest(int argc, char *argv[])
length -= flash_offset;
}
- printf("Flash offset: 0x%08x\n",
- (unsigned)(flash_offset + memregion.offset));
- printf("Length: 0x%08x\n", (unsigned)length);
- printf("End address: 0x%08x\n",
- (unsigned)(flash_offset + length + memregion.offset));
- printf("Erasesize: 0x%08x\n", (unsigned)(meminfo.erasesize));
+ printf("Flash offset: 0x%08llx\n",
+ flash_offset + memregion.offset);
+ printf("Length: 0x%08llx\n", length);
+ printf("End address: 0x%08llx\n",
+ flash_offset + length + memregion.offset);
+ printf("Erasesize: 0x%08x\n", meminfo.erasesize);
printf("Starting nandtest...\n");
- if (flash_offset % meminfo.erasesize) {
- printf("Offset 0x%08x not multiple of erase size 0x%08x\n",
- (unsigned)flash_offset, meminfo.erasesize);
+ if (!IS_ALIGNED(flash_offset, meminfo.erasesize)) {
+ printf("Offset 0x%08llx not multiple of erase size 0x%08x\n",
+ flash_offset, meminfo.erasesize);
goto err;
}
- if (length % meminfo.erasesize) {
- printf("Length 0x%08x not multiple of erase size 0x%08x\n",
- (unsigned)length, meminfo.erasesize);
+ if (!IS_ALIGNED(length, meminfo.erasesize)) {
+ printf("Length 0x%08llx not multiple of erase size 0x%08x\n",
+ length, meminfo.erasesize);
goto err;
}
if (length + flash_offset > meminfo.size) {
- printf("Length 0x%08x + offset 0x%08x exceeds "
- "device size 0x%08x\n", (unsigned)length,
- (unsigned)flash_offset, meminfo.size);
+ printf("Length 0x%08llx + offset 0x%08llx exceeds "
+ "device size 0x%08x\n", length,
+ flash_offset, meminfo.size);
goto err;
}
@@ -317,9 +317,8 @@ static int do_nandtest(int argc, char *argv[])
seed = rand();
if (ioctl(fd, MEMGETBADBLOCK, &test_ofs)) {
- printf("\nBad block at 0x%08x\n",
- (unsigned)(test_ofs +
- memregion.offset));
+ printf("\nBad block at 0x%08llx\n",
+ test_ofs + memregion.offset);
init_progression_bar(length);
show_progress(test_ofs);
continue;
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 8/8] nandtest: add another constraints check
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (6 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
@ 2012-10-22 7:23 ` Alexander Aring
2012-10-23 6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer
8 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2012-10-22 7:23 UTC (permalink / raw)
To: barebox
Add check if writesize is a multiple of erasesize.
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
---
commands/nandtest.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/commands/nandtest.c b/commands/nandtest.c
index f9c9318..f08f8eb 100644
--- a/commands/nandtest.c
+++ b/commands/nandtest.c
@@ -282,6 +282,13 @@ static int do_nandtest(int argc, char *argv[])
printf("Erasesize: 0x%08x\n", meminfo.erasesize);
printf("Starting nandtest...\n");
+ if (!IS_ALIGNED(meminfo.erasesize, meminfo.writesize)) {
+ printf("Erasesize 0x%08x is not a multiple "
+ "of writesize 0x%08x.\n"
+ "Please check driver implementation\n",
+ meminfo.erasesize, meminfo.writesize);
+ goto err;
+ }
if (!IS_ALIGNED(flash_offset, meminfo.erasesize)) {
printf("Offset 0x%08llx not multiple of erase size 0x%08x\n",
flash_offset, meminfo.erasesize);
--
1.7.12.4
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 0/8] improve nandtest command
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
` (7 preceding siblings ...)
2012-10-22 7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
@ 2012-10-23 6:27 ` Sascha Hauer
8 siblings, 0 replies; 10+ messages in thread
From: Sascha Hauer @ 2012-10-23 6:27 UTC (permalink / raw)
To: Alexander Aring; +Cc: barebox
On Mon, Oct 22, 2012 at 09:23:24AM +0200, Alexander Aring wrote:
> Small Summary:
> - The old nandtest do a ecc statistic per eraseblock, it's better to
> do this per page. I don't know how this works with subpages.
>
> - Add a progressbar instead of prints of current flash offset.
>
> - Rename command argument 'passes' to 'iterations', which makes more
> sense.
>
> - use builtin function 'get_random_bytes' to generate random buffer.
>
> - use loff_t instead of off_t. To handle flash >4GB.
>
> - add another constraints check for writesize.
Applied, thanks
Sascha
>
> Alexander Aring (8):
> nandtest: stat ecc per page not per eraseblock
> nandtest: add progressbar instead of offset print
> nandtest: rename command argument p to i
> nandtest: change flash length variable type
> nandtest: use get_random_bytes instead of for loop
> nandtest: clean up code
> nandtest: use loff_t instead off_t
> nandtest: add another constraints check
>
> commands/nandtest.c | 190 ++++++++++++++++++++++++++++------------------------
> 1 file changed, 103 insertions(+), 87 deletions(-)
>
> --
> 1.7.12.4
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-10-23 6:27 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-22 7:23 [PATCH 0/8] improve nandtest command Alexander Aring
2012-10-22 7:23 ` [PATCH 1/8] nandtest: stat ecc per page not per eraseblock Alexander Aring
2012-10-22 7:23 ` [PATCH 2/8] nandtest: add progressbar instead of offset print Alexander Aring
2012-10-22 7:23 ` [PATCH 3/8] nandtest: rename command argument p to i Alexander Aring
2012-10-22 7:23 ` [PATCH 4/8] nandtest: change flash length variable type Alexander Aring
2012-10-22 7:23 ` [PATCH 5/8] nandtest: use get_random_bytes instead of for loop Alexander Aring
2012-10-22 7:23 ` [PATCH 6/8] nandtest: clean up code Alexander Aring
2012-10-22 7:23 ` [PATCH 7/8] nandtest: use loff_t instead off_t Alexander Aring
2012-10-22 7:23 ` [PATCH 8/8] nandtest: add another constraints check Alexander Aring
2012-10-23 6:27 ` [PATCH 0/8] improve nandtest command Sascha Hauer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.