aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/tests/mtd_nandecctest.c
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2012-09-07 12:48:06 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2012-09-29 10:47:28 -0400
commitc092b43906098a6879d0fa9f74e5141516b9b856 (patch)
treebe725d9e8d0e7e3392a430e708952a93f2aff5b1 /drivers/mtd/tests/mtd_nandecctest.c
parent3cf06f4f85aea715e8caf8540760faff2fbf86d6 (diff)
mtd: mtd_nandecctest: support injecting bit error for ecc code
Currently inject_single_bit_error() is used to inject single bit error into randomly selected bit position of the 256 or 512 bytes data block. Later change will add tests which inject bit errors into the ecc code. Unfortunately, inject_single_bit_error() doesn't work for the ecc code which is not a multiple of sizeof(unsigned long). Because bit fliping at random position is done by __change_bit(). For example, flipping bit position 0 by __change_bit(0, addr) modifies 3rd byte (32bit) or 7th byte (64bit) on big-endian systems. Using little-endian version of bitops can fix this issue. But little-endian version of __change_bit is not yet available. So this defines __change_bit_le() locally in a similar fashion to asm-generic/bitops/le.h and use it. 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/mtd_nandecctest.c')
-rw-r--r--drivers/mtd/tests/mtd_nandecctest.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/mtd/tests/mtd_nandecctest.c b/drivers/mtd/tests/mtd_nandecctest.c
index d3e8873ad38a..d90daf879c46 100644
--- a/drivers/mtd/tests/mtd_nandecctest.c
+++ b/drivers/mtd/tests/mtd_nandecctest.c
@@ -9,11 +9,25 @@
9 9
10#if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE) 10#if defined(CONFIG_MTD_NAND) || defined(CONFIG_MTD_NAND_MODULE)
11 11
12/*
13 * The reason for this __change_bit_le() instead of __change_bit() is to inject
14 * bit error properly within the region which is not a multiple of
15 * sizeof(unsigned long) on big-endian systems
16 */
17#ifdef __LITTLE_ENDIAN
18#define __change_bit_le(nr, addr) __change_bit(nr, addr)
19#elif defined(__BIG_ENDIAN)
20#define __change_bit_le(nr, addr) \
21 __change_bit((nr) ^ ((BITS_PER_LONG - 1) & ~0x7), addr)
22#else
23#error "Unknown byte order"
24#endif
25
12static void inject_single_bit_error(void *data, size_t size) 26static void inject_single_bit_error(void *data, size_t size)
13{ 27{
14 unsigned long offset = random32() % (size * BITS_PER_BYTE); 28 unsigned int offset = random32() % (size * BITS_PER_BYTE);
15 29
16 __change_bit(offset, data); 30 __change_bit_le(offset, data);
17} 31}
18 32
19static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data, 33static void dump_data_ecc(void *error_data, void *error_ecc, void *correct_data,