aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/tests
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2012-09-07 12:48:09 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-09-29 10:47:55 -0400
commit200ab8454c42c607efd281b2c2398624eccdd2cc (patch)
treef01ad7d909efe308340e2d2074dc07e1edd768a7 /drivers/mtd/tests
parentccaa67956cfef80776d72d134467235f0055c863 (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.c37
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
51static 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
67static 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
51static void no_bit_error(void *error_data, void *error_ecc, 76static 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
104static 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
79static int single_bit_error_correct(void *error_data, void *error_ecc, 111static 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
106static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data, 143static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data,