@@ -80,6 +80,8 @@ int nand_bbm_get_next_page(struct nand_chip *chip, int page);
int nand_markbad_bbm(struct nand_chip *chip, loff_t ofs);
int nand_erase_nand(struct nand_chip *chip, struct erase_info *instr,
int allowbbt);
+int nand_write_oob_nand(struct nand_chip *chip, loff_t to,
+ struct mtd_oob_ops *ops);
int onfi_fill_data_interface(struct nand_chip *chip,
enum nand_data_interface_type type,
int timing_mode);
@@ -4116,6 +4116,13 @@ static int nand_write_oob(struct mtd_info *mtd, loff_t to,
struct mtd_oob_ops *ops)
{
struct nand_chip *chip = mtd_to_nand(mtd);
+
+ return chip->write_oob(chip, to, ops);
+}
+
+int nand_write_oob_nand(struct nand_chip *chip, loff_t to,
+ struct mtd_oob_ops *ops)
+{
int ret;
ops->retlen = 0;
@@ -4377,6 +4384,7 @@ static void nand_set_defaults(struct nand_chip *chip)
chip->buf_align = 1;
chip->erase = nand_erase_nand;
+ chip->write_oob = nand_write_oob_nand;
}
/* Sanitize ONFI strings so we can safely print them */
@@ -1021,6 +1021,7 @@ struct nand_legacy {
* @setup_read_retry: [FLASHSPECIFIC] flash (vendor) specific function for
* setting the read-retry mode. Mostly needed for MLC NAND.
* @erase: Raw NAND erase operation.
+ * @write_oob: Raw NAND write operation.
* @ecc: [BOARDSPECIFIC] ECC control structure
* @buf_align: minimum buffer alignment required by a platform
* @oob_poi: "poison value buffer," used for laying out OOB data
@@ -1088,6 +1089,8 @@ struct nand_chip {
int (*setup_read_retry)(struct nand_chip *chip, int retry_mode);
int (*erase)(struct nand_chip *chip, struct erase_info *instr,
int allowbbt);
+ int (*write_oob)(struct nand_chip *chip, loff_t to,
+ struct mtd_oob_ops *ops);
unsigned int options;
unsigned int bbt_options;
With the same approach as for the ->erase hook, in order to solve an issue with Micron NANDs, we must be able to overload the write operation. With this in mind, we create a ->write_oob hook in the nand_chip structure which points by default to the currently in use nand_write_oob() helper, renamed nand_write_oob_nand() for the parallel with the nand_erase_nand() one. Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> --- drivers/mtd/nand/raw/internals.h | 2 ++ drivers/mtd/nand/raw/nand_base.c | 8 ++++++++ include/linux/mtd/rawnand.h | 3 +++ 3 files changed, 13 insertions(+)