aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/tests
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2013-08-03 05:52:13 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2013-08-30 16:34:21 -0400
commit5a78df69eeb34b560a92f64170625083018383de (patch)
tree70644ebafeeca96667a213d650b73f203123d346 /drivers/mtd/tests
parent59b0816d7c7de3c14d6dd59da3baa3deffb973da (diff)
mtd: mtd_stresstest: use mtd_test helpers
Use mtdtest_read(), mtdtest_write(), mtdtest_erase_eraseblock(), and mtdtest_scan_for_bad_eraseblocks() in mtd_test helpers. 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/mtd/tests')
-rw-r--r--drivers/mtd/tests/stresstest.c86
1 files changed, 12 insertions, 74 deletions
diff --git a/drivers/mtd/tests/stresstest.c b/drivers/mtd/tests/stresstest.c
index 3a95e61b535d..169524845401 100644
--- a/drivers/mtd/tests/stresstest.c
+++ b/drivers/mtd/tests/stresstest.c
@@ -31,6 +31,8 @@
31#include <linux/vmalloc.h> 31#include <linux/vmalloc.h>
32#include <linux/random.h> 32#include <linux/random.h>
33 33
34#include "mtd_test.h"
35
34static int dev = -EINVAL; 36static int dev = -EINVAL;
35module_param(dev, int, S_IRUGO); 37module_param(dev, int, S_IRUGO);
36MODULE_PARM_DESC(dev, "MTD device number to use"); 38MODULE_PARM_DESC(dev, "MTD device number to use");
@@ -81,46 +83,8 @@ static int rand_len(int offs)
81 return len; 83 return len;
82} 84}
83 85
84static int erase_eraseblock(int ebnum)
85{
86 int err;
87 struct erase_info ei;
88 loff_t addr = ebnum * mtd->erasesize;
89
90 memset(&ei, 0, sizeof(struct erase_info));
91 ei.mtd = mtd;
92 ei.addr = addr;
93 ei.len = mtd->erasesize;
94
95 err = mtd_erase(mtd, &ei);
96 if (unlikely(err)) {
97 pr_err("error %d while erasing EB %d\n", err, ebnum);
98 return err;
99 }
100
101 if (unlikely(ei.state == MTD_ERASE_FAILED)) {
102 pr_err("some erase error occurred at EB %d\n",
103 ebnum);
104 return -EIO;
105 }
106
107 return 0;
108}
109
110static int is_block_bad(int ebnum)
111{
112 loff_t addr = ebnum * mtd->erasesize;
113 int ret;
114
115 ret = mtd_block_isbad(mtd, addr);
116 if (ret)
117 pr_info("block %d is bad\n", ebnum);
118 return ret;
119}
120
121static int do_read(void) 86static int do_read(void)
122{ 87{
123 size_t read;
124 int eb = rand_eb(); 88 int eb = rand_eb();
125 int offs = rand_offs(); 89 int offs = rand_offs();
126 int len = rand_len(offs), err; 90 int len = rand_len(offs), err;
@@ -133,14 +97,10 @@ static int do_read(void)
133 len = mtd->erasesize - offs; 97 len = mtd->erasesize - offs;
134 } 98 }
135 addr = eb * mtd->erasesize + offs; 99 addr = eb * mtd->erasesize + offs;
136 err = mtd_read(mtd, addr, len, &read, readbuf); 100 err = mtdtest_read(mtd, addr, len, readbuf);
137 if (mtd_is_bitflip(err)) 101 if (unlikely(err)) {
138 err = 0;
139 if (unlikely(err || read != len)) {
140 pr_err("error: read failed at 0x%llx\n", 102 pr_err("error: read failed at 0x%llx\n",
141 (long long)addr); 103 (long long)addr);
142 if (!err)
143 err = -EINVAL;
144 return err; 104 return err;
145 } 105 }
146 return 0; 106 return 0;
@@ -149,12 +109,11 @@ static int do_read(void)
149static int do_write(void) 109static int do_write(void)
150{ 110{
151 int eb = rand_eb(), offs, err, len; 111 int eb = rand_eb(), offs, err, len;
152 size_t written;
153 loff_t addr; 112 loff_t addr;
154 113
155 offs = offsets[eb]; 114 offs = offsets[eb];
156 if (offs >= mtd->erasesize) { 115 if (offs >= mtd->erasesize) {
157 err = erase_eraseblock(eb); 116 err = mtdtest_erase_eraseblock(mtd, eb);
158 if (err) 117 if (err)
159 return err; 118 return err;
160 offs = offsets[eb] = 0; 119 offs = offsets[eb] = 0;
@@ -165,19 +124,17 @@ static int do_write(void)
165 if (bbt[eb + 1]) 124 if (bbt[eb + 1])
166 len = mtd->erasesize - offs; 125 len = mtd->erasesize - offs;
167 else { 126 else {
168 err = erase_eraseblock(eb + 1); 127 err = mtdtest_erase_eraseblock(mtd, eb + 1);
169 if (err) 128 if (err)
170 return err; 129 return err;
171 offsets[eb + 1] = 0; 130 offsets[eb + 1] = 0;
172 } 131 }
173 } 132 }
174 addr = eb * mtd->erasesize + offs; 133 addr = eb * mtd->erasesize + offs;
175 err = mtd_write(mtd, addr, len, &written, writebuf); 134 err = mtdtest_write(mtd, addr, len, writebuf);
176 if (unlikely(err || written != len)) { 135 if (unlikely(err)) {
177 pr_err("error: write failed at 0x%llx\n", 136 pr_err("error: write failed at 0x%llx\n",
178 (long long)addr); 137 (long long)addr);
179 if (!err)
180 err = -EINVAL;
181 return err; 138 return err;
182 } 139 }
183 offs += len; 140 offs += len;
@@ -197,28 +154,6 @@ static int do_operation(void)
197 return do_write(); 154 return do_write();
198} 155}
199 156
200static int scan_for_bad_eraseblocks(void)
201{
202 int i, bad = 0;
203
204 bbt = kzalloc(ebcnt, GFP_KERNEL);
205 if (!bbt)
206 return -ENOMEM;
207
208 if (!mtd_can_have_bb(mtd))
209 return 0;
210
211 pr_info("scanning for bad eraseblocks\n");
212 for (i = 0; i < ebcnt; ++i) {
213 bbt[i] = is_block_bad(i) ? 1 : 0;
214 if (bbt[i])
215 bad += 1;
216 cond_resched();
217 }
218 pr_info("scanned %d eraseblocks, %d are bad\n", i, bad);
219 return 0;
220}
221
222static int __init mtd_stresstest_init(void) 157static int __init mtd_stresstest_init(void)
223{ 158{
224 int err; 159 int err;
@@ -280,7 +215,10 @@ static int __init mtd_stresstest_init(void)
280 offsets[i] = mtd->erasesize; 215 offsets[i] = mtd->erasesize;
281 prandom_bytes(writebuf, bufsize); 216 prandom_bytes(writebuf, bufsize);
282 217
283 err = scan_for_bad_eraseblocks(); 218 bbt = kzalloc(ebcnt, GFP_KERNEL);
219 if (!bbt)
220 goto out;
221 err = mtdtest_scan_for_bad_eraseblocks(mtd, bbt, 0, ebcnt);
284 if (err) 222 if (err)
285 goto out; 223 goto out;
286 224