[U-Boot] [PATCH] mtd: mxc_nand: Fix crash after MTD resync

The driver triggered a BUG() in nand_base.c:3214/nand_scan_tail() because the ecc.strength was incorrectly set in case of NAND_ECC_HW instead of NAND_ECC_HW_SYNDROME ECC mode.
Signed-off-by: Marek Vasut marex@denx.de Cc: Benoît Thébaudeau benoit.thebaudeau@advansee.com Cc: Fabio Estevam fabio.estevam@freescale.com Cc: Scott Wood scottwood@freescale.com --- drivers/mtd/nand/mxc_nand.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index ac435f2..08c7b8b 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1238,15 +1238,12 @@ int board_nand_init(struct nand_chip *this) this->ecc.write_oob = mxc_nand_write_oob_syndrome; this->ecc.bytes = 9; this->ecc.prepad = 7; - } else { - 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; + } else { + this->ecc.mode = NAND_ECC_HW; }
host->pagesize_2k = 0;

On 07/02/2013 10:11:55 AM, Marek Vasut wrote:
The driver triggered a BUG() in nand_base.c:3214/nand_scan_tail() because the ecc.strength was incorrectly set in case of NAND_ECC_HW instead of NAND_ECC_HW_SYNDROME ECC mode.
Signed-off-by: Marek Vasut marex@denx.de Cc: Benoît Thébaudeau benoit.thebaudeau@advansee.com Cc: Fabio Estevam fabio.estevam@freescale.com Cc: Scott Wood scottwood@freescale.com
drivers/mtd/nand/mxc_nand.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index ac435f2..08c7b8b 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1238,15 +1238,12 @@ int board_nand_init(struct nand_chip *this) this->ecc.write_oob = mxc_nand_write_oob_syndrome; this->ecc.bytes = 9; this->ecc.prepad = 7;
- } else {
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;
- } else {
}this->ecc.mode = NAND_ECC_HW;
Where does ecc.strength now get set for the non-SYNDROME case?
-Scott

Dear Scott Wood,
On 07/02/2013 10:11:55 AM, Marek Vasut wrote:
The driver triggered a BUG() in nand_base.c:3214/nand_scan_tail() because the ecc.strength was incorrectly set in case of NAND_ECC_HW instead of NAND_ECC_HW_SYNDROME ECC mode.
Signed-off-by: Marek Vasut marex@denx.de Cc: Benoît Thébaudeau benoit.thebaudeau@advansee.com Cc: Fabio Estevam fabio.estevam@freescale.com Cc: Scott Wood scottwood@freescale.com
drivers/mtd/nand/mxc_nand.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c index ac435f2..08c7b8b 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1238,15 +1238,12 @@ int board_nand_init(struct nand_chip *this)
this->ecc.write_oob = mxc_nand_write_oob_syndrome; this->ecc.bytes = 9; this->ecc.prepad = 7;
} else {
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;
} else {
this->ecc.mode = NAND_ECC_HW;
}
Where does ecc.strength now get set for the non-SYNDROME case?
Gone ;-) The strength only needs to be set for the SYNDROME case according to the code in nand_base.c .
Best regards, Marek Vasut

On 07/02/2013 03:57:58 PM, Marek Vasut wrote:
Dear Scott Wood,
On 07/02/2013 10:11:55 AM, Marek Vasut wrote:
The driver triggered a BUG() in nand_base.c:3214/nand_scan_tail() because the ecc.strength was incorrectly set in case of
NAND_ECC_HW
instead of NAND_ECC_HW_SYNDROME ECC mode.
Signed-off-by: Marek Vasut marex@denx.de Cc: Benoît Thébaudeau benoit.thebaudeau@advansee.com Cc: Fabio Estevam fabio.estevam@freescale.com Cc: Scott Wood scottwood@freescale.com
drivers/mtd/nand/mxc_nand.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c
b/drivers/mtd/nand/mxc_nand.c
index ac435f2..08c7b8b 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1238,15 +1238,12 @@ int board_nand_init(struct nand_chip
*this)
this->ecc.write_oob = mxc_nand_write_oob_syndrome; this->ecc.bytes = 9; this->ecc.prepad = 7;
} else {
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;
} else {
this->ecc.mode = NAND_ECC_HW;
}
Where does ecc.strength now get set for the non-SYNDROME case?
Gone ;-) The strength only needs to be set for the SYNDROME case according to the code in nand_base.c .
Read it again. Note the lack of a "break;" before "case NAND_ECC_HW_SYNDROME:".
-Scott

Dear Scott Wood,
On 07/02/2013 03:57:58 PM, Marek Vasut wrote:
Dear Scott Wood,
On 07/02/2013 10:11:55 AM, Marek Vasut wrote:
The driver triggered a BUG() in nand_base.c:3214/nand_scan_tail() because the ecc.strength was incorrectly set in case of
NAND_ECC_HW
instead of NAND_ECC_HW_SYNDROME ECC mode.
Signed-off-by: Marek Vasut marex@denx.de Cc: Benoît Thébaudeau benoit.thebaudeau@advansee.com Cc: Fabio Estevam fabio.estevam@freescale.com Cc: Scott Wood scottwood@freescale.com
drivers/mtd/nand/mxc_nand.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c
b/drivers/mtd/nand/mxc_nand.c
index ac435f2..08c7b8b 100644 --- a/drivers/mtd/nand/mxc_nand.c +++ b/drivers/mtd/nand/mxc_nand.c @@ -1238,15 +1238,12 @@ int board_nand_init(struct nand_chip
*this)
this->ecc.write_oob = mxc_nand_write_oob_syndrome; this->ecc.bytes = 9; this->ecc.prepad = 7;
} else {
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;
} else {
this->ecc.mode = NAND_ECC_HW;
}
Where does ecc.strength now get set for the non-SYNDROME case?
Gone ;-) The strength only needs to be set for the SYNDROME case according to the code in nand_base.c .
Read it again. Note the lack of a "break;" before "case NAND_ECC_HW_SYNDROME:".
Blargh. V2-time.
Best regards, Marek Vasut
participants (2)
-
Marek Vasut
-
Scott Wood