X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_ecc.c;h=e95a8069a8c5bc0c754b9f41ddbc9944e0b76f98;hp=35f8747040771f8a11d68a3bf28d908c288b4512;hb=2870702e0b0f4342857222a36ffcb21886c7f4bf;hpb=470ba34cc1d593fca7cd98bb9a385a100f7cb3ac diff --git a/yaffs_ecc.c b/yaffs_ecc.c index 35f8747..e95a806 100644 --- a/yaffs_ecc.c +++ b/yaffs_ecc.c @@ -67,29 +67,6 @@ static const unsigned char column_parity_table[] = { 0x69, 0x3c, 0x30, 0x65, 0x0c, 0x59, 0x55, 0x00, }; -/* Count the bits in an unsigned char or a U32 */ - -static int yaffs_count_bits(unsigned char x) -{ - int r = 0; - while (x) { - if (x & 1) - r++; - x >>= 1; - } - return r; -} - -static int yaffs_count_bits32(unsigned x) -{ - int r = 0; - while (x) { - if (x & 1) - r++; - x >>= 1; - } - return r; -} /* Calculate the ECC for a 256-byte block of data */ void yaffs_ecc_cacl(const unsigned char *data, unsigned char *ecc) @@ -106,7 +83,7 @@ void yaffs_ecc_cacl(const unsigned char *data, unsigned char *ecc) b = column_parity_table[*data++]; col_parity ^= b; - if (b & 0x01) { /* odd number of bits in the byte */ + if (b & 0x01) { /* odd number of bits in the byte */ line_parity ^= i; line_parity_prime ^= ~i; } @@ -160,11 +137,10 @@ void yaffs_ecc_cacl(const unsigned char *data, unsigned char *ecc) #endif } - /* Correct the ECC on a 256 byte block of data */ int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, - const unsigned char *test_ecc) + const unsigned char *test_ecc) { unsigned char d0, d1, d2; /* deltas */ @@ -173,7 +149,7 @@ int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, d2 = read_ecc[2] ^ test_ecc[2]; if ((d0 | d1 | d2) == 0) - return 0; /* no error */ + return 0; /* no error */ if (((d0 ^ (d0 >> 1)) & 0x55) == 0x55 && ((d1 ^ (d1 >> 1)) & 0x55) == 0x55 && @@ -220,19 +196,17 @@ int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, data[byte] ^= (1 << bit); - return 1; /* Corrected the error */ + return 1; /* Corrected the error */ } - if ((yaffs_count_bits(d0) + - yaffs_count_bits(d1) + - yaffs_count_bits(d2)) == 1) { + if ((hweight8(d0) + hweight8(d1) + hweight8(d2)) == 1) { /* Reccoverable error in ecc */ read_ecc[0] = test_ecc[0]; read_ecc[1] = test_ecc[1]; read_ecc[2] = test_ecc[2]; - return 1; /* Corrected the error */ + return 1; /* Corrected the error */ } /* Unrecoverable error */ @@ -241,12 +215,11 @@ int yaffs_ecc_correct(unsigned char *data, unsigned char *read_ecc, } - /* * ECCxxxOther does ECC calcs on arbitrary n bytes of data */ void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, - yaffs_ecc_other *ecc_other) + struct yaffs_ecc_other *ecc_other) { unsigned int i; @@ -259,7 +232,7 @@ void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, b = column_parity_table[*data++]; col_parity ^= b; - if (b & 0x01) { + if (b & 0x01) { /* odd number of bits in the byte */ line_parity ^= i; line_parity_prime ^= ~i; @@ -273,8 +246,8 @@ void yaffs_ecc_calc_other(const unsigned char *data, unsigned n_bytes, } int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, - yaffs_ecc_other *read_ecc, - const yaffs_ecc_other *test_ecc) + struct yaffs_ecc_other *read_ecc, + const struct yaffs_ecc_other *test_ecc) { unsigned char delta_col; /* column parity delta */ unsigned delta_line; /* line parity delta */ @@ -283,10 +256,11 @@ int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, delta_col = read_ecc->col_parity ^ test_ecc->col_parity; delta_line = read_ecc->line_parity ^ test_ecc->line_parity; - delta_line_prime = read_ecc->line_parity_prime ^ test_ecc->line_parity_prime; + delta_line_prime = + read_ecc->line_parity_prime ^ test_ecc->line_parity_prime; if ((delta_col | delta_line | delta_line_prime) == 0) - return 0; /* no error */ + return 0; /* no error */ if (delta_line == ~delta_line_prime && (((delta_col ^ (delta_col >> 1)) & 0x15) == 0x15)) { @@ -306,15 +280,16 @@ int yaffs_ecc_correct_other(unsigned char *data, unsigned n_bytes, data[delta_line] ^= (1 << bit); - return 1; /* corrected */ + return 1; /* corrected */ } - if ((yaffs_count_bits32(delta_line) + yaffs_count_bits32(delta_line_prime) + - yaffs_count_bits(delta_col)) == 1) { + if ((hweight32(delta_line) + + hweight32(delta_line_prime) + + hweight8(delta_col)) == 1) { /* Reccoverable error in ecc */ *read_ecc = *test_ecc; - return 1; /* corrected */ + return 1; /* corrected */ } /* Unrecoverable error */