diff options
Diffstat (limited to 'drivers/mtd/tests/mtd_nandecctest.c')
-rw-r--r-- | drivers/mtd/tests/mtd_nandecctest.c | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c index 2b2d1a90417b..d3e8873ad38a 100644 --- a/drivers/mtd/tests/mtd_nandecctest.c +++ b/drivers/mtd/tests/mtd_nandecctest.c @@ -4,6 +4,7 @@ #include <linux/random.h> #include <linux/string.h> #include <linux/bitops.h> +#include <linux/slab.h> #include <linux/mtd/nand_ecc.h> #if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) @@ -31,16 +32,24 @@ static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data, DUMP_PREFIX_NONE, 16, 1, correct_ecc, 3, false); } -static unsigned char correct_data[512]; -static unsigned char error_data[512]; - static int nand_ecc_test(const size_t size) { - unsigned char correct_ecc[3]; - unsigned char error_ecc[3]; + int err = 0; + void *error_data; + void *error_ecc; + void *correct_data; + void *correct_ecc; char testname[30]; - BUG_ON(sizeof(correct_data) < size); + error_data = kmalloc(size, GFP_KERNEL); + error_ecc = kmalloc(3, GFP_KERNEL); + correct_data = kmalloc(size, GFP_KERNEL); + correct_ecc = kmalloc(3, GFP_KERNEL); + + if (!error_data || !error_ecc || !correct_data || !correct_ecc) { + err = -ENOMEM; + goto error; + } sprintf(testname, "nand-ecc-%zu", size); @@ -53,15 +62,21 @@ static int nand_ecc_test(const size_t size) __nand_calculate_ecc(error_data, size, error_ecc); __nand_correct_data(error_data, correct_ecc, error_ecc, size); - if (!memcmp(correct_data, error_data, size)) { - pr_info("mtd_nandecctest: ok - %s\n", testname); - return 0; + if (memcmp(correct_data, error_data, size)) { + pr_err("mtd_nandecctest: not ok - %s\n", testname); + dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc, + size); + err = -EINVAL; + goto error; } - - pr_err("mtd_nandecctest: not ok - %s\n", testname); - dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc, size); - - return -EINVAL; + pr_info("mtd_nandecctest: ok - %s\n", testname); +error: + kfree(error_data); + kfree(error_ecc); + kfree(correct_data); + kfree(correct_ecc); + + return err; } #else |