[openwrt/openwrt] uboot-airoha: update to v2025.10

LEDE Commits lede-commits at lists.infradead.org
Thu Nov 20 14:08:46 PST 2025


ansuel pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/b8742b1ae0f1dc0bc8412fe852a006ea538e6943

commit b8742b1ae0f1dc0bc8412fe852a006ea538e6943
Author: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
AuthorDate: Mon Oct 13 07:43:31 2025 +0300

    uboot-airoha: update to v2025.10
    
    Changes:
     * removed upstreamed patches,
     * rebased local patches,
     * fix en7581_evb/an7583_evb booting issues
     * enable position independent code
    
    Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
    Link: https://github.com/openwrt/openwrt/pull/20400
    Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
---
 package/boot/uboot-airoha/Makefile                 |   4 +-
 ...eld.h-import-FIELD_PREP_CONST-macro-from-.patch |  55 ---------
 ...-winbond-add-Winbond-W25N04KV-flash-suppo.patch |  56 ---------
 ...02-mtd-spinand-Use-the-spi-mem-dirmap-API.patch |   7 +-
 ...remove-unnecessary-operation-adjust_op_si.patch |   5 -
 ...add-support-of-dual-quad-wires-spi-modes-.patch |   5 -
 .../patches/205-spi-airoha-add-dma-support.patch   |   5 -
 ...support-of-dualio-quadio-flash-reading-co.patch |   5 -
 ...avoid-setting-of-page-oob-sizes-in-REG_SP.patch |   5 -
 ...reduce-the-number-of-modification-of-REG_.patch |   5 -
 ...set-custom-sector-size-equal-to-flash-pag.patch |   5 -
 ...-avoid-usage-of-flash-specific-parameters.patch |   5 -
 ...-airoha-add-support-for-Airoha-AN7583-SoC.patch |   6 +-
 ...iroha-Add-support-for-Airoha-AN7583-reset.patch |  23 ++--
 ...-net-airoha-add-support-for-Airoha-AN7583.patch |  25 ++--
 ...-airoha_eth-add-missing-terminator-for-co.patch |  32 -----
 ...iroha-simplify-rx-free-packet-logic-a-bit.patch |  93 ++++++++++++++
 ...-airoha_eth-fix-packet-transmission-error.patch | 107 ----------------
 ...-airoha_eth-fix-stalling-in-package-recei.patch | 135 ---------------------
 ...-airoha_eth-enable-hw-padding-of-short-tx.patch |  64 ----------
 ...increase-the-number-of-rx-network-buffers.patch |  13 +-
 ...le-UBI-support-and-define-default-partiti.patch |  10 +-
 .../901-airoha-add-default-configuration.patch     |  18 +--
 ...-disable-environment-inside-mtd-partition.patch |  40 ++++++
 ...dts-enable-spi-support-for-en7581_evb-boa.patch |  23 ++++
 ...m-airoha-enable-position-independent-code.patch |  32 +++++
 26 files changed, 233 insertions(+), 550 deletions(-)

diff --git a/package/boot/uboot-airoha/Makefile b/package/boot/uboot-airoha/Makefile
index 0b811321d0..100cee9c4c 100644
--- a/package/boot/uboot-airoha/Makefile
+++ b/package/boot/uboot-airoha/Makefile
@@ -1,8 +1,8 @@
 include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
-PKG_VERSION:=2025.07
-PKG_HASH:=0f933f6c5a426895bf306e93e6ac53c60870e4b54cda56d95211bec99e63bec7
+PKG_VERSION:=2025.10
+PKG_HASH:=b4f032848e56cc8f213ad59f9132c084dbbb632bc29176d024e58220e0efdf4a
 PKG_BUILD_DEPENDS:=arm-trusted-firmware-tools/host
 
 UBOOT_USE_INTREE_DTC:=1
