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 /include/linux/mtd | |
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 'include/linux/mtd')
-rw-r--r-- | include/linux/mtd/nand.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h index c7113a9cd66d..0b3d464cba13 100644 --- a/include/linux/mtd/nand.h +++ b/include/linux/mtd/nand.h | |||
@@ -341,6 +341,7 @@ struct nand_hw_control { | |||
341 | * @write_page: function to write a page according to the ECC generator | 341 | * @write_page: function to write a page according to the ECC generator |
342 | * requirements. | 342 | * requirements. |
343 | * @write_oob_raw: function to write chip OOB data without ECC | 343 | * @write_oob_raw: function to write chip OOB data without ECC |
344 | * @read_oob_raw: function to read chip OOB data without ECC | ||
344 | * @read_oob: function to read chip OOB data | 345 | * @read_oob: function to read chip OOB data |
345 | * @write_oob: function to write chip OOB data | 346 | * @write_oob: function to write chip OOB data |
346 | */ | 347 | */ |
@@ -371,6 +372,8 @@ struct nand_ecc_ctrl { | |||
371 | const uint8_t *buf); | 372 | const uint8_t *buf); |
372 | int (*write_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, | 373 | int (*write_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, |
373 | int page); | 374 | int page); |
375 | int (*read_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip, | ||
376 | int page, int sndcmd); | ||
374 | int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page, | 377 | int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page, |
375 | int sndcmd); | 378 | int sndcmd); |
376 | int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip, | 379 | int (*write_oob)(struct mtd_info *mtd, struct nand_chip *chip, |