diff options
author | Akinobu Mita <akinobu.mita@gmail.com> | 2012-09-07 12:48:09 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2012-09-29 10:47:55 -0400 |
commit | 200ab8454c42c607efd281b2c2398624eccdd2cc (patch) | |
tree | f01ad7d909efe308340e2d2074dc07e1edd768a7 /drivers/mtd/tests | |
parent | ccaa67956cfef80776d72d134467235f0055c863 (diff) |
mtd: mtd_nandecctest: add single bit error correction test
This adds the single bit error correction test case listed below:
Prepare data block without corruption and ECC data with single bit error,
and verify that the data block is preserved by __nand_correct_data().
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/mtd/tests')
-rw-r--r-- | drivers/mtd/tests/mtd_nandecctest.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c index ff97b1070235..caaeb64acdea 100644 --- a/drivers/mtd/tests/mtd_nandecctest.c +++ b/drivers/mtd/tests/mtd_nandecctest.c | |||
@@ -48,6 +48,31 @@ static void single_bit_error_data(void *error_data, void *correct_data, | |||
48 | __change_bit_le(offset, error_data); | 48 | __change_bit_le(offset, error_data); |
49 | } | 49 | } |
50 | 50 | ||
51 | static unsigned int random_ecc_bit(size_t size) | ||
52 | { | ||
53 | unsigned int offset = random32() % (3 * BITS_PER_BYTE); | ||
54 | |||
55 | if (size == 256) { | ||
56 | /* | ||
57 | * Don't inject a bit error into the insignificant bits (16th | ||
58 | * and 17th bit) in ECC code for 256 byte data block | ||
59 | */ | ||
60 | while (offset == 16 || offset == 17) | ||
61 | offset = random32() % (3 * BITS_PER_BYTE); | ||
62 | } | ||
63 | |||
64 | return offset; | ||
65 | } | ||
66 | |||
67 | static void single_bit_error_ecc(void *error_ecc, void *correct_ecc, | ||
68 | size_t size) | ||
69 | { | ||
70 | unsigned int offset = random_ecc_bit(size); | ||
71 | |||
72 | memcpy(error_ecc, correct_ecc, 3); | ||
73 | __change_bit_le(offset, error_ecc); | ||
74 | } | ||
75 | |||
51 | static void no_bit_error(void *error_data, void *error_ecc, | 76 | static void no_bit_error(void *error_data, void *error_ecc, |
52 | void *correct_data, void *correct_ecc, const size_t size) | 77 | void *correct_data, void *correct_ecc, const size_t size) |
53 | { | 78 | { |
@@ -76,6 +101,13 @@ static void single_bit_error_in_data(void *error_data, void *error_ecc, | |||
76 | memcpy(error_ecc, correct_ecc, 3); | 101 | memcpy(error_ecc, correct_ecc, 3); |
77 | } | 102 | } |
78 | 103 | ||
104 | static void single_bit_error_in_ecc(void *error_data, void *error_ecc, | ||
105 | void *correct_data, void *correct_ecc, const size_t size) | ||
106 | { | ||
107 | memcpy(error_data, correct_data, size); | ||
108 | single_bit_error_ecc(error_ecc, correct_ecc, size); | ||
109 | } | ||
110 | |||
79 | static int single_bit_error_correct(void *error_data, void *error_ecc, | 111 | static int single_bit_error_correct(void *error_data, void *error_ecc, |
80 | void *correct_data, const size_t size) | 112 | void *correct_data, const size_t size) |
81 | { | 113 | { |
@@ -101,6 +133,11 @@ static const struct nand_ecc_test nand_ecc_test[] = { | |||
101 | .prepare = single_bit_error_in_data, | 133 | .prepare = single_bit_error_in_data, |
102 | .verify = single_bit_error_correct, | 134 | .verify = single_bit_error_correct, |
103 | }, | 135 | }, |
136 | { | ||
137 | .name = "single-bit-error-in-ecc-correct", | ||
138 | .prepare = single_bit_error_in_ecc, | ||
139 | .verify = single_bit_error_correct, | ||
140 | }, | ||
104 | }; | 141 | }; |
105 | 142 | ||
106 | static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data, | 143 | static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data, |