16 Oct, 2011

1 commit

  • This driver has been broken through all of git history and
    cannot even be built. Better mark it as broken. Next stop is
    removing from the tree.

    Signed-off-by: Arnd Bergmann
    Acked-by: Eric Miao
    Signed-off-by: Artem Bityutskiy

    Arnd Bergmann
     

14 Oct, 2011

3 commits


01 Oct, 2011

1 commit


26 Sep, 2011

1 commit


23 Sep, 2011

1 commit


21 Sep, 2011

8 commits

  • A portion of the `check_pattern()' function is basically a `memcmp()'.
    Since it's possible for `memcmp()' to be optimized for a particular
    architecture, we should use it instead.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • In rare cases, we are given an unaligned parameter `from' in
    `nand_do_read_ops()'. In such cases, we use the page cache
    (chip->buffers->databuf) as an intermediate buffer before dumping to the
    client buffer. However, there are also cases where this buffer is not
    cleanly reusable. In those cases, we need to make sure that we
    explicitly invalidate the cache.

    This patch prevents accidental reusage of the page cache, and for me,
    this solves some problems I come across when reading a corrupted BBT
    from flash (NAND_BBT_USE_FLASH and NAND_BBT_NO_OOB).

    Note: the rare "unaligned" case is a result of the extra BBT pattern +
    version located in the data area instead of OOB.

    Also, this patch disables caching on raw reads, since we are reading
    without error correction. This is, obviously, prone to errors and should
    not be cached.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Updates to our default function for creating bad block patterns have
    broken the "no OOB" feature. The NAND_BBT_NO_OOB option should not be
    set while scanning for bad blocks, but we've been passing all BBT
    options from nand_chip.bbt_options to the bad block scan. This causes us
    to hit the:

    BUG_ON(bd->options & NAND_BBT_NO_OOB);

    in create_bbt() when we scan the flash for bad blocks.

    Thus, while it can be legal to set NAND_BBT_NO_OOB in a custom badblock
    pattern descriptor (presumably with NAND_BBT_CREATE disabled?), we
    should not pass it through in our default function.

    Also, to help clarify and emphasize that the function creates bad block
    patterns only (not, for example, table descriptors for locating
    flash-based BBT), I renamed `nand_create_default_bbt_descr' to
    `nand_create_badblock_pattern'.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • 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: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • 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: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • 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: Matthieu CASTET
    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • 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: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     

11 Sep, 2011

