Add a new module parameter 'pattern'. If it is set to zero,
we will use the 55/AA pattern to torture the nand blocks; if it is set
to a non-zero value, we will use the random data pattern.

Signed-off-by: Huang Shijie <b32...@freescale.com>
---
 drivers/mtd/tests/mtd_torturetest.c |   72 ++++++++++++++++++++++++-----------
 1 files changed, 50 insertions(+), 22 deletions(-)

diff --git a/drivers/mtd/tests/mtd_torturetest.c 
b/drivers/mtd/tests/mtd_torturetest.c
index 516cf66..07655bc 100644
--- a/drivers/mtd/tests/mtd_torturetest.c
+++ b/drivers/mtd/tests/mtd_torturetest.c
@@ -32,6 +32,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/slab.h>
 #include <linux/sched.h>
+#include <linux/random.h>
 
 #define RETRIES 3
 
@@ -64,6 +65,11 @@ module_param(cycles_count, uint, S_IRUGO);
 MODULE_PARM_DESC(cycles_count, "how many erase cycles to do "
                               "(infinite by default)");
 
+static int pattern;
+module_param(pattern, int, S_IRUGO);
+MODULE_PARM_DESC(pattern, "0 for 55/AA pattern(default), else for
+                               the random pattern");
+
 static struct mtd_info *mtd;
 
 /* This buffer contains 0x555555...0xAAAAAA... pattern */
@@ -72,6 +78,8 @@ static unsigned char *patt_5A5;
 static unsigned char *patt_A5A;
 /* This buffer contains all 0xFF bytes */
 static unsigned char *patt_FF;
+/* This buffer contains the random data. */
+static unsigned char *patt_rd;
 /* This a temporary buffer is use when checking data */
 static unsigned char *check_buf;
 /* How many erase cycles were done */
@@ -228,6 +236,8 @@ static int __init tort_init(void)
                pr_info("torturing just %d pages per eraseblock\n",
                        pgcnt);
        pr_info("write verify %s\n", check ? "enabled" : "disabled");
+       pr_info("Test pattern is %s\n",
+                       pattern ? "random data pattern" : "55/AA pattern");
 
        mtd = get_mtd_device(NULL, dev);
        if (IS_ERR(mtd)) {
@@ -249,16 +259,24 @@ static int __init tort_init(void)
        }
 
        err = -ENOMEM;
-       patt_5A5 = kmalloc(mtd->erasesize, GFP_KERNEL);
-       if (!patt_5A5) {
-               pr_err("error: cannot allocate memory\n");
-               goto out_mtd;
-       }
+       if (!pattern) {
+               patt_5A5 = kmalloc(mtd->erasesize, GFP_KERNEL);
+               if (!patt_5A5) {
+                       pr_err("error: cannot allocate memory\n");
+                       goto out_mtd;
+               }
 
-       patt_A5A = kmalloc(mtd->erasesize, GFP_KERNEL);
-       if (!patt_A5A) {
-               pr_err("error: cannot allocate memory\n");
-               goto out_patt_5A5;
+               patt_A5A = kmalloc(mtd->erasesize, GFP_KERNEL);
+               if (!patt_A5A) {
+                       pr_err("error: cannot allocate memory\n");
+                       goto out_patt_5A5;
+               }
+       } else {
+               patt_rd = kmalloc(mtd->erasesize, GFP_KERNEL);
+               if (!patt_rd) {
+                       pr_err("error: cannot allocate memory\n");
+                       goto out_patt_rd;
+               }
        }
 
        patt_FF = kmalloc(mtd->erasesize, GFP_KERNEL);
@@ -277,13 +295,15 @@ static int __init tort_init(void)
 
        /* Initialize patterns */
        memset(patt_FF, 0xFF, mtd->erasesize);
-       for (i = 0; i < mtd->erasesize / pgsize; i++) {
-               if (!(i & 1)) {
-                       memset(patt_5A5 + i * pgsize, 0x55, pgsize);
-                       memset(patt_A5A + i * pgsize, 0xAA, pgsize);
-               } else {
-                       memset(patt_5A5 + i * pgsize, 0xAA, pgsize);
-                       memset(patt_A5A + i * pgsize, 0x55, pgsize);
+       if (!pattern) {
+               for (i = 0; i < mtd->erasesize / pgsize; i++) {
+                       if (!(i & 1)) {
+                               memset(patt_5A5 + i * pgsize, 0x55, pgsize);
+                               memset(patt_A5A + i * pgsize, 0xAA, pgsize);
+                       } else {
+                               memset(patt_5A5 + i * pgsize, 0xAA, pgsize);
+                               memset(patt_A5A + i * pgsize, 0x55, pgsize);
+                       }
                }
        }
 
@@ -335,10 +355,15 @@ static int __init tort_init(void)
                        }
 
                        /* Write the pattern */
-                       if ((eb + erase_cycles) & 1)
-                               patt = patt_5A5;
-                       else
-                               patt = patt_A5A;
+                       if (!pattern) {
+                               if ((eb + erase_cycles) & 1)
+                                       patt = patt_5A5;
+                               else
+                                       patt = patt_A5A;
+                       } else {
+                               patt = patt_rd;
+                               prandom_bytes(patt, mtd->erasesize);
+                       }
                        err = write_pattern(i, patt);
                        if (err)
                                goto out;
@@ -350,8 +375,9 @@ static int __init tort_init(void)
                                if (err) {
                                        pr_info("verify failed for %s"
                                               " pattern\n",
-                                              ((eb + erase_cycles) & 1) ?
-                                              "0x55AA55..." : "0xAA55AA...");
+                                              pattern ? "random pattern" :
+                                              (((eb + erase_cycles) & 1) ?
+                                              "0x55AA55..." : "0xAA55AA..."));
                                        goto out;
                                }
                                cond_resched();
@@ -386,6 +412,8 @@ out_patt_A5A:
        kfree(patt_A5A);
 out_patt_5A5:
        kfree(patt_5A5);
+out_patt_rd:
+       kfree(patt_rd);
 out_mtd:
        put_mtd_device(mtd);
        if (err)
-- 
1.7.0.4


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to