• Masahiro Yamada's avatar
    mtd: nand: denali: fix bitflips calculation in handle_ecc() · 20d48595
    Masahiro Yamada authored
    This function is wrong in multiple ways:
    
    [1] Counting corrected bytes instead of corrected bits.
    
    The following code is counting the number of corrected _bytes_.
    
        /* correct the ECC error */
        buf[offset] ^= err_cor_value;
        mtd->ecc_stats.corrected++;
        bitflips++;
    
    What the core framework expects is the number of corrected _bits_.
    They can be different if multiple bitflips occur within one byte.
    
    [2] total number of errors instead of max of per-sector errors
    
    The core framework expects that corrected errors are counted per
    sector, then the max value should be taken.  The current code simply
    iterates over the whole page, i.e. counts the total number of
    correction in the page.  This means "too many bitflips" is triggered
    earlier than it should be, i.e. the NAND device is worn out sooner.
    
    Besides those bugs, this function is unreadable due to the deep
    nesting.  Notice the whole code in this function is wrapped in
    if (irq_status & INTR__ECC_ERR), so this conditional can be moved
    out of the function.  Also, use shorter names for local variables.
    
    Re-work the function to fix all the issues.
    Signed-off-by: default avatarMasahiro Yamada <yamada.masahiro@socionext.com>
    Signed-off-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
    20d48595
denali.c 43 KB