]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
airoha: backport some missing airoha_eth upstream patches 22479/head
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 18 Mar 2026 11:16:49 +0000 (12:16 +0100)
committerChristian Marangi <ansuelsmth@gmail.com>
Fri, 20 Mar 2026 12:21:24 +0000 (13:21 +0100)
Backport more upstream patch to include all the fixes pushed upstream and
add all the preliminary patch for multi-serdes support.

While at it also move 2 patch in the 6xx numbering to the 000-1xx backport
numbering to keep things tidy.

All the affected patch manually and automatically refreshed.

Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
[ add comment, renumber patch, add more patch, fix PCS patch ]
Link: https://github.com/openwrt/openwrt/pull/22479
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
21 files changed:
target/linux/airoha/patches-6.12/115-v7.0-net-airoha-Fix-npu-rx-DMA-definitions.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/116-v6.19-net-airoha-Move-net_devs-registration-in-a-dedicated.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/117-v7.0-net-airoha-Use-gdm-port-enum-value-whenever-possible.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/118-v7.0-net-airoha-npu-Dump-fw-version-during-probe.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/119-v6.19-net-airoha-Fix-schedule-while-atomic-in-airoha_ppe_d.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/120-v7.0-net-airoha-implement-get_link_ksettings.patch [moved from target/linux/airoha/patches-6.12/611-v7.0-net-airoha-implement-get_link_ksettings.patch with 93% similarity]
target/linux/airoha/patches-6.12/121-v7.0-net-airoha-npu-Init-BA-memory-region-if-provided-via.patch [moved from target/linux/airoha/patches-6.12/910-01-v7.0-net-airoha-npu-Init-BA-memory-region-if.patch with 100% similarity]
target/linux/airoha/patches-6.12/122-v7.0-net-airoha_eth-increase-max-MTU-to-9220-for-DSA-jumb.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/123-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch [moved from target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch with 98% similarity]
target/linux/airoha/patches-6.12/124-v7.1-net-airoha-fix-typo-in-function-name.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/125-v7.1-net-airoha-Rely-__field_prep-for-non-constant-masks.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/126-v7.1-net-airoha-Make-flow-control-source-port-mapping-dep.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/127-v7.1-net-airoha-Move-GDM-forward-port-configuration-in-nd.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/128-v7.1-net-airoha-Remove-airoha_dev_stop-in-airoha_remove.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/129-v7.1-net-airoha-select-QDMA-block-according-LAN-WAN-confi.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/130-v7.0-net-airoha-Fix-typo-in-airoha_ppe_setup_tc_block_cb-.patch [new file with mode: 0644]
target/linux/airoha/patches-6.12/131-v7.0-net-phy-mediatek-enable-interrupts-on-AN7581.patch [moved from target/linux/airoha/patches-6.12/610-v7.0-net-phy-mediatek-enable-interrupts-on-AN7581.patch with 100% similarity]
target/linux/airoha/patches-6.12/310-06-net-airoha-add-initial-fixup-for-GDM3-4-port-support.patch
target/linux/airoha/patches-6.12/310-07-airoha-ethernet-drop-xsi-mac-reset.patch
target/linux/airoha/patches-6.12/310-10-net-airoha-add-phylink-support-for-GDM2-4.patch
target/linux/airoha/patches-6.12/606-net-airoha-disable-external-phy-code-if-PCS_AIROHA-i.patch

