|
@@ -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
|