23 #include <linux/module.h>
27 #include <linux/slab.h>
28 #include <linux/sched.h>
30 #define PRINT_PREF KERN_INFO "mtd_readtest: "
37 static unsigned char *iobuf;
38 static unsigned char *iobuf1;
39 static unsigned char *bbt;
45 static int read_eraseblock_by_page(
int ebnum)
51 void *oobbuf = iobuf1;
53 for (i = 0; i < pgcnt; i++) {
55 ret =
mtd_read(mtd, addr, pgsize, &read, buf);
58 if (ret || read != pgsize) {
78 if ((ret && !mtd_is_bitflip(ret)) ||
81 "%#llx\n", (
long long)addr);
96 static void dump_eraseblock(
int ebnum)
104 for (i = 0; i <
n;) {
108 for (j = 0; j < 32 && i <
n; j++, i++)
109 p +=
sprintf(p,
"%02x", (
unsigned int)iobuf[i]);
117 for (pg = 0, i = 0; pg < pgcnt; pg++)
118 for (oob = 0; oob <
n;) {
122 for (j = 0; j < 32 && oob <
n; j++, oob++, i++)
124 (
unsigned int)iobuf1[i]);
130 static int is_block_bad(
int ebnum)
141 static int scan_for_bad_eraseblocks(
void)
151 if (!mtd_can_have_bb(mtd))
155 for (i = 0; i < ebcnt; ++
i) {
156 bbt[
i] = is_block_bad(i) ? 1 : 0;
165 static int __init mtd_readtest_init(
void)
171 printk(
KERN_INFO "=================================================\n");
174 printk(
PRINT_PREF "Please specify a valid mtd-device via module paramter\n");
200 "page size %u, count of eraseblocks %u, pages per "
201 "eraseblock %u, OOB size %u\n",
203 pgsize, ebcnt, pgcnt, mtd->
oobsize);
217 err = scan_for_bad_eraseblocks();
223 for (i = 0; i < ebcnt; ++
i) {
228 ret = read_eraseblock_by_page(i);
250 printk(
KERN_INFO "=================================================\n");
255 static void __exit mtd_readtest_exit(
void)