diff --git a/target/linux/airoha/patches-6.12/115-v7.0-net-airoha-Fix-npu-rx-DMA-definitions.patch b/target/linux/airoha/patches-6.12/115-v7.0-net-airoha-Fix-npu-rx-DMA-definitions.patch
new file mode 100644 (file)
index 0000000..1d29e54
--- /dev/null
@@ -0,0 +1,34 @@
+From a7fc8c641cab855824c45e5e8877e40fd528b5df Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 2 Jan 2026 12:29:38 +0100
+Subject: [PATCH] net: airoha: Fix npu rx DMA definitions
+
+Fix typos in npu rx DMA descriptor definitions.
+
+Fixes: b3ef7bdec66fb ("net: airoha: Add airoha_offload.h header")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260102-airoha-npu-dma-rx-def-fixes-v1-1-205fc6bf7d94@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ include/linux/soc/airoha/airoha_offload.h | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/include/linux/soc/airoha/airoha_offload.h
++++ b/include/linux/soc/airoha/airoha_offload.h
+@@ -71,12 +71,12 @@ static inline void airoha_ppe_dev_check_
+ #define NPU_RX1_DESC_NUM      512
+ /* CTRL */
+-#define NPU_RX_DMA_DESC_LAST_MASK     BIT(29)
+-#define NPU_RX_DMA_DESC_LEN_MASK      GENMASK(28, 15)
+-#define NPU_RX_DMA_DESC_CUR_LEN_MASK  GENMASK(14, 1)
++#define NPU_RX_DMA_DESC_LAST_MASK     BIT(27)
++#define NPU_RX_DMA_DESC_LEN_MASK      GENMASK(26, 14)
++#define NPU_RX_DMA_DESC_CUR_LEN_MASK  GENMASK(13, 1)
+ #define NPU_RX_DMA_DESC_DONE_MASK     BIT(0)
+ /* INFO */
+-#define NPU_RX_DMA_PKT_COUNT_MASK     GENMASK(31, 28)
++#define NPU_RX_DMA_PKT_COUNT_MASK     GENMASK(31, 29)
+ #define NPU_RX_DMA_PKT_ID_MASK                GENMASK(28, 26)
+ #define NPU_RX_DMA_SRC_PORT_MASK      GENMASK(25, 21)
+ #define NPU_RX_DMA_CRSN_MASK          GENMASK(20, 16)
diff --git a/target/linux/airoha/patches-6.12/116-v6.19-net-airoha-Move-net_devs-registration-in-a-dedicated.patch b/target/linux/airoha/patches-6.12/116-v6.19-net-airoha-Move-net_devs-registration-in-a-dedicated.patch
new file mode 100644 (file)
index 0000000..685ab15
--- /dev/null
@@ -0,0 +1,89 @@
+From 5e7365b5a1ac8f517a7a84442289d7de242deb76 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Sun, 14 Dec 2025 10:30:07 +0100
+Subject: [PATCH] net: airoha: Move net_devs registration in a dedicated
+ routine
+
+Since airoha_probe() is not executed under rtnl lock, there is small race
+where a given device is configured by user-space while the remaining ones
+are not completely loaded from the dts yet. This condition will allow a
+hw device misconfiguration since there are some conditions (e.g. GDM2 check
+in airoha_dev_init()) that require all device are properly loaded from the
+device tree. Fix the issue moving net_devices registration at the end of
+the airoha_probe routine.
+
+Fixes: 9cd451d414f6e ("net: airoha: Add loopback support for GDM2")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/20251214-airoha-fix-dev-registration-v1-1-860e027ad4c6@kernel.org
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 39 ++++++++++++++++--------
+ 1 file changed, 26 insertions(+), 13 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -2924,19 +2924,26 @@ static int airoha_alloc_gdm_port(struct
+       port->id = id;
+       eth->ports[p] = port;
+-      err = airoha_metadata_dst_alloc(port);
+-      if (err)
+-              return err;
++      return airoha_metadata_dst_alloc(port);
++}
+-      err = register_netdev(dev);
+-      if (err)
+-              goto free_metadata_dst;
++static int airoha_register_gdm_devices(struct airoha_eth *eth)
++{
++      int i;
+-      return 0;
++      for (i = 0; i < ARRAY_SIZE(eth->ports); i++) {
++              struct airoha_gdm_port *port = eth->ports[i];
++              int err;
++
++              if (!port)
++                      continue;
++
++              err = register_netdev(port->dev);
++              if (err)
++                      return err;
++      }
+-free_metadata_dst:
+-      airoha_metadata_dst_free(port);
+-      return err;
++      return 0;
+ }
+ static int airoha_probe(struct platform_device *pdev)
+@@ -3027,6 +3034,10 @@ static int airoha_probe(struct platform_
+               }
+       }
++      err = airoha_register_gdm_devices(eth);
++      if (err)
++              goto error_napi_stop;
++
+       return 0;
+ error_napi_stop:
+@@ -3040,10 +3051,12 @@ error_hw_cleanup:
+       for (i = 0; i < ARRAY_SIZE(eth->ports); i++) {
+               struct airoha_gdm_port *port = eth->ports[i];
+-              if (port && port->dev->reg_state == NETREG_REGISTERED) {
++              if (!port)
++                      continue;
++
++              if (port->dev->reg_state == NETREG_REGISTERED)
+                       unregister_netdev(port->dev);
+-                      airoha_metadata_dst_free(port);
+-              }
++              airoha_metadata_dst_free(port);
+       }
+       free_netdev(eth->napi_dev);
+       platform_set_drvdata(pdev, NULL);
diff --git a/target/linux/airoha/patches-6.12/117-v7.0-net-airoha-Use-gdm-port-enum-value-whenever-possible.patch b/target/linux/airoha/patches-6.12/117-v7.0-net-airoha-Use-gdm-port-enum-value-whenever-possible.patch
new file mode 100644 (file)
index 0000000..95e8c22
--- /dev/null
@@ -0,0 +1,132 @@
+From 4d513329b87c1bd0546d9f0288794e244322daa6 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Mon, 5 Jan 2026 10:40:47 +0100
+Subject: [PATCH] net: airoha: Use gdm port enum value whenever possible
+
+Use AIROHA_GDMx_IDX enum value whenever possible.
+This patch is just cosmetic changes and does not introduce any logic one.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260105-airoha-use-port-idx-enum-v1-1-503ca5763858@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 40 +++++++++++++-----------
+ 1 file changed, 21 insertions(+), 19 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -108,11 +108,11 @@ static int airoha_set_vip_for_gdm_port(s
+       u32 vip_port;
+       switch (port->id) {
+-      case 3:
++      case AIROHA_GDM3_IDX:
+               /* FIXME: handle XSI_PCIE1_PORT */
+               vip_port = XSI_PCIE0_VIP_PORT_MASK;
+               break;
+-      case 4:
++      case AIROHA_GDM4_IDX:
+               /* FIXME: handle XSI_USB_PORT */
+               vip_port = XSI_ETH_VIP_PORT_MASK;
+               break;
+@@ -514,8 +514,8 @@ static int airoha_fe_init(struct airoha_
+                     FIELD_PREP(IP_ASSEMBLE_PORT_MASK, 0) |
+                     FIELD_PREP(IP_ASSEMBLE_NBQ_MASK, 22));
+-      airoha_fe_set(eth, REG_GDM_FWD_CFG(3), GDM_PAD_EN_MASK);
+-      airoha_fe_set(eth, REG_GDM_FWD_CFG(4), GDM_PAD_EN_MASK);
++      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM3_IDX), GDM_PAD_EN_MASK);
++      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM4_IDX), GDM_PAD_EN_MASK);
+       airoha_fe_crsn_qsel_init(eth);
+@@ -1690,27 +1690,29 @@ static int airhoha_set_gdm2_loopback(str
+       /* Forward the traffic to the proper GDM port */
+       pse_port = port->id == AIROHA_GDM3_IDX ? FE_PSE_PORT_GDM3
+                                              : FE_PSE_PORT_GDM4;
+-      airoha_set_gdm_port_fwd_cfg(eth, REG_GDM_FWD_CFG(2), pse_port);
+-      airoha_fe_clear(eth, REG_GDM_FWD_CFG(2), GDM_STRIP_CRC_MASK);
++      airoha_set_gdm_port_fwd_cfg(eth, REG_GDM_FWD_CFG(AIROHA_GDM2_IDX),
++                                  pse_port);
++      airoha_fe_clear(eth, REG_GDM_FWD_CFG(AIROHA_GDM2_IDX),
++                      GDM_STRIP_CRC_MASK);
+       /* Enable GDM2 loopback */
+-      airoha_fe_wr(eth, REG_GDM_TXCHN_EN(2), 0xffffffff);
+-      airoha_fe_wr(eth, REG_GDM_RXCHN_EN(2), 0xffff);
++      airoha_fe_wr(eth, REG_GDM_TXCHN_EN(AIROHA_GDM2_IDX), 0xffffffff);
++      airoha_fe_wr(eth, REG_GDM_RXCHN_EN(AIROHA_GDM2_IDX), 0xffff);
+       chan = port->id == AIROHA_GDM3_IDX ? airoha_is_7581(eth) ? 4 : 3 : 0;
+-      airoha_fe_rmw(eth, REG_GDM_LPBK_CFG(2),
++      airoha_fe_rmw(eth, REG_GDM_LPBK_CFG(AIROHA_GDM2_IDX),
+                     LPBK_CHAN_MASK | LPBK_MODE_MASK | LPBK_EN_MASK,
+                     FIELD_PREP(LPBK_CHAN_MASK, chan) |
+                     LBK_GAP_MODE_MASK | LBK_LEN_MODE_MASK |
+                     LBK_CHAN_MODE_MASK | LPBK_EN_MASK);
+-      airoha_fe_rmw(eth, REG_GDM_LEN_CFG(2),
++      airoha_fe_rmw(eth, REG_GDM_LEN_CFG(AIROHA_GDM2_IDX),
+                     GDM_SHORT_LEN_MASK | GDM_LONG_LEN_MASK,
+                     FIELD_PREP(GDM_SHORT_LEN_MASK, 60) |
+                     FIELD_PREP(GDM_LONG_LEN_MASK, AIROHA_MAX_MTU));
+       /* Disable VIP and IFC for GDM2 */
+-      airoha_fe_clear(eth, REG_FE_VIP_PORT_EN, BIT(2));
+-      airoha_fe_clear(eth, REG_FE_IFC_PORT_EN, BIT(2));
++      airoha_fe_clear(eth, REG_FE_VIP_PORT_EN, BIT(AIROHA_GDM2_IDX));
++      airoha_fe_clear(eth, REG_FE_IFC_PORT_EN, BIT(AIROHA_GDM2_IDX));
+       /* XXX: handle XSI_USB_PORT and XSI_PCE1_PORT */
+       nbq = port->id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
+@@ -1746,8 +1748,8 @@ static int airoha_dev_init(struct net_de
+       airoha_set_macaddr(port, dev->dev_addr);
+       switch (port->id) {
+-      case 3:
+-      case 4:
++      case AIROHA_GDM3_IDX:
++      case AIROHA_GDM4_IDX:
+               /* If GDM2 is active we can't enable loopback */
+               if (!eth->ports[1]) {
+                       int err;
+@@ -1757,7 +1759,7 @@ static int airoha_dev_init(struct net_de
+                               return err;
+               }
+               fallthrough;
+-      case 2:
++      case AIROHA_GDM2_IDX:
+               if (airoha_ppe_is_enabled(eth, 1)) {
+                       /* For PPE2 always use secondary cpu port. */
+                       fe_cpu_port = FE_PSE_PORT_CDM2;
+@@ -3101,14 +3103,14 @@ static const char * const en7581_xsi_rst
+ static int airoha_en7581_get_src_port_id(struct airoha_gdm_port *port, int nbq)
+ {
+       switch (port->id) {
+-      case 3:
++      case AIROHA_GDM3_IDX:
+               /* 7581 SoC supports PCIe serdes on GDM3 port */
+               if (nbq == 4)
+                       return HSGMII_LAN_7581_PCIE0_SRCPORT;
+               if (nbq == 5)
+                       return HSGMII_LAN_7581_PCIE1_SRCPORT;
+               break;
+-      case 4:
++      case AIROHA_GDM4_IDX:
+               /* 7581 SoC supports eth and usb serdes on GDM4 port */
+               if (!nbq)
+                       return HSGMII_LAN_7581_ETH_SRCPORT;
+@@ -3132,12 +3134,12 @@ static const char * const an7583_xsi_rst
+ static int airoha_an7583_get_src_port_id(struct airoha_gdm_port *port, int nbq)
+ {
+       switch (port->id) {
+-      case 3:
++      case AIROHA_GDM3_IDX:
+               /* 7583 SoC supports eth serdes on GDM3 port */
+               if (!nbq)
+                       return HSGMII_LAN_7583_ETH_SRCPORT;
+               break;
+-      case 4:
++      case AIROHA_GDM4_IDX:
+               /* 7583 SoC supports PCIe and USB serdes on GDM4 port */
+               if (!nbq)
+                       return HSGMII_LAN_7583_PCIE_SRCPORT;
diff --git a/target/linux/airoha/patches-6.12/118-v7.0-net-airoha-npu-Dump-fw-version-during-probe.patch b/target/linux/airoha/patches-6.12/118-v7.0-net-airoha-npu-Dump-fw-version-during-probe.patch
new file mode 100644 (file)
index 0000000..36f8850
--- /dev/null
@@ -0,0 +1,36 @@
+From e4bc5dd53bf5d46cd58f081ffccc3809e2be5373 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Mon, 5 Jan 2026 09:49:16 +0100
+Subject: [PATCH] net: airoha: npu: Dump fw version during probe
+
+Dump firmware version running on the npu during module probe.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260105-airoha-npu-dump-fw-v1-1-36d8326975f8@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_npu.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/net/ethernet/airoha/airoha_npu.c
++++ b/drivers/net/ethernet/airoha/airoha_npu.c
+@@ -658,6 +658,7 @@ static int airoha_npu_probe(struct platf
+       struct device_node *np;
+       void __iomem *base;
+       int i, irq, err;
++      u32 val;
+       base = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(base))
+@@ -757,6 +758,11 @@ static int airoha_npu_probe(struct platf
+       regmap_write(npu->regmap, REG_CR_BOOT_TRIGGER, 0x1);
+       msleep(100);
++      if (!airoha_npu_wlan_msg_get(npu, 0, WLAN_FUNC_GET_WAIT_NPU_VERSION,
++                                   &val, sizeof(val), GFP_KERNEL))
++              dev_info(dev, "NPU fw version: %0d.%d\n",
++                       (val >> 16) & 0xffff, val & 0xffff);
++
+       platform_set_drvdata(pdev, npu);
+       return 0;
diff --git a/target/linux/airoha/patches-6.12/119-v6.19-net-airoha-Fix-schedule-while-atomic-in-airoha_ppe_d.patch b/target/linux/airoha/patches-6.12/119-v6.19-net-airoha-Fix-schedule-while-atomic-in-airoha_ppe_d.patch
new file mode 100644 (file)
index 0000000..2a7ce09
--- /dev/null
@@ -0,0 +1,41 @@
+From 6abcf751bc084804a9e5b3051442e8a2ce67f48a Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Mon, 5 Jan 2026 09:43:31 +0100
+Subject: [PATCH] net: airoha: Fix schedule while atomic in airoha_ppe_deinit()
+
+airoha_ppe_deinit() runs airoha_npu_ppe_deinit() in atomic context.
+airoha_npu_ppe_deinit routine allocates ppe_data buffer with GFP_KERNEL
+flag. Rely on rcu_replace_pointer in airoha_ppe_deinit routine in order
+to fix schedule while atomic issue in airoha_npu_ppe_deinit() since we
+do not need atomic context there.
+
+Fixes: 00a7678310fe3 ("net: airoha: Introduce flowtable offload support")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260105-airoha-fw-ethtool-v2-1-3b32b158cc31@kernel.org
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/ethernet/airoha/airoha_ppe.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_ppe.c
++++ b/drivers/net/ethernet/airoha/airoha_ppe.c
+@@ -1547,13 +1547,16 @@ void airoha_ppe_deinit(struct airoha_eth
+ {
+       struct airoha_npu *npu;
+-      rcu_read_lock();
+-      npu = rcu_dereference(eth->npu);
++      mutex_lock(&flow_offload_mutex);
++
++      npu = rcu_replace_pointer(eth->npu, NULL,
++                                lockdep_is_held(&flow_offload_mutex));
+       if (npu) {
+               npu->ops.ppe_deinit(npu);
+               airoha_npu_put(npu);
+       }
+-      rcu_read_unlock();
++
++      mutex_unlock(&flow_offload_mutex);
+       rhashtable_destroy(&eth->ppe->l2_flows);
+       rhashtable_destroy(&eth->flow_table);
similarity index 93%
rename from target/linux/airoha/patches-6.12/611-v7.0-net-airoha-implement-get_link_ksettings.patch
rename to target/linux/airoha/patches-6.12/120-v7.0-net-airoha-implement-get_link_ksettings.patch
index 0691b2402ac77342c006ccfc3f6bb24ff0b1d429..b2f1e36426b74e0543f250d7e43e67d51adcce55 100644 (file)
@@ -16,7 +16,7 @@ Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 
 --- a/drivers/net/ethernet/airoha/airoha_eth.c
 +++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -2844,6 +2844,7 @@ static const struct ethtool_ops airoha_e
+@@ -2805,6 +2805,7 @@ static const struct ethtool_ops airoha_e
        .get_drvinfo            = airoha_ethtool_get_drvinfo,
        .get_eth_mac_stats      = airoha_ethtool_get_mac_stats,
        .get_rmon_stats         = airoha_ethtool_get_rmon_stats,
diff --git a/target/linux/airoha/patches-6.12/122-v7.0-net-airoha_eth-increase-max-MTU-to-9220-for-DSA-jumb.patch b/target/linux/airoha/patches-6.12/122-v7.0-net-airoha_eth-increase-max-MTU-to-9220-for-DSA-jumb.patch
new file mode 100644 (file)
index 0000000..ddd02ed
--- /dev/null
@@ -0,0 +1,37 @@
+From 6406fc709ace081575de2a8a7eee12e63d4c96c6 Mon Sep 17 00:00:00 2001
+From: Sayantan Nandy <sayantann11@gmail.com>
+Date: Mon, 19 Jan 2026 13:06:58 +0530
+Subject: [PATCH] net: airoha_eth: increase max MTU to 9220 for DSA jumbo
+ frames
+
+The industry standard jumbo frame MTU is 9216 bytes. When using the DSA
+subsystem, a 4-byte tag is added to each Ethernet frame.
+
+Increase AIROHA_MAX_MTU to 9220 bytes (9216 + 4) so that users can set a
+standard 9216-byte MTU on DSA ports.
+
+The underlying hardware supports significantly larger frame sizes
+(approximately 16K). However, the maximum MTU is limited to 9220 bytes
+for now, as this is sufficient to support standard jumbo frames and does
+not incur additional memory allocation overhead.
+
+Signed-off-by: Sayantan Nandy <sayantann11@gmail.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260119073658.6216-1-sayantann11@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -21,7 +21,7 @@
+ #define AIROHA_MAX_NUM_IRQ_BANKS      4
+ #define AIROHA_MAX_DSA_PORTS          7
+ #define AIROHA_MAX_NUM_RSTS           3
+-#define AIROHA_MAX_MTU                        9216
++#define AIROHA_MAX_MTU                        9220
+ #define AIROHA_MAX_PACKET_SIZE                2048
+ #define AIROHA_NUM_QOS_CHANNELS               4
+ #define AIROHA_NUM_QOS_QUEUES         8
similarity index 98%
rename from target/linux/airoha/patches-6.12/910-02-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch
rename to target/linux/airoha/patches-6.12/123-v7.0-net-airoha-npu-Add-the-capability-to-read-firmware-n.patch
index e5586b7f1b54517b85d2400e4406e5b21bf2efe5..35ad950f4207492c14d8729d49eab2cd7a9815bd 100644 (file)
@@ -108,7 +108,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  }
  
  static irqreturn_t airoha_npu_mbox_handler(int irq, void *npu_instance)
-@@ -791,6 +823,8 @@ module_platform_driver(airoha_npu_driver
+@@ -797,6 +829,8 @@ module_platform_driver(airoha_npu_driver
  
  MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_DATA);
  MODULE_FIRMWARE(NPU_EN7581_FIRMWARE_RV32);
diff --git a/target/linux/airoha/patches-6.12/124-v7.1-net-airoha-fix-typo-in-function-name.patch b/target/linux/airoha/patches-6.12/124-v7.1-net-airoha-fix-typo-in-function-name.patch
new file mode 100644 (file)
index 0000000..7264414
--- /dev/null
@@ -0,0 +1,53 @@
+From aebf15e8eb09b01e99f043e9f5d423798aac9d32 Mon Sep 17 00:00:00 2001
+From: Zhengping Zhang <aquapinn@qq.com>
+Date: Thu, 26 Feb 2026 10:37:08 +0800
+Subject: [PATCH] net: airoha: fix typo in function name
+
+Corrected the typo in the function name from
+ `airhoa_is_lan_gdm_port` to `airoha_is_lan_gdm_port`. This change ensures
+ consistency in the API naming convention.
+
+Signed-off-by: Zhengping Zhang <aquapinn@qq.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Acked-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/tencent_E4FD5D6BC0131E617D848896F5F9FCED6E0A@qq.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 2 +-
+ drivers/net/ethernet/airoha/airoha_eth.h | 2 +-
+ drivers/net/ethernet/airoha/airoha_ppe.c | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -76,7 +76,7 @@ static void airoha_set_macaddr(struct ai
+       struct airoha_eth *eth = port->qdma->eth;
+       u32 val, reg;
+-      reg = airhoa_is_lan_gdm_port(port) ? REG_FE_LAN_MAC_H
++      reg = airoha_is_lan_gdm_port(port) ? REG_FE_LAN_MAC_H
+                                          : REG_FE_WAN_MAC_H;
+       val = (addr[0] << 16) | (addr[1] << 8) | addr[2];
+       airoha_fe_wr(eth, reg, val);
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -626,7 +626,7 @@ u32 airoha_rmw(void __iomem *base, u32 o
+ #define airoha_qdma_clear(qdma, offset, val)                  \
+       airoha_rmw((qdma)->regs, (offset), (val), 0)
+-static inline bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port)
++static inline bool airoha_is_lan_gdm_port(struct airoha_gdm_port *port)
+ {
+       /* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
+        * GDM{2,3,4} can be used as wan port connected to an external
+--- a/drivers/net/ethernet/airoha/airoha_ppe.c
++++ b/drivers/net/ethernet/airoha/airoha_ppe.c
+@@ -321,7 +321,7 @@ static int airoha_ppe_foe_entry_prepare(
+                       /* For downlink traffic consume SRAM memory for hw
+                        * forwarding descriptors queue.
+                        */
+-                      if (airhoa_is_lan_gdm_port(port))
++                      if (airoha_is_lan_gdm_port(port))
+                               val |= AIROHA_FOE_IB2_FAST_PATH;
+                       if (dsa_port >= 0)
+                               val |= FIELD_PREP(AIROHA_FOE_IB2_NBQ,
diff --git a/target/linux/airoha/patches-6.12/125-v7.1-net-airoha-Rely-__field_prep-for-non-constant-masks.patch b/target/linux/airoha/patches-6.12/125-v7.1-net-airoha-Rely-__field_prep-for-non-constant-masks.patch
new file mode 100644 (file)
index 0000000..a0e983e
--- /dev/null
@@ -0,0 +1,44 @@
+From 7600fb3b41dd6ab65ed61169df1b6099044edf97 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Wed, 4 Mar 2026 11:56:47 +0100
+Subject: [PATCH] net: airoha: Rely __field_prep for non-constant masks
+
+Rely on __field_prep macros for non-constant masks preparing the values
+for register updates instead of open-coding.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260304-airoha-__field_prep-v1-1-b185facc4e2f@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1727,7 +1727,7 @@ static int airhoha_set_gdm2_loopback(str
+       airoha_fe_rmw(eth,
+                     REG_SP_DFT_CPORT(src_port >> fls(SP_CPORT_DFT_MASK)),
+                     SP_CPORT_MASK(val),
+-                    FE_PSE_PORT_CDM2 << __ffs(SP_CPORT_MASK(val)));
++                    __field_prep(SP_CPORT_MASK(val), FE_PSE_PORT_CDM2));
+       if (port->id != AIROHA_GDM3_IDX && airoha_is_7581(eth))
+               airoha_fe_rmw(eth, REG_SRC_PORT_FC_MAP6,
+@@ -1781,7 +1781,7 @@ static int airoha_dev_init(struct net_de
+       ppe_id = pse_port == FE_PSE_PORT_PPE2 ? 1 : 0;
+       airoha_fe_rmw(eth, REG_PPE_DFT_CPORT0(ppe_id),
+                     DFT_CPORT_MASK(port->id),
+-                    fe_cpu_port << __ffs(DFT_CPORT_MASK(port->id)));
++                    __field_prep(DFT_CPORT_MASK(port->id), fe_cpu_port));
+       return 0;
+ }
+@@ -2138,7 +2138,7 @@ static int airoha_qdma_set_chan_tx_sched
+       airoha_qdma_rmw(port->qdma, REG_CHAN_QOS_MODE(channel >> 3),
+                       CHAN_QOS_MODE_MASK(channel),
+-                      mode << __ffs(CHAN_QOS_MODE_MASK(channel)));
++                      __field_prep(CHAN_QOS_MODE_MASK(channel), mode));
+       return 0;
+ }
diff --git a/target/linux/airoha/patches-6.12/126-v7.1-net-airoha-Make-flow-control-source-port-mapping-dep.patch b/target/linux/airoha/patches-6.12/126-v7.1-net-airoha-Make-flow-control-source-port-mapping-dep.patch
new file mode 100644 (file)
index 0000000..5f9c6be
--- /dev/null
@@ -0,0 +1,52 @@
+From bf3471e6e6c02137dc0d26caa783ac1849f9aab8 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 6 Mar 2026 09:07:27 +0100
+Subject: [PATCH] net: airoha: Make flow control source port mapping dependent
+ on nbq parameter
+
+Flow control source port mapping for USB serdes needs to be configured
+according to the GDM port nbq parameter. This is a preliminary patch
+since nbq parameter is specific for the given port serdes and needs to
+be read from the DTS (in the current codebase is assigned statically).
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260306-airoha-fix-loopback-for-usb-serdes-v2-1-319de9c96826@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c  | 10 ++++++----
+ drivers/net/ethernet/airoha/airoha_regs.h |  5 +----
+ 2 files changed, 7 insertions(+), 8 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1729,10 +1729,12 @@ static int airhoha_set_gdm2_loopback(str
+                     SP_CPORT_MASK(val),
+                     __field_prep(SP_CPORT_MASK(val), FE_PSE_PORT_CDM2));
+-      if (port->id != AIROHA_GDM3_IDX && airoha_is_7581(eth))
+-              airoha_fe_rmw(eth, REG_SRC_PORT_FC_MAP6,
+-                            FC_ID_OF_SRC_PORT24_MASK,
+-                            FIELD_PREP(FC_ID_OF_SRC_PORT24_MASK, 2));
++      if (port->id == AIROHA_GDM4_IDX && airoha_is_7581(eth)) {
++              u32 mask = FC_ID_OF_SRC_PORT_MASK(nbq);
++
++              airoha_fe_rmw(eth, REG_SRC_PORT_FC_MAP6, mask,
++                            __field_prep(mask, AIROHA_GDM2_IDX));
++      }
+       return 0;
+ }
+--- a/drivers/net/ethernet/airoha/airoha_regs.h
++++ b/drivers/net/ethernet/airoha/airoha_regs.h
+@@ -376,10 +376,7 @@
+ #define SP_CPORT_MASK(_n)             GENMASK(3 + ((_n) << 2), ((_n) << 2))
+ #define REG_SRC_PORT_FC_MAP6          0x2298
+-#define FC_ID_OF_SRC_PORT27_MASK      GENMASK(28, 24)
+-#define FC_ID_OF_SRC_PORT26_MASK      GENMASK(20, 16)
+-#define FC_ID_OF_SRC_PORT25_MASK      GENMASK(12, 8)
+-#define FC_ID_OF_SRC_PORT24_MASK      GENMASK(4, 0)
++#define FC_ID_OF_SRC_PORT_MASK(_n)    GENMASK(4 + ((_n) << 3), ((_n) << 3))
+ #define REG_CDM5_RX_OQ1_DROP_CNT      0x29d4
diff --git a/target/linux/airoha/patches-6.12/127-v7.1-net-airoha-Move-GDM-forward-port-configuration-in-nd.patch b/target/linux/airoha/patches-6.12/127-v7.1-net-airoha-Move-GDM-forward-port-configuration-in-nd.patch
new file mode 100644 (file)
index 0000000..e5bc306
--- /dev/null
@@ -0,0 +1,86 @@
+From 46097d011f77f5758fb47b7059b4f1f2e7403940 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 6 Mar 2026 16:09:47 +0100
+Subject: [PATCH] net: airoha: Move GDM forward port configuration in
+ ndo_open/ndo_stop callbacks
+
+This change allows to set GDM forward port configuration to
+FE_PSE_PORT_DROP stopping the network device. Hw design requires to stop
+packet forwarding putting the interface down.  Moreover, PPE firmware
+requires to use PPE1 for GDM3 or GDM4.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260306-airoha-gdm-forward-ndo-open-stop-v1-1-7b7a20dd9ef0@kernel.org
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 20 +++++++++++++++-----
+ 1 file changed, 15 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1611,6 +1611,7 @@ static int airoha_dev_open(struct net_de
+       int err, len = ETH_HLEN + dev->mtu + ETH_FCS_LEN;
+       struct airoha_gdm_port *port = netdev_priv(dev);
+       struct airoha_qdma *qdma = port->qdma;
++      u32 pse_port = FE_PSE_PORT_PPE1;
+       netif_tx_start_all_queues(dev);
+       err = airoha_set_vip_for_gdm_port(port, true);
+@@ -1634,6 +1635,14 @@ static int airoha_dev_open(struct net_de
+                       GLOBAL_CFG_RX_DMA_EN_MASK);
+       atomic_inc(&qdma->users);
++      if (port->id == AIROHA_GDM2_IDX &&
++          airoha_ppe_is_enabled(qdma->eth, 1)) {
++              /* For PPE2 always use secondary cpu port. */
++              pse_port = FE_PSE_PORT_PPE2;
++      }
++      airoha_set_gdm_port_fwd_cfg(qdma->eth, REG_GDM_FWD_CFG(port->id),
++                                  pse_port);
++
+       return 0;
+ }
+@@ -1651,6 +1660,9 @@ static int airoha_dev_stop(struct net_de
+       for (i = 0; i < ARRAY_SIZE(qdma->q_tx); i++)
+               netdev_tx_reset_subqueue(dev, i);
++      airoha_set_gdm_port_fwd_cfg(qdma->eth, REG_GDM_FWD_CFG(port->id),
++                                  FE_PSE_PORT_DROP);
++
+       if (atomic_dec_and_test(&qdma->users)) {
+               airoha_qdma_clear(qdma, REG_QDMA_GLOBAL_CFG,
+                                 GLOBAL_CFG_TX_DMA_EN_MASK |
+@@ -1744,7 +1756,7 @@ static int airoha_dev_init(struct net_de
+       struct airoha_gdm_port *port = netdev_priv(dev);
+       struct airoha_qdma *qdma = port->qdma;
+       struct airoha_eth *eth = qdma->eth;
+-      u32 pse_port, fe_cpu_port;
++      u32 fe_cpu_port;
+       u8 ppe_id;
+       airoha_set_macaddr(port, dev->dev_addr);
+@@ -1765,7 +1777,7 @@ static int airoha_dev_init(struct net_de
+               if (airoha_ppe_is_enabled(eth, 1)) {
+                       /* For PPE2 always use secondary cpu port. */
+                       fe_cpu_port = FE_PSE_PORT_CDM2;
+-                      pse_port = FE_PSE_PORT_PPE2;
++                      ppe_id = 1;
+                       break;
+               }
+               fallthrough;
+@@ -1774,13 +1786,11 @@ static int airoha_dev_init(struct net_de
+               /* For PPE1 select cpu port according to the running QDMA. */
+               fe_cpu_port = qdma_id ? FE_PSE_PORT_CDM2 : FE_PSE_PORT_CDM1;
+-              pse_port = FE_PSE_PORT_PPE1;
++              ppe_id = 0;
+               break;
+       }
+       }
+-      airoha_set_gdm_port_fwd_cfg(eth, REG_GDM_FWD_CFG(port->id), pse_port);
+-      ppe_id = pse_port == FE_PSE_PORT_PPE2 ? 1 : 0;
+       airoha_fe_rmw(eth, REG_PPE_DFT_CPORT0(ppe_id),
+                     DFT_CPORT_MASK(port->id),
+                     __field_prep(DFT_CPORT_MASK(port->id), fe_cpu_port));
diff --git a/target/linux/airoha/patches-6.12/128-v7.1-net-airoha-Remove-airoha_dev_stop-in-airoha_remove.patch b/target/linux/airoha/patches-6.12/128-v7.1-net-airoha-Remove-airoha_dev_stop-in-airoha_remove.patch
new file mode 100644 (file)
index 0000000..6dfcb18
--- /dev/null
@@ -0,0 +1,30 @@
+From d4a533ad249e9fbdc2d0633f2ddd60a5b3a9a4ca Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 13 Mar 2026 12:27:00 +0100
+Subject: [PATCH] net: airoha: Remove airoha_dev_stop() in airoha_remove()
+
+Do not run airoha_dev_stop routine explicitly in airoha_remove()
+since ndo_stop() callback is already executed by unregister_netdev() in
+__dev_close_many routine if necessary and, doing so, we will end up causing
+an underflow in the qdma users atomic counters. Rely on networking subsystem
+to stop the device removing the airoha_eth module.
+
+Fixes: 23020f0493270 ("net: airoha: Introduce ethernet support for EN7581 SoC")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://patch.msgid.link/20260313-airoha-remove-ndo_stop-remove-net-v2-1-67542c3ceeca@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -3095,7 +3095,6 @@ static void airoha_remove(struct platfor
+               if (!port)
+                       continue;
+-              airoha_dev_stop(port->dev);
+               unregister_netdev(port->dev);
+               airoha_metadata_dst_free(port);
+       }
diff --git a/target/linux/airoha/patches-6.12/129-v7.1-net-airoha-select-QDMA-block-according-LAN-WAN-confi.patch b/target/linux/airoha/patches-6.12/129-v7.1-net-airoha-select-QDMA-block-according-LAN-WAN-confi.patch
new file mode 100644 (file)
index 0000000..0e210f4
--- /dev/null
@@ -0,0 +1,131 @@
+From 8737d7194d6d5947c3d7d8813895b44a25b84477 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 13 Mar 2026 17:28:36 +0100
+Subject: [PATCH] net: airoha: select QDMA block according LAN/WAN
+ configuration
+
+Before this patch even GDM ports were assigned to QDMA0 while odd GDM
+ports were using QDMA1, so, based on the DTS configuration, both QDMA0
+and QDMA1 can theoretically receive traffic destinated to the host cpu
+from LAN or WAN GDM ports.
+Airoha folks reported the hw design assumes the LAN traffic destinated
+to the host cpu is be forwarded to QDMA0 while traffic received on WAN
+GDM port is managed by QDMA1. For this reason, select QDMA block according
+to the GDM port LAN or WAN configuration:
+- QDMA0 is used for GDM LAN devices
+- QDMA1 is used for GDM WAN device
+
+Assuming a device with three GDM ports, a typical configuration could be:
+- MT7530 DSA switch -> GDM1 (eth0) -> QDMA0 (LAN traffic)
+- External PHY      -> GDM2 (eth1) -> QDMA1 (WAN traffic)
+- External PHY      -> GDM3 (eth2) -> QDMA0 (LAN traffic)
+
+We can then bridge eth0 DSA port (lanX) with eth2 since they all tx/rx
+LAN traffic.
+
+Please note this patch introduces a change not visible to the user since
+airoha_eth driver currently supports just the internal phy available via
+the MT7530 DSA switch and there are no WAN interfaces officially supported
+since PCS/external phy is not merged mainline yet (it will be posted with
+following patches).
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260313-airoha-qdma-lan-wan-mode-v2-1-7d577db6e40c@kernel.org
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 18 ++++++++----------
+ drivers/net/ethernet/airoha/airoha_eth.h |  1 +
+ 2 files changed, 9 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1754,11 +1754,13 @@ static int airhoha_set_gdm2_loopback(str
+ static int airoha_dev_init(struct net_device *dev)
+ {
+       struct airoha_gdm_port *port = netdev_priv(dev);
+-      struct airoha_qdma *qdma = port->qdma;
+-      struct airoha_eth *eth = qdma->eth;
++      struct airoha_eth *eth = port->eth;
+       u32 fe_cpu_port;
+       u8 ppe_id;
++      /* QDMA0 is used for lan ports while QDMA1 is used for WAN ports */
++      port->qdma = &eth->qdma[!airoha_is_lan_gdm_port(port)];
++      port->dev->irq = port->qdma->irq_banks[0].irq;
+       airoha_set_macaddr(port, dev->dev_addr);
+       switch (port->id) {
+@@ -1782,7 +1784,7 @@ static int airoha_dev_init(struct net_de
+               }
+               fallthrough;
+       default: {
+-              u8 qdma_id = qdma - &eth->qdma[0];
++              u8 qdma_id = port->qdma - &eth->qdma[0];
+               /* For PPE1 select cpu port according to the running QDMA. */
+               fe_cpu_port = qdma_id ? FE_PSE_PORT_CDM2 : FE_PSE_PORT_CDM1;
+@@ -2866,11 +2868,10 @@ bool airoha_is_valid_gdm_port(struct air
+ }
+ static int airoha_alloc_gdm_port(struct airoha_eth *eth,
+-                               struct device_node *np, int index)
++                               struct device_node *np)
+ {
+       const __be32 *id_ptr = of_get_property(np, "reg", NULL);
+       struct airoha_gdm_port *port;
+-      struct airoha_qdma *qdma;
+       struct net_device *dev;
+       int err, p;
+       u32 id;
+@@ -2901,7 +2902,6 @@ static int airoha_alloc_gdm_port(struct
+               return -ENOMEM;
+       }
+-      qdma = &eth->qdma[index % AIROHA_MAX_NUM_QDMA];
+       dev->netdev_ops = &airoha_netdev_ops;
+       dev->ethtool_ops = &airoha_ethtool_ops;
+       dev->max_mtu = AIROHA_MAX_MTU;
+@@ -2913,7 +2913,6 @@ static int airoha_alloc_gdm_port(struct
+       dev->features |= dev->hw_features;
+       dev->vlan_features = dev->hw_features;
+       dev->dev.of_node = np;
+-      dev->irq = qdma->irq_banks[0].irq;
+       SET_NETDEV_DEV(dev, eth->dev);
+       /* reserve hw queues for HTB offloading */
+@@ -2934,7 +2933,7 @@ static int airoha_alloc_gdm_port(struct
+       port = netdev_priv(dev);
+       u64_stats_init(&port->stats.syncp);
+       spin_lock_init(&port->stats.lock);
+-      port->qdma = qdma;
++      port->eth = eth;
+       port->dev = dev;
+       port->id = id;
+       eth->ports[p] = port;
+@@ -3034,7 +3033,6 @@ static int airoha_probe(struct platform_
+       for (i = 0; i < ARRAY_SIZE(eth->qdma); i++)
+               airoha_qdma_start_napi(&eth->qdma[i]);
+-      i = 0;
+       for_each_child_of_node(pdev->dev.of_node, np) {
+               if (!of_device_is_compatible(np, "airoha,eth-mac"))
+                       continue;
+@@ -3042,7 +3040,7 @@ static int airoha_probe(struct platform_
+               if (!of_device_is_available(np))
+                       continue;
+-              err = airoha_alloc_gdm_port(eth, np, i++);
++              err = airoha_alloc_gdm_port(eth, np);
+               if (err) {
+                       of_node_put(np);
+                       goto error_napi_stop;
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -533,6 +533,7 @@ struct airoha_qdma {
+ struct airoha_gdm_port {
+       struct airoha_qdma *qdma;
++      struct airoha_eth *eth;
+       struct net_device *dev;
+       int id;
diff --git a/target/linux/airoha/patches-6.12/130-v7.0-net-airoha-Fix-typo-in-airoha_ppe_setup_tc_block_cb-.patch b/target/linux/airoha/patches-6.12/130-v7.0-net-airoha-Fix-typo-in-airoha_ppe_setup_tc_block_cb-.patch
new file mode 100644 (file)
index 0000000..9620d1e
--- /dev/null
@@ -0,0 +1,32 @@
+From dfdf774656205515b2d6ad94fce63c7ccbe92d91 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 9 Jan 2026 10:29:06 +0100
+Subject: [PATCH] net: airoha: Fix typo in airoha_ppe_setup_tc_block_cb
+ definition
+
+Fix Typo in airoha_ppe_dev_setup_tc_block_cb routine definition when
+CONFIG_NET_AIROHA is not enabled.
+
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202601090517.Fj6v501r-lkp@intel.com/
+Fixes: f45fc18b6de04 ("net: airoha: Add airoha_ppe_dev struct definition")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260109-airoha_ppe_dev_setup_tc_block_cb-typo-v1-1-282e8834a9f9@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ include/linux/soc/airoha/airoha_offload.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/include/linux/soc/airoha/airoha_offload.h
++++ b/include/linux/soc/airoha/airoha_offload.h
+@@ -52,8 +52,8 @@ static inline void airoha_ppe_put_dev(st
+ {
+ }
+-static inline int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev,
+-                                             void *type_data)
++static inline int airoha_ppe_dev_setup_tc_block_cb(struct airoha_ppe_dev *dev,
++                                                 void *type_data)
+ {
+       return -EOPNOTSUPP;
+ }
index 3805febe717b7417aa361cfccb7f381358cc2e07..da5e459250cf3ac5caca1042f520c28c2b387283 100644 (file)
@@ -19,16 +19,16 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
                      FIELD_PREP(IP_ASSEMBLE_PORT_MASK, 0) |
                      FIELD_PREP(IP_ASSEMBLE_NBQ_MASK, 22));
  
--      airoha_fe_set(eth, REG_GDM_FWD_CFG(3), GDM_PAD_EN_MASK);
--      airoha_fe_set(eth, REG_GDM_FWD_CFG(4), GDM_PAD_EN_MASK);
-+      airoha_fe_set(eth, REG_GDM_FWD_CFG(3),
+-      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM3_IDX), GDM_PAD_EN_MASK);
+-      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM4_IDX), GDM_PAD_EN_MASK);
++      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM3_IDX),
 +                    GDM_PAD_EN_MASK | GDM_STRIP_CRC_MASK);
-+      airoha_fe_set(eth, REG_GDM_FWD_CFG(4),
++      airoha_fe_set(eth, REG_GDM_FWD_CFG(AIROHA_GDM4_IDX),
 +                    GDM_PAD_EN_MASK | GDM_STRIP_CRC_MASK);
  
        airoha_fe_crsn_qsel_init(eth);
  
-@@ -1624,7 +1626,8 @@ static int airoha_dev_open(struct net_de
+@@ -1625,7 +1627,8 @@ static int airoha_dev_open(struct net_de
        if (err)
                return err;
  
index 7e0fc5a7988e2eb2b93dd19b5f2e1e21f711370c..dd95a69995aef0b99f614a4ee9a74f2260b8e38a 100644 (file)
@@ -15,7 +15,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 
 --- a/drivers/net/ethernet/airoha/airoha_eth.c
 +++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -3088,7 +3088,6 @@ static void airoha_remove(struct platfor
+@@ -3113,7 +3113,6 @@ static void airoha_remove(struct platfor
  }
  
  static const char * const en7581_xsi_rsts_names[] = {
@@ -23,7 +23,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
        "hsi0-mac",
        "hsi1-mac",
        "hsi-mac",
-@@ -3120,7 +3119,6 @@ static int airoha_en7581_get_src_port_id
+@@ -3145,7 +3144,6 @@ static int airoha_en7581_get_src_port_id
  }
  
  static const char * const an7583_xsi_rsts_names[] = {
index d0e658b81e3b8cb1d2dbf59e6e076f44edb0f79f..ca68969dde895d092cc23721275ab436bcd37935 100644 (file)
@@ -35,9 +35,9 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
  static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
  {
        struct airoha_eth *eth = port->qdma->eth;
-@@ -1621,6 +1627,17 @@ static int airoha_dev_open(struct net_de
-       struct airoha_gdm_port *port = netdev_priv(dev);
+@@ -1622,6 +1628,17 @@ static int airoha_dev_open(struct net_de
        struct airoha_qdma *qdma = port->qdma;
+       u32 pse_port = FE_PSE_PORT_PPE1;
  
 +      if (airhoa_is_phy_external(port)) {
 +              err = phylink_of_phy_connect(port->phylink, dev->dev.of_node, 0);
@@ -53,7 +53,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
        netif_tx_start_all_queues(dev);
        err = airoha_set_vip_for_gdm_port(port, true);
        if (err)
-@@ -1674,6 +1691,11 @@ static int airoha_dev_stop(struct net_de
+@@ -1686,6 +1703,11 @@ static int airoha_dev_stop(struct net_de
                }
        }
  
@@ -65,7 +65,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
        return 0;
  }
  
-@@ -2816,6 +2838,20 @@ static const struct ethtool_ops airoha_e
+@@ -2833,6 +2855,20 @@ static const struct ethtool_ops airoha_e
        .get_link               = ethtool_op_get_link,
  };
  
@@ -86,7 +86,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
  static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
  {
        int i;
-@@ -2860,6 +2896,99 @@ bool airoha_is_valid_gdm_port(struct air
+@@ -2877,6 +2913,99 @@ bool airoha_is_valid_gdm_port(struct air
        return false;
  }
  
@@ -184,34 +184,34 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 +}
 +
  static int airoha_alloc_gdm_port(struct airoha_eth *eth,
-                                struct device_node *np, int index)
+                                struct device_node *np)
  {
-@@ -2938,6 +3067,12 @@ static int airoha_alloc_gdm_port(struct
-       if (err)
-               return err;
+@@ -2948,6 +3077,12 @@ static int airoha_alloc_gdm_port(struct
+       port->id = id;
+       eth->ports[p] = port;
  
 +      if (airhoa_is_phy_external(port)) {
 +              err = airoha_setup_phylink(dev);
 +              if (err)
-+                      goto free_metadata_dst;
++                      return err;
 +      }
 +
-       err = register_netdev(dev);
-       if (err)
-               goto free_metadata_dst;
-@@ -3053,6 +3188,10 @@ error_hw_cleanup:
-               if (port && port->dev->reg_state == NETREG_REGISTERED) {
+       return airoha_metadata_dst_alloc(port);
+ }
+@@ -3079,6 +3214,10 @@ error_hw_cleanup:
+               if (port->dev->reg_state == NETREG_REGISTERED)
                        unregister_netdev(port->dev);
-                       airoha_metadata_dst_free(port);
-+                      if (airhoa_is_phy_external(port)) {
-+                              phylink_destroy(port->phylink);
-+                              airoha_pcs_destroy(port->pcs);
-+                      }
-               }
++              if (airhoa_is_phy_external(port)) {
++                      phylink_destroy(port->phylink);
++                      airoha_pcs_destroy(port->pcs);
++              }
+               airoha_metadata_dst_free(port);
        }
        free_netdev(eth->napi_dev);
-@@ -3080,6 +3219,10 @@ static void airoha_remove(struct platfor
-               airoha_dev_stop(port->dev);
+@@ -3105,6 +3244,10 @@ static void airoha_remove(struct platfor
                unregister_netdev(port->dev);
                airoha_metadata_dst_free(port);
 +              if (airhoa_is_phy_external(port)) {
@@ -223,7 +223,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
  
 --- a/drivers/net/ethernet/airoha/airoha_eth.h
 +++ b/drivers/net/ethernet/airoha/airoha_eth.h
-@@ -536,6 +536,10 @@ struct airoha_gdm_port {
+@@ -537,6 +537,10 @@ struct airoha_gdm_port {
        struct net_device *dev;
        int id;
  
index bcc80b002d1c10c4a21ef4e5a7a7796484944ec6..5820adf6c72d00aaca42d9f201d097f2f2c6947b 100644 (file)
@@ -28,15 +28,15 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  
  static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
  {
-@@ -1630,6 +1632,7 @@ static int airoha_dev_open(struct net_de
-       struct airoha_gdm_port *port = netdev_priv(dev);
+@@ -1631,6 +1633,7 @@ static int airoha_dev_open(struct net_de
        struct airoha_qdma *qdma = port->qdma;
+       u32 pse_port = FE_PSE_PORT_PPE1;
  
 +#if defined(CONFIG_PCS_AIROHA)
        if (airhoa_is_phy_external(port)) {
                err = phylink_of_phy_connect(port->phylink, dev->dev.of_node, 0);
                if (err) {
-@@ -1640,6 +1643,7 @@ static int airoha_dev_open(struct net_de
+@@ -1641,6 +1644,7 @@ static int airoha_dev_open(struct net_de
  
                phylink_start(port->phylink);
        }
@@ -44,7 +44,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  
        netif_tx_start_all_queues(dev);
        err = airoha_set_vip_for_gdm_port(port, true);
-@@ -1694,10 +1698,12 @@ static int airoha_dev_stop(struct net_de
+@@ -1706,10 +1710,12 @@ static int airoha_dev_stop(struct net_de
                }
        }
  
@@ -57,7 +57,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  
        return 0;
  }
-@@ -2841,6 +2847,7 @@ static const struct ethtool_ops airoha_e
+@@ -2858,6 +2864,7 @@ static const struct ethtool_ops airoha_e
        .get_link               = ethtool_op_get_link,
  };
  
@@ -65,7 +65,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  static struct phylink_pcs *airoha_phylink_mac_select_pcs(struct phylink_config *config,
                                                         phy_interface_t interface)
  {
-@@ -2854,6 +2861,7 @@ static void airoha_mac_config(struct phy
+@@ -2871,6 +2878,7 @@ static void airoha_mac_config(struct phy
                              const struct phylink_link_state *state)
  {
  }
@@ -73,7 +73,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  
  static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
  {
-@@ -2899,6 +2907,7 @@ bool airoha_is_valid_gdm_port(struct air
+@@ -2916,6 +2924,7 @@ bool airoha_is_valid_gdm_port(struct air
        return false;
  }
  
@@ -81,43 +81,43 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  static void airoha_mac_link_up(struct phylink_config *config, struct phy_device *phy,
                               unsigned int mode, phy_interface_t interface,
                               int speed, int duplex, bool tx_pause, bool rx_pause)
-@@ -2991,6 +3000,7 @@ static int airoha_setup_phylink(struct n
+@@ -3008,6 +3017,7 @@ static int airoha_setup_phylink(struct n
  
        return 0;
  }
 +#endif
  
  static int airoha_alloc_gdm_port(struct airoha_eth *eth,
-                                struct device_node *np, int index)
-@@ -3070,11 +3080,13 @@ static int airoha_alloc_gdm_port(struct
-       if (err)
-               return err;
+                                struct device_node *np)
+@@ -3080,11 +3090,13 @@ static int airoha_alloc_gdm_port(struct
+       port->id = id;
+       eth->ports[p] = port;
  
 +#if defined(CONFIG_PCS_AIROHA)
        if (airhoa_is_phy_external(port)) {
                err = airoha_setup_phylink(dev);
                if (err)
-                       goto free_metadata_dst;
+                       return err;
        }
 +#endif
  
-       err = register_netdev(dev);
-       if (err)
-@@ -3191,10 +3203,12 @@ error_hw_cleanup:
-               if (port && port->dev->reg_state == NETREG_REGISTERED) {
+       return airoha_metadata_dst_alloc(port);
+ }
+@@ -3217,10 +3229,12 @@ error_hw_cleanup:
+               if (port->dev->reg_state == NETREG_REGISTERED)
                        unregister_netdev(port->dev);
-                       airoha_metadata_dst_free(port);
 +#if defined(CONFIG_PCS_AIROHA)
-                       if (airhoa_is_phy_external(port)) {
-                               phylink_destroy(port->phylink);
-                               airoha_pcs_destroy(port->pcs);
-                       }
-+#endif
+               if (airhoa_is_phy_external(port)) {
+                       phylink_destroy(port->phylink);
+                       airoha_pcs_destroy(port->pcs);
                }
++#endif
+               airoha_metadata_dst_free(port);
        }
        free_netdev(eth->napi_dev);
-@@ -3222,10 +3236,12 @@ static void airoha_remove(struct platfor
-               airoha_dev_stop(port->dev);
+@@ -3247,10 +3261,12 @@ static void airoha_remove(struct platfor
                unregister_netdev(port->dev);
                airoha_metadata_dst_free(port);
 +#if defined(CONFIG_PCS_AIROHA)
@@ -131,7 +131,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
  
 --- a/drivers/net/ethernet/airoha/airoha_eth.h
 +++ b/drivers/net/ethernet/airoha/airoha_eth.h
-@@ -536,9 +536,11 @@ struct airoha_gdm_port {
+@@ -537,9 +537,11 @@ struct airoha_gdm_port {
        struct net_device *dev;
        int id;