1. 21 Sep, 2011 5 commits
    • Brian Norris's avatar
      mtd: nand: wait to set BBT version · dadc17a3
      Brian Norris authored
      Because there are so many cases of checking, writing, and re-writing of
      the bad block table(s), we might as well wait until the we've settled on
      a valid, clean copy of the table. This also prevents us from falsely
      incrementing the table version. For example, we may have the following:
      
        Primary table, with version 0x02
        Mirror table, with version 0x01
        Primary table has uncorrectable ECC errors
      
      If we don't have this fix applied, then we will:
      
        Choose to read the primary table (higher version)
        Set mirror table version to 0x02
        Read back primary table
        Invalidate table because of ECC errors
        Retry readback operation with mirror table, now version 0x02
        Mirrored table reads cleanly
        Writeback BBT to primary table location (with "version 0x02")
      
      However, the mirrored table shouldn't have a new version number.
      Instead, we actually want:
      
        Choose to read the primary table (higher version)
        Read back primary table
        Invalidate table because of ECC errors
        Retry readback with mirror table (version 0x01)
        Mirrored table reads cleanly
        Set both tables to version 0x01
        Writeback BBT to primary table location (version 0x01)
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@intel.com>
      dadc17a3
    • Brian Norris's avatar
      mtd: nand: scrub BBT on ECC errors · 623978de
      Brian Norris authored
      Now that `read_bbt()' returns ECC error codes properly, we handle those
      codes when checking the integrity of our flash-based BBT.
      
      The modifications can be described by this new policy:
      
      *) On any uncorrected ECC error, we invalidate the corresponding table
         and retry our version-checking integrity logic.
      *) On corrected bitflips, we mark both tables for re-writing to flash
         (a.k.a. scrubbing).
      
      Current integrity checks (i.e., comparing version numbers, etc.) should
      take care of all the cases that result in rescanning the device for bad
      blocks or falling back to the BBT as found in the mirror descriptor.
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@intel.com>
      623978de
    • Brian Norris's avatar
      mtd: nand: report ECC errors properly when reading BBT · 167a8d52
      Brian Norris authored
      Instead of just printing a warning when encountering ECC errors, we
      should return a proper error status and print a more informative
      warning. Later, we will handle these error messages in the upper layers
      of the BBT scan.
      
      Note that this patch makes our check for ECC error codes a little bit
      more restrictive, leaving all unrecognized errors to the generic "else"
      clause. This shouldn't cause problems and could even be a benefit.
      
      This code is based on some findings reported by Matthieu Castet.
      Reported-by: default avatarMatthieu CASTET <matthieu.castet@parrot.com>
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@intel.com>
      167a8d52
    • Brian Norris's avatar
    • Brian Norris's avatar
      mtd: define `mtd_is_*()' functions · 7387ce77
      Brian Norris authored
      These functions can be used instead of referencing -EUCLEAN and -EBADMSG
      all over the place. They should help make code a little bit more
      readable.
      Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@intel.com>
      7387ce77
  2. 11 Sep, 2011 35 commits