]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-tests: nandbiterrs: Add support for testing continuous reads
authorMiquel Raynal <miquel.raynal@bootlin.com>
Mon, 26 Aug 2024 09:46:24 +0000 (11:46 +0200)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Tue, 8 Oct 2024 06:14:42 +0000 (08:14 +0200)
In order to trigger a continuous read, the user needs to request at
least two pages at the same time. So far the tool would only read single
pages, so let's extend its capabilities to test continuous read output
when the -c option is passed.

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
tests/mtd-tests/nandbiterrs.c

index 30954f59c292597531b784da649d8811bf511068..424a95f1e77c002c9299ee12db786bb6ce4c07c7 100644 (file)
@@ -63,6 +63,7 @@
 #define MODE_INCREMENTAL 0x02
 #define MODE_OVERWRITE 0x04
 #define PAGE_ERASED 0x08
+#define CONTINUOUS_READ 0x10
 
 static int peb = -1, page = -1, max_overwrite = -1, seed = -1;
 static const char *mtddev;
@@ -81,6 +82,7 @@ static const struct option options[] = {
        { "erased", no_argument, NULL, 'e' },
        { "writes", required_argument, NULL, 'w' },
        { "incremental", no_argument, NULL, 'i' },
+       { "continuous", no_argument, NULL, 'c' },
        { "overwrite", no_argument, NULL, 'o' },
        { NULL, 0, NULL, 0 },
 };
@@ -95,7 +97,8 @@ static NORETURN void usage(int status)
        "  -b, --peb <num>     Use this physical erase block\n"
        "  -p, --page <num>    Use this page within the erase block\n"
        "  -s, --seed <num>    Specify seed for PRNG\n"
-       "  -e, --erased        Test erased pages instead of written pages\n\n"
+       "  -e, --erased        Test erased pages instead of written pages\n"
+       "  -c, --continuous    Use two consecutive pages (incremental test only)\n\n"
        "Options controling test mode:\n"
        "  -i, --incremental   Manually insert bit errors until ECC fails\n"
        "  -o, --overwrite     Rewrite page until bits flip and ECC fails\n\n"
@@ -124,7 +127,7 @@ static void process_options(int argc, char **argv)
        int c;
 
        while (1) {
-               c = getopt_long(argc, argv, "hkb:p:s:eiow:", options, NULL);
+               c = getopt_long(argc, argv, "hkb:p:s:eiow:c", options, NULL);
                if (c == -1)
                        break;
 
@@ -175,6 +178,9 @@ static void process_options(int argc, char **argv)
                case 'e':
                        flags |= PAGE_ERASED;
                        break;
+               case 'c':
+                       flags |= CONTINUOUS_READ;
+                       break;
                case 'h':
                        usage(EXIT_SUCCESS);
                default:
@@ -193,6 +199,9 @@ static void process_options(int argc, char **argv)
        if (!(flags & (MODE_OVERWRITE|MODE_INCREMENTAL)))
                errmsg_die("No test mode specified!");
 
+       if (flags & CONTINUOUS_READ && !(flags & MODE_INCREMENTAL))
+               errmsg_die("Use --continuous with --incremental only!");
+
        if ((max_overwrite > 0) && !(flags & MODE_OVERWRITE))
                errmsg_die("Write count specified but mode is not --overwrite!");
 
@@ -461,7 +470,10 @@ int main(int argc, char **argv)
 
        pagesize = mtd.subpage_size;
        pagecount = mtd.eb_size / pagesize;
-       bs = pagesize;
+       if (!(flags & CONTINUOUS_READ))
+               bs = pagesize;
+       else
+               bs = 2 * pagesize;
 
        if (peb >= mtd.eb_cnt)
                return errmsg("Physical erase block %d is out of range!", peb);