diff options
-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 @@ | |||
4 | #include <linux/random.h> | 4 | #include <linux/random.h> |
5 | #include <linux/string.h> | 5 | #include <linux/string.h> |
6 | #include <linux/bitops.h> | 6 | #include <linux/bitops.h> |
7 | #include <linux/slab.h> | ||
7 | #include <linux/mtd/nand_ecc.h> | 8 | #include <linux/mtd/nand_ecc.h> |
8 | 9 | ||
9 | #if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) | 10 | #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, | |||
31 | DUMP_PREFIX_NONE, 16, 1, correct_ecc, 3, false); | 32 | DUMP_PREFIX_NONE, 16, 1, correct_ecc, 3, false); |
32 | } | 33 | } |
33 | 34 | ||
34 | static unsigned char correct_data[512]; | ||
35 | static unsigned char error_data[512]; | ||
36 | |||
37 | static int nand_ecc_test(const size_t size) | 35 | static int nand_ecc_test(const size_t size) |
38 | { | 36 | { |
39 | unsigned char correct_ecc[3]; | 37 | int err = 0; |
40 | unsigned char error_ecc[3]; | 38 | void *error_data; |
39 | void *error_ecc; | ||
40 | void *correct_data; | ||
41 | void *correct_ecc; | ||
41 | char testname[30]; | 42 | char testname[30]; |
42 | 43 | ||
43 | BUG_ON(sizeof(correct_data) < size); | 44 | error_data = kmalloc(size, GFP_KERNEL); |
45 | error_ecc = kmalloc(3, GFP_KERNEL); | ||
46 | correct_data = kmalloc(size, GFP_KERNEL); | ||
47 | correct_ecc = kmalloc(3, GFP_KERNEL); | ||
48 | |||
49 | if (!error_data || !error_ecc || !correct_data || !correct_ecc) { | ||
50 | err = -ENOMEM; | ||
51 | goto error; | ||
52 | } | ||
44 | 53 | ||
45 | sprintf(testname, "nand-ecc-%zu", size); | 54 | sprintf(testname, "nand-ecc-%zu", size); |
46 | 55 | ||
@@ -53,15 +62,21 @@ static int nand_ecc_test(const size_t size) | |||
53 | __nand_calculate_ecc(error_data, size, error_ecc); | 62 | __nand_calculate_ecc(error_data, size, error_ecc); |
54 | __nand_correct_data(error_data, correct_ecc, error_ecc, size); | 63 | __nand_correct_data(error_data, correct_ecc, error_ecc, size); |
55 | 64 | ||
56 | if (!memcmp(correct_data, error_data, size)) { | 65 | if (memcmp(correct_data, error_data, size)) { |
57 | pr_info("mtd_nandecctest: ok - %s\n", testname); | 66 | pr_err("mtd_nandecctest: not ok - %s\n", testname); |
58 | return 0; | 67 | dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc, |
68 | size); | ||
69 | err = -EINVAL; | ||
70 | goto error; | ||
59 | } | 71 | } |
60 | 72 | pr_info("mtd_nandecctest: ok - %s\n", testname); | |
61 | pr_err("mtd_nandecctest: not ok - %s\n", testname); | 73 | error: |
62 | dump_data_ecc(error_data, error_ecc, correct_data, correct_ecc, size); | 74 | kfree(error_data); |
63 | 75 | kfree(error_ecc); | |
64 | return -EINVAL; | 76 | kfree(correct_data); |
77 | kfree(correct_ecc); | ||
78 | |||
79 | return err; | ||
65 | } | 80 | } |
66 | 81 | ||
67 | #else | 82 | #else |