Skip to content

Commit 0c741b8

Browse files
naseefmiquelraynal
authored andcommitted
mtd: nand: realtek-ecc: relax OOB size check to minimum
The ECC engine strictly validates that flash OOB size equals exactly 64 bytes. However, some NAND chips have a larger physical OOB while vendor firmware only uses the first 64 bytes for the ECC layout. For example the Macronix MX35LF1G24AD found in the Netlink HG323DAC has 128 byte physical OOB but vendor firmware only uses the first 64 bytes (24 bytes free + 40 bytes BCH6 parity), leaving bytes 64-127 unused. Since the engine only operates on the first 64 bytes of OOB regardless of the physical size, change the check from exact match to minimum size. Flash with OOB >= 64 bytes works correctly with the engine's 64-byte layout. Suggested-by: Markus Stockhausen <markus.stockhausen@gmx.de> Signed-off-by: Ahmed Naseef <naseefkm@gmail.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
1 parent 43479bb commit 0c741b8

1 file changed

Lines changed: 10 additions & 8 deletions

File tree

drivers/mtd/nand/ecc-realtek.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
* - BCH12 : Generate 20 ECC bytes from 512 data bytes plus 6 free bytes
1818
*
1919
* It can run for arbitrary NAND flash chips with different block and OOB sizes. Currently there
20-
* are only two known devices in the wild that have NAND flash and make use of this ECC engine
21-
* (Linksys LGS328C & LGS352C). To keep compatibility with vendor firmware, new modes can only
22-
* be added when new data layouts have been analyzed. For now allow BCH6 on flash with 2048 byte
23-
* blocks and 64 bytes oob.
20+
* are a few known devices in the wild that make use of this ECC engine
21+
* (Linksys LGS328C, LGS352C & Netlink HG323DAC). To keep compatibility with vendor firmware,
22+
* new modes can only be added when new data layouts have been analyzed. For now allow BCH6 on
23+
* flash with 2048 byte blocks and at least 64 bytes oob. Some vendors make use of
24+
* 128 bytes OOB NAND chips (e.g. Macronix MX35LF1G24AD) but only use BCH6 and thus the first
25+
* 64 bytes of the OOB area. In this case the engine leaves any extra bytes unused.
2426
*
2527
* This driver aligns with kernel ECC naming conventions. Neverthless a short notice on the
2628
* Realtek naming conventions for the different structures in the OOB area.
@@ -39,7 +41,7 @@
3941
*/
4042

4143
#define RTL_ECC_ALLOWED_PAGE_SIZE 2048
42-
#define RTL_ECC_ALLOWED_OOB_SIZE 64
44+
#define RTL_ECC_ALLOWED_MIN_OOB_SIZE 64
4345
#define RTL_ECC_ALLOWED_STRENGTH 6
4446

4547
#define RTL_ECC_BLOCK_SIZE 512
@@ -310,10 +312,10 @@ static int rtl_ecc_check_support(struct nand_device *nand)
310312
struct mtd_info *mtd = nanddev_to_mtd(nand);
311313
struct device *dev = nand->ecc.engine->dev;
312314

313-
if (mtd->oobsize != RTL_ECC_ALLOWED_OOB_SIZE ||
315+
if (mtd->oobsize < RTL_ECC_ALLOWED_MIN_OOB_SIZE ||
314316
mtd->writesize != RTL_ECC_ALLOWED_PAGE_SIZE) {
315-
dev_err(dev, "only flash geometry data=%d, oob=%d supported\n",
316-
RTL_ECC_ALLOWED_PAGE_SIZE, RTL_ECC_ALLOWED_OOB_SIZE);
317+
dev_err(dev, "only flash geometry data=%d, oob>=%d supported\n",
318+
RTL_ECC_ALLOWED_PAGE_SIZE, RTL_ECC_ALLOWED_MIN_OOB_SIZE);
317319
return -EINVAL;
318320
}
319321

0 commit comments

Comments
 (0)