|
|
@@ -2979,6 +2979,30 @@ ext_out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode)
|
|
|
+{
|
|
|
+ struct nand_chip *chip = mtd->priv;
|
|
|
+ uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {retry_mode};
|
|
|
+
|
|
|
+ return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY,
|
|
|
+ feature);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Configure chip properties from Micron vendor-specific ONFI table
|
|
|
+ */
|
|
|
+static void nand_onfi_detect_micron(struct nand_chip *chip,
|
|
|
+ struct nand_onfi_params *p)
|
|
|
+{
|
|
|
+ struct nand_onfi_vendor_micron *micron = (void *)p->vendor;
|
|
|
+
|
|
|
+ if (le16_to_cpu(p->vendor_revision) < 1)
|
|
|
+ return;
|
|
|
+
|
|
|
+ chip->read_retries = micron->read_retry_options;
|
|
|
+ chip->setup_read_retry = nand_setup_read_retry_micron;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
|
|
|
*/
|
|
|
@@ -3085,6 +3109,9 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
|
|
|
pr_warn("Could not retrieve ONFI ECC requirements\n");
|
|
|
}
|
|
|
|
|
|
+ if (p->jedec_id == NAND_MFR_MICRON)
|
|
|
+ nand_onfi_detect_micron(chip, p);
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|