25 commits

  • This is a second step in restructuring `check_create()'. When we don't
    rely on goto statements for our main functionality, the code will become
    a little easier to manipulate.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • We will begin restructuring the code for check_create so that we can
    make some important changes. For now, we should just begin to get rid of
    some goto statements to make things cleaner. This is the first step of a
    few, which are separated to make them easier to follow.

    This step should just be a code refactor.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Remove some extra spaces
    Consistently use '0x' prefix for bitfield-like constants
    Spelling: "aplies" -> "applies"

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • `writeops' is unnecessary in the function `nand_update_bbt()'

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • There are a few reasons not to ignore ECC errors here.

    First, mtd->read_oob is being called in raw mode, so there should be no
    error correction in the first place.

    Second, if we change this such that there *is* error correction in this
    function, then we will want to pass the error message upward.

    In fact, the code I introduced to "ignore ECC errors" would have been
    better if it had just placed this test down in `scan_block_full()' in
    the first place. We would like to ignore ECC errors when we are simply
    checking for bad block markers (e.g., factory marked), but we may not
    want to ignore ECC errors when scanning OOB for a flash-based BBT
    pattern (in `scan_read_raw()'; note that the return codes from
    `scan_read_raw()' are not actually handled yet).

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • A few pieces of code are unnecessarily duplicated. For easier
    maintenance, we should fix this.

    This should have no functional effect.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • The integrator flash has been deleted, even from the Makefile.
    Drop the Kconfig entry as well.

    Signed-off-by: Linus Walleij
    Acked-by: Marc Zyngier
    Signed-off-by: Artem Bityutskiy

    Linus Walleij
     
  • The ecctype and eccsize fields have been obsolete for a while. Since they
    don't have any users, we can kill them and leave padding in their place
    for now.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • The nand_chip.ops field is a struct that is passed around globally with
    no particular reason. Every time it is used, it could just as easily be
    replaced with a local struct that is updated on each operation. So make
    it local.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • We're missing a lot of important documentation in include/mtd/mtd-abi.h:

    * add a simple description of each ioctl (feel free to expand!)
    * give full explanations of recently added and modified operations
    * explain the usage of "RAW" that appear in different modes and types of
    operations
    * fix some comment style along the way

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Implement a new ioctl for writing both page data and OOB to flash at the
    same time. This ioctl is intended to be a generic interface that can
    replace other ioctls (MEMWRITEOOB and MEMWRITEOOB64) and cover the
    functionality of several other old ones, e.g., MEMWRITE can:

    * write autoplaced OOB instead of using ECCGETLAYOUT (deprecated) and
    working around the reserved areas
    * write raw (no ECC) OOB instead of using MTDFILEMODE to set the
    per-file-descriptor MTD_FILE_MODE_RAW
    * write raw (no ECC) data instead of using MTDFILEMODE
    (MTD_FILE_MODE_RAW) and using standard character device "write"

    This ioctl is especially useful for MLC NAND, which cannot be written
    twice (i.e., we cannot successfully write the page data and OOB in two
    separate operations). Instead, MEMWRITE can write both in a single
    operation.

    Note that this ioctl is not affected by the MTD file mode (i.e.,
    MTD_FILE_MODE_RAW vs. MTD_FILE_MODE_NORMAL), since it receives its write
    mode as an input parameter.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • These modes hold their state only for the life of their file descriptor,
    and they overlap functionality with the MTD_OPS_* modes. Particularly,
    MTD_MODE_RAW and MTD_OPS_RAW cover the same function: to provide raw
    (i.e., without ECC) access to the flash. In fact, although it may not be
    clear, MTD_MODE_RAW implied that operations should enable the
    MTD_OPS_RAW mode.

    Thus, we should be specific on what each mode means. This is a start,
    where MTD_FILE_MODE_* actually represents a "file mode," not necessarily
    a true global MTD mode.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • These modes are not necessarily for OOB only. Particularly, MTD_OOB_RAW
    affected operations on in-band page data as well. To clarify these
    options and to emphasize that their effect is applied per-operation, we
    change the primary prefix to MTD_OPS_.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • We will want to use the MTD_OOB_{PLACE,AUTO,RAW} modes in user-space
    applications through the introduction of new ioctls, so we should make
    this enum a shared type.

    This enum is now anonymous.

    Artem: tweaked the patch.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • This fixes issues with `nanddump -n' and the MEMREADOOB[64] ioctls on
    hardware that performs error correction when reading only OOB data. A
    driver for such hardware needs to know when we're doing a RAW vs. a
    normal write, but mtd_do_read_oob does not pass such information to the
    lower layers (e.g., NAND). We should pass MTD_OOB_RAW or MTD_OOB_PLACE
    based on the MTD file mode.

    For now, most drivers can get away with just setting:

    chip->ecc.read_oob_raw = chip->ecc.read_oob

    This is done by default; but for systems that behave as described above,
    you must supply your own replacement function.

    This was tested with nandsim as well as on actual SLC NAND.

    Signed-off-by: Brian Norris
    Cc: Jim Quinlan
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • This fixes issues with `nandwrite -n -o' and the MEMWRITEOOB[64] ioctls
    on hardware that writes ECC when writing OOB. The problem arises as
    follows: `nandwrite -n' can write page data to flash without applying
    ECC, but when used with the `-o' option, ECC is applied (incorrectly),
    contrary to the `--noecc' option.

    I found that this is the case because my hardware computes and writes
    ECC data to flash upon either OOB write or page write. Thus, to support
    a proper "no ECC" write, my driver must know when we're performing a raw
    OOB write vs. a normal ECC OOB write. However, MTD does not pass any raw
    mode information to the write_oob functions. This patch addresses the
    problems by:

    1) Passing MTD_OOB_RAW down to lower layers, instead of just defaulting
    to MTD_OOB_PLACE
    2) Handling MTD_OOB_RAW within the NAND layer's `nand_do_write_oob'
    3) Adding a new (replaceable) function pointer in struct ecc_ctrl; this
    function should support writing OOB without ECC data. Current
    hardware often can use the same OOB write function when writing
    either with or without ECC

    This was tested with nandsim as well as on actual SLC NAND.

    Signed-off-by: Brian Norris
    Cc: Jim Quinlan
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • These files contain the common code for the GPMI-NAND driver.

    Signed-off-by: Huang Shijie
    Acked-by: Marek Vasut
    Tested-by: Koen Beel
    Signed-off-by: Artem Bityutskiy

    Huang Shijie
     
  • add the GPMI-NAND driver in the relevant Kconfig and Makefile in the MTD.

    Signed-off-by: Huang Shijie
    Acked-by: Marek Vasut
    Tested-by: Koen Beel
    Signed-off-by: Artem Bityutskiy

    Huang Shijie
     
  • bch-regs.h : registers file for BCH module
    gpmi-regs.h: registers file for GPMI module
    gpmi-lib.c: helper functions library.

    Signed-off-by: Huang Shijie
    Acked-by: Marek Vasut
    Tested-by: Koen Beel
    Signed-off-by: Artem Bityutskiy

    Huang Shijie
     
  • The code has the check for parts but it called after kmemdup,
    kmemdup(parts, sizeof(*parts) * nr_parts,...)
    if (!parts)
    return -ENOMEM

    In fact, we need check parts before safely using it.
    and we also need check the real_parts to make sure kmemdup
    allocation sucessfully.

    Signed-off-by: Jason Liu
    Signed-off-by: Artem Bityutskiy

    Jason Liu
     
  • Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • MEMSETOOBSEL is completely unused and useless. Remove the definition.

    Note: it's probably best not to use this ioctl number in the future for
    MTD, since that may cause conflicts between old kernels and new user
    software (or new kernels and old user software).

    Artem: leave a comment about MEMSETOOBSEL.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris
     
  • It's been gone for a while.

    Signed-off-by: Brian Norris
    Signed-off-by: Artem Bityutskiy

    Brian Norris