| From a5c02ab00e1144c82deaf90ca24aec96abac6af2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 24 Oct 2025 13:19:42 +1300 |
| Subject: mtd: nand: relax ECC parameter validation check |
| |
| From: Aryan Srivastava <aryan.srivastava@alliedtelesis.co.nz> |
| |
| [ Upstream commit 050553c683f21eebd7d1020df9b2ec852e2a9e4e ] |
| |
| Due to the custom handling and layouts of certain nand controllers this |
| validity check will always fail for certain layouts. The check |
| inherently depends on even chunk sizing and this is not always the |
| case. |
| |
| Modify the check to only print a warning, instead of failing to |
| init the attached NAND. This allows various 8 bit and 12 ECC strength |
| layouts to be used. |
| |
| Fixes: 68c18dae6888 ("mtd: rawnand: marvell: add missing layouts") |
| Signed-off-by: Aryan Srivastava <aryan.srivastava@alliedtelesis.co.nz> |
| Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/mtd/nand/raw/nand_base.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/mtd/nand/raw/nand_base.c b/drivers/mtd/nand/raw/nand_base.c |
| index 7c3e3d70be8b0..fe0b298f8425e 100644 |
| --- a/drivers/mtd/nand/raw/nand_base.c |
| +++ b/drivers/mtd/nand/raw/nand_base.c |
| @@ -6450,11 +6450,14 @@ static int nand_scan_tail(struct nand_chip *chip) |
| ecc->steps = mtd->writesize / ecc->size; |
| if (!base->ecc.ctx.nsteps) |
| base->ecc.ctx.nsteps = ecc->steps; |
| - if (ecc->steps * ecc->size != mtd->writesize) { |
| - WARN(1, "Invalid ECC parameters\n"); |
| - ret = -EINVAL; |
| - goto err_nand_manuf_cleanup; |
| - } |
| + |
| + /* |
| + * Validity check: Warn if ECC parameters are not compatible with page size. |
| + * Due to the custom handling of ECC blocks in certain controllers the check |
| + * may result in an expected failure. |
| + */ |
| + if (ecc->steps * ecc->size != mtd->writesize) |
| + pr_warn("ECC parameters may be invalid in reference to underlying NAND chip\n"); |
| |
| if (!ecc->total) { |
| ecc->total = ecc->steps * ecc->bytes; |
| -- |
| 2.51.0 |
| |