aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorRoger Quadros <rogerq@ti.com>2014-12-05 10:18:39 -0500
committerBrian Norris <computersforpeace@gmail.com>2015-04-05 21:10:23 -0400
commitd2b51c808745ca93c020ba34a3cf256ad52adc63 (patch)
tree6dde6542d2de918e83a23df020c2b37e9b06074b /drivers/mtd
parent45fd357a491ecc56c0f9bb110bd05d9caf28889f (diff)
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>
Diffstat (limited to 'drivers/mtd')
-rw-r--r--drivers/mtd/tests/oobtest.c62
1 files changed, 35 insertions, 27 deletions
diff --git a/drivers/mtd/tests/oobtest.c b/drivers/mtd/tests/oobtest.c
index 64390ab88a80..c6b35644a10f 100644
--- a/drivers/mtd/tests/oobtest.c
+++ b/drivers/mtd/tests/oobtest.c
@@ -141,6 +141,31 @@ static size_t memcmpshow(loff_t addr, const void *cs, const void *ct, size_t cou
141 return bitflips; 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 */
148static 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
144static int verify_eraseblock(int ebnum) 169static int verify_eraseblock(int ebnum)
145{ 170{
146 int i; 171 int i;
@@ -203,6 +228,15 @@ static int verify_eraseblock(int ebnum)
203 bitflips = memcmpshow(addr, readbuf + use_offset, 228 bitflips = memcmpshow(addr, readbuf + use_offset,
204 writebuf + (use_len_max * i) + use_offset, 229 writebuf + (use_len_max * i) + use_offset,
205 use_len); 230 use_len);
231
232 /* verify pre-offset area for 0xff */
233 bitflips += memffshow(addr, 0, readbuf, use_offset);
234
235 /* verify post-(use_offset + use_len) area for 0xff */
236 k = use_offset + use_len;
237 bitflips += memffshow(addr, k, readbuf + k,
238 mtd->ecclayout->oobavail - k);
239
206 if (bitflips > bitflip_limit) { 240 if (bitflips > bitflip_limit) {
207 pr_err("error: verify failed at %#llx\n", 241 pr_err("error: verify failed at %#llx\n",
208 (long long)addr); 242 (long long)addr);
@@ -212,34 +246,8 @@ static int verify_eraseblock(int ebnum)
212 return -1; 246 return -1;
213 } 247 }
214 } else if (bitflips) { 248 } else if (bitflips) {
215 pr_info("ignoring error as within bitflip_limit\n"); 249 pr_info("ignoring errors as within bitflip limit\n");
216 } 250 }
217
218 for (k = 0; k < use_offset; ++k)
219 if (readbuf[k] != 0xff) {
220 pr_err("error: verify 0xff "
221 "failed at %#llx\n",
222 (long long)addr);
223 errcnt += 1;
224 if (errcnt > 1000) {
225 pr_err("error: too "
226 "many errors\n");
227 return -1;
228 }
229 }
230 for (k = use_offset + use_len;
231 k < mtd->ecclayout->oobavail; ++k)
232 if (readbuf[k] != 0xff) {
233 pr_err("error: verify 0xff "
234 "failed at %#llx\n",
235 (long long)addr);
236 errcnt += 1;
237 if (errcnt > 1000) {
238 pr_err("error: too "
239 "many errors\n");
240 return -1;
241 }
242 }
243 } 251 }
244 if (vary_offset) 252 if (vary_offset)
245 do_vary_offset(); 253 do_vary_offset();