diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2013-08-03 05:52:10 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2013-08-30 16:34:17 -0400 |
commit | 66b28183eeba83998a52bd6e598aa2abbe877ef3 (patch) | |
tree | c487ec7f858b9b7d19b5df7738c3dab42f5d1523 /drivers | |
parent | 4bf527aa5312655d478a49f545a355ee9e76175d (diff) |
mtd: mtd_pagetest: use mtd_test helpers
Use mtdtest_write(), mtdtest_read(), mtdtest_erase_eraseblock(),
mtdtest_scan_for_bad_eraseblocks(), and mtdtest_erase_good_eraseblocks()
in mtd_test helpers.
[dwmw2: merge later 'remove always true condition' fix]
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: Brian Norris <computersforpeace@gmail.com>
Cc: Vikram Narayanan <vikram186@gmail.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/tests/pagetest.c | 205 |
1 files changed, 58 insertions, 147 deletions
diff --git a/drivers/mtd/tests/pagetest.c b/drivers/mtd/tests/pagetest.c index acd991f4bf94..83189765eb05 100644 --- a/drivers/mtd/tests/pagetest.c +++ b/drivers/mtd/tests/pagetest.c | |||
@@ -31,6 +31,8 @@ | |||
31 | #include <linux/sched.h> | 31 | #include <linux/sched.h> |
32 | #include <linux/random.h> | 32 | #include <linux/random.h> |
33 | 33 | ||
34 | #include "mtd_test.h" | ||
35 | |||
34 | static int dev = -EINVAL; | 36 | static int dev = -EINVAL; |
35 | module_param(dev, int, S_IRUGO); | 37 | module_param(dev, int, S_IRUGO); |
36 | MODULE_PARM_DESC(dev, "MTD device number to use"); | 38 | MODULE_PARM_DESC(dev, "MTD device number to use"); |
@@ -48,42 +50,15 @@ static int pgcnt; | |||
48 | static int errcnt; | 50 | static int errcnt; |
49 | static struct rnd_state rnd_state; | 51 | static struct rnd_state rnd_state; |
50 | 52 | ||
51 | static int erase_eraseblock(int ebnum) | ||
52 | { | ||
53 | int err; | ||
54 | struct erase_info ei; | ||
55 | loff_t addr = ebnum * mtd->erasesize; | ||
56 | |||
57 | memset(&ei, 0, sizeof(struct erase_info)); | ||
58 | ei.mtd = mtd; | ||
59 | ei.addr = addr; | ||
60 | ei.len = mtd->erasesize; | ||
61 | |||
62 | err = mtd_erase(mtd, &ei); | ||
63 | if (err) { | ||
64 | pr_err("error %d while erasing EB %d\n", err, ebnum); | ||
65 | return err; | ||
66 | } | ||
67 | |||
68 | if (ei.state == MTD_ERASE_FAILED) { | ||
69 | pr_err("some erase error occurred at EB %d\n", | ||
70 | ebnum); | ||
71 | return -EIO; | ||
72 | } | ||
73 | |||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static int write_eraseblock(int ebnum) | 53 | static int write_eraseblock(int ebnum) |
78 | { | 54 | { |
79 | int err = 0; | 55 | int err; |
80 | size_t written; | ||
81 | loff_t addr = ebnum * mtd->erasesize; | 56 | loff_t addr = ebnum * mtd->erasesize; |
82 | 57 | ||
83 | prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize); | 58 | prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize); |
84 | cond_resched(); | 59 | cond_resched(); |
85 | err = mtd_write(mtd, addr, mtd->erasesize, &written, writebuf); | 60 | err = mtdtest_write(mtd, addr, mtd->erasesize, writebuf); |
86 | if (err || written != mtd->erasesize) | 61 | if (err) |
87 | pr_err("error: write failed at %#llx\n", | 62 | pr_err("error: write failed at %#llx\n", |
88 | (long long)addr); | 63 | (long long)addr); |
89 | 64 | ||
@@ -93,7 +68,6 @@ static int write_eraseblock(int ebnum) | |||
93 | static int verify_eraseblock(int ebnum) | 68 | static int verify_eraseblock(int ebnum) |
94 | { | 69 | { |
95 | uint32_t j; | 70 | uint32_t j; |
96 | size_t read; | ||
97 | int err = 0, i; | 71 | int err = 0, i; |
98 | loff_t addr0, addrn; | 72 | loff_t addr0, addrn; |
99 | loff_t addr = ebnum * mtd->erasesize; | 73 | loff_t addr = ebnum * mtd->erasesize; |
@@ -109,27 +83,21 @@ static int verify_eraseblock(int ebnum) | |||
109 | prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize); | 83 | prandom_bytes_state(&rnd_state, writebuf, mtd->erasesize); |
110 | for (j = 0; j < pgcnt - 1; ++j, addr += pgsize) { | 84 | for (j = 0; j < pgcnt - 1; ++j, addr += pgsize) { |
111 | /* Do a read to set the internal dataRAMs to different data */ | 85 | /* Do a read to set the internal dataRAMs to different data */ |
112 | err = mtd_read(mtd, addr0, bufsize, &read, twopages); | 86 | err = mtdtest_read(mtd, addr0, bufsize, twopages); |
113 | if (mtd_is_bitflip(err)) | 87 | if (err) { |
114 | err = 0; | ||
115 | if (err || read != bufsize) { | ||
116 | pr_err("error: read failed at %#llx\n", | 88 | pr_err("error: read failed at %#llx\n", |
117 | (long long)addr0); | 89 | (long long)addr0); |
118 | return err; | 90 | return err; |
119 | } | 91 | } |
120 | err = mtd_read(mtd, addrn - bufsize, bufsize, &read, twopages); | 92 | err = mtdtest_read(mtd, addrn - bufsize, bufsize, twopages); |
121 | if (mtd_is_bitflip(err)) | 93 | if (err) { |
122 | err = 0; | ||
123 | if (err || read != bufsize) { | ||
124 | pr_err("error: read failed at %#llx\n", | 94 | pr_err("error: read failed at %#llx\n", |
125 | (long long)(addrn - bufsize)); | 95 | (long long)(addrn - bufsize)); |
126 | return err; | 96 | return err; |
127 | } | 97 | } |
128 | memset(twopages, 0, bufsize); | 98 | memset(twopages, 0, bufsize); |
129 | err = mtd_read(mtd, addr, bufsize, &read, twopages); | 99 | err = mtdtest_read(mtd, addr, bufsize, twopages); |
130 | if (mtd_is_bitflip(err)) | 100 | if (err) { |
131 | err = 0; | ||
132 | if (err || read != bufsize) { | ||
133 | pr_err("error: read failed at %#llx\n", | 101 | pr_err("error: read failed at %#llx\n", |
134 | (long long)addr); | 102 | (long long)addr); |
135 | break; | 103 | break; |
@@ -145,27 +113,21 @@ static int verify_eraseblock(int ebnum) | |||
145 | struct rnd_state old_state = rnd_state; | 113 | struct rnd_state old_state = rnd_state; |
146 | 114 | ||
147 | /* Do a read to set the internal dataRAMs to different data */ | 115 | /* Do a read to set the internal dataRAMs to different data */ |
148 | err = mtd_read(mtd, addr0, bufsize, &read, twopages); | 116 | err = mtdtest_read(mtd, addr0, bufsize, twopages); |
149 | if (mtd_is_bitflip(err)) | 117 | if (err) { |
150 | err = 0; | ||
151 | if (err || read != bufsize) { | ||
152 | pr_err("error: read failed at %#llx\n", | 118 | pr_err("error: read failed at %#llx\n", |
153 | (long long)addr0); | 119 | (long long)addr0); |
154 | return err; | 120 | return err; |
155 | } | 121 | } |
156 | err = mtd_read(mtd, addrn - bufsize, bufsize, &read, twopages); | 122 | err = mtdtest_read(mtd, addrn - bufsize, bufsize, twopages); |
157 | if (mtd_is_bitflip(err)) | 123 | if (err) { |
158 | err = 0; | ||
159 | if (err || read != bufsize) { | ||
160 | pr_err("error: read failed at %#llx\n", | 124 | pr_err("error: read failed at %#llx\n", |
161 | (long long)(addrn - bufsize)); | 125 | (long long)(addrn - bufsize)); |
162 | return err; | 126 | return err; |
163 | } | 127 | } |
164 | memset(twopages, 0, bufsize); | 128 | memset(twopages, 0, bufsize); |
165 | err = mtd_read(mtd, addr, bufsize, &read, twopages); | 129 | err = mtdtest_read(mtd, addr, bufsize, twopages); |
166 | if (mtd_is_bitflip(err)) | 130 | if (err) { |
167 | err = 0; | ||
168 | if (err || read != bufsize) { | ||
169 | pr_err("error: read failed at %#llx\n", | 131 | pr_err("error: read failed at %#llx\n", |
170 | (long long)addr); | 132 | (long long)addr); |
171 | return err; | 133 | return err; |
@@ -184,7 +146,6 @@ static int verify_eraseblock(int ebnum) | |||
184 | 146 | ||
185 | static int crosstest(void) | 147 | static int crosstest(void) |
186 | { | 148 | { |
187 | size_t read; | ||
188 | int err = 0, i; | 149 | int err = 0, i; |
189 | loff_t addr, addr0, addrn; | 150 | loff_t addr, addr0, addrn; |
190 | unsigned char *pp1, *pp2, *pp3, *pp4; | 151 | unsigned char *pp1, *pp2, *pp3, *pp4; |
@@ -208,10 +169,8 @@ static int crosstest(void) | |||
208 | 169 | ||
209 | /* Read 2nd-to-last page to pp1 */ | 170 | /* Read 2nd-to-last page to pp1 */ |
210 | addr = addrn - pgsize - pgsize; | 171 | addr = addrn - pgsize - pgsize; |
211 | err = mtd_read(mtd, addr, pgsize, &read, pp1); | 172 | err = mtdtest_read(mtd, addr, pgsize, pp1); |
212 | if (mtd_is_bitflip(err)) | 173 | if (err) { |
213 | err = 0; | ||
214 | if (err || read != pgsize) { | ||
215 | pr_err("error: read failed at %#llx\n", | 174 | pr_err("error: read failed at %#llx\n", |
216 | (long long)addr); | 175 | (long long)addr); |
217 | kfree(pp1); | 176 | kfree(pp1); |
@@ -220,10 +179,8 @@ static int crosstest(void) | |||
220 | 179 | ||
221 | /* Read 3rd-to-last page to pp1 */ | 180 | /* Read 3rd-to-last page to pp1 */ |
222 | addr = addrn - pgsize - pgsize - pgsize; | 181 | addr = addrn - pgsize - pgsize - pgsize; |
223 | err = mtd_read(mtd, addr, pgsize, &read, pp1); | 182 | err = mtdtest_read(mtd, addr, pgsize, pp1); |
224 | if (mtd_is_bitflip(err)) | 183 | if (err) { |
225 | err = 0; | ||
226 | if (err || read != pgsize) { | ||
227 | pr_err("error: read failed at %#llx\n", | 184 | pr_err("error: read failed at %#llx\n", |
228 | (long long)addr); | 185 | (long long)addr); |
229 | kfree(pp1); | 186 | kfree(pp1); |
@@ -233,10 +190,8 @@ static int crosstest(void) | |||
233 | /* Read first page to pp2 */ | 190 | /* Read first page to pp2 */ |
234 | addr = addr0; | 191 | addr = addr0; |
235 | pr_info("reading page at %#llx\n", (long long)addr); | 192 | pr_info("reading page at %#llx\n", (long long)addr); |
236 | err = mtd_read(mtd, addr, pgsize, &read, pp2); | 193 | err = mtdtest_read(mtd, addr, pgsize, pp2); |
237 | if (mtd_is_bitflip(err)) | 194 | if (err) { |
238 | err = 0; | ||
239 | if (err || read != pgsize) { | ||
240 | pr_err("error: read failed at %#llx\n", | 195 | pr_err("error: read failed at %#llx\n", |
241 | (long long)addr); | 196 | (long long)addr); |
242 | kfree(pp1); | 197 | kfree(pp1); |
@@ -246,10 +201,8 @@ static int crosstest(void) | |||
246 | /* Read last page to pp3 */ | 201 | /* Read last page to pp3 */ |
247 | addr = addrn - pgsize; | 202 | addr = addrn - pgsize; |
248 | pr_info("reading page at %#llx\n", (long long)addr); | 203 | pr_info("reading page at %#llx\n", (long long)addr); |
249 | err = mtd_read(mtd, addr, pgsize, &read, pp3); | 204 | err = mtdtest_read(mtd, addr, pgsize, pp3); |
250 | if (mtd_is_bitflip(err)) | 205 | if (err) { |
251 | err = 0; | ||
252 | if (err || read != pgsize) { | ||
253 | pr_err("error: read failed at %#llx\n", | 206 | pr_err("error: read failed at %#llx\n", |
254 | (long long)addr); | 207 | (long long)addr); |
255 | kfree(pp1); | 208 | kfree(pp1); |
@@ -259,10 +212,8 @@ static int crosstest(void) | |||
259 | /* Read first page again to pp4 */ | 212 | /* Read first page again to pp4 */ |
260 | addr = addr0; | 213 | addr = addr0; |
261 | pr_info("reading page at %#llx\n", (long long)addr); | 214 | pr_info("reading page at %#llx\n", (long long)addr); |
262 | err = mtd_read(mtd, addr, pgsize, &read, pp4); | 215 | err = mtdtest_read(mtd, addr, pgsize, pp4); |
263 | if (mtd_is_bitflip(err)) | 216 | if (err) { |
264 | err = 0; | ||
265 | if (err || read != pgsize) { | ||
266 | pr_err("error: read failed at %#llx\n", | 217 | pr_err("error: read failed at %#llx\n", |
267 | (long long)addr); | 218 | (long long)addr); |
268 | kfree(pp1); | 219 | kfree(pp1); |
@@ -283,7 +234,6 @@ static int crosstest(void) | |||
283 | 234 | ||
284 | static int erasecrosstest(void) | 235 | static int erasecrosstest(void) |
285 | { | 236 | { |
286 | size_t read, written; | ||
287 | int err = 0, i, ebnum, ebnum2; | 237 | int err = 0, i, ebnum, ebnum2; |
288 | loff_t addr0; | 238 | loff_t addr0; |
289 | char *readbuf = twopages; | 239 | char *readbuf = twopages; |
@@ -302,29 +252,27 @@ static int erasecrosstest(void) | |||
302 | ebnum2 -= 1; | 252 | ebnum2 -= 1; |
303 | 253 | ||
304 | pr_info("erasing block %d\n", ebnum); | 254 | pr_info("erasing block %d\n", ebnum); |
305 | err = erase_eraseblock(ebnum); | 255 | err = mtdtest_erase_eraseblock(mtd, ebnum); |
306 | if (err) | 256 | if (err) |
307 | return err; | 257 | return err; |
308 | 258 | ||
309 | pr_info("writing 1st page of block %d\n", ebnum); | 259 | pr_info("writing 1st page of block %d\n", ebnum); |
310 | prandom_bytes_state(&rnd_state, writebuf, pgsize); | 260 | prandom_bytes_state(&rnd_state, writebuf, pgsize); |
311 | strcpy(writebuf, "There is no data like this!"); | 261 | strcpy(writebuf, "There is no data like this!"); |
312 | err = mtd_write(mtd, addr0, pgsize, &written, writebuf); | 262 | err = mtdtest_write(mtd, addr0, pgsize, writebuf); |
313 | if (err || written != pgsize) { | 263 | if (err) { |
314 | pr_info("error: write failed at %#llx\n", | 264 | pr_info("error: write failed at %#llx\n", |
315 | (long long)addr0); | 265 | (long long)addr0); |
316 | return err ? err : -1; | 266 | return err; |
317 | } | 267 | } |
318 | 268 | ||
319 | pr_info("reading 1st page of block %d\n", ebnum); | 269 | pr_info("reading 1st page of block %d\n", ebnum); |
320 | memset(readbuf, 0, pgsize); | 270 | memset(readbuf, 0, pgsize); |
321 | err = mtd_read(mtd, addr0, pgsize, &read, readbuf); | 271 | err = mtdtest_read(mtd, addr0, pgsize, readbuf); |
322 | if (mtd_is_bitflip(err)) | 272 | if (err) { |
323 | err = 0; | ||
324 | if (err || read != pgsize) { | ||
325 | pr_err("error: read failed at %#llx\n", | 273 | pr_err("error: read failed at %#llx\n", |
326 | (long long)addr0); | 274 | (long long)addr0); |
327 | return err ? err : -1; | 275 | return err; |
328 | } | 276 | } |
329 | 277 | ||
330 | pr_info("verifying 1st page of block %d\n", ebnum); | 278 | pr_info("verifying 1st page of block %d\n", ebnum); |
@@ -335,34 +283,32 @@ static int erasecrosstest(void) | |||
335 | } | 283 | } |
336 | 284 | ||
337 | pr_info("erasing block %d\n", ebnum); | 285 | pr_info("erasing block %d\n", ebnum); |
338 | err = erase_eraseblock(ebnum); | 286 | err = mtdtest_erase_eraseblock(mtd, ebnum); |
339 | if (err) | 287 | if (err) |
340 | return err; | 288 | return err; |
341 | 289 | ||
342 | pr_info("writing 1st page of block %d\n", ebnum); | 290 | pr_info("writing 1st page of block %d\n", ebnum); |
343 | prandom_bytes_state(&rnd_state, writebuf, pgsize); | 291 | prandom_bytes_state(&rnd_state, writebuf, pgsize); |
344 | strcpy(writebuf, "There is no data like this!"); | 292 | strcpy(writebuf, "There is no data like this!"); |
345 | err = mtd_write(mtd, addr0, pgsize, &written, writebuf); | 293 | err = mtdtest_write(mtd, addr0, pgsize, writebuf); |
346 | if (err || written != pgsize) { | 294 | if (err) { |
347 | pr_err("error: write failed at %#llx\n", | 295 | pr_err("error: write failed at %#llx\n", |
348 | (long long)addr0); | 296 | (long long)addr0); |
349 | return err ? err : -1; | 297 | return err; |
350 | } | 298 | } |
351 | 299 | ||
352 | pr_info("erasing block %d\n", ebnum2); | 300 | pr_info("erasing block %d\n", ebnum2); |
353 | err = erase_eraseblock(ebnum2); | 301 | err = mtdtest_erase_eraseblock(mtd, ebnum2); |
354 | if (err) | 302 | if (err) |
355 | return err; | 303 | return err; |
356 | 304 | ||
357 | pr_info("reading 1st page of block %d\n", ebnum); | 305 | pr_info("reading 1st page of block %d\n", ebnum); |
358 | memset(readbuf, 0, pgsize); | 306 | memset(readbuf, 0, pgsize); |
359 | err = mtd_read(mtd, addr0, pgsize, &read, readbuf); | 307 | err = mtdtest_read(mtd, addr0, pgsize, readbuf); |
360 | if (mtd_is_bitflip(err)) | 308 | if (err) { |
361 | err = 0; | ||
362 | if (err || read != pgsize) { | ||
363 | pr_err("error: read failed at %#llx\n", | 309 | pr_err("error: read failed at %#llx\n", |
364 | (long long)addr0); | 310 | (long long)addr0); |
365 | return err ? err : -1; | 311 | return err; |
366 | } | 312 | } |
367 | 313 | ||
368 | pr_info("verifying 1st page of block %d\n", ebnum); | 314 | pr_info("verifying 1st page of block %d\n", ebnum); |
@@ -379,7 +325,6 @@ static int erasecrosstest(void) | |||
379 | 325 | ||
380 | static int erasetest(void) | 326 | static int erasetest(void) |
381 | { | 327 | { |
382 | size_t read, written; | ||
383 | int err = 0, i, ebnum, ok = 1; | 328 | int err = 0, i, ebnum, ok = 1; |
384 | loff_t addr0; | 329 | loff_t addr0; |
385 | 330 | ||
@@ -393,32 +338,30 @@ static int erasetest(void) | |||
393 | } | 338 | } |
394 | 339 | ||
395 | pr_info("erasing block %d\n", ebnum); | 340 | pr_info("erasing block %d\n", ebnum); |
396 | err = erase_eraseblock(ebnum); | 341 | err = mtdtest_erase_eraseblock(mtd, ebnum); |
397 | if (err) | 342 | if (err) |
398 | return err; | 343 | return err; |
399 | 344 | ||
400 | pr_info("writing 1st page of block %d\n", ebnum); | 345 | pr_info("writing 1st page of block %d\n", ebnum); |
401 | prandom_bytes_state(&rnd_state, writebuf, pgsize); | 346 | prandom_bytes_state(&rnd_state, writebuf, pgsize); |
402 | err = mtd_write(mtd, addr0, pgsize, &written, writebuf); | 347 | err = mtdtest_write(mtd, addr0, pgsize, writebuf); |
403 | if (err || written != pgsize) { | 348 | if (err) { |
404 | pr_err("error: write failed at %#llx\n", | 349 | pr_err("error: write failed at %#llx\n", |
405 | (long long)addr0); | 350 | (long long)addr0); |
406 | return err ? err : -1; | 351 | return err; |
407 | } | 352 | } |
408 | 353 | ||
409 | pr_info("erasing block %d\n", ebnum); | 354 | pr_info("erasing block %d\n", ebnum); |
410 | err = erase_eraseblock(ebnum); | 355 | err = mtdtest_erase_eraseblock(mtd, ebnum); |
411 | if (err) | 356 | if (err) |
412 | return err; | 357 | return err; |
413 | 358 | ||
414 | pr_info("reading 1st page of block %d\n", ebnum); | 359 | pr_info("reading 1st page of block %d\n", ebnum); |
415 | err = mtd_read(mtd, addr0, pgsize, &read, twopages); | 360 | err = mtdtest_read(mtd, addr0, pgsize, twopages); |
416 | if (mtd_is_bitflip(err)) | 361 | if (err) { |
417 | err = 0; | ||
418 | if (err || read != pgsize) { | ||
419 | pr_err("error: read failed at %#llx\n", | 362 | pr_err("error: read failed at %#llx\n", |
420 | (long long)addr0); | 363 | (long long)addr0); |
421 | return err ? err : -1; | 364 | return err; |
422 | } | 365 | } |
423 | 366 | ||
424 | pr_info("verifying 1st page of block %d is all 0xff\n", | 367 | pr_info("verifying 1st page of block %d is all 0xff\n", |
@@ -438,36 +381,6 @@ static int erasetest(void) | |||
438 | return err; | 381 | return err; |
439 | } | 382 | } |
440 | 383 | ||
441 | static int is_block_bad(int ebnum) | ||
442 | { | ||
443 | loff_t addr = ebnum * mtd->erasesize; | ||
444 | int ret; | ||
445 | |||
446 | ret = mtd_block_isbad(mtd, addr); | ||
447 | if (ret) | ||
448 | pr_info("block %d is bad\n", ebnum); | ||
449 | return ret; | ||
450 | } | ||
451 | |||
452 | static int scan_for_bad_eraseblocks(void) | ||
453 | { | ||
454 | int i, bad = 0; | ||
455 | |||
456 | bbt = kzalloc(ebcnt, GFP_KERNEL); | ||
457 | if (!bbt) | ||
458 | return -ENOMEM; | ||
459 | |||
460 | pr_info("scanning for bad eraseblocks\n"); | ||
461 | for (i = 0; i < ebcnt; ++i) { | ||
462 | bbt[i] = is_block_bad(i) ? 1 : 0; | ||
463 | if (bbt[i]) | ||
464 | bad += 1; | ||
465 | cond_resched(); | ||
466 | } | ||
467 | pr_info("scanned %d eraseblocks, %d are bad\n", i, bad); | ||
468 | return 0; | ||
469 | } | ||
470 | |||
471 | static int __init mtd_pagetest_init(void) | 384 | static int __init mtd_pagetest_init(void) |
472 | { | 385 | { |
473 | int err = 0; | 386 | int err = 0; |
@@ -521,21 +434,19 @@ static int __init mtd_pagetest_init(void) | |||
521 | if (!boundary) | 434 | if (!boundary) |
522 | goto out; | 435 | goto out; |
523 | 436 | ||
524 | err = scan_for_bad_eraseblocks(); | 437 | bbt = kzalloc(ebcnt, GFP_KERNEL); |
438 | if (!bbt) | ||
439 | goto out; | ||
440 | err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt); | ||
525 | if (err) | 441 | if (err) |
526 | goto out; | 442 | goto out; |
527 | 443 | ||
528 | /* Erase all eraseblocks */ | 444 | /* Erase all eraseblocks */ |
529 | pr_info("erasing whole device\n"); | 445 | pr_info("erasing whole device\n"); |
530 | for (i = 0; i < ebcnt; ++i) { | 446 | err = mtdtest_erase_good_eraseblocks(mtd, bbt, 0, ebcnt); |
531 | if (bbt[i]) | 447 | if (err) |
532 | continue; | 448 | goto out; |
533 | err = erase_eraseblock(i); | 449 | pr_info("erased %u eraseblocks\n", ebcnt); |
534 | if (err) | ||
535 | goto out; | ||
536 | cond_resched(); | ||
537 | } | ||
538 | pr_info("erased %u eraseblocks\n", i); | ||
539 | 450 | ||
540 | /* Write all eraseblocks */ | 451 | /* Write all eraseblocks */ |
541 | prandom_seed_state(&rnd_state, 1); | 452 | prandom_seed_state(&rnd_state, 1); |