diff --git a/package/boot/uboot-airoha/patches/200-linux-bitfield.h-import-FIELD_PREP_CONST-macro-from-.patch b/package/boot/uboot-airoha/patches/200-linux-bitfield.h-import-FIELD_PREP_CONST-macro-from-.patch
deleted file mode 100644
index 6eca59fcc4..0000000000
--- a/package/boot/uboot-airoha/patches/200-linux-bitfield.h-import-FIELD_PREP_CONST-macro-from-.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From 4f1fcf5281ee4e22b1e89a62bd0417878bcbeca5 Mon Sep 17 00:00:00 2001
-From: Christian Marangi <ansuelsmth at gmail.com>
-Date: Tue, 3 Jun 2025 10:41:18 +0200
-Subject: [PATCH 1/2] linux/bitfield.h: import FIELD_PREP_CONST macro from
- Linux Kernel
-
-Import FIELD_PREP_CONST macro from Linux Kernel to permit usage of
-FIELD_PREP with scenario where a constant value is needed.
-
-Refer to commit e2192de59e45 ("bitfield: add FIELD_PREP_CONST()") in
-Linux kernel for extensive explaination of why this is useful.
-
-This is also to better align with the Linux Kernel for easier porting of
-driver.
-
-Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
----
- include/linux/bitfield.h | 26 ++++++++++++++++++++++++++
- 1 file changed, 26 insertions(+)
-
---- a/include/linux/bitfield.h
-+++ b/include/linux/bitfield.h
-@@ -90,6 +90,32 @@
- 		((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask);	\
- 	})
- 
-+#define __BF_CHECK_POW2(n)	BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0)
-+
-+/**
-+ * FIELD_PREP_CONST() - prepare a constant bitfield element
-+ * @_mask: shifted mask defining the field's length and position
-+ * @_val:  value to put in the field
-+ *
-+ * FIELD_PREP_CONST() masks and shifts up the value.  The result should
-+ * be combined with other fields of the bitfield using logical OR.
-+ *
-+ * Unlike FIELD_PREP() this is a constant expression and can therefore
-+ * be used in initializers. Error checking is less comfortable for this
-+ * version, and non-constant masks cannot be used.
-+ */
-+#define FIELD_PREP_CONST(_mask, _val)					\
-+	(								\
-+		/* mask must be non-zero */				\
-+		BUILD_BUG_ON_ZERO((_mask) == 0) +			\
-+		/* check if value fits */				\
-+		BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \
-+		/* check if mask is contiguous */			\
-+		__BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) +	\
-+		/* and create the value */				\
-+		(((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask))	\
-+	)
-+
- /**
-  * FIELD_GET() - extract a bitfield element
-  * @_mask: shifted mask defining the field's length and position
diff --git a/package/boot/uboot-airoha/patches/201-mtd-spinand-winbond-add-Winbond-W25N04KV-flash-suppo.patch b/package/boot/uboot-airoha/patches/201-mtd-spinand-winbond-add-Winbond-W25N04KV-flash-suppo.patch
deleted file mode 100644
index 17acda68a2..0000000000
--- a/package/boot/uboot-airoha/patches/201-mtd-spinand-winbond-add-Winbond-W25N04KV-flash-suppo.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From 00e8038b8be74d599f7bc8078731cc2505832f57 Mon Sep 17 00:00:00 2001
-From: Christian Marangi <ansuelsmth at gmail.com>
-Date: Tue, 3 Jun 2025 10:47:15 +0200
-Subject: [PATCH 2/2] mtd: spinand: winbond: add Winbond W25N04KV flash support
-
-Add Winbond W25N04KV flash support that use a different value to detect
-ECC bitflip.
-
-Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
----
- drivers/mtd/nand/spi/winbond.c | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
---- a/drivers/mtd/nand/spi/winbond.c
-+++ b/drivers/mtd/nand/spi/winbond.c
-@@ -11,6 +11,7 @@
- #include <linux/device.h>
- #include <linux/kernel.h>
- #endif
-+#include <linux/bitfield.h>
- #include <linux/bug.h>
- #include <linux/mtd/spinand.h>
- 
-@@ -18,6 +19,8 @@
- 
- #define WINBOND_CFG_BUF_READ		BIT(3)
- 
-+#define W25N04KV_STATUS_ECC_5_8_BITFLIPS FIELD_PREP_CONST(STATUS_ECC_MASK, 0x3)
-+
- static SPINAND_OP_VARIANTS(read_cache_variants,
- 		SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0),
- 		SPINAND_PAGE_READ_FROM_CACHE_X4_OP(0, 1, NULL, 0),
-@@ -121,6 +124,7 @@ static int w25n02kv_ecc_get_status(struc
- 		return -EBADMSG;
- 
- 	case STATUS_ECC_HAS_BITFLIPS:
-+	case W25N04KV_STATUS_ECC_5_8_BITFLIPS:
- 		/*
- 		 * Let's try to retrieve the real maximum number of bitflips
- 		 * in order to avoid forcing the wear-leveling layer to move
-@@ -169,6 +173,15 @@ static const struct spinand_info winbond
- 		     NAND_ECCREQ(8, 512),
- 		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
- 					      &write_cache_variants,
-+					      &update_cache_variants),
-+		     0,
-+		     SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
-+	SPINAND_INFO("W25N04KV",
-+		     SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xaa, 0x23),
-+		     NAND_MEMORG(1, 2048, 128, 64, 4096, 40, 2, 1, 1),
-+		     NAND_ECCREQ(8, 512),
-+		     SPINAND_INFO_OP_VARIANTS(&read_cache_variants,
-+					      &write_cache_variants,
- 					      &update_cache_variants),
- 		     0,
- 		     SPINAND_ECCINFO(&w25n02kv_ooblayout, w25n02kv_ecc_get_status)),
diff --git a/package/boot/uboot-airoha/patches/202-mtd-spinand-Use-the-spi-mem-dirmap-API.patch b/package/boot/uboot-airoha/patches/202-mtd-spinand-Use-the-spi-mem-dirmap-API.patch
index 6e425792b8..3197818931 100644
--- a/package/boot/uboot-airoha/patches/202-mtd-spinand-Use-the-spi-mem-dirmap-API.patch
+++ b/package/boot/uboot-airoha/patches/202-mtd-spinand-Use-the-spi-mem-dirmap-API.patch
@@ -17,8 +17,6 @@ Reviewed-by: Frieder Schrempf <frieder.schrempf at kontron.de>
  include/linux/mtd/spinand.h |   7 ++
  2 files changed, 95 insertions(+), 97 deletions(-)
 
-diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c
-index f5ddfbf4b83..ea00cd7dcf0 100644
 --- a/drivers/mtd/nand/spi/core.c
 +++ b/drivers/mtd/nand/spi/core.c
 @@ -41,21 +41,6 @@ struct spinand_plat {
@@ -275,7 +273,7 @@ index f5ddfbf4b83..ea00cd7dcf0 100644
  static const struct nand_ops spinand_ops = {
  	.erase = spinand_erase,
  	.markbad = spinand_markbad,
-@@ -1116,6 +1099,14 @@ static int spinand_init(struct spinand_device *spinand)
+@@ -1134,6 +1117,14 @@ static int spinand_init(struct spinand_device *spinand)
  		goto err_free_bufs;
  	}
  
@@ -315,6 +313,3 @@ index 6fe6fd520a4..163269313f6 100644
  	int (*select_target)(struct spinand_device *spinand,
  			     unsigned int target);
  	unsigned int cur_target;
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/203-spi-airoha-remove-unnecessary-operation-adjust_op_si.patch b/package/boot/uboot-airoha/patches/203-spi-airoha-remove-unnecessary-operation-adjust_op_si.patch
index 639f18fc31..79435081a3 100644
--- a/package/boot/uboot-airoha/patches/203-spi-airoha-remove-unnecessary-operation-adjust_op_si.patch
+++ b/package/boot/uboot-airoha/patches/203-spi-airoha-remove-unnecessary-operation-adjust_op_si.patch
@@ -12,8 +12,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 16 ----------------
  1 file changed, 16 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 3ea25b293d1..4eb01038404 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -525,21 +525,6 @@ static int airoha_snand_nfi_config(struct airoha_snand_priv *priv)
@@ -46,6 +44,3 @@ index 3ea25b293d1..4eb01038404 100644
  	.supports_op = airoha_snand_supports_op,
  	.exec_op = airoha_snand_exec_op,
  };
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/204-spi-airoha-add-support-of-dual-quad-wires-spi-modes-.patch b/package/boot/uboot-airoha/patches/204-spi-airoha-add-support-of-dual-quad-wires-spi-modes-.patch
index 055c8b781a..f665e2ca92 100644
--- a/package/boot/uboot-airoha/patches/204-spi-airoha-add-support-of-dual-quad-wires-spi-modes-.patch
+++ b/package/boot/uboot-airoha/patches/204-spi-airoha-add-support-of-dual-quad-wires-spi-modes-.patch
@@ -32,8 +32,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 143 +++++++++++++++++++++++++++-------
  1 file changed, 117 insertions(+), 26 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 4eb01038404..7cd409ba44a 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -186,6 +186,14 @@
@@ -257,6 +255,3 @@ index 4eb01038404..7cd409ba44a 100644
  		if (err)
  			return err;
  	}
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/205-spi-airoha-add-dma-support.patch b/package/boot/uboot-airoha/patches/205-spi-airoha-add-dma-support.patch
index 0a4a56d0e9..982af4cf9d 100644
--- a/package/boot/uboot-airoha/patches/205-spi-airoha-add-dma-support.patch
+++ b/package/boot/uboot-airoha/patches/205-spi-airoha-add-dma-support.patch
@@ -19,8 +19,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 309 ++++++++++++++++++++++++++++++++++
  1 file changed, 309 insertions(+)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 7cd409ba44a..f72d11f5b19 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -141,12 +141,14 @@
@@ -373,6 +371,3 @@ index 7cd409ba44a..f72d11f5b19 100644
  };
  
  static const struct dm_spi_ops airoha_snfi_spi_ops = {
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/206-spi-airoha-support-of-dualio-quadio-flash-reading-co.patch b/package/boot/uboot-airoha/patches/206-spi-airoha-support-of-dualio-quadio-flash-reading-co.patch
index 8defba35ae..f2d8ef4404 100644
--- a/package/boot/uboot-airoha/patches/206-spi-airoha-support-of-dualio-quadio-flash-reading-co.patch
+++ b/package/boot/uboot-airoha/patches/206-spi-airoha-support-of-dualio-quadio-flash-reading-co.patch
@@ -15,8 +15,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 27 +++++++++++++++++++++------
  1 file changed, 21 insertions(+), 6 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index f72d11f5b19..7cafa900bbc 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -141,6 +141,7 @@
@@ -89,6 +87,3 @@ index f72d11f5b19..7cafa900bbc 100644
  	if (err)
  		goto error_dma_unmap;
  
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/207-spi-airoha-avoid-setting-of-page-oob-sizes-in-REG_SP.patch b/package/boot/uboot-airoha/patches/207-spi-airoha-avoid-setting-of-page-oob-sizes-in-REG_SP.patch
index 30df31bd7c..a619627347 100644
--- a/package/boot/uboot-airoha/patches/207-spi-airoha-avoid-setting-of-page-oob-sizes-in-REG_SP.patch
+++ b/package/boot/uboot-airoha/patches/207-spi-airoha-avoid-setting-of-page-oob-sizes-in-REG_SP.patch
@@ -13,8 +13,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 38 -----------------------------------
  1 file changed, 38 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 7cafa900bbc..71e4fc13924 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -514,44 +514,6 @@ static int airoha_snand_nfi_config(struct airoha_snand_priv *priv)
@@ -62,6 +60,3 @@ index 7cafa900bbc..71e4fc13924 100644
  	/* sec num */
  	val = FIELD_PREP(SPI_NFI_SEC_NUM, priv->nfi_cfg.sec_num);
  	err = regmap_update_bits(priv->regmap_nfi, REG_SPI_NFI_CON,
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/208-spi-airoha-reduce-the-number-of-modification-of-REG_.patch b/package/boot/uboot-airoha/patches/208-spi-airoha-reduce-the-number-of-modification-of-REG_.patch
index 278276df00..92db90e5d2 100644
--- a/package/boot/uboot-airoha/patches/208-spi-airoha-reduce-the-number-of-modification-of-REG_.patch
+++ b/package/boot/uboot-airoha/patches/208-spi-airoha-reduce-the-number-of-modification-of-REG_.patch
@@ -15,8 +15,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 134 +++++++++++++++++++++++++---------
  1 file changed, 101 insertions(+), 33 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 71e4fc13924..1fcf5dd89e9 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -641,7 +641,47 @@ static ssize_t airoha_snand_dirmap_read(struct spi_mem_dirmap_desc *desc,
@@ -195,6 +193,3 @@ index 71e4fc13924..1fcf5dd89e9 100644
  	err = regmap_write(priv->regmap_nfi, REG_SPI_NFI_CMD, 0x80);
  	if (err)
  		goto error_dma_unmap;
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/209-spi-airoha-set-custom-sector-size-equal-to-flash-pag.patch b/package/boot/uboot-airoha/patches/209-spi-airoha-set-custom-sector-size-equal-to-flash-pag.patch
index dd7a0ff2c1..55a953d148 100644
--- a/package/boot/uboot-airoha/patches/209-spi-airoha-set-custom-sector-size-equal-to-flash-pag.patch
+++ b/package/boot/uboot-airoha/patches/209-spi-airoha-set-custom-sector-size-equal-to-flash-pag.patch
@@ -16,8 +16,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 35 +++++++++++++++++++----------------
  1 file changed, 19 insertions(+), 16 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index 1fcf5dd89e9..c9feef83f89 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -515,7 +515,7 @@ static int airoha_snand_nfi_config(struct airoha_snand_priv *priv)
@@ -135,6 +133,3 @@ index 1fcf5dd89e9..c9feef83f89 100644
  	if (err)
  		goto error_dma_unmap;
  
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/210-spi-airoha-avoid-usage-of-flash-specific-parameters.patch b/package/boot/uboot-airoha/patches/210-spi-airoha-avoid-usage-of-flash-specific-parameters.patch
index 688372557e..216a515a98 100644
--- a/package/boot/uboot-airoha/patches/210-spi-airoha-avoid-usage-of-flash-specific-parameters.patch
+++ b/package/boot/uboot-airoha/patches/210-spi-airoha-avoid-usage-of-flash-specific-parameters.patch
@@ -30,8 +30,6 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  drivers/spi/airoha_snfi_spi.c | 94 ++---------------------------------
  1 file changed, 4 insertions(+), 90 deletions(-)
 
-diff --git a/drivers/spi/airoha_snfi_spi.c b/drivers/spi/airoha_snfi_spi.c
-index c9feef83f89..37fee0c6655 100644
 --- a/drivers/spi/airoha_snfi_spi.c
 +++ b/drivers/spi/airoha_snfi_spi.c
 @@ -218,13 +218,6 @@ struct airoha_snand_priv {
@@ -170,6 +168,3 @@ index c9feef83f89..37fee0c6655 100644
  };
  
  static const struct udevice_id airoha_snand_ids[] = {
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/300-airoha-add-support-for-Airoha-AN7583-SoC.patch b/package/boot/uboot-airoha/patches/300-airoha-add-support-for-Airoha-AN7583-SoC.patch
index 8c7b6a22dd..aa3a0f1df9 100644
--- a/package/boot/uboot-airoha/patches/300-airoha-add-support-for-Airoha-AN7583-SoC.patch
+++ b/package/boot/uboot-airoha/patches/300-airoha-add-support-for-Airoha-AN7583-SoC.patch
@@ -19,9 +19,9 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  board/airoha/an7583/MAINTAINERS      |   5 +
  board/airoha/an7583/Makefile         |   3 +
  board/airoha/an7583/an7583_rfb.c     |  16 ++
- configs/an7583_evb_defconfig         |  83 ++++++
+ configs/an7583_evb_defconfig         |  81 ++++++
  include/configs/an7583.h             |  19 ++
- 11 files changed, 645 insertions(+)
+ 11 files changed, 643 insertions(+)
  create mode 100644 arch/arm/dts/an7583-evb.dts
  create mode 100644 arch/arm/dts/an7583.dtsi
  create mode 100644 arch/arm/mach-airoha/an7583/Makefile
@@ -667,7 +667,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +CONFIG_CMD_LOG=y
 +CONFIG_ENV_OVERWRITE=y
 +CONFIG_ENV_IS_IN_MMC=y
-+CONFIG_SYS_RELOC_GD_ENV_ADDR=y
++CONFIG_ENV_RELOC_GD_ENV_ADDR=y
 +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
 +CONFIG_NET_RANDOM_ETHADDR=y
 +CONFIG_REGMAP=y
diff --git a/package/boot/uboot-airoha/patches/303-reset-airoha-Add-support-for-Airoha-AN7583-reset.patch b/package/boot/uboot-airoha/patches/303-reset-airoha-Add-support-for-Airoha-AN7583-reset.patch
index 033814f539..d0d563a647 100644
--- a/package/boot/uboot-airoha/patches/303-reset-airoha-Add-support-for-Airoha-AN7583-reset.patch
+++ b/package/boot/uboot-airoha/patches/303-reset-airoha-Add-support-for-Airoha-AN7583-reset.patch
@@ -96,7 +96,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  static int airoha_reset_update(struct airoha_reset_priv *priv,
  			       unsigned long id, bool assert)
  {
-@@ -135,7 +191,7 @@ static int airoha_reset_xlate(struct res
+@@ -135,7 +191,7 @@ static int airoha_reset_xlate(struct reset_ctl *reset_ctl,
  {
  	struct airoha_reset_priv *priv = dev_get_priv(reset_ctl->dev);
  
@@ -105,7 +105,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  		return -EINVAL;
  
  	reset_ctl->id = priv->idx_map[args->args[0]];
-@@ -150,7 +206,7 @@ static struct reset_ops airoha_reset_ops
+@@ -150,7 +206,7 @@ static struct reset_ops airoha_reset_ops = {
  	.rst_status = airoha_reset_status,
  };
  
@@ -114,15 +114,15 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  {
  	struct airoha_reset_priv *priv = dev_get_priv(dev);
  	int ret;
-@@ -161,10 +217,44 @@ static int airoha_reset_probe(struct ude
+@@ -161,10 +217,44 @@ static int airoha_reset_probe(struct udevice *dev)
  
  	priv->bank_ofs = en7581_rst_ofs;
  	priv->idx_map = en7581_rst_map;
 +	priv->num_rsts = ARRAY_SIZE(en7581_rst_map);
- 
- 	return 0;
- }
- 
++
++	return 0;
++}
++
 +static int an7583_reset_probe(struct udevice *dev)
 +{
 +	struct airoha_reset_priv *priv = dev_get_priv(dev);
@@ -139,10 +139,10 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +	priv->bank_ofs = en7581_rst_ofs;
 +	priv->idx_map = an7583_rst_map;
 +	priv->num_rsts = ARRAY_SIZE(an7583_rst_map);
-+
-+	return 0;
-+}
-+
+ 
+ 	return 0;
+ }
+ 
 +static int airoha_reset_probe(struct udevice *dev)
 +{
 +	if (ofnode_device_is_compatible(dev_ofnode(dev),
@@ -223,3 +223,4 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +#define AN7583_XPON_MAC_RST		47
 +
 +#endif /* __DT_BINDINGS_RESET_CONTROLLER_AIROHA_AN7583_H_ */
+
diff --git a/package/boot/uboot-airoha/patches/304-net-airoha-add-support-for-Airoha-AN7583.patch b/package/boot/uboot-airoha/patches/304-net-airoha-add-support-for-Airoha-AN7583.patch
index bc9eb3c610..60cdf43e82 100644
--- a/package/boot/uboot-airoha/patches/304-net-airoha-add-support-for-Airoha-AN7583.patch
+++ b/package/boot/uboot-airoha/patches/304-net-airoha-add-support-for-Airoha-AN7583.patch
@@ -1,7 +1,7 @@
-From 289503869e5580658035e82d91b02a43c775f1a1 Mon Sep 17 00:00:00 2001
+From dfdc7309ba22f6a6b6c581acfe95a222108bd760 Mon Sep 17 00:00:00 2001
 From: Christian Marangi <ansuelsmth at gmail.com>
 Date: Mon, 19 May 2025 14:29:53 +0200
-Subject: [PATCH 1/4] net: airoha: add support for Airoha AN7583
+Subject: [PATCH] net: airoha: add support for Airoha AN7583
 
 Add support for Ethernet controller present in Airoha AN7583. This
 follow the same implementation of Airoha AN7581 with the only difference
@@ -61,7 +61,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  
  /* FE */
  #define PSE_BASE			0x0100
-@@ -311,6 +330,26 @@ struct airoha_eth {
+@@ -312,6 +331,26 @@ struct airoha_eth {
  	struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
  };
  
@@ -88,7 +88,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  static u32 airoha_rr(void __iomem *base, u32 offset)
  {
  	return readl(base + offset);
-@@ -351,8 +390,12 @@ static u32 airoha_rmw(void __iomem *base
+@@ -352,8 +391,12 @@ static u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val)
  #define airoha_qdma_clear(qdma, offset, val)			\
  	airoha_rmw((qdma)->regs, (offset), (val), 0)
  
@@ -99,9 +99,9 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +#define airoha_switch_rmw(eth, offset, mask, val)		\
 +	airoha_rmw((eth)->switch_regs, (offset), (mask), (val))
  
- static void airoha_fe_maccr_init(struct airoha_eth *eth)
- {
-@@ -652,10 +695,12 @@ static int airoha_hw_init(struct udevice
+ static inline dma_addr_t dma_map_unaligned(void *vaddr, size_t len,
+ 					   enum dma_data_direction dir)
+@@ -682,10 +725,12 @@ static int airoha_hw_init(struct udevice *dev,
  
  static int airoha_switch_init(struct udevice *dev, struct airoha_eth *eth)
  {
@@ -115,7 +115,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  	if (!ofnode_valid(switch_node))
  		return -EINVAL;
  
-@@ -687,17 +732,71 @@ static int airoha_switch_init(struct ude
+@@ -717,17 +762,71 @@ static int airoha_switch_init(struct udevice *dev, struct airoha_eth *eth)
  			 FIELD_PREP(SWITCH_PHY_END_ADDR, 0xc) |
  			 FIELD_PREP(SWITCH_PHY_ST_ADDR, 0x8));
  
@@ -189,7 +189,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  	if (!ofnode_valid(scu_node))
  		return -EINVAL;
  
-@@ -721,11 +820,11 @@ static int airoha_eth_probe(struct udevi
+@@ -751,11 +850,11 @@ static int airoha_eth_probe(struct udevice *dev)
  		return -ENOMEM;
  	eth->rsts.count = AIROHA_MAX_NUM_RSTS;
  
@@ -203,7 +203,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  
  	ret = reset_get_by_name(dev, "fe", &eth->rsts.resets[0]);
  	if (ret)
-@@ -739,21 +838,12 @@ static int airoha_eth_probe(struct udevi
+@@ -769,21 +868,12 @@ static int airoha_eth_probe(struct udevice *dev)
  	if (ret)
  		return ret;
  
@@ -231,11 +231,10 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  
  	ret = airoha_hw_init(dev, eth);
  	if (ret)
-@@ -924,8 +1014,44 @@ static int arht_eth_write_hwaddr(struct
+@@ -971,8 +1061,43 @@ static int arht_eth_write_hwaddr(struct udevice *dev)
  	return 0;
  }
  
-+
 +static ofnode en7581_get_scu_node(struct udevice *dev)
 +{
 +	return ofnode_by_compatible(ofnode_null(), "airoha,en7581-scu");
@@ -274,6 +273,6 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +	{ .compatible = "airoha,an7583-eth",
 +	  .data = (ulong)&an7583_data,
 +	},
+ 	{ }
  };
  
- static const struct eth_ops airoha_eth_ops = {
diff --git a/package/boot/uboot-airoha/patches/500-drivers-net-airoha_eth-add-missing-terminator-for-co.patch b/package/boot/uboot-airoha/patches/500-drivers-net-airoha_eth-add-missing-terminator-for-co.patch
deleted file mode 100644
index befdfac6b1..0000000000
--- a/package/boot/uboot-airoha/patches/500-drivers-net-airoha_eth-add-missing-terminator-for-co.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From a11420dac873fbd5b8a81192571d914f01bee26d Mon Sep 17 00:00:00 2001
-From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
-Date: Wed, 9 Jul 2025 12:28:07 +0300
-Subject: [PATCH 1/5] drivers/net/airoha_eth: add missing terminator for
- compatible devices list
-
-Compatible device list must have a terminator. If terminator is missed
-the u-boot driver subsystem will access random data placed after the
-list in the memory.
-
-The issue can be observed with the "dm compat" command.
-
-Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
----
- drivers/net/airoha_eth.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/net/airoha_eth.c b/drivers/net/airoha_eth.c
-index b3fd1ab9064..db34ec48c81 100644
---- a/drivers/net/airoha_eth.c
-+++ b/drivers/net/airoha_eth.c
-@@ -1052,6 +1052,7 @@ static const struct udevice_id airoha_eth_ids[] = {
- 	{ .compatible = "airoha,an7583-eth",
- 	  .data = (ulong)&an7583_data,
- 	},
-+	{ }
- };
- 
- static const struct eth_ops airoha_eth_ops = {
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/500-net-airoha-simplify-rx-free-packet-logic-a-bit.patch b/package/boot/uboot-airoha/patches/500-net-airoha-simplify-rx-free-packet-logic-a-bit.patch
new file mode 100644
index 0000000000..41871e4a25
--- /dev/null
+++ b/package/boot/uboot-airoha/patches/500-net-airoha-simplify-rx-free-packet-logic-a-bit.patch
@@ -0,0 +1,93 @@
+From e7b7bd119b68fe9106a1c9a45a7eba811fc40ce0 Mon Sep 17 00:00:00 2001
+From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+Date: Fri, 3 Oct 2025 20:12:06 +0300
+Subject: [PATCH v2 1/2] net: airoha: simplify rx/free packet logic a bit
+
+The commit 997786bbf473 ("drivers/net/airoha_eth: fix stalling in package
+receiving") can be improved. Instead of returning previous descriptor
+it's possible:
+ * do nothing in even descriptor case
+ * return 2 descriptor to the queue (current and previous) in the odd
+   descriptor case.
+
+This patch:
+ * implements above approach
+ * remove logic not required within new approach
+ * adds note that PKTBUFSRX must be even and larger than 7
+   for reliable driver operations
+
+Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+---
+ drivers/net/airoha_eth.c | 40 +++++++++++++++++++++-------------------
+ 1 file changed, 21 insertions(+), 19 deletions(-)
+
+--- a/drivers/net/airoha_eth.c
++++ b/drivers/net/airoha_eth.c
+@@ -492,14 +492,10 @@ static int airoha_qdma_init_rx_queue(struct airoha_queue *q,
+ 			RX_RING_SIZE_MASK,
+ 			FIELD_PREP(RX_RING_SIZE_MASK, ndesc));
+ 
+-	/*
+-	 * See arht_eth_free_pkt() for the reasons used to fill
+-	 * REG_RX_CPU_IDX(qid) register.
+-	 */
+ 	airoha_qdma_rmw(qdma, REG_RX_RING_SIZE(qid), RX_RING_THR_MASK,
+ 			FIELD_PREP(RX_RING_THR_MASK, 0));
+ 	airoha_qdma_rmw(qdma, REG_RX_CPU_IDX(qid), RX_RING_CPU_IDX_MASK,
+-			FIELD_PREP(RX_RING_CPU_IDX_MASK, q->ndesc - 3));
++			FIELD_PREP(RX_RING_CPU_IDX_MASK, q->ndesc - 1));
+ 	airoha_qdma_rmw(qdma, REG_RX_DMA_IDX(qid), RX_RING_DMA_IDX_MASK,
+ 			FIELD_PREP(RX_RING_DMA_IDX_MASK, q->head));
+ 
+@@ -1010,7 +1006,6 @@ static int arht_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
+ 	struct airoha_qdma *qdma = &eth->qdma[0];
+ 	struct airoha_queue *q;
+ 	int qid;
+-	u16 prev, pprev;
+ 
+ 	if (!packet)
+ 		return 0;
+@@ -1020,22 +1015,29 @@ static int arht_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
+ 
+ 	/*
+ 	 * Due to cpu cache issue the airoha_qdma_reset_rx_desc() function
+-	 * will always touch 2 descriptors:
+-	 *   - if current descriptor is even, then the previous and the one
+-	 *     before previous descriptors will be touched (previous cacheline)
+-	 *   - if current descriptor is odd, then only current and previous
+-	 *     descriptors will be touched (current cacheline)
++	 * will always touch 2 descriptors placed on the same cacheline:
++	 *   - if current descriptor is even, then current and next
++	 *     descriptors will be touched
++	 *   - if current descriptor is odd, then current and previous
++	 *     descriptors will be touched
+ 	 *
+-	 * Thus, to prevent possible destroying of rx queue, only (q->ndesc - 2)
+-	 * descriptors might be used for packet receiving.
++	 * Thus, to prevent possible destroying of rx queue, we should:
++	 *   - do nothing in the even descriptor case,
++	 *   - utilize 2 descriptors (current and previous one) in the
++	 *     odd descriptor case.
++	 *
++	 * WARNING: Observations shows that PKTBUFSRX must be even and
++	 *          larger than 7 for reliable driver operations.
+ 	 */
+-	prev  = (q->head + q->ndesc - 1) % q->ndesc;
+-	pprev = (q->head + q->ndesc - 2) % q->ndesc;
+-	q->head = (q->head + 1) % q->ndesc;
++	if (q->head & 0x01) {
++		airoha_qdma_reset_rx_desc(q, q->head - 1);
++		airoha_qdma_reset_rx_desc(q, q->head);
+ 
+-	airoha_qdma_reset_rx_desc(q, prev);
+-	airoha_qdma_rmw(qdma, REG_RX_CPU_IDX(qid), RX_RING_CPU_IDX_MASK,
+-			FIELD_PREP(RX_RING_CPU_IDX_MASK, pprev));
++		airoha_qdma_rmw(qdma, REG_RX_CPU_IDX(qid), RX_RING_CPU_IDX_MASK,
++				FIELD_PREP(RX_RING_CPU_IDX_MASK, q->head));
++	}
++
++	q->head = (q->head + 1) % q->ndesc;
+ 
+ 	return 0;
+ }
+
diff --git a/package/boot/uboot-airoha/patches/501-drivers-net-airoha_eth-fix-packet-transmission-error.patch b/package/boot/uboot-airoha/patches/501-drivers-net-airoha_eth-fix-packet-transmission-error.patch
deleted file mode 100644
index 269dcf585f..0000000000
--- a/package/boot/uboot-airoha/patches/501-drivers-net-airoha_eth-fix-packet-transmission-error.patch
+++ /dev/null
@@ -1,107 +0,0 @@
-From 8fce1cfe775e1f3b5d7cecb8bdcc8271bf9f799c Mon Sep 17 00:00:00 2001
-From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
-Date: Wed, 9 Jul 2025 12:28:08 +0300
-Subject: [PATCH 2/5] drivers/net/airoha_eth: fix packet transmission errors
-
-The dma_map_single() function calls one of the functions
-  * invalidate_dcache_range(),
-  * flush_dcache_range().
-Both of them expect that 'vaddr' is aligned to the ARCH_DMA_MINALIGN
-boundary. Unfortunately, RX/TX descriptors are 32-byte long. Thus they
-might not be aligned to the ARCH_DMA_MINALIGN boundary. Data flushing
-(or invalidating) might do nothing in this case.
-
-The same applies to dma_unmap_single() function.
-
-In the TX path case the issue might prevent package transmission (filled
-TX descriptor was not flushed).
-
-To fix an issue a special wrappers for
-  * dma_map_single(),
-  * dma_unmap_single()
-functions were created. The patch fix flushing/invalidatiog for the
-RX path as well.
-
-The bug appears on 32-bit airoha platform, but should be present on
-64-bit as well.
-
-The code was tested both on 32-bit and 64-bit airoha boards.
-
-Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
----
- drivers/net/airoha_eth.c | 33 +++++++++++++++++++++++++++------
- 1 file changed, 27 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/net/airoha_eth.c b/drivers/net/airoha_eth.c
-index db34ec48c81..aae6922f3c7 100644
---- a/drivers/net/airoha_eth.c
-+++ b/drivers/net/airoha_eth.c
-@@ -397,6 +397,27 @@ static u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val)
- #define airoha_switch_rmw(eth, offset, mask, val)		\
- 	airoha_rmw((eth)->switch_regs, (offset), (mask), (val))
- 
-+static inline dma_addr_t dma_map_unaligned(void *vaddr, size_t len,
-+					   enum dma_data_direction dir)
-+{
-+	uintptr_t start, end;
-+
-+	start = ALIGN_DOWN((uintptr_t)vaddr, ARCH_DMA_MINALIGN);
-+	end = ALIGN((uintptr_t)(vaddr + len), ARCH_DMA_MINALIGN);
-+
-+	return dma_map_single((void *)start, end - start, dir);
-+}
-+
-+static inline void dma_unmap_unaligned(dma_addr_t addr, size_t len,
-+				       enum dma_data_direction dir)
-+{
-+	uintptr_t start, end;
-+
-+	start = ALIGN_DOWN((uintptr_t)addr, ARCH_DMA_MINALIGN);
-+	end = ALIGN((uintptr_t)(addr + len), ARCH_DMA_MINALIGN);
-+	dma_unmap_single(start, end - start, dir);
-+}
-+
- static void airoha_fe_maccr_init(struct airoha_eth *eth)
- {
- 	int p;
-@@ -434,7 +455,7 @@ static void airoha_qdma_reset_rx_desc(struct airoha_queue *q, int index,
- 	val = FIELD_PREP(QDMA_DESC_LEN_MASK, PKTSIZE_ALIGN);
- 	WRITE_ONCE(desc->ctrl, cpu_to_le32(val));
- 
--	dma_map_single(desc, sizeof(*desc), DMA_TO_DEVICE);
-+	dma_map_unaligned(desc, sizeof(*desc), DMA_TO_DEVICE);
- }
- 
- static void airoha_qdma_init_rx_desc(struct airoha_queue *q)
-@@ -916,14 +937,14 @@ static int airoha_eth_send(struct udevice *dev, void *packet, int length)
- 	WRITE_ONCE(desc->msg1, cpu_to_le32(msg1));
- 	WRITE_ONCE(desc->msg2, cpu_to_le32(0xffff));
- 
--	dma_map_single(desc, sizeof(*desc), DMA_TO_DEVICE);
-+	dma_map_unaligned(desc, sizeof(*desc), DMA_TO_DEVICE);
- 
- 	airoha_qdma_rmw(qdma, REG_TX_CPU_IDX(qid), TX_RING_CPU_IDX_MASK,
- 			FIELD_PREP(TX_RING_CPU_IDX_MASK, index));
- 
- 	for (i = 0; i < 100; i++) {
--		dma_unmap_single(virt_to_phys(desc), sizeof(*desc),
--				 DMA_FROM_DEVICE);
-+		dma_unmap_unaligned(virt_to_phys(desc), sizeof(*desc),
-+				    DMA_FROM_DEVICE);
- 		if (desc->ctrl & QDMA_DESC_DONE_MASK)
- 			break;
- 
-@@ -954,8 +975,8 @@ static int airoha_eth_recv(struct udevice *dev, int flags, uchar **packetp)
- 	q = &qdma->q_rx[qid];
- 	desc = &q->desc[q->head];
- 
--	dma_unmap_single(virt_to_phys(desc), sizeof(*desc),
--			 DMA_FROM_DEVICE);
-+	dma_unmap_unaligned(virt_to_phys(desc), sizeof(*desc),
-+			    DMA_FROM_DEVICE);
- 
- 	if (!(desc->ctrl & QDMA_DESC_DONE_MASK))
- 		return -EAGAIN;
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/502-drivers-net-airoha_eth-fix-stalling-in-package-recei.patch b/package/boot/uboot-airoha/patches/502-drivers-net-airoha_eth-fix-stalling-in-package-recei.patch
deleted file mode 100644
index 590bdfb81f..0000000000
--- a/package/boot/uboot-airoha/patches/502-drivers-net-airoha_eth-fix-stalling-in-package-recei.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From 352c071bc18855238565cc6417a4c15a4e24bad8 Mon Sep 17 00:00:00 2001
-From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
-Date: Wed, 9 Jul 2025 12:28:09 +0300
-Subject: [PATCH 3/5] drivers/net/airoha_eth: fix stalling in package
- receiving
-
-ARCH_DMA_MINALIGN is 64 for ARMv7a/ARMv8a architectures, but RX/TX
-descriptors are 32 bytes long. So they may not be aligned on an
-ARCH_DMA_MINALIGN boundary. In case of RX path, this may cause the
-following problem
-
-1) Assume that a packet has arrived and the EVEN rx descriptor has been
-   updated with the incoming data. The driver will invalidate and check
-   the corresponding rx descriptor.
-
-2) Now suppose the next descriptor (ODD) has not yet completed.
-
-   Please note that all even descriptors starts on 64-byte boundary,
-   and the odd ones are NOT aligned on 64-byte boundary.
-
-   Inspecting even descriptor, we will read the entire CPU cache line
-   (64 bytes). So we read and sore in CPU cache also the next (odd)
-   descriptor.
-
-3) Now suppose the next packet (for the odd rx descriptor) arrived
-   while the first packet was being processed. So we have new data
-   in memory but old data in cache.
-
-4) After packet processing (in arht_eth_free_pkt() function) we will
-   cleanup the descriptor and put it back to rx queue.
-
-   This will call flush_dcache_range() function for the even descriptor,
-   so the odd one will be flushed as well (it is in the same cache line).
-   So the old data will be written to the next rx descriptor.
-
-5) We get a freeze. The next descriptor is empty (so the driver is
-   waiting for packets), but the hardware will continue to receive
-   packets on other available descriptors. This will continue until
-   the last available rx descriptor is full. Then the hardware will
-   also freeze.
-
-The problem will be solved if:
-  * do nothing in even descriptor case,
-  * return 2 descriptor to the queue (current and previous) in the odd
-    descriptor case.
-
-If the current descriptor is even nothing will be done, so no issue
-will arrise.
-
-If the current descriptor is odd, then the previous descriptor is on
-the same cache line. Both (current and previous) descriptors are not
-currently in use, so issue will not arrise as well.
-
-WARNING: The following restrictions on PKTBUFSRX must be held:
-  * PKTBUFSRX is even,
-  * PKTBUFSRX >= 4. Observations shows that PKTBUFSRX must be at least 8.
-
-The bug appears on 32-bit airoha platform, but should be present on
-64-bit as well.
-
-The code was tested both on 32-bit and 64-bit airoha boards.
-
-Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
----
- drivers/net/airoha_eth.c | 33 ++++++++++++++++++++++++++-------
- 1 file changed, 26 insertions(+), 7 deletions(-)
-
-diff --git a/drivers/net/airoha_eth.c b/drivers/net/airoha_eth.c
-index aae6922f3c7..44d4773bc5d 100644
---- a/drivers/net/airoha_eth.c
-+++ b/drivers/net/airoha_eth.c
-@@ -435,13 +435,14 @@ static int airoha_fe_init(struct airoha_eth *eth)
- 	return 0;
- }
- 
--static void airoha_qdma_reset_rx_desc(struct airoha_queue *q, int index,
--				      uchar *rx_packet)
-+static void airoha_qdma_reset_rx_desc(struct airoha_queue *q, int index)
- {
- 	struct airoha_qdma_desc *desc;
-+	uchar *rx_packet;
- 	u32 val;
- 
- 	desc = &q->desc[index];
-+	rx_packet = net_rx_packets[index];
- 	index = (index + 1) % q->ndesc;
- 
- 	dma_map_single(rx_packet, PKTSIZE_ALIGN, DMA_TO_DEVICE);
-@@ -463,7 +464,7 @@ static void airoha_qdma_init_rx_desc(struct airoha_queue *q)
- 	int i;
- 
- 	for (i = 0; i < q->ndesc; i++)
--		airoha_qdma_reset_rx_desc(q, i, net_rx_packets[i]);
-+		airoha_qdma_reset_rx_desc(q, i);
- }
- 
- static int airoha_qdma_init_rx_queue(struct airoha_queue *q,
-@@ -1003,12 +1004,30 @@ static int arht_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
- 	qid = 0;
- 	q = &qdma->q_rx[qid];
- 
--	dma_map_single(packet, length, DMA_TO_DEVICE);
-+	/*
-+	 * Due to cpu cache issue the airoha_qdma_reset_rx_desc() function
-+	 * will always touch 2 descriptors placed on the same cacheline:
-+	 *   - if current descriptor is even, then current and next
-+	 *     descriptors will be touched
-+	 *   - if current descriptor is odd, then current and previous
-+	 *     descriptors will be touched
-+	 *
-+	 * Thus, to prevent possible destroying of rx queue, we should:
-+	 *   - do nothing in the even descriptor case,
-+	 *   - utilize 2 descriptors (current and previous one) in the
-+	 *     odd descriptor case.
-+	 *
-+	 * WARNING: Observations shows that PKTBUFSRX must be even and
-+	 *          larger than 7 for reliable driver operations.
-+	 */
-+	if (q->head & 0x01) {
-+		airoha_qdma_reset_rx_desc(q, q->head - 1);
-+		airoha_qdma_reset_rx_desc(q, q->head);
- 
--	airoha_qdma_reset_rx_desc(q, q->head, packet);
-+		airoha_qdma_rmw(qdma, REG_RX_CPU_IDX(qid), RX_RING_CPU_IDX_MASK,
-+				FIELD_PREP(RX_RING_CPU_IDX_MASK, q->head));
-+	}
- 
--	airoha_qdma_rmw(qdma, REG_RX_CPU_IDX(qid), RX_RING_CPU_IDX_MASK,
--			FIELD_PREP(RX_RING_CPU_IDX_MASK, q->head));
- 	q->head = (q->head + 1) % q->ndesc;
- 
- 	return 0;
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/503-drivers-net-airoha_eth-enable-hw-padding-of-short-tx.patch b/package/boot/uboot-airoha/patches/503-drivers-net-airoha_eth-enable-hw-padding-of-short-tx.patch
deleted file mode 100644
index b109be1e48..0000000000
--- a/package/boot/uboot-airoha/patches/503-drivers-net-airoha_eth-enable-hw-padding-of-short-tx.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From dc0ae3455f4344403e293c9b385653ad3fddb0b1 Mon Sep 17 00:00:00 2001
-From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
-Date: Wed, 9 Jul 2025 12:28:10 +0300
-Subject: [PATCH 4/5] drivers/net/airoha_eth: enable hw padding of short tx
- packets
-
-Transmission of short packets does not work good for XFI (GDM2) and
-HSGMII (GDM3) interfaces. The issue can be solved with:
-
- - padding of short packets to 60 bytes
- - setting of PAD_EN bit in the corresponding REG_GDM_FWD_CFG(n)
-   register.
-
-The issue should present for the lan switch (GDM1) as well, but it does
-does not appear due to unknown reason.
-
-This patch set PAD_EN bit for the used GDM.
-
-Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
----
- drivers/net/airoha_eth.c | 13 +++++++++++--
- 1 file changed, 11 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/net/airoha_eth.c b/drivers/net/airoha_eth.c
-index 53c722379c9..b2f73c7dbb7 100644
---- a/drivers/net/airoha_eth.c
-+++ b/drivers/net/airoha_eth.c
-@@ -116,6 +116,7 @@
- 	 (_n) == 2 ? GDM2_BASE : GDM1_BASE)
- 
- #define REG_GDM_FWD_CFG(_n)		GDM_BASE(_n)
-+#define GDM_PAD_EN			BIT(28)
- #define GDM_DROP_CRC_ERR		BIT(23)
- #define GDM_IP4_CKSUM			BIT(22)
- #define GDM_TCP_CKSUM			BIT(21)
-@@ -423,8 +424,11 @@ static void airoha_fe_maccr_init(struct airoha_eth *eth)
- 	int p;
- 
- 	for (p = 1; p <= ARRAY_SIZE(eth->ports); p++) {
--		/* Disable any kind of CRC drop or offload */
--		airoha_fe_wr(eth, REG_GDM_FWD_CFG(p), 0);
-+		/*
-+		 * Disable any kind of CRC drop or offload.
-+		 * Enable padding of short TX packets to 60 bytes.
-+		 */
-+		airoha_fe_wr(eth, REG_GDM_FWD_CFG(p), GDM_PAD_EN);
- 	}
- }
- 
-@@ -920,6 +924,11 @@ static int airoha_eth_send(struct udevice *dev, void *packet, int length)
- 	u32 val;
- 	int i;
- 
-+	/*
-+	 * There is no need to pad short TX packets to 60 bytes since the
-+	 * GDM_PAD_EN bit set in the corresponding REG_GDM_FWD_CFG(n) register.
-+	 */
-+
- 	dma_addr = dma_map_single(packet, length, DMA_TO_DEVICE);
- 
- 	qid = 0;
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/504-net-airoha-increase-the-number-of-rx-network-buffers.patch b/package/boot/uboot-airoha/patches/504-net-airoha-increase-the-number-of-rx-network-buffers.patch
index 903d76de61..6193397977 100644
--- a/package/boot/uboot-airoha/patches/504-net-airoha-increase-the-number-of-rx-network-buffers.patch
+++ b/package/boot/uboot-airoha/patches/504-net-airoha-increase-the-number-of-rx-network-buffers.patch
@@ -13,30 +13,23 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
  configs/an7583_evb_defconfig | 1 +
  2 files changed, 2 insertions(+)
 
-diff --git a/configs/an7581_evb_defconfig b/configs/an7581_evb_defconfig
-index c74247e13db..aa1a30aad6a 100644
 --- a/configs/an7581_evb_defconfig
 +++ b/configs/an7581_evb_defconfig
-@@ -44,6 +44,7 @@ CONFIG_ENV_IS_IN_MMC=y
- CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+@@ -43,6 +43,7 @@ CONFIG_ENV_IS_IN_MMC=y
+ CONFIG_ENV_RELOC_GD_ENV_ADDR=y
  CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
  CONFIG_NET_RANDOM_ETHADDR=y
 +CONFIG_SYS_RX_ETH_BUFFER=8
  CONFIG_REGMAP=y
  CONFIG_SYSCON=y
  CONFIG_CLK=y
-diff --git a/configs/an7583_evb_defconfig b/configs/an7583_evb_defconfig
-index 057104b93af..c67444ae8bf 100644
 --- a/configs/an7583_evb_defconfig
 +++ b/configs/an7583_evb_defconfig
 @@ -44,6 +44,7 @@ CONFIG_ENV_IS_IN_MMC=y
- CONFIG_SYS_RELOC_GD_ENV_ADDR=y
+ CONFIG_ENV_RELOC_GD_ENV_ADDR=y
  CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
  CONFIG_NET_RANDOM_ETHADDR=y
 +CONFIG_SYS_RX_ETH_BUFFER=8
  CONFIG_REGMAP=y
  CONFIG_SYSCON=y
  CONFIG_CLK=y
--- 
-2.51.0
-
diff --git a/package/boot/uboot-airoha/patches/900-airoha-enable-UBI-support-and-define-default-partiti.patch b/package/boot/uboot-airoha/patches/900-airoha-enable-UBI-support-and-define-default-partiti.patch
index e758d310e5..66733c3aba 100644
--- a/package/boot/uboot-airoha/patches/900-airoha-enable-UBI-support-and-define-default-partiti.patch
+++ b/package/boot/uboot-airoha/patches/900-airoha-enable-UBI-support-and-define-default-partiti.patch
@@ -38,14 +38,10 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  
 --- a/arch/arm/dts/an7583-evb.dts
 +++ b/arch/arm/dts/an7583-evb.dts
-@@ -46,6 +46,28 @@
+@@ -46,6 +46,24 @@
  	};
  };
  
-+&snfi {
-+	status = "okay";
-+};
-+
 +&spi_nand {
 +	partitions {
 +		compatible = "fixed-partitions";
@@ -69,7 +65,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
  	pinctrl-0 = <&pcie0_rst_pins>;
 --- a/configs/an7581_evb_defconfig
 +++ b/configs/an7581_evb_defconfig
-@@ -77,3 +77,19 @@ CONFIG_SPI=y
+@@ -78,3 +78,19 @@ CONFIG_SPI=y
  CONFIG_DM_SPI=y
  CONFIG_AIROHA_SNFI_SPI=y
  CONFIG_SHA512=y
@@ -91,7 +87,7 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 +# CONFIG_UBIFS_SILENCE_DEBUG_DUMP is not set
 --- a/configs/an7583_evb_defconfig
 +++ b/configs/an7583_evb_defconfig
-@@ -79,3 +79,19 @@ CONFIG_SHA512=y
+@@ -80,3 +80,19 @@ CONFIG_SHA512=y
  CONFIG_AIROHA_ETH=y
  CONFIG_MMC_MTK=y
  CONFIG_AIROHA_SNFI_SPI=y
diff --git a/package/boot/uboot-airoha/patches/901-airoha-add-default-configuration.patch b/package/boot/uboot-airoha/patches/901-airoha-add-default-configuration.patch
index 595848c731..9908733bb6 100644
--- a/package/boot/uboot-airoha/patches/901-airoha-add-default-configuration.patch
+++ b/package/boot/uboot-airoha/patches/901-airoha-add-default-configuration.patch
@@ -7,28 +7,28 @@ Signed-off-by: Christian Marangi <ansuelsmth at gmail.com>
 ---
  configs/an7581_evb_defconfig | 2 ++
  configs/an7583_evb_defconfig | 2 ++
- defenvs/an7581_rfb_env       | 3 +++
- defenvs/an7583_rfb_env       | 3 +++
- 4 files changed, 10 insertions(+)
+ defenvs/an7581_rfb_env       | 4 ++++
+ defenvs/an7583_rfb_env       | 4 ++++
+ 4 files changed, 12 insertions(+)
  create mode 100644 defenvs/an7581_rfb_env
  create mode 100644 defenvs/an7583_rfb_env
 
 --- a/configs/an7581_evb_defconfig
 +++ b/configs/an7581_evb_defconfig
-@@ -93,3 +93,5 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
+@@ -94,3 +94,5 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
  CONFIG_UBI_BLOCK=y
  # CONFIG_UBIFS_SILENCE_MSG is not set
  # CONFIG_UBIFS_SILENCE_DEBUG_DUMP is not set
-+CONFIG_USE_DEFAULT_ENV_FILE=y
-+CONFIG_DEFAULT_ENV_FILE="defenvs/an7581_rfb_env"
++CONFIG_ENV_USE_DEFAULT_ENV_TEXT_FILE=y
++CONFIG_ENV_DEFAULT_ENV_TEXT_FILE="defenvs/an7581_rfb_env"
 --- a/configs/an7583_evb_defconfig
 +++ b/configs/an7583_evb_defconfig
-@@ -95,3 +95,5 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
+@@ -96,3 +96,5 @@ CONFIG_MTD_UBI_BEB_LIMIT=20
  CONFIG_UBI_BLOCK=y
  # CONFIG_UBIFS_SILENCE_MSG is not set
  # CONFIG_UBIFS_SILENCE_DEBUG_DUMP is not set
-+CONFIG_USE_DEFAULT_ENV_FILE=y
-+CONFIG_DEFAULT_ENV_FILE="defenvs/an7583_rfb_env"
++CONFIG_ENV_USE_DEFAULT_ENV_TEXT_FILE=y
++CONFIG_ENV_DEFAULT_ENV_TEXT_FILE="defenvs/an7583_rfb_env"
 --- /dev/null
 +++ b/defenvs/an7581_rfb_env
 @@ -0,0 +1,4 @@
diff --git a/package/boot/uboot-airoha/patches/902-arm-airoha-disable-environment-inside-mtd-partition.patch b/package/boot/uboot-airoha/patches/902-arm-airoha-disable-environment-inside-mtd-partition.patch
new file mode 100644
index 0000000000..c78114506a
--- /dev/null
+++ b/package/boot/uboot-airoha/patches/902-arm-airoha-disable-environment-inside-mtd-partition.patch
@@ -0,0 +1,40 @@
+From 10bd131a6a365965ce868419933fd7936e91c635 Mon Sep 17 00:00:00 2001
+From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+Date: Mon, 13 Oct 2025 20:48:00 +0300
+Subject: [PATCH 2/3] arm: airoha: disable environment inside mtd partition
+
+When booting on en7581_evb board equipped with spinand flash, a u-boot
+panic occurs. The panic is caused by the absence any available mtd
+partition.
+
+Disable CONFIG_ENV_IS_IN_MTD to avoid an issue. The environment will
+be stored in the EMMC or in UBI, so actually CONFIG_ENV_IS_IN_MTD is
+not needed.
+
+Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+---
+ configs/an7581_evb_defconfig | 1 +
+ configs/an7583_evb_defconfig | 1 +
+ 2 files changed, 2 insertions(+)
+
+--- a/configs/an7581_evb_defconfig
++++ b/configs/an7581_evb_defconfig
+@@ -40,6 +40,7 @@ CONFIG_CMD_LOG=y
+ CONFIG_OF_UPSTREAM=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_IS_IN_MMC=y
++# CONFIG_ENV_IS_IN_MTD is not set
+ CONFIG_ENV_RELOC_GD_ENV_ADDR=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
+--- a/configs/an7583_evb_defconfig
++++ b/configs/an7583_evb_defconfig
+@@ -41,6 +41,7 @@ CONFIG_CMD_MTDPARTS=y
+ CONFIG_CMD_LOG=y
+ CONFIG_ENV_OVERWRITE=y
+ CONFIG_ENV_IS_IN_MMC=y
++# CONFIG_ENV_IS_IN_MTD is not set
+ CONFIG_ENV_RELOC_GD_ENV_ADDR=y
+ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y
+ CONFIG_NET_RANDOM_ETHADDR=y
+
diff --git a/package/boot/uboot-airoha/patches/903-arm-airoha-dts-enable-spi-support-for-en7581_evb-boa.patch b/package/boot/uboot-airoha/patches/903-arm-airoha-dts-enable-spi-support-for-en7581_evb-boa.patch
new file mode 100644
index 0000000000..92e96e1450
--- /dev/null
+++ b/package/boot/uboot-airoha/patches/903-arm-airoha-dts-enable-spi-support-for-en7581_evb-boa.patch
@@ -0,0 +1,23 @@
+From 6c4a07ecf211b56eb28fe2dbd8e324b2fdecb84a Mon Sep 17 00:00:00 2001
+From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+Date: Mon, 13 Oct 2025 20:44:24 +0300
+Subject: [PATCH 1/3] arm: airoha: dts: enable spi support for en7581_evb board
+
+spinand flashes are inaccessible without this patch
+
+Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+---
+ arch/arm/dts/en7581-evb-u-boot.dtsi | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/arm/dts/en7581-evb-u-boot.dtsi
++++ b/arch/arm/dts/en7581-evb-u-boot.dtsi
+@@ -9,3 +9,7 @@
+ };
+ 
+ #include "an7581-u-boot.dtsi"
++
++&snfi {
++	status = "okay";
++};
+
diff --git a/package/boot/uboot-airoha/patches/904-arm-airoha-enable-position-independent-code.patch b/package/boot/uboot-airoha/patches/904-arm-airoha-enable-position-independent-code.patch
new file mode 100644
index 0000000000..88ea40b247
--- /dev/null
+++ b/package/boot/uboot-airoha/patches/904-arm-airoha-enable-position-independent-code.patch
@@ -0,0 +1,32 @@
+From bee36b6f42792556e123f331ece80f8d5a40e8cd Mon Sep 17 00:00:00 2001
+From: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+Date: Mon, 13 Oct 2025 20:56:31 +0300
+Subject: [PATCH 3/3] arm: airoha: enable position independent code
+
+This slightly increase the code, but makes debugging a bit easy
+
+Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
+---
+ configs/an7581_evb_defconfig | 1 +
+ configs/an7583_evb_defconfig | 1 +
+ 2 files changed, 2 insertions(+)
+
+--- a/configs/an7581_evb_defconfig
++++ b/configs/an7581_evb_defconfig
+@@ -1,5 +1,6 @@
+ CONFIG_ARM=y
+ CONFIG_ARCH_AIROHA=y
++CONFIG_POSITION_INDEPENDENT=y
+ CONFIG_TEXT_BASE=0x81E00000
+ CONFIG_SYS_MALLOC_F_LEN=0x4000
+ CONFIG_NR_DRAM_BANKS=1
+--- a/configs/an7583_evb_defconfig
++++ b/configs/an7583_evb_defconfig
+@@ -1,5 +1,6 @@
+ CONFIG_ARM=y
+ CONFIG_ARCH_AIROHA=y
++CONFIG_POSITION_INDEPENDENT=y
+ CONFIG_TARGET_AN7583=y
+ CONFIG_TEXT_BASE=0x81E00000
+ CONFIG_SYS_MALLOC_F_LEN=0x4000
+




More information about the lede-commits mailing list