diff options
author | Brian Norris <computersforpeace@gmail.com> | 2011-08-30 21:45:38 -0400 |
---|---|---|
committer | Artem Bityutskiy <artem.bityutskiy@intel.com> | 2011-09-11 08:13:38 -0400 |
commit | c46f6483d21e93400e4a110de7902830173d53b0 (patch) | |
tree | bac45575c58963f4bc35d13b188c8ff5a32c9823 /drivers/mtd/nand | |
parent | e9195edc59f33e9cabdd32a2959e927806670f45 (diff) |
mtd: support reading OOB without ECC
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 <computersforpeace@gmail.com>
Cc: Jim Quinlan <jim2101024@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@intel.com>
Diffstat (limited to 'drivers/mtd/nand')
-rw-r--r-- | drivers/mtd/nand/nand_base.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index b61a7c7bd097..ad40607f5f24 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
@@ -1787,7 +1787,10 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, | |||
1787 | page = realpage & chip->pagemask; | 1787 | page = realpage & chip->pagemask; |
1788 | 1788 | ||
1789 | while (1) { | 1789 | while (1) { |
1790 | sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd); | 1790 | if (ops->mode == MTD_OOB_RAW) |
1791 | sndcmd = chip->ecc.read_oob_raw(mtd, chip, page, sndcmd); | ||
1792 | else | ||
1793 | sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd); | ||
1791 | 1794 | ||
1792 | len = min(len, readlen); | 1795 | len = min(len, readlen); |
1793 | buf = nand_transfer_oob(chip, buf, ops, len); | 1796 | buf = nand_transfer_oob(chip, buf, ops, len); |
@@ -3385,6 +3388,8 @@ int nand_scan_tail(struct mtd_info *mtd) | |||
3385 | } | 3388 | } |
3386 | 3389 | ||
3387 | /* For many systems, the standard OOB write also works for raw */ | 3390 | /* For many systems, the standard OOB write also works for raw */ |
3391 | if (!chip->ecc.read_oob_raw) | ||
3392 | chip->ecc.read_oob_raw = chip->ecc.read_oob; | ||
3388 | if (!chip->ecc.write_oob_raw) | 3393 | if (!chip->ecc.write_oob_raw) |
3389 | chip->ecc.write_oob_raw = chip->ecc.write_oob; | 3394 | chip->ecc.write_oob_raw = chip->ecc.write_oob; |
3390 | 3395 | ||