diff mbox

[U-Boot,v2] mtd: resync with Linux-3.7.1

Message ID 20130118094509.GA30922@build.ihdev.net
State Superseded
Delegated to: Scott Wood
Headers show

Commit Message

Sergey Lapin Jan. 18, 2013, 9:45 a.m. UTC
Dear Scott,

could you please test the following patch
on top of this big patch to see if ecc.strength
problem goes away? I can integrate it into big
one then.

From dffea1f073c546ab88f37f219f66d9d1478d4cf1 Mon Sep 17 00:00:00 2001
From: Sergey Lapin <slapin@ossfans.org>
Date: Thu, 17 Jan 2013 18:29:21 +0400
Subject: [PATCH] SQUASHME: mtd: nand: Add ecc.strength support to drivers


Signed-off-by: Sergey Lapin <slapin@ossfans.org>
---
 drivers/mtd/nand/atmel_nand.c    |    1 +
 drivers/mtd/nand/bfin_nand.c     |    2 ++
 drivers/mtd/nand/davinci_nand.c  |    1 +
 drivers/mtd/nand/diskonchip.c    |    1 +
 drivers/mtd/nand/fsl_elbc_nand.c |    6 ++++++
 drivers/mtd/nand/fsl_ifc_nand.c  |    1 +
 drivers/mtd/nand/fsmc_nand.c     |    2 ++
 drivers/mtd/nand/jz4740_nand.c   |    5 +++++
 drivers/mtd/nand/mxc_nand.c      |    7 +++++++
 drivers/mtd/nand/mxs_nand.c      |    1 +
 drivers/mtd/nand/nand_base.c     |    1 +
 drivers/mtd/nand/ndfc.c          |    1 +
 drivers/mtd/nand/nomadik.c       |    1 +
 drivers/mtd/nand/omap_gpmc.c     |    1 +
 drivers/mtd/nand/s3c2410_nand.c  |    1 +
 drivers/mtd/nand/s3c64xx.c       |    1 +
 drivers/mtd/nand/tegra_nand.c    |    1 +
 17 files changed, 34 insertions(+)

Comments

Josh Wu Jan. 18, 2013, 10:53 a.m. UTC | #1
Hi, Sergey

