Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mtd: mtd_oobtest: Fix bitflip_limit usage in test case 3

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>

authored by

Roger Quadros and committed by
Brian Norris
d2b51c80 45fd357a

+35 -27
+35 -27
drivers/mtd/tests/oobtest.c
··· 141 141 return bitflips; 142 142 } 143 143 144 + /* 145 + * Compare with 0xff and show the address, offset and data bytes at 146 + * comparison failure. Return number of bitflips encountered. 147 + */ 148 + static size_t memffshow(loff_t addr, loff_t offset, const void *cs, 149 + size_t count) 150 + { 151 + const unsigned char *su1; 152 + int res; 153 + size_t i = 0; 154 + size_t bitflips = 0; 155 + 156 + for (su1 = cs; 0 < count; ++su1, count--, i++) { 157 + res = *su1 ^ 0xff; 158 + if (res) { 159 + pr_info("error @addr[0x%lx:0x%lx] 0x%x -> 0xff diff 0x%x\n", 160 + (unsigned long)addr, (unsigned long)offset + i, 161 + *su1, res); 162 + bitflips += hweight8(res); 163 + } 164 + } 165 + 166 + return bitflips; 167 + } 168 + 144 169 static int verify_eraseblock(int ebnum) 145 170 { 146 171 int i; ··· 228 203 bitflips = memcmpshow(addr, readbuf + use_offset, 229 204 writebuf + (use_len_max * i) + use_offset, 230 205 use_len); 206 + 207 + /* verify pre-offset area for 0xff */ 208 + bitflips += memffshow(addr, 0, readbuf, use_offset); 209 + 210 + /* verify post-(use_offset + use_len) area for 0xff */ 211 + k = use_offset + use_len; 212 + bitflips += memffshow(addr, k, readbuf + k, 213 + mtd->ecclayout->oobavail - k); 214 + 231 215 if (bitflips > bitflip_limit) { 232 216 pr_err("error: verify failed at %#llx\n", 233 217 (long long)addr); ··· 246 212 return -1; 247 213 } 248 214 } else if (bitflips) { 249 - pr_info("ignoring error as within bitflip_limit\n"); 215 + pr_info("ignoring errors as within bitflip limit\n"); 250 216 } 251 - 252 - for (k = 0; k < use_offset; ++k) 253 - if (readbuf[k] != 0xff) { 254 - pr_err("error: verify 0xff " 255 - "failed at %#llx\n", 256 - (long long)addr); 257 - errcnt += 1; 258 - if (errcnt > 1000) { 259 - pr_err("error: too " 260 - "many errors\n"); 261 - return -1; 262 - } 263 - } 264 - for (k = use_offset + use_len; 265 - k < mtd->ecclayout->oobavail; ++k) 266 - if (readbuf[k] != 0xff) { 267 - pr_err("error: verify 0xff " 268 - "failed at %#llx\n", 269 - (long long)addr); 270 - errcnt += 1; 271 - if (errcnt > 1000) { 272 - pr_err("error: too " 273 - "many errors\n"); 274 - return -1; 275 - } 276 - } 277 217 } 278 218 if (vary_offset) 279 219 do_vary_offset();