#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)
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);
__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