--- /dev/null
+From c06a2f2903f6fba0a3088ad05fc5cf61a66e5d89 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Tue, 28 Apr 2026 07:23:38 +0200
+Subject: [PATCH] net: airoha: Rename get_src_port_id callback in get_sport
+
+For code consistency, rename get_src_port_id callback in get_sport.
+Please note this patch does not introduce any logical change and it is
+just a cosmetic patch.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260428-airoha-get_src_port_id-callback-v1-1-3f765c91c1e8@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 10 +++++-----
+ drivers/net/ethernet/airoha/airoha_eth.h | 2 +-
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1823,7 +1823,7 @@ static int airoha_set_gdm2_loopback(stru
+ 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));
+
+- src_port = eth->soc->ops.get_src_port_id(port, port->nbq);
++ src_port = eth->soc->ops.get_sport(port, port->nbq);
+ if (src_port < 0)
+ return src_port;
+
+@@ -3199,7 +3199,7 @@ static const char * const en7581_xsi_rst
+ "xfp-mac",
+ };
+
+-static int airoha_en7581_get_src_port_id(struct airoha_gdm_port *port, int nbq)
++static int airoha_en7581_get_sport(struct airoha_gdm_port *port, int nbq)
+ {
+ switch (port->id) {
+ case AIROHA_GDM3_IDX:
+@@ -3252,7 +3252,7 @@ static const char * const an7583_xsi_rst
+ "xfp-mac",
+ };
+
+-static int airoha_an7583_get_src_port_id(struct airoha_gdm_port *port, int nbq)
++static int airoha_an7583_get_sport(struct airoha_gdm_port *port, int nbq)
+ {
+ switch (port->id) {
+ case AIROHA_GDM3_IDX:
+@@ -3300,7 +3300,7 @@ static const struct airoha_eth_soc_data
+ .num_xsi_rsts = ARRAY_SIZE(en7581_xsi_rsts_names),
+ .num_ppe = 2,
+ .ops = {
+- .get_src_port_id = airoha_en7581_get_src_port_id,
++ .get_sport = airoha_en7581_get_sport,
+ .get_vip_port = airoha_en7581_get_vip_port,
+ },
+ };
+@@ -3311,7 +3311,7 @@ static const struct airoha_eth_soc_data
+ .num_xsi_rsts = ARRAY_SIZE(an7583_xsi_rsts_names),
+ .num_ppe = 1,
+ .ops = {
+- .get_src_port_id = airoha_an7583_get_src_port_id,
++ .get_sport = airoha_an7583_get_sport,
+ .get_vip_port = airoha_an7583_get_vip_port,
+ },
+ };
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -578,7 +578,7 @@ struct airoha_eth_soc_data {
+ int num_xsi_rsts;
+ int num_ppe;
+ struct {
+- int (*get_src_port_id)(struct airoha_gdm_port *port, int nbq);
++ int (*get_sport)(struct airoha_gdm_port *port, int nbq);
+ u32 (*get_vip_port)(struct airoha_gdm_port *port, int nbq);
+ } ops;
+ };
--- /dev/null
+From 4ca01292ea2f2363660610a65ba0285d7c3309ed Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Tue, 28 Apr 2026 08:53:16 +0200
+Subject: [PATCH] net: airoha: Do not return err in ndo_stop() callback
+
+Always complete the airoha_dev_stop() routine regardless of the
+airoha_set_vip_for_gdm_port() return value, since errors from
+ndo_stop() are ignored by the networking stack and the interface is
+always considered down after the call.
+
+Fixes: 23020f049327 ("net: airoha: Introduce ethernet support for EN7581 SoC")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260428-airoha-ndo-stop-not-err-v1-1-674506d29a91@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -1747,13 +1747,10 @@ static int airoha_dev_stop(struct net_de
+ {
+ struct airoha_gdm_port *port = netdev_priv(dev);
+ struct airoha_qdma *qdma = port->qdma;
+- int i, err;
++ int i;
+
+ netif_tx_disable(dev);
+- err = airoha_set_vip_for_gdm_port(port, false);
+- if (err)
+- return err;
+-
++ airoha_set_vip_for_gdm_port(port, false);
+ for (i = 0; i < dev->num_tx_queues; i++)
+ netdev_tx_reset_subqueue(dev, i);
+
--- /dev/null
+From 75df490c9e8457990c8b227650f6491218ce018b Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Wed, 29 Apr 2026 14:02:31 +0200
+Subject: [PATCH] net: airoha: Move entries to queue head in case of DMA
+ mapping failure in airoha_dev_xmit()
+
+In order to respect the original descriptor order and avoid any
+potential IOMMU fault or memory corruption, move pending queue entries
+to the head of hw queue tx_list if the DMA mapping of current inflight
+packet fails in airoha_dev_xmit routine.
+
+Fixes: 3f47e67dff1f7 ("net: airoha: Add the capability to consume out-of-order DMA tx descriptors")
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260429-airoha-xmit-unmap-error-path-v2-1-32e43b7c6d25@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -2120,14 +2120,12 @@ static netdev_tx_t airoha_dev_xmit(struc
+ return NETDEV_TX_OK;
+
+ error_unmap:
+- while (!list_empty(&tx_list)) {
+- e = list_first_entry(&tx_list, struct airoha_queue_entry,
+- list);
++ list_for_each_entry(e, &tx_list, list) {
+ dma_unmap_single(dev->dev.parent, e->dma_addr, e->dma_len,
+ DMA_TO_DEVICE);
+ e->dma_addr = 0;
+- list_move_tail(&e->list, &q->tx_list);
+ }
++ list_splice(&tx_list, &q->tx_list);
+
+ spin_unlock_bh(&q->lock);
+ error:
--- /dev/null
+From 286efd34d1a1ef5d83f9441b5e59421a26738169 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Thu, 30 Apr 2026 10:47:38 +0200
+Subject: [PATCH] net: airoha: configure QoS channel for HW accelerated
+ flowtable traffic
+
+As done for the SW path, configure the QoS channel for HW accelerated
+traffic according to the user port index when forwarding to a DSA port,
+or rely on the GDM port identifier otherwise. This allows HTB shaping
+to be applied to HW accelerated traffic.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260430-airoha-ppe-qos-channel-v1-1-5ef9221e85c1@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_ppe.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_ppe.c
++++ b/drivers/net/ethernet/airoha/airoha_ppe.c
+@@ -332,7 +332,7 @@ static int airoha_ppe_foe_entry_prepare(
+ info.wcid);
+ } else {
+ struct airoha_gdm_port *port = netdev_priv(dev);
+- u8 pse_port;
++ u8 pse_port, channel;
+
+ if (!airoha_is_valid_gdm_port(eth, port))
+ return -EINVAL;
+@@ -345,6 +345,14 @@ static int airoha_ppe_foe_entry_prepare(
+ * loopback
+ */
+
++ /* For traffic forwarded to DSA devices select QoS
++ * channel according to the DSA user port index, rely
++ * on port id otherwise.
++ */
++ channel = dsa_port >= 0 ? dsa_port : port->id;
++ channel = channel % AIROHA_NUM_QOS_CHANNELS;
++ qdata |= FIELD_PREP(AIROHA_FOE_CHANNEL, channel);
++
+ val |= FIELD_PREP(AIROHA_FOE_IB2_PSE_PORT, pse_port) |
+ AIROHA_FOE_IB2_PSE_QOS;
+ /* For downlink traffic consume SRAM memory for hw
--- /dev/null
+From 98e490930de3af9afa0bbb2d1d79d6d5b5513012 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Fri, 1 May 2026 09:49:11 +0200
+Subject: [PATCH] net: airoha: Introduce airoha_fe_get()/airoha_qdma_get()
+ register read helpers
+
+Add airoha_fe_get() and airoha_qdma_get() as utility routines for reading
+a masked field from a specified register.
+This is a non-functional refactor, no logical changes are introduced to
+the existing codebase.
+
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260501-airoha_fe_get-airoha_qdma_get-v3-1-126c6f647ccb@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 13 ++++---------
+ drivers/net/ethernet/airoha/airoha_eth.h | 4 ++++
+ drivers/net/ethernet/airoha/airoha_ppe.c | 5 ++---
+ 3 files changed, 10 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -201,15 +201,13 @@ static void airoha_fe_vip_setup(struct a
+ static u32 airoha_fe_get_pse_queue_rsv_pages(struct airoha_eth *eth,
+ u32 port, u32 queue)
+ {
+- u32 val;
+-
+ airoha_fe_rmw(eth, REG_FE_PSE_QUEUE_CFG_WR,
+ PSE_CFG_PORT_ID_MASK | PSE_CFG_QUEUE_ID_MASK,
+ FIELD_PREP(PSE_CFG_PORT_ID_MASK, port) |
+ FIELD_PREP(PSE_CFG_QUEUE_ID_MASK, queue));
+- val = airoha_fe_rr(eth, REG_FE_PSE_QUEUE_CFG_VAL);
+
+- return FIELD_GET(PSE_CFG_OQ_RSV_MASK, val);
++ return airoha_fe_get(eth, REG_FE_PSE_QUEUE_CFG_VAL,
++ PSE_CFG_OQ_RSV_MASK);
+ }
+
+ static void airoha_fe_set_pse_queue_rsv_pages(struct airoha_eth *eth,
+@@ -227,9 +225,7 @@ static void airoha_fe_set_pse_queue_rsv_
+
+ static u32 airoha_fe_get_pse_all_rsv(struct airoha_eth *eth)
+ {
+- u32 val = airoha_fe_rr(eth, REG_FE_PSE_BUF_SET);
+-
+- return FIELD_GET(PSE_ALLRSV_MASK, val);
++ return airoha_fe_get(eth, REG_FE_PSE_BUF_SET, PSE_ALLRSV_MASK);
+ }
+
+ static int airoha_fe_set_pse_oq_rsv(struct airoha_eth *eth,
+@@ -247,8 +243,7 @@ static int airoha_fe_set_pse_oq_rsv(stru
+ FIELD_PREP(PSE_ALLRSV_MASK, all_rsv));
+
+ /* modify hthd */
+- tmp = airoha_fe_rr(eth, PSE_FQ_CFG);
+- fq_limit = FIELD_GET(PSE_FQ_LIMIT_MASK, tmp);
++ fq_limit = airoha_fe_get(eth, PSE_FQ_CFG, PSE_FQ_LIMIT_MASK);
+ tmp = fq_limit - all_rsv - 0x20;
+ airoha_fe_rmw(eth, REG_PSE_SHARE_USED_THD,
+ PSE_SHARE_USED_HTHD_MASK,
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -619,6 +619,8 @@ u32 airoha_rmw(void __iomem *base, u32 o
+ airoha_rmw((eth)->fe_regs, (offset), 0, (val))
+ #define airoha_fe_clear(eth, offset, val) \
+ airoha_rmw((eth)->fe_regs, (offset), (val), 0)
++#define airoha_fe_get(eth, offset, mask) \
++ FIELD_GET((mask), airoha_fe_rr((eth), (offset)))
+
+ #define airoha_qdma_rr(qdma, offset) \
+ airoha_rr((qdma)->regs, (offset))
+@@ -630,6 +632,8 @@ u32 airoha_rmw(void __iomem *base, u32 o
+ airoha_rmw((qdma)->regs, (offset), 0, (val))
+ #define airoha_qdma_clear(qdma, offset, val) \
+ airoha_rmw((qdma)->regs, (offset), (val), 0)
++#define airoha_qdma_get(qdma, offset, mask) \
++ FIELD_GET((mask), airoha_qdma_rr((qdma), (offset)))
+
+ static inline u16 airoha_qdma_get_txq(struct airoha_qdma *qdma, u16 qid)
+ {
+--- a/drivers/net/ethernet/airoha/airoha_ppe.c
++++ b/drivers/net/ethernet/airoha/airoha_ppe.c
+@@ -80,9 +80,8 @@ bool airoha_ppe_is_enabled(struct airoha
+
+ static u32 airoha_ppe_get_timestamp(struct airoha_ppe *ppe)
+ {
+- u16 timestamp = airoha_fe_rr(ppe->eth, REG_FE_FOE_TS);
+-
+- return FIELD_GET(AIROHA_FOE_IB1_BIND_TIMESTAMP, timestamp);
++ return airoha_fe_get(ppe->eth, REG_FE_FOE_TS,
++ AIROHA_FOE_IB1_BIND_TIMESTAMP);
+ }
+
+ void airoha_ppe_set_cpu_port(struct airoha_gdm_port *port, u8 ppe_id, u8 fport)
--- /dev/null
+From bbfb1983944f2eaa8ee192e0f7b59ecc0fda9981 Mon Sep 17 00:00:00 2001
+From: Lorenzo Bianconi <lorenzo@kernel.org>
+Date: Wed, 13 May 2026 17:03:59 +0200
+Subject: [PATCH] net: airoha: Reserve RX headroom to avoid skb reallocation
+
+Reserve NET_SKB_PAD + NET_IP_ALIGN bytes of headroom for received packets
+to avoid skb head reallocation when pushing protocol headers into the skb.
+
+Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
+Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
+Link: https://patch.msgid.link/20260513-airoha-rx-headroom-v1-1-bd87798e422d@kernel.org
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+---
+ drivers/net/ethernet/airoha/airoha_eth.c | 14 ++++++++------
+ drivers/net/ethernet/airoha/airoha_eth.h | 2 ++
+ 2 files changed, 10 insertions(+), 6 deletions(-)
+
+--- a/drivers/net/ethernet/airoha/airoha_eth.c
++++ b/drivers/net/ethernet/airoha/airoha_eth.c
+@@ -543,9 +543,10 @@ static int airoha_qdma_fill_rx_queue(str
+ q->queued++;
+ nframes++;
+
++ offset += AIROHA_RX_HEADROOM;
+ e->buf = page_address(page) + offset;
+ e->dma_addr = page_pool_get_dma_addr(page) + offset;
+- e->dma_len = SKB_WITH_OVERHEAD(q->buf_size);
++ e->dma_len = SKB_WITH_OVERHEAD(AIROHA_RX_LEN(q->buf_size));
+
+ val = FIELD_PREP(QDMA_DESC_LEN_MASK, e->dma_len);
+ WRITE_ONCE(desc->ctrl, cpu_to_le32(val));
+@@ -611,13 +612,12 @@ static int airoha_qdma_rx_process(struct
+ q->tail = (q->tail + 1) % q->ndesc;
+ q->queued--;
+
+- dma_sync_single_for_cpu(eth->dev, e->dma_addr,
+- SKB_WITH_OVERHEAD(q->buf_size), dir);
++ dma_sync_single_for_cpu(eth->dev, e->dma_addr, e->dma_len,
++ dir);
+
+ page = virt_to_head_page(e->buf);
+ len = FIELD_GET(QDMA_DESC_LEN_MASK, desc_ctrl);
+- data_len = q->skb ? q->buf_size
+- : SKB_WITH_OVERHEAD(q->buf_size);
++ data_len = q->skb ? AIROHA_RX_LEN(q->buf_size) : e->dma_len;
+ if (!len || data_len < len)
+ goto free_frag;
+
+@@ -627,10 +627,12 @@ static int airoha_qdma_rx_process(struct
+
+ port = eth->ports[p];
+ if (!q->skb) { /* first buffer */
+- q->skb = napi_build_skb(e->buf, q->buf_size);
++ q->skb = napi_build_skb(e->buf - AIROHA_RX_HEADROOM,
++ q->buf_size);
+ if (!q->skb)
+ goto free_frag;
+
++ skb_reserve(q->skb, AIROHA_RX_HEADROOM);
+ __skb_put(q->skb, len);
+ skb_mark_for_recycle(q->skb);
+ q->skb->dev = port->dev;
+--- a/drivers/net/ethernet/airoha/airoha_eth.h
++++ b/drivers/net/ethernet/airoha/airoha_eth.h
+@@ -32,6 +32,8 @@
+ #define AIROHA_FE_MC_MAX_VLAN_TABLE 64
+ #define AIROHA_FE_MC_MAX_VLAN_PORT 16
+ #define AIROHA_NUM_TX_IRQ 2
++#define AIROHA_RX_HEADROOM (NET_SKB_PAD + NET_IP_ALIGN)
++#define AIROHA_RX_LEN(_n) ((_n) - AIROHA_RX_HEADROOM)
+ #define HW_DSCP_NUM 2048
+ #define IRQ_QUEUE_LEN(_n) ((_n) ? 1024 : 2048)
+ #define TX_DSCP_NUM 1024
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -1490,6 +1490,10 @@ static int airoha_hw_init(struct platfor
+@@ -1487,6 +1487,10 @@ static int airoha_hw_init(struct platfor
if (err)
return err;
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -578,8 +578,11 @@ static int airoha_qdma_get_gdm_port(stru
+@@ -574,8 +574,11 @@ static int airoha_qdma_get_gdm_port(stru
sport = FIELD_GET(QDMA_ETH_RXMSG_SPORT_MASK, msg1);
switch (sport) {
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -503,8 +503,10 @@ static int airoha_fe_init(struct airoha_
+@@ -498,8 +498,10 @@ static int airoha_fe_init(struct airoha_
FIELD_PREP(IP_ASSEMBLE_PORT_MASK, 0) |
FIELD_PREP(IP_ASSEMBLE_NBQ_MASK, 22));
airoha_fe_crsn_qsel_init(eth);
-@@ -1722,7 +1724,8 @@ static int airoha_dev_open(struct net_de
+@@ -1719,7 +1721,8 @@ static int airoha_dev_open(struct net_de
if (err)
return err;
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -3202,7 +3202,6 @@ static void airoha_remove(struct platfor
+@@ -3194,7 +3194,6 @@ static void airoha_remove(struct platfor
}
static const char * const en7581_xsi_rsts_names[] = {
"hsi0-mac",
"hsi1-mac",
"hsi-mac",
-@@ -3256,7 +3255,6 @@ static u32 airoha_en7581_get_vip_port(st
+@@ -3248,7 +3247,6 @@ static u32 airoha_en7581_get_vip_port(st
}
static const char * const an7583_xsi_rsts_names[] = {
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
{
struct airoha_eth *eth = port->qdma->eth;
-@@ -1719,6 +1725,17 @@ static int airoha_dev_open(struct net_de
+@@ -1716,6 +1722,17 @@ static int airoha_dev_open(struct net_de
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);
if (err)
-@@ -1783,6 +1800,11 @@ static int airoha_dev_stop(struct net_de
+@@ -1777,6 +1794,11 @@ static int airoha_dev_stop(struct net_de
}
}
return 0;
}
-@@ -2922,6 +2944,11 @@ static const struct ethtool_ops airoha_e
+@@ -2914,6 +2936,11 @@ static const struct ethtool_ops airoha_e
.get_link = ethtool_op_get_link,
};
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
{
int i;
-@@ -2966,6 +2993,124 @@ bool airoha_is_valid_gdm_port(struct air
+@@ -2958,6 +2985,124 @@ bool airoha_is_valid_gdm_port(struct air
return false;
}
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
struct device_node *np)
{
-@@ -3039,6 +3184,12 @@ static int airoha_alloc_gdm_port(struct
+@@ -3031,6 +3176,12 @@ static int airoha_alloc_gdm_port(struct
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
eth->ports[p] = port;
return airoha_metadata_dst_alloc(port);
}
-@@ -3166,8 +3317,11 @@ error_napi_stop:
+@@ -3158,8 +3309,11 @@ error_napi_stop:
if (!port)
continue;
airoha_metadata_dst_free(port);
}
airoha_hw_cleanup(eth);
-@@ -3192,6 +3346,8 @@ static void airoha_remove(struct platfor
+@@ -3184,6 +3338,8 @@ static void airoha_remove(struct platfor
if (!port)
continue;
}
--- a/drivers/net/ethernet/airoha/airoha_eth.h
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
-@@ -540,6 +540,9 @@ struct airoha_gdm_port {
+@@ -542,6 +542,9 @@ struct airoha_gdm_port {
int id;
int nbq;
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
-@@ -589,6 +589,9 @@ static int airoha_qdma_get_gdm_port(stru
+@@ -585,6 +585,9 @@ static int airoha_qdma_get_gdm_port(stru
case 0x18:
port = 3; /* GDM4 */
break;
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
{
-@@ -1728,6 +1730,7 @@ static int airoha_dev_open(struct net_de
+@@ -1725,6 +1727,7 @@ 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);
if (err) {
-@@ -1738,6 +1741,7 @@ static int airoha_dev_open(struct net_de
+@@ -1735,6 +1738,7 @@ static int airoha_dev_open(struct net_de
phylink_start(port->phylink);
}
netif_tx_start_all_queues(dev);
err = airoha_set_vip_for_gdm_port(port, true);
-@@ -1803,10 +1807,12 @@ static int airoha_dev_stop(struct net_de
+@@ -1797,10 +1801,12 @@ static int airoha_dev_stop(struct net_de
}
}
return 0;
}
-@@ -2996,6 +3002,7 @@ bool airoha_is_valid_gdm_port(struct air
+@@ -2988,6 +2994,7 @@ bool airoha_is_valid_gdm_port(struct air
return false;
}
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)
-@@ -3113,6 +3120,7 @@ out:
+@@ -3105,6 +3112,7 @@ out:
return err;
}
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
struct device_node *np)
-@@ -3187,11 +3195,13 @@ static int airoha_alloc_gdm_port(struct
+@@ -3179,11 +3187,13 @@ static int airoha_alloc_gdm_port(struct
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
eth->ports[p] = port;
return airoha_metadata_dst_alloc(port);
}
-@@ -3321,8 +3331,10 @@ error_napi_stop:
+@@ -3313,8 +3323,10 @@ error_napi_stop:
continue;
if (port->dev->reg_state == NETREG_REGISTERED) {
unregister_netdev(port->dev);
}
airoha_metadata_dst_free(port);
-@@ -3349,8 +3361,10 @@ static void airoha_remove(struct platfor
+@@ -3341,8 +3353,10 @@ static void airoha_remove(struct platfor
if (!port)
continue;
}
--- a/drivers/net/ethernet/airoha/airoha_eth.h
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
-@@ -540,8 +540,10 @@ struct airoha_gdm_port {
+@@ -542,8 +542,10 @@ struct airoha_gdm_port {
int id;
int nbq;