From: Akinobu Mita <akinobu.mita@gmail.com>
To: linux-mtd@lists.infradead.org
Cc: Artem Bityutskiy <dedekind1@gmail.com>,
Vikram Narayanan <vikram186@gmail.com>,
Akinobu Mita <akinobu.mita@gmail.com>,
Adrian Hunter <adrian.hunter@intel.com>,
Brian Norris <computersforpeace@gmail.com>,
David Woodhouse <dwmw2@infradead.org>
Subject: [PATCH -next v2 01/10] mtd: tests: introduce helper functions
Date: Sat, 3 Aug 2013 18:52:07 +0900 [thread overview]
Message-ID: <1375523536-32671-2-git-send-email-akinobu.mita@gmail.com> (raw)
In-Reply-To: <1375523536-32671-1-git-send-email-akinobu.mita@gmail.com>
This introduces the helper functions which can be used by several
mtd/tests modules.
The following three functions are used all over the test modules.
- mtdtest_erase_eraseblock()
- mtdtest_scan_for_bad_eraseblocks()
- mtdtest_erase_good_eraseblocks()
The following are wrapper functions for mtd_read() and mtd_write()
which can simplify the return value check.
- mtdtest_read()
- mtdtest_write()
All helpers are put into a single .c file and it will be linked to
every test module later. The code will actually be copied to every
test module, but it is fine for our small test infrastructure.
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>
Cc: Artem Bityutskiy <dedekind1@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: linux-mtd@lists.infradead.org
---
* Changes from v1
- link a signle object including helper functions to the test modules,
instead of providing a separate module.
- extend mtdtest_scan_for_bad_eraseblocks() so that it can specify any
contiguous erase blocks.
- rename mtdtest_erase_whole_device() to mtdtest_erase_good_eraseblocks()
and extend it so that it can specify any contiguous erase blocks.
drivers/mtd/tests/mtd_test.c | 110 +++++++++++++++++++++++++++++++++++++++++++
drivers/mtd/tests/mtd_test.h | 11 +++++
2 files changed, 121 insertions(+)
create mode 100644 drivers/mtd/tests/mtd_test.c
create mode 100644 drivers/mtd/tests/mtd_test.h
diff --git a/drivers/mtd/tests/mtd_test.c b/drivers/mtd/tests/mtd_test.c
new file mode 100644
index 0000000..9e63896
--- /dev/null
+++ b/drivers/mtd/tests/mtd_test.c
@@ -0,0 +1,110 @@
+#define pr_fmt(fmt) "mtd_test: " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/printk.h>
+
+#include "mtd_test.h"
+
+int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum)
+{
+ int err;
+ struct erase_info ei;
+ loff_t addr = ebnum * mtd->erasesize;
+
+ memset(&ei, 0, sizeof(struct erase_info));
+ ei.mtd = mtd;
+ ei.addr = addr;
+ ei.len = mtd->erasesize;
+
+ err = mtd_erase(mtd, &ei);
+ if (err) {
+ pr_info("error %d while erasing EB %d\n", err, ebnum);
+ return err;
+ }
+
+ if (ei.state == MTD_ERASE_FAILED) {
+ pr_info("some erase error occurred at EB %d\n", ebnum);
+ return -EIO;
+ }
+ return 0;
+}
+
+static int is_block_bad(struct mtd_info *mtd, unsigned int ebnum)
+{
+ int ret;
+ loff_t addr = ebnum * mtd->erasesize;
+
+ ret = mtd_block_isbad(mtd, addr);
+ if (ret)
+ pr_info("block %d is bad\n", ebnum);
+
+ return ret;
+}
+
+int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+ unsigned int eb, int ebcnt)
+{
+ int i, bad = 0;
+
+ if (!mtd_can_have_bb(mtd))
+ return 0;
+
+ pr_info("scanning for bad eraseblocks\n");
+ for (i = 0; i < ebcnt; ++i) {
+ bbt[i] = is_block_bad(mtd, eb + i) ? 1 : 0;
+ if (bbt[i])
+ bad += 1;
+ cond_resched();
+ }
+ pr_info("scanned %d eraseblocks, %d are bad\n", i, bad);
+
+ return 0;
+}
+
+int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+ unsigned int eb, int ebcnt)
+{
+ int err;
+ unsigned int i;
+
+ for (i = 0; i < ebcnt; ++i) {
+ if (bbt[i])
+ continue;
+ err = mtdtest_erase_eraseblock(mtd, eb + i);
+ if (err)
+ return err;
+ cond_resched();
+ }
+
+ return 0;
+}
+
+int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf)
+{
+ size_t read;
+ int err;
+
+ err = mtd_read(mtd, addr, size, &read, buf);
+ /* Ignore corrected ECC errors */
+ if (mtd_is_bitflip(err))
+ err = 0;
+ if (!err && read != size)
+ err = -EINVAL;
+
+ return err;
+}
+
+int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size,
+ const void *buf)
+{
+ size_t written;
+ int err;
+
+ err = mtd_write(mtd, addr, size, &written, buf);
+ if (!err && written != size)
+ err = -EIO;
+
+ return err;
+}
diff --git a/drivers/mtd/tests/mtd_test.h b/drivers/mtd/tests/mtd_test.h
new file mode 100644
index 0000000..f437c77
--- /dev/null
+++ b/drivers/mtd/tests/mtd_test.h
@@ -0,0 +1,11 @@
+#include <linux/mtd/mtd.h>
+
+int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum);
+int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+ unsigned int eb, int ebcnt);
+int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+ unsigned int eb, int ebcnt);
+
+int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf);
+int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size,
+ const void *buf);
--
1.8.3.1
next prev parent reply other threads:[~2013-08-03 9:53 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-03 9:52 [PATCH -next v2 00/10] mtd: tests: reduce duplication among mtd tests modules Akinobu Mita
2013-08-03 9:52 ` Akinobu Mita [this message]
2013-08-03 9:52 ` [PATCH -next v2 02/10] mtd: tests: rename sources in order to link a helper object Akinobu Mita
2013-08-30 15:53 ` David Woodhouse
2013-08-30 16:24 ` Brian Norris
2013-08-30 17:17 ` David Woodhouse
2013-09-01 0:51 ` Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 03/10] mtd: mtd_oobtest: use mtd_test helpers Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 04/10] mtd: mtd_pagetest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 05/10] mtd: mtd_readtest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 06/10] mtd: mtd_speedtest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 07/10] mtd: mtd_stresstest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 08/10] mtd: mtd_subpagetest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 09/10] mtd: mtd_torturetest: " Akinobu Mita
2013-08-03 9:52 ` [PATCH -next v2 10/10] mtd: mtd_nandbiterrs: " Akinobu Mita
2013-08-06 14:07 ` [PATCH -next v2 00/10] mtd: tests: reduce duplication among mtd tests modules Artem Bityutskiy
2013-08-07 14:11 ` Akinobu Mita
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1375523536-32671-2-git-send-email-akinobu.mita@gmail.com \
--to=akinobu.mita@gmail.com \
--cc=adrian.hunter@intel.com \
--cc=computersforpeace@gmail.com \
--cc=dedekind1@gmail.com \
--cc=dwmw2@infradead.org \
--cc=linux-mtd@lists.infradead.org \
--cc=vikram186@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox