mtd: mtd_oobtest: Fix bitflip_limit usage in test case 3
authorRoger Quadros <rogerq@ti.com>
Fri, 5 Dec 2014 15:18:39 +0000 (17:18 +0200)
committerBrian Norris <computersforpeace@gmail.com>
Mon, 6 Apr 2015 01:10:23 +0000 (18:10 -0700)
In test case 3, we set vary_offset to write at different
offsets and lengths in the OOB available area. We need to
do the bitflip_limit check while checking for 0xff outside the
OOB offset + length area that we didn't modify during write.

Signed-off-by: Roger Quadros <rogerq@ti.com>
[Brian: whitespace fixup]
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
drivers/mtd/tests/oobtest.c

index 64390ab88a802cca6e2cbea264f2a6691273bf01..c6b35644a10f13162fae8a06aca77773cae33718 100644 (file)
@@ -141,6 +141,31 @@ static size_t memcmpshow(loff_t addr, const void *cs, const void *ct, size_t cou
        return bitflips;
 }
 
+/*
+ * Compare with 0xff and show the address, offset and data bytes at
+ * comparison failure. Return number of bitflips encountered.
+ */
+static size_t memffshow(loff_t addr, loff_t offset, const void *cs,
+                       size_t count)
+{
+       const unsigned char *su1;
+       int res;
+       size_t i = 0;
+       size_t bitflips = 0;
+
+       for (su1 = cs; 0 < count; ++su1, count--, i++) {
+               res = *su1 ^ 0xff;
+               if (res) {
+                       pr_info("error @addr[0x%lx:0x%lx] 0x%x -> 0xff diff 0x%x\n",
+                               (unsigned long)addr, (unsigned long)offset + i,
+                               *su1, res);
+                       bitflips += hweight8(res);
+               }
+       }
+
+       return bitflips;
+}
+
 static int verify_eraseblock(int ebnum)
 {
        int i;
@@ -203,6 +228,15 @@ static int verify_eraseblock(int ebnum)
                        bitflips = memcmpshow(addr, readbuf + use_offset,
                                              writebuf + (use_len_max * i) + use_offset,
                                              use_len);
+
+                       /* verify pre-offset area for 0xff */
+                       bitflips += memffshow(addr, 0, readbuf, use_offset);
+
+                       /* verify post-(use_offset + use_len) area for 0xff */
+                       k = use_offset + use_len;
+                       bitflips += memffshow(addr, k, readbuf + k,
+                                             mtd->ecclayout->oobavail - k);
+
                        if (bitflips > bitflip_limit) {
                                pr_err("error: verify failed at %#llx\n",
                                                (long long)addr);
@@ -212,34 +246,8 @@ static int verify_eraseblock(int ebnum)
                                        return -1;
                                }
                        } else if (bitflips) {
-                               pr_info("ignoring error as within bitflip_limit\n");
+                               pr_info("ignoring errors as within bitflip limit\n");
                        }
-
-                       for (k = 0; k < use_offset; ++k)
-                               if (readbuf[k] != 0xff) {
-                                       pr_err("error: verify 0xff "
-                                              "failed at %#llx\n",
-                                              (long long)addr);
-                                       errcnt += 1;
-                                       if (errcnt > 1000) {
-                                               pr_err("error: too "
-                                                      "many errors\n");
-                                               return -1;
-                                       }
-                               }
-                       for (k = use_offset + use_len;
-                            k < mtd->ecclayout->oobavail; ++k)
-                               if (readbuf[k] != 0xff) {
-                                       pr_err("error: verify 0xff "
-                                              "failed at %#llx\n",
-                                              (long long)addr);
-                                       errcnt += 1;
-                                       if (errcnt > 1000) {
-                                               pr_err("error: too "
-                                                      "many errors\n");
-                                               return -1;
-                                       }
-                               }
                }
                if (vary_offset)
                        do_vary_offset();