summaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/raw/nand_micron.c
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-07-18 10:42:21 +0200
committerMiquel Raynal <miquel.raynal@bootlin.com>2018-07-19 23:15:05 +0200
commit317c6d9b69eb2dcab2ca4759a2c1c04496ec1591 (patch)
tree3204f6dc9a6599f2652bc9138c2fd67a7f988654 /drivers/mtd/nand/raw/nand_micron.c
parentef422e1ecd272d077efce64432907632758cf2e2 (diff)
downloadlinux-317c6d9b69eb2dcab2ca4759a2c1c04496ec1591.tar.bz2
mtd: rawnand: micron: Make ECC activation stateful
We currently don't store the on-die ECC state (enabled/disabled) which might force us to re-disable the engine even if it's already been disabled after we've read the page in raw mode to count the actual number of bitflips. Add an "enabled" field to struct micron_on_die_ecc to keep track of the ECC state. Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> Tested-by: Chris Packham <chris.packham@alliedtelesis.co.nz> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Diffstat (limited to 'drivers/mtd/nand/raw/nand_micron.c')
-rw-r--r--drivers/mtd/nand/raw/nand_micron.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c
index 9d13b701e581..656947d91841 100644
--- a/drivers/mtd/nand/raw/nand_micron.c
+++ b/drivers/mtd/nand/raw/nand_micron.c
@@ -66,6 +66,7 @@ struct nand_onfi_vendor_micron {
struct micron_on_die_ecc {
bool forced;
+ bool enabled;
void *rawbuf;
};
@@ -174,14 +175,22 @@ static int micron_nand_on_die_ecc_setup(struct nand_chip *chip, bool enable)
{
struct micron_nand *micron = nand_get_manufacturer_data(chip);
u8 feature[ONFI_SUBFEATURE_PARAM_LEN] = { 0, };
+ int ret;
if (micron->ecc.forced)
return 0;
+ if (micron->ecc.enabled == enable)
+ return 0;
+
if (enable)
feature[0] |= ONFI_FEATURE_ON_DIE_ECC_EN;
- return nand_set_features(chip, ONFI_FEATURE_ON_DIE_ECC, feature);
+ ret = nand_set_features(chip, ONFI_FEATURE_ON_DIE_ECC, feature);
+ if (!ret)
+ micron->ecc.enabled = enable;
+
+ return ret;
}
static int micron_nand_on_die_ecc_status_4(struct nand_chip *chip, u8 status,
@@ -457,8 +466,10 @@ static int micron_nand_init(struct nand_chip *chip)
goto err_free_manuf_data;
}
- if (ondie == MICRON_ON_DIE_MANDATORY)
+ if (ondie == MICRON_ON_DIE_MANDATORY) {
micron->ecc.forced = true;
+ micron->ecc.enabled = true;
+ }
/*
* In case of 4bit on-die ECC, we need a buffer to store a