[PATCH v1] mtd: nand: raw: rockchip_nfc: fix oobfree length calculation

Johan Jonker jbx6244 at gmail.com
Tue Jun 30 15:32:46 CEST 2026


The oobfree[0].length calculation depends on the
rknand->metadata_size value, but this is calculated
after the function rk_nfc_ecc_init is called. Move this
calculation to a location before it's value is required.

Fixes: 1b3fcb3c0456 ("mtd: nand: raw: rockchip_nfc: add layout structure")
Signed-off-by: Johan Jonker <jbx6244 at gmail.com>
---
 drivers/mtd/nand/raw/rockchip_nfc.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/mtd/nand/raw/rockchip_nfc.c b/drivers/mtd/nand/raw/rockchip_nfc.c
index f730e15d0410..ea8e67d1a23e 100644
--- a/drivers/mtd/nand/raw/rockchip_nfc.c
+++ b/drivers/mtd/nand/raw/rockchip_nfc.c
@@ -861,6 +861,15 @@ static int rk_nfc_ecc_init(struct rk_nfc *nfc, struct nand_chip *chip)
 	ecc->steps = mtd->writesize / ecc->size;
 	ecc->bytes = DIV_ROUND_UP(ecc->strength * fls(8 * chip->ecc.size), 8);
 
+	rknand->metadata_size = NFC_SYS_DATA_SIZE * ecc->steps;
+
+	if (rknand->metadata_size < NFC_SYS_DATA_SIZE + 2) {
+		dev_err(nfc->dev,
+			"driver needs at least %d bytes of meta data\n",
+			NFC_SYS_DATA_SIZE + 2);
+		return -EIO;
+	}
+
 	if (ecc->bytes * ecc->steps > mtd->oobsize - rknand->metadata_size)
 		return -EINVAL;
 
@@ -974,15 +983,6 @@ static int rk_nfc_nand_chip_init(ofnode node, struct rk_nfc *nfc, int devnum)
 	ret = ofnode_read_u32(node, "rockchip,boot-ecc-strength", &tmp);
 	rknand->boot_ecc = ret ? ecc->strength : tmp;
 
-	rknand->metadata_size = NFC_SYS_DATA_SIZE * ecc->steps;
-
-	if (rknand->metadata_size < NFC_SYS_DATA_SIZE + 2) {
-		dev_err(dev,
-			"driver needs at least %d bytes of meta data\n",
-			NFC_SYS_DATA_SIZE + 2);
-		return -EIO;
-	}
-
 	if (!nfc->page_buf) {
 		nfc->page_buf = kzalloc(NFC_MAX_PAGE_SIZE, GFP_KERNEL);
 		if (!nfc->page_buf) {
-- 
2.39.5



More information about the U-Boot mailing list