aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/tests/mtd_nandecctest.c43
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
34static unsigned char correct_data[512];
35static unsigned char error_data[512];
36
37static int nand_ecc_test(const size_t size) 35static 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); 73error:
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