• David Brownell's avatar
    [MTD] [NAND] fix "raw" reads with ECC syndrome layouts · 52ff49df
    David Brownell authored
    The syndrome based page read/write routines store ECC, and possibly other
    "OOB" data, right after each chunk of ECC'd data.  With ECC chunk size of
    512 bytes and a large page (2KiB) NAND, the layout is:
    
      data-0 OOB-0 data-1 OOB-1 data-2 OOB-2 data-3 OOB-3 OOB-leftover
    
    Where OOBx is (prepad, ECC, postpad).  However, the current "raw" routines
    use a traditional layout -- data OOB, disregarding the prepad and postpad
    values -- so when they're used with that type of ECC hardware, those calls
    mix up the data and OOB.  Which means, in particular, that bad block
    tables won't be found on startup, with data corruption and related chaos
    ensuing.
    
    The current syndrome-based drivers in mainline all seem to use one chunk
    per page; presumably they haven't noticed such bugs.
    
    Fix this, by adding read/write page_raw_syndrome() routines as siblings of
    the existing non-raw routines; "raw" just means to bypass the ECC
    computations, not change data and OOB layout.
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
    52ff49df
nand_base.c 74.3 KB