aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2013-12-03 18:51:09 -0500
committerBrian Norris <computersforpeace@gmail.com>2014-01-14 02:13:05 -0500
commit8429bb3975ef81c114cde4da111e64d224d19f83 (patch)
treefffbb2465b0ac01d053ba2ba0087a0b0d9db1c8f
parentba84fb5952af114e28ac82adcdef75297701ccc1 (diff)
mtd: nand: support Micron READ RETRY
Micron provides READ RETRY support via the ONFI vendor-specific parameter block (to indicate how many read-retry modes are available) and the ONFI {GET,SET}_FEATURES commands with a vendor-specific feature address (to support reading/switching the current read-retry mode). The recommended sequence is as follows: 1. Perform PAGE_READ operation 2. If no ECC error, we are done 3. Run SET_FEATURES with feature address 89h, mode 1 4. Retry PAGE_READ operation 5. If ECC error and there are remaining supported modes, increment the mode and return to step 3. Otherwise, this is a true ECC error. 6. Run SET_FEATURES with feature address 89h, mode 0, to return to the default state. This patch implements the chip->setup_read_retry() callback for Micron and fills in the chip->read_retries. Tested on Micron MT29F32G08CBADA, which supports 8 read-retry modes. The Micron vendor-specific table was checked against the datasheets for the following Micron NAND: Needs retry Cell-type Part number Vendor revision Byte 180 ----------- --------- ---------------- --------------- ------------ No SLC MT29F16G08ABABA 1 Reserved (0) No MLC MT29F32G08CBABA 1 Reserved (0) No SLC MT29F1G08AACWP 1 0 Yes MLC MT29F32G08CBADA 1 08h Yes MLC MT29F64G08CBABA 2 08h Signed-off-by: Brian Norris <computersforpeace@gmail.com> Acked-by: Huang Shijie <b32955@freescale.com>
-rw-r--r--drivers/mtd/nand/nand_base.c27
-rw-r--r--include/linux/mtd/nand.h3
2 files changed, 30 insertions, 0 deletions
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 4c2f39f351da..b8c74cda7625 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2979,6 +2979,30 @@ ext_out:
2979 return ret; 2979 return ret;
2980} 2980}
2981 2981
2982static int nand_setup_read_retry_micron(struct mtd_info *mtd, int retry_mode)
2983{
2984 struct nand_chip *chip = mtd->priv;
2985 uint8_t feature[ONFI_SUBFEATURE_PARAM_LEN] = {retry_mode};
2986
2987 return chip->onfi_set_features(mtd, chip, ONFI_FEATURE_ADDR_READ_RETRY,
2988 feature);
2989}
2990
2991/*
2992 * Configure chip properties from Micron vendor-specific ONFI table
2993 */
2994static void nand_onfi_detect_micron(struct nand_chip *chip,
2995 struct nand_onfi_params *p)
2996{
2997 struct nand_onfi_vendor_micron *micron = (void *)p->vendor;
2998
2999 if (le16_to_cpu(p->vendor_revision) < 1)
3000 return;
3001
3002 chip->read_retries = micron->read_retry_options;
3003 chip->setup_read_retry = nand_setup_read_retry_micron;
3004}
3005
2982/* 3006/*
2983 * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise. 3007 * Check if the NAND chip is ONFI compliant, returns 1 if it is, 0 otherwise.
2984 */ 3008 */
@@ -3085,6 +3109,9 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip,
3085 pr_warn("Could not retrieve ONFI ECC requirements\n"); 3109 pr_warn("Could not retrieve ONFI ECC requirements\n");
3086 } 3110 }
3087 3111
3112 if (p->jedec_id == NAND_MFR_MICRON)
3113 nand_onfi_detect_micron(chip, p);
3114
3088 return 1; 3115 return 1;
3089} 3116}
3090 3117
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 267d61dd89dd..3080a8c8b62e 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -219,6 +219,9 @@ struct nand_chip;
219/* ONFI feature address */ 219/* ONFI feature address */
220#define ONFI_FEATURE_ADDR_TIMING_MODE 0x1 220#define ONFI_FEATURE_ADDR_TIMING_MODE 0x1
221 221
222/* Vendor-specific feature address (Micron) */
223#define ONFI_FEATURE_ADDR_READ_RETRY 0x89
224
222/* ONFI subfeature parameters length */ 225/* ONFI subfeature parameters length */
223#define ONFI_SUBFEATURE_PARAM_LEN 4 226#define ONFI_SUBFEATURE_PARAM_LEN 4
224 227