@ -1426,6 +1426,16 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
stat = chip - > ecc . correct ( mtd , p ,
& chip - > buffers - > ecccode [ i ] , & chip - > buffers - > ecccalc [ i ] ) ;
if ( stat = = - EBADMSG & &
( chip - > ecc . options & NAND_ECC_GENERIC_ERASED_CHECK ) ) {
/* check for empty pages with bitflips */
stat = nand_check_erased_ecc_chunk ( p , chip - > ecc . size ,
& chip - > buffers - > ecccode [ i ] ,
chip - > ecc . bytes ,
NULL , 0 ,
chip - > ecc . strength ) ;
}
if ( stat < 0 ) {
mtd - > ecc_stats . failed + + ;
} else {
@ -1475,6 +1485,15 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
int stat ;
stat = chip - > ecc . correct ( mtd , p , & ecc_code [ i ] , & ecc_calc [ i ] ) ;
if ( stat = = - EBADMSG & &
( chip - > ecc . options & NAND_ECC_GENERIC_ERASED_CHECK ) ) {
/* check for empty pages with bitflips */
stat = nand_check_erased_ecc_chunk ( p , eccsize ,
& ecc_code [ i ] , eccbytes ,
NULL , 0 ,
chip - > ecc . strength ) ;
}
if ( stat < 0 ) {
mtd - > ecc_stats . failed + + ;
} else {
@ -1527,6 +1546,15 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
chip - > ecc . calculate ( mtd , p , & ecc_calc [ i ] ) ;
stat = chip - > ecc . correct ( mtd , p , & ecc_code [ i ] , NULL ) ;
if ( stat = = - EBADMSG & &
( chip - > ecc . options & NAND_ECC_GENERIC_ERASED_CHECK ) ) {
/* check for empty pages with bitflips */
stat = nand_check_erased_ecc_chunk ( p , eccsize ,
& ecc_code [ i ] , eccbytes ,
NULL , 0 ,
chip - > ecc . strength ) ;
}
if ( stat < 0 ) {
mtd - > ecc_stats . failed + + ;
} else {
@ -1554,6 +1582,7 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
int i , eccsize = chip - > ecc . size ;
int eccbytes = chip - > ecc . bytes ;
int eccsteps = chip - > ecc . steps ;
int eccpadbytes = eccbytes + chip - > ecc . prepad + chip - > ecc . postpad ;
uint8_t * p = buf ;
uint8_t * oob = chip - > oob_poi ;
unsigned int max_bitflips = 0 ;
@ -1573,19 +1602,29 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
chip - > read_buf ( mtd , oob , eccbytes ) ;
stat = chip - > ecc . correct ( mtd , p , oob , NULL ) ;
if ( stat < 0 ) {
mtd - > ecc_stats . failed + + ;
} else {
mtd - > ecc_stats . corrected + = stat ;
max_bitflips = max_t ( unsigned int , max_bitflips , stat ) ;
}
oob + = eccbytes ;
if ( chip - > ecc . postpad ) {
chip - > read_buf ( mtd , oob , chip - > ecc . postpad ) ;
oob + = chip - > ecc . postpad ;
}
if ( stat = = - EBADMSG & &
( chip - > ecc . options & NAND_ECC_GENERIC_ERASED_CHECK ) ) {
/* check for empty pages with bitflips */
stat = nand_check_erased_ecc_chunk ( p , chip - > ecc . size ,
oob - eccpadbytes ,
eccpadbytes ,
NULL , 0 ,
chip - > ecc . strength ) ;
}
if ( stat < 0 ) {
mtd - > ecc_stats . failed + + ;
} else {
mtd - > ecc_stats . corrected + = stat ;
max_bitflips = max_t ( unsigned int , max_bitflips , stat ) ;
}
}
/* Calculate remaining oob bytes */