On 1/18/2013 5:45 PM, Sergey Lapin wrote:
> Dear Scott,
>
> could you please test the following patch
> on top of this big patch to see if ecc.strength
> problem goes away? I can integrate it into big
> one then.
>
>  From dffea1f073c546ab88f37f219f66d9d1478d4cf1 Mon Sep 17 00:00:00 2001
> From: Sergey Lapin <slapin@ossfans.org>
> Date: Thu, 17 Jan 2013 18:29:21 +0400
> Subject: [PATCH] SQUASHME: mtd: nand: Add ecc.strength support to drivers
>
>
> Signed-off-by: Sergey Lapin <slapin@ossfans.org>
> ---
>   drivers/mtd/nand/atmel_nand.c    |    1 +
>   drivers/mtd/nand/bfin_nand.c     |    2 ++
>   drivers/mtd/nand/davinci_nand.c  |    1 +
>   drivers/mtd/nand/diskonchip.c    |    1 +
>   drivers/mtd/nand/fsl_elbc_nand.c |    6 ++++++
>   drivers/mtd/nand/fsl_ifc_nand.c  |    1 +
>   drivers/mtd/nand/fsmc_nand.c     |    2 ++
>   drivers/mtd/nand/jz4740_nand.c   |    5 +++++
>   drivers/mtd/nand/mxc_nand.c      |    7 +++++++
>   drivers/mtd/nand/mxs_nand.c      |    1 +
>   drivers/mtd/nand/nand_base.c     |    1 +
>   drivers/mtd/nand/ndfc.c          |    1 +
>   drivers/mtd/nand/nomadik.c       |    1 +
>   drivers/mtd/nand/omap_gpmc.c     |    1 +
>   drivers/mtd/nand/s3c2410_nand.c  |    1 +
>   drivers/mtd/nand/s3c64xx.c       |    1 +
>   drivers/mtd/nand/tegra_nand.c    |    1 +
>   17 files changed, 34 insertions(+)
>
> diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
> index b09e7b7..9cdf35b 100644
> --- a/drivers/mtd/nand/atmel_nand.c
> +++ b/drivers/mtd/nand/atmel_nand.c
> @@ -709,6 +709,7 @@ static int atmel_pmecc_nand_init_params(struct nand_chip *nand,
>   
>   	nand->ecc.read_page = atmel_nand_pmecc_read_page;
>   	nand->ecc.write_page = atmel_nand_pmecc_write_page;
> +	nand->ecc.strength = 1;

For atmel nand, it should be:

+	nand->ecc.strength = cap;

Best Regards,
Josh Wu

>   
>   	atmel_pmecc_core_init(mtd);
>   
> diff --git a/drivers/mtd/nand/bfin_nand.c b/drivers/mtd/nand/bfin_nand.c
> index c7ddbb2..7e755e8 100644
> --- a/drivers/mtd/nand/bfin_nand.c
> +++ b/drivers/mtd/nand/bfin_nand.c
> @@ -374,9 +374,11 @@ int board_nand_init(struct nand_chip *chip)
>   		if (!NAND_IS_512()) {
>   			chip->ecc.bytes = 3;
>   			chip->ecc.size = 256;
> +			chip->ecc.strength = 1;
>   		} else {
>   			chip->ecc.bytes = 6;
>   			chip->ecc.size = 512;
> +			chip->ecc.strength = 2;
>   		}
>   		chip->ecc.mode = NAND_ECC_HW;
>   		chip->ecc.calculate = bfin_nfc_calculate_ecc;
> diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
> index 04b24f3..9777878 100644
> --- a/drivers/mtd/nand/davinci_nand.c
> +++ b/drivers/mtd/nand/davinci_nand.c
> @@ -613,6 +613,7 @@ void davinci_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode = NAND_ECC_HW;
>   	nand->ecc.size = 512;
>   	nand->ecc.bytes = 3;
> +	nand->ecc.strength = 4;
>   	nand->ecc.calculate = nand_davinci_calculate_ecc;
>   	nand->ecc.correct  = nand_davinci_correct_data;
>   	nand->ecc.hwctl  = nand_davinci_enable_hwecc;
> diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
> index 104d97f..4cd741e 100644
> --- a/drivers/mtd/nand/diskonchip.c
> +++ b/drivers/mtd/nand/diskonchip.c
> @@ -1658,6 +1658,7 @@ static int __init doc_probe(unsigned long physadr)
>   	nand->ecc.mode		= NAND_ECC_HW_SYNDROME;
>   	nand->ecc.size		= 512;
>   	nand->ecc.bytes		= 6;
> +	nand->ecc.strength	= 2;
>   	nand->bbt_options	= NAND_BBT_USE_FLASH;
>   
>   	doc->physadr		= physadr;
> diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
> index 65edbf5..c3f350d 100644
> --- a/drivers/mtd/nand/fsl_elbc_nand.c
> +++ b/drivers/mtd/nand/fsl_elbc_nand.c
> @@ -781,6 +781,12 @@ static int fsl_elbc_chip_init(int devnum, u8 *addr)
>   		nand->ecc.size = 512;
>   		nand->ecc.bytes = 3;
>   		nand->ecc.steps = 1;
> +		chip->ecc.strength = 1;
> +		/*
> +		 * FIXME: can hardware ecc correct 4 bitflips if page size is
> +		 * 2k?  Then does hardware report number of corrections for this
> +		 * case?  If so, ecc_stats reporting needs to be fixed as well.
> +		 */
>   	} else {
>   		/* otherwise fall back to default software ECC */
>   		nand->ecc.mode = NAND_ECC_SOFT;
> diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
> index 5d47b40..823a2eb 100644
> --- a/drivers/mtd/nand/fsl_ifc_nand.c
> +++ b/drivers/mtd/nand/fsl_ifc_nand.c
> @@ -871,6 +871,7 @@ int board_nand_init(struct nand_chip *nand)
>   	/* Hardware generates ECC per 512 Bytes */
>   	nand->ecc.size = 512;
>   	nand->ecc.bytes = 8;
> +	nand->ecc.strength = 1;
>   
>   	switch (csor & CSOR_NAND_PGS_MASK) {
>   	case CSOR_NAND_PGS_512:
> diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
> index 48ca543..fab2aeb 100644
> --- a/drivers/mtd/nand/fsmc_nand.c
> +++ b/drivers/mtd/nand/fsmc_nand.c
> @@ -453,6 +453,7 @@ int fsmc_nand_init(struct nand_chip *nand)
>   	switch (fsmc_version) {
>   	case FSMC_VER8:
>   		nand->ecc.bytes = 13;
> +		nand->ecc.strength = 8;
>   		nand->ecc.correct = fsmc_bch8_correct_data;
>   		nand->ecc.read_page = fsmc_read_page_hwecc;
>   		if (mtd->writesize == 512)
> @@ -467,6 +468,7 @@ int fsmc_nand_init(struct nand_chip *nand)
>   		break;
>   	default:
>   		nand->ecc.bytes = 3;
> +		nand->ecc.strength = 1;
>   		nand->ecc.layout = &fsmc_ecc1_layout;
>   		nand->ecc.correct = nand_correct_data;
>   		break;
> diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c
> index 3ec34f3..3f64dc3 100644
> --- a/drivers/mtd/nand/jz4740_nand.c
> +++ b/drivers/mtd/nand/jz4740_nand.c
> @@ -253,6 +253,11 @@ int board_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode		= NAND_ECC_HW_OOB_FIRST;
>   	nand->ecc.size		= CONFIG_SYS_NAND_ECCSIZE;
>   	nand->ecc.bytes		= CONFIG_SYS_NAND_ECCBYTES;
> +	nand->ecc.strength	= 2;
> +	/*
> +	 * FIXME: ecc_strength value of 2 bits per 512 bytes of data is a
> +	 * conservative guess, given 9 ecc bytes and reed-solomon alg.
> +	 */
>   	nand->ecc.layout	= &qi_lb60_ecclayout_2gb;
>   	nand->chip_delay	= 50;
>   	nand->options		= NAND_USE_FLASH_BBT;
> diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
> index c51a012..df2f489 100644
> --- a/drivers/mtd/nand/mxc_nand.c
> +++ b/drivers/mtd/nand/mxc_nand.c
> @@ -1222,6 +1222,13 @@ int board_nand_init(struct nand_chip *this)
>   		this->ecc.mode = NAND_ECC_HW;
>   	}
>   
> +	if (this->ecc.mode == NAND_ECC_HW) {
> +		if (is_mxc_nfc_1())
> +			this->ecc.strength = 1;
> +		else
> +			this->ecc.strength = 4;
> +	}
> +
>   	host->pagesize_2k = 0;
>   
>   	this->ecc.size = 512;
> diff --git a/drivers/mtd/nand/mxs_nand.c b/drivers/mtd/nand/mxs_nand.c
> index 422519a..d1f4986 100644
> --- a/drivers/mtd/nand/mxs_nand.c
> +++ b/drivers/mtd/nand/mxs_nand.c
> @@ -1166,6 +1166,7 @@ int board_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode		= NAND_ECC_HW;
>   	nand->ecc.bytes		= 9;
>   	nand->ecc.size		= 512;
> +	nand->ecc.strength	= 8;
>   
>   	return 0;
>   
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index 3ad7783..a2df8ee 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -3233,6 +3233,7 @@ int nand_scan_tail(struct mtd_info *mtd)
>   		if (!chip->ecc.size)
>   			chip->ecc.size = 256;
>   		chip->ecc.bytes = 3;
> +		chip->ecc.strength = 1;
>   		break;
>   
>   	case NAND_ECC_SOFT_BCH:
> diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
> index 6ebbb5e..b7a837b 100644
> --- a/drivers/mtd/nand/ndfc.c
> +++ b/drivers/mtd/nand/ndfc.c
> @@ -216,6 +216,7 @@ int board_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode = NAND_ECC_HW;
>   	nand->ecc.size = 256;
>   	nand->ecc.bytes = 3;
> +	nand->ecc.strength = 1;
>   	nand->select_chip = ndfc_select_chip;
>   
>   #ifdef CONFIG_SYS_NDFC_16BIT
> diff --git a/drivers/mtd/nand/nomadik.c b/drivers/mtd/nand/nomadik.c
> index b76f4cb..dc8e513 100644
> --- a/drivers/mtd/nand/nomadik.c
> +++ b/drivers/mtd/nand/nomadik.c
> @@ -212,6 +212,7 @@ int board_nand_init(struct nand_chip *chip)
>   	chip->ecc.mode = NAND_ECC_HW;
>   	chip->ecc.bytes = 3;
>   	chip->ecc.size = 512;
> +	chip->ecc.strength = 1;
>   	chip->ecc.layout = &nomadik_ecc_layout;
>   	chip->ecc.calculate = nomadik_ecc_calculate;
>   	chip->ecc.hwctl = nomadik_ecc_hwctl;
> diff --git a/drivers/mtd/nand/omap_gpmc.c b/drivers/mtd/nand/omap_gpmc.c
> index ccf9750..728dfdc 100644
> --- a/drivers/mtd/nand/omap_gpmc.c
> +++ b/drivers/mtd/nand/omap_gpmc.c
> @@ -274,6 +274,7 @@ void omap_nand_switch_ecc(int32_t hardware)
>   		nand->ecc.layout = &hw_nand_oob;
>   		nand->ecc.size = 512;
>   		nand->ecc.bytes = 3;
> +		nand->ecc.strength = 1;
>   		nand->ecc.hwctl = omap_enable_hwecc;
>   		nand->ecc.correct = omap_correct_data;
>   		nand->ecc.calculate = omap_calculate_ecc;
> diff --git a/drivers/mtd/nand/s3c2410_nand.c b/drivers/mtd/nand/s3c2410_nand.c
> index e1a459b..43d8213 100644
> --- a/drivers/mtd/nand/s3c2410_nand.c
> +++ b/drivers/mtd/nand/s3c2410_nand.c
> @@ -173,6 +173,7 @@ int board_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode = NAND_ECC_HW;
>   	nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
>   	nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
> +	nand->ecc.strength = 1;
>   #else
>   	nand->ecc.mode = NAND_ECC_SOFT;
>   #endif
> diff --git a/drivers/mtd/nand/s3c64xx.c b/drivers/mtd/nand/s3c64xx.c
> index 87f0341..8c4a737 100644
> --- a/drivers/mtd/nand/s3c64xx.c
> +++ b/drivers/mtd/nand/s3c64xx.c
> @@ -285,6 +285,7 @@ int board_nand_init(struct nand_chip *nand)
>   	nand->ecc.mode		= NAND_ECC_HW;
>   	nand->ecc.size		= CONFIG_SYS_NAND_ECCSIZE;
>   	nand->ecc.bytes		= CONFIG_SYS_NAND_ECCBYTES;
> +	nand->ecc.strength	= 1;
>   #else
>   	nand->ecc.mode		= NAND_ECC_SOFT;
>   #endif /* ! CONFIG_SYS_S3C_NAND_HWECC */
> diff --git a/drivers/mtd/nand/tegra_nand.c b/drivers/mtd/nand/tegra_nand.c
> index 854fd21..6afbec6 100644
> --- a/drivers/mtd/nand/tegra_nand.c
> +++ b/drivers/mtd/nand/tegra_nand.c
> @@ -1014,6 +1014,7 @@ int tegra_nand_init(struct nand_chip *nand, int devnum)
>   	nand->ecc.write_page_raw = nand_write_page_raw;
>   	nand->ecc.read_oob = nand_read_oob;
>   	nand->ecc.write_oob = nand_write_oob;
> +	nand->ecc.strength = 1;
>   	nand->select_chip = nand_select_chip;
>   	nand->dev_ready  = nand_dev_ready;
>   	nand->priv = &nand_ctrl;
Sergey Lapin Jan. 18, 2013, 11:48 a.m. UTC | #2
Hi, Josh

> >diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
> >index b09e7b7..9cdf35b 100644
> >--- a/drivers/mtd/nand/atmel_nand.c
> >+++ b/drivers/mtd/nand/atmel_nand.c
> >@@ -709,6 +709,7 @@ static int atmel_pmecc_nand_init_params(struct nand_chip *nand,
> >  	nand->ecc.read_page = atmel_nand_pmecc_read_page;
> >  	nand->ecc.write_page = atmel_nand_pmecc_write_page;
> >+	nand->ecc.strength = 1;
> 
> For atmel nand, it should be:
> 
> +	nand->ecc.strength = cap;
> 
> Best Regards,
> Josh Wu

Thanks, changed.
diff mbox

Patch

diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c
index b09e7b7..9cdf35b 100644
--- a/drivers/mtd/nand/atmel_nand.c
+++ b/drivers/mtd/nand/atmel_nand.c
@@ -709,6 +709,7 @@  static int atmel_pmecc_nand_init_params(struct nand_chip *nand,
 
 	nand->ecc.read_page = atmel_nand_pmecc_read_page;
 	nand->ecc.write_page = atmel_nand_pmecc_write_page;
+	nand->ecc.strength = 1;
 
 	atmel_pmecc_core_init(mtd);
 
diff --git a/drivers/mtd/nand/bfin_nand.c b/drivers/mtd/nand/bfin_nand.c
index c7ddbb2..7e755e8 100644
--- a/drivers/mtd/nand/bfin_nand.c
+++ b/drivers/mtd/nand/bfin_nand.c
@@ -374,9 +374,11 @@  int board_nand_init(struct nand_chip *chip)
 		if (!NAND_IS_512()) {
 			chip->ecc.bytes = 3;
 			chip->ecc.size = 256;
+			chip->ecc.strength = 1;
 		} else {
 			chip->ecc.bytes = 6;
 			chip->ecc.size = 512;
+			chip->ecc.strength = 2;
 		}
 		chip->ecc.mode = NAND_ECC_HW;
 		chip->ecc.calculate = bfin_nfc_calculate_ecc;
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c
index 04b24f3..9777878 100644
--- a/drivers/mtd/nand/davinci_nand.c
+++ b/drivers/mtd/nand/davinci_nand.c
@@ -613,6 +613,7 @@  void davinci_nand_init(struct nand_chip *nand)
 	nand->ecc.mode = NAND_ECC_HW;
 	nand->ecc.size = 512;
 	nand->ecc.bytes = 3;
+	nand->ecc.strength = 4;
 	nand->ecc.calculate = nand_davinci_calculate_ecc;
 	nand->ecc.correct  = nand_davinci_correct_data;
 	nand->ecc.hwctl  = nand_davinci_enable_hwecc;
diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c
index 104d97f..4cd741e 100644
--- a/drivers/mtd/nand/diskonchip.c
+++ b/drivers/mtd/nand/diskonchip.c
@@ -1658,6 +1658,7 @@  static int __init doc_probe(unsigned long physadr)
 	nand->ecc.mode		= NAND_ECC_HW_SYNDROME;
 	nand->ecc.size		= 512;
 	nand->ecc.bytes		= 6;
+	nand->ecc.strength	= 2;
 	nand->bbt_options	= NAND_BBT_USE_FLASH;
 
 	doc->physadr		= physadr;
diff --git a/drivers/mtd/nand/fsl_elbc_nand.c b/drivers/mtd/nand/fsl_elbc_nand.c
index 65edbf5..c3f350d 100644
--- a/drivers/mtd/nand/fsl_elbc_nand.c
+++ b/drivers/mtd/nand/fsl_elbc_nand.c
@@ -781,6 +781,12 @@  static int fsl_elbc_chip_init(int devnum, u8 *addr)
 		nand->ecc.size = 512;
 		nand->ecc.bytes = 3;
 		nand->ecc.steps = 1;
+		chip->ecc.strength = 1;
+		/*
+		 * FIXME: can hardware ecc correct 4 bitflips if page size is
+		 * 2k?  Then does hardware report number of corrections for this
+		 * case?  If so, ecc_stats reporting needs to be fixed as well.
+		 */
 	} else {
 		/* otherwise fall back to default software ECC */
 		nand->ecc.mode = NAND_ECC_SOFT;
diff --git a/drivers/mtd/nand/fsl_ifc_nand.c b/drivers/mtd/nand/fsl_ifc_nand.c
index 5d47b40..823a2eb 100644
--- a/drivers/mtd/nand/fsl_ifc_nand.c
+++ b/drivers/mtd/nand/fsl_ifc_nand.c
@@ -871,6 +871,7 @@  int board_nand_init(struct nand_chip *nand)
 	/* Hardware generates ECC per 512 Bytes */
 	nand->ecc.size = 512;
 	nand->ecc.bytes = 8;
+	nand->ecc.strength = 1;
 
 	switch (csor & CSOR_NAND_PGS_MASK) {
 	case CSOR_NAND_PGS_512:
diff --git a/drivers/mtd/nand/fsmc_nand.c b/drivers/mtd/nand/fsmc_nand.c
index 48ca543..fab2aeb 100644
--- a/drivers/mtd/nand/fsmc_nand.c
+++ b/drivers/mtd/nand/fsmc_nand.c
@@ -453,6 +453,7 @@  int fsmc_nand_init(struct nand_chip *nand)
 	switch (fsmc_version) {
 	case FSMC_VER8:
 		nand->ecc.bytes = 13;
+		nand->ecc.strength = 8;
 		nand->ecc.correct = fsmc_bch8_correct_data;
 		nand->ecc.read_page = fsmc_read_page_hwecc;
 		if (mtd->writesize == 512)
@@ -467,6 +468,7 @@  int fsmc_nand_init(struct nand_chip *nand)
 		break;
 	default:
 		nand->ecc.bytes = 3;
+		nand->ecc.strength = 1;
 		nand->ecc.layout = &fsmc_ecc1_layout;
 		nand->ecc.correct = nand_correct_data;
 		break;
diff --git a/drivers/mtd/nand/jz4740_nand.c b/drivers/mtd/nand/jz4740_nand.c
index 3ec34f3..3f64dc3 100644
--- a/drivers/mtd/nand/jz4740_nand.c
+++ b/drivers/mtd/nand/jz4740_nand.c
@@ -253,6 +253,11 @@  int board_nand_init(struct nand_chip *nand)
 	nand->ecc.mode		= NAND_ECC_HW_OOB_FIRST;
 	nand->ecc.size		= CONFIG_SYS_NAND_ECCSIZE;
 	nand->ecc.bytes		= CONFIG_SYS_NAND_ECCBYTES;
+	nand->ecc.strength	= 2;
+	/*
+	 * FIXME: ecc_strength value of 2 bits per 512 bytes of data is a
+	 * conservative guess, given 9 ecc bytes and reed-solomon alg.
+	 */
 	nand->ecc.layout	= &qi_lb60_ecclayout_2gb;
 	nand->chip_delay	= 50;
 	nand->options		= NAND_USE_FLASH_BBT;
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index c51a012..df2f489 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -1222,6 +1222,13 @@  int board_nand_init(struct nand_chip *this)
 		this->ecc.mode = NAND_ECC_HW;
 	}
 
+	if (this->ecc.mode == NAND_ECC_HW) {
+		if (is_mxc_nfc_1())
+			this->ecc.strength = 1;
+		else
+			this->ecc.strength = 4;
+	}
+
 	host->pagesize_2k = 0;
 
 	this->ecc.size = 512;
diff --git a/drivers/mtd/nand/mxs_nand.c b/drivers/mtd/nand/mxs_nand.c
index 422519a..d1f4986 100644
--- a/drivers/mtd/nand/mxs_nand.c
+++ b/drivers/mtd/nand/mxs_nand.c
@@ -1166,6 +1166,7 @@  int board_nand_init(struct nand_chip *nand)
 	nand->ecc.mode		= NAND_ECC_HW;
 	nand->ecc.bytes		= 9;
 	nand->ecc.size		= 512;
+	nand->ecc.strength	= 8;
 
 	return 0;
 
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 3ad7783..a2df8ee 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -3233,6 +3233,7 @@  int nand_scan_tail(struct mtd_info *mtd)
 		if (!chip->ecc.size)
 			chip->ecc.size = 256;
 		chip->ecc.bytes = 3;
+		chip->ecc.strength = 1;
 		break;
 
 	case NAND_ECC_SOFT_BCH:
diff --git a/drivers/mtd/nand/ndfc.c b/drivers/mtd/nand/ndfc.c
index 6ebbb5e..b7a837b 100644
--- a/drivers/mtd/nand/ndfc.c
+++ b/drivers/mtd/nand/ndfc.c
@@ -216,6 +216,7 @@  int board_nand_init(struct nand_chip *nand)
 	nand->ecc.mode = NAND_ECC_HW;
 	nand->ecc.size = 256;
 	nand->ecc.bytes = 3;
+	nand->ecc.strength = 1;
 	nand->select_chip = ndfc_select_chip;
 
 #ifdef CONFIG_SYS_NDFC_16BIT
diff --git a/drivers/mtd/nand/nomadik.c b/drivers/mtd/nand/nomadik.c
index b76f4cb..dc8e513 100644
--- a/drivers/mtd/nand/nomadik.c
+++ b/drivers/mtd/nand/nomadik.c
@@ -212,6 +212,7 @@  int board_nand_init(struct nand_chip *chip)
 	chip->ecc.mode = NAND_ECC_HW;
 	chip->ecc.bytes = 3;
 	chip->ecc.size = 512;
+	chip->ecc.strength = 1;
 	chip->ecc.layout = &nomadik_ecc_layout;
 	chip->ecc.calculate = nomadik_ecc_calculate;
 	chip->ecc.hwctl = nomadik_ecc_hwctl;
diff --git a/drivers/mtd/nand/omap_gpmc.c b/drivers/mtd/nand/omap_gpmc.c
index ccf9750..728dfdc 100644
--- a/drivers/mtd/nand/omap_gpmc.c
+++ b/drivers/mtd/nand/omap_gpmc.c
@@ -274,6 +274,7 @@  void omap_nand_switch_ecc(int32_t hardware)
 		nand->ecc.layout = &hw_nand_oob;
 		nand->ecc.size = 512;
 		nand->ecc.bytes = 3;
+		nand->ecc.strength = 1;
 		nand->ecc.hwctl = omap_enable_hwecc;
 		nand->ecc.correct = omap_correct_data;
 		nand->ecc.calculate = omap_calculate_ecc;
diff --git a/drivers/mtd/nand/s3c2410_nand.c b/drivers/mtd/nand/s3c2410_nand.c
index e1a459b..43d8213 100644
--- a/drivers/mtd/nand/s3c2410_nand.c
+++ b/drivers/mtd/nand/s3c2410_nand.c
@@ -173,6 +173,7 @@  int board_nand_init(struct nand_chip *nand)
 	nand->ecc.mode = NAND_ECC_HW;
 	nand->ecc.size = CONFIG_SYS_NAND_ECCSIZE;
 	nand->ecc.bytes = CONFIG_SYS_NAND_ECCBYTES;
+	nand->ecc.strength = 1;
 #else
 	nand->ecc.mode = NAND_ECC_SOFT;
 #endif
diff --git a/drivers/mtd/nand/s3c64xx.c b/drivers/mtd/nand/s3c64xx.c
index 87f0341..8c4a737 100644
--- a/drivers/mtd/nand/s3c64xx.c
+++ b/drivers/mtd/nand/s3c64xx.c
@@ -285,6 +285,7 @@  int board_nand_init(struct nand_chip *nand)
 	nand->ecc.mode		= NAND_ECC_HW;
 	nand->ecc.size		= CONFIG_SYS_NAND_ECCSIZE;
 	nand->ecc.bytes		= CONFIG_SYS_NAND_ECCBYTES;
+	nand->ecc.strength	= 1;
 #else
 	nand->ecc.mode		= NAND_ECC_SOFT;
 #endif /* ! CONFIG_SYS_S3C_NAND_HWECC */
diff --git a/drivers/mtd/nand/tegra_nand.c b/drivers/mtd/nand/tegra_nand.c
index 854fd21..6afbec6 100644
--- a/drivers/mtd/nand/tegra_nand.c
+++ b/drivers/mtd/nand/tegra_nand.c
@@ -1014,6 +1014,7 @@  int tegra_nand_init(struct nand_chip *nand, int devnum)
 	nand->ecc.write_page_raw = nand_write_page_raw;
 	nand->ecc.read_oob = nand_read_oob;
 	nand->ecc.write_oob = nand_write_oob;
+	nand->ecc.strength = 1;
 	nand->select_chip = nand_select_chip;
 	nand->dev_ready  = nand_dev_ready;
 	nand->priv = &nand_ctrl;