@ -15,41 +15,51 @@ static void inject_single_bit_error(void *data, size_t size)
__change_bit ( offset , data ) ;
}
static unsigned char data [ 512 ] ;
static void dump_data_ecc ( void * error_data , void * error_ecc , void * correct_data ,
void * correct_ecc , const size_t size )
{
pr_info ( " hexdump of error data: \n " ) ;
print_hex_dump ( KERN_INFO , " " , DUMP_PREFIX_OFFSET , 16 , 4 ,
error_data , size , false ) ;
print_hex_dump ( KERN_INFO , " hexdump of error ecc: " ,
DUMP_PREFIX_NONE , 16 , 1 , error_ecc , 3 , false ) ;
pr_info ( " hexdump of correct data: \n " ) ;
print_hex_dump ( KERN_INFO , " " , DUMP_PREFIX_OFFSET , 16 , 4 ,
correct_data , size , false ) ;
print_hex_dump ( KERN_INFO , " hexdump of correct ecc: " ,
DUMP_PREFIX_NONE , 16 , 1 , correct_ecc , 3 , false ) ;
}
static unsigned char correct_data [ 512 ] ;
static unsigned char error_data [ 512 ] ;
static int nand_ecc_test ( const size_t size )
{
unsigned char code [ 3 ] ;
unsigned char error_code [ 3 ] ;
unsigned char correct_ecc [ 3 ] ;
unsigned char error_ec c [ 3 ] ;
char testname [ 30 ] ;
BUG_ON ( sizeof ( data ) < size ) ;
BUG_ON ( sizeof ( correct_ data) < size ) ;
sprintf ( testname , " nand-ecc-%zu " , size ) ;
get_random_bytes ( data , size ) ;
get_random_bytes ( correct_ data, size ) ;
memcpy ( error_data , data , size ) ;
memcpy ( error_data , correct_ data, size ) ;
inject_single_bit_error ( error_data , size ) ;
__nand_calculate_ecc ( data , size , code ) ;
__nand_calculate_ecc ( error_data , size , error_code ) ;
__nand_correct_data ( error_data , code , error_code , size ) ;
__nand_calculate_ecc ( correct_ data, size , correct_ecc ) ;
__nand_calculate_ecc ( error_data , size , error_ec c ) ;
__nand_correct_data ( error_data , correct_ecc , error_ec c , size ) ;
if ( ! memcmp ( data , error_data , size ) ) {
printk ( KERN_INFO " mtd_nandecctest: ok - %s \n " , testname ) ;
if ( ! memcmp ( correct_ data, error_data , size ) ) {
pr_info ( " mtd_nandecctest: ok - %s \n " , testname ) ;
return 0 ;
}
printk ( KERN_ERR " mtd_nandecctest: not ok - %s \n " , testname ) ;
printk ( KERN_DEBUG " hexdump of data: \n " ) ;
print_hex_dump ( KERN_DEBUG , " " , DUMP_PREFIX_OFFSET , 16 , 4 ,
data , size , false ) ;
printk ( KERN_DEBUG " hexdump of error data: \n " ) ;
print_hex_dump ( KERN_DEBUG , " " , DUMP_PREFIX_OFFSET , 16 , 4 ,
error_data , size , false ) ;
pr_err ( " mtd_nandecctest: not ok - %s \n " , testname ) ;
dump_data_ecc ( error_data , error_ecc , correct_data , correct_ecc , size ) ;
return - EINVAL ;
}