airoha: backport additional patch for memory leak and multi-serdes rework
Backport upstream memory leak patch merged upstream and even more preliminary patch for multi-serdes rewrk. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
This commit is contained in:
parent
cf2e435e0e
commit
155c610962
@ -0,0 +1,78 @@
|
|||||||
|
From 4ae0604a0673e11e2075b178387151fcad5111b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Tue, 7 Apr 2026 08:48:04 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Add dma_rmb() and READ_ONCE() in
|
||||||
|
airoha_qdma_rx_process()
|
||||||
|
|
||||||
|
Add missing dma_rmb() in airoha_qdma_rx_process routine to make sure the
|
||||||
|
DMA read operations are completed when the NIC reports the processing on
|
||||||
|
the current descriptor is done. Moreover, add missing READ_ONCE() in
|
||||||
|
airoha_qdma_rx_process() for DMA descriptor control fields in order to
|
||||||
|
avoid any compiler reordering.
|
||||||
|
|
||||||
|
Fixes: 23020f0493270 ("net: airoha: Introduce ethernet support for EN7581 SoC")
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260407-airoha_qdma_rx_process-fix-reordering-v3-1-91c36e9da31f@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 16 ++++++++++------
|
||||||
|
1 file changed, 10 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -584,7 +584,7 @@ static int airoha_qdma_fill_rx_queue(str
|
||||||
|
static int airoha_qdma_get_gdm_port(struct airoha_eth *eth,
|
||||||
|
struct airoha_qdma_desc *desc)
|
||||||
|
{
|
||||||
|
- u32 port, sport, msg1 = le32_to_cpu(desc->msg1);
|
||||||
|
+ u32 port, sport, msg1 = le32_to_cpu(READ_ONCE(desc->msg1));
|
||||||
|
|
||||||
|
sport = FIELD_GET(QDMA_ETH_RXMSG_SPORT_MASK, msg1);
|
||||||
|
switch (sport) {
|
||||||
|
@@ -612,21 +612,24 @@ static int airoha_qdma_rx_process(struct
|
||||||
|
while (done < budget) {
|
||||||
|
struct airoha_queue_entry *e = &q->entry[q->tail];
|
||||||
|
struct airoha_qdma_desc *desc = &q->desc[q->tail];
|
||||||
|
- u32 hash, reason, msg1 = le32_to_cpu(desc->msg1);
|
||||||
|
- struct page *page = virt_to_head_page(e->buf);
|
||||||
|
- u32 desc_ctrl = le32_to_cpu(desc->ctrl);
|
||||||
|
+ u32 hash, reason, msg1, desc_ctrl;
|
||||||
|
struct airoha_gdm_port *port;
|
||||||
|
int data_len, len, p;
|
||||||
|
+ struct page *page;
|
||||||
|
|
||||||
|
+ desc_ctrl = le32_to_cpu(READ_ONCE(desc->ctrl));
|
||||||
|
if (!(desc_ctrl & QDMA_DESC_DONE_MASK))
|
||||||
|
break;
|
||||||
|
|
||||||
|
+ dma_rmb();
|
||||||
|
+
|
||||||
|
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);
|
||||||
|
|
||||||
|
+ 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);
|
||||||
|
@@ -670,8 +673,8 @@ static int airoha_qdma_rx_process(struct
|
||||||
|
* DMA descriptor. Report DSA tag to the DSA stack
|
||||||
|
* via skb dst info.
|
||||||
|
*/
|
||||||
|
- u32 sptag = FIELD_GET(QDMA_ETH_RXMSG_SPTAG,
|
||||||
|
- le32_to_cpu(desc->msg0));
|
||||||
|
+ u32 msg0 = le32_to_cpu(READ_ONCE(desc->msg0));
|
||||||
|
+ u32 sptag = FIELD_GET(QDMA_ETH_RXMSG_SPTAG, msg0);
|
||||||
|
|
||||||
|
if (sptag < ARRAY_SIZE(port->dsa_meta) &&
|
||||||
|
port->dsa_meta[sptag])
|
||||||
|
@@ -679,6 +682,7 @@ static int airoha_qdma_rx_process(struct
|
||||||
|
&port->dsa_meta[sptag]->dst);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ msg1 = le32_to_cpu(READ_ONCE(desc->msg1));
|
||||||
|
hash = FIELD_GET(AIROHA_RXD4_FOE_ENTRY, msg1);
|
||||||
|
if (hash != AIROHA_RXD4_FOE_ENTRY)
|
||||||
|
skb_set_hash(q->skb, jhash_1word(hash, 0),
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
From b9d8b856689d2b968495d79fe653d87fcb8ad98c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 10:43:26 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Add missing PPE configurations in
|
||||||
|
airoha_ppe_hw_init()
|
||||||
|
|
||||||
|
Add the following PPE configuration in airoha_ppe_hw_init routine:
|
||||||
|
- 6RD hw offloading is currently not supported by Netfilter flowtable.
|
||||||
|
Disable explicitly PPE 6RD offloading in order to prevent PPE to learn
|
||||||
|
6RD flows and eventually interrupt the traffic.
|
||||||
|
- Add missing PPE bind rate configuration for L3 and L2 traffic.
|
||||||
|
PPE bind rate configuration specifies the pps threshold to move a PPE
|
||||||
|
entry state from UNBIND to BIND. Without this configuration this value
|
||||||
|
is random.
|
||||||
|
- Set ageing thresholds to the values used in the vendor SDK in order to
|
||||||
|
improve connection stability under load and avoid packet loss caused by
|
||||||
|
fast aging.
|
||||||
|
|
||||||
|
Fixes: 00a7678310fe3 ("net: airoha: Introduce flowtable offload support")
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha_ppe_hw_init-missing-bits-v1-1-06ac670819e3@kernel.org
|
||||||
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_ppe.c | 14 +++++++++++---
|
||||||
|
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
|
||||||
|
@@ -125,13 +125,13 @@ static void airoha_ppe_hw_init(struct ai
|
||||||
|
airoha_fe_rmw(eth, REG_PPE_BND_AGE0(i),
|
||||||
|
PPE_BIND_AGE0_DELTA_NON_L4 |
|
||||||
|
PPE_BIND_AGE0_DELTA_UDP,
|
||||||
|
- FIELD_PREP(PPE_BIND_AGE0_DELTA_NON_L4, 1) |
|
||||||
|
- FIELD_PREP(PPE_BIND_AGE0_DELTA_UDP, 12));
|
||||||
|
+ FIELD_PREP(PPE_BIND_AGE0_DELTA_NON_L4, 60) |
|
||||||
|
+ FIELD_PREP(PPE_BIND_AGE0_DELTA_UDP, 60));
|
||||||
|
airoha_fe_rmw(eth, REG_PPE_BND_AGE1(i),
|
||||||
|
PPE_BIND_AGE1_DELTA_TCP_FIN |
|
||||||
|
PPE_BIND_AGE1_DELTA_TCP,
|
||||||
|
FIELD_PREP(PPE_BIND_AGE1_DELTA_TCP_FIN, 1) |
|
||||||
|
- FIELD_PREP(PPE_BIND_AGE1_DELTA_TCP, 7));
|
||||||
|
+ FIELD_PREP(PPE_BIND_AGE1_DELTA_TCP, 60));
|
||||||
|
|
||||||
|
airoha_fe_rmw(eth, REG_PPE_TB_HASH_CFG(i),
|
||||||
|
PPE_SRAM_TABLE_EN_MASK |
|
||||||
|
@@ -159,7 +159,15 @@ static void airoha_ppe_hw_init(struct ai
|
||||||
|
FIELD_PREP(PPE_DRAM_TB_NUM_ENTRY_MASK,
|
||||||
|
dram_num_entries));
|
||||||
|
|
||||||
|
+ airoha_fe_rmw(eth, REG_PPE_BIND_RATE(i),
|
||||||
|
+ PPE_BIND_RATE_L2B_BIND_MASK |
|
||||||
|
+ PPE_BIND_RATE_BIND_MASK,
|
||||||
|
+ FIELD_PREP(PPE_BIND_RATE_L2B_BIND_MASK, 0x1e) |
|
||||||
|
+ FIELD_PREP(PPE_BIND_RATE_BIND_MASK, 0x1e));
|
||||||
|
+
|
||||||
|
airoha_fe_wr(eth, REG_PPE_HASH_SEED(i), PPE_HASH_SEED);
|
||||||
|
+ airoha_fe_clear(eth, REG_PPE_PPE_FLOW_CFG(i),
|
||||||
|
+ PPE_FLOW_CFG_IP6_6RD_MASK);
|
||||||
|
|
||||||
|
for (p = 0; p < ARRAY_SIZE(eth->ports); p++) {
|
||||||
|
struct airoha_gdm_port *port = eth->ports[p];
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
From 656121b155030086b01cfce9bd31b0c925ee6860 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Wed, 8 Apr 2026 20:26:56 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Add missing RX_CPU_IDX() configuration in
|
||||||
|
airoha_qdma_cleanup_rx_queue()
|
||||||
|
|
||||||
|
When the descriptor index written in REG_RX_CPU_IDX() is equal to the one
|
||||||
|
stored in REG_RX_DMA_IDX(), the hw will stop since the QDMA RX ring is
|
||||||
|
empty.
|
||||||
|
Add missing REG_RX_CPU_IDX() configuration in airoha_qdma_cleanup_rx_queue
|
||||||
|
routine during QDMA RX ring cleanup.
|
||||||
|
|
||||||
|
Fixes: 514aac359987 ("net: airoha: Add missing cleanup bits in airoha_qdma_cleanup_rx_queue()")
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260408-airoha-cpu-idx-airoha_qdma_cleanup_rx_queue-v1-1-8efa64844308@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -824,6 +824,11 @@ static void airoha_qdma_cleanup_rx_queue
|
||||||
|
}
|
||||||
|
|
||||||
|
q->head = q->tail;
|
||||||
|
+ /* Set RX_DMA_IDX to RX_CPU_IDX to notify the hw the QDMA RX ring is
|
||||||
|
+ * empty.
|
||||||
|
+ */
|
||||||
|
+ 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_DMA_IDX(qid), RX_RING_DMA_IDX_MASK,
|
||||||
|
FIELD_PREP(RX_RING_DMA_IDX_MASK, q->tail));
|
||||||
|
}
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
From 02f72964395911e7a09bb2ea2fe6f79eda4ea2c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Wed, 8 Apr 2026 12:20:09 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Fix FE_PSE_BUF_SET configuration if PPE2 is
|
||||||
|
available
|
||||||
|
|
||||||
|
airoha_fe_set routine is used to set specified bits to 1 in the selected
|
||||||
|
register. In the FE_PSE_BUF_SET case this can due to a overestimation of
|
||||||
|
the required buffers for I/O queues since we can miss to set some bits
|
||||||
|
of PSE_ALLRSV_MASK subfield to 0. Fix the issue relying on airoha_fe_rmw
|
||||||
|
routine instead.
|
||||||
|
|
||||||
|
Fixes: 8e38e08f2c560 ("net: airoha: fix PSE memory configuration in airoha_fe_pse_ports_init()")
|
||||||
|
Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260408-airoha-reg_fe_pse_buf_set-v1-1-0c4fa8f4d1d9@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 8 +++++---
|
||||||
|
1 file changed, 5 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -293,16 +293,18 @@ static void airoha_fe_pse_ports_init(str
|
||||||
|
[FE_PSE_PORT_GDM4] = 2,
|
||||||
|
[FE_PSE_PORT_CDM5] = 2,
|
||||||
|
};
|
||||||
|
- u32 all_rsv;
|
||||||
|
int q;
|
||||||
|
|
||||||
|
- all_rsv = airoha_fe_get_pse_all_rsv(eth);
|
||||||
|
if (airoha_ppe_is_enabled(eth, 1)) {
|
||||||
|
+ u32 all_rsv;
|
||||||
|
+
|
||||||
|
/* hw misses PPE2 oq rsv */
|
||||||
|
+ all_rsv = airoha_fe_get_pse_all_rsv(eth);
|
||||||
|
all_rsv += PSE_RSV_PAGES *
|
||||||
|
pse_port_num_queues[FE_PSE_PORT_PPE2];
|
||||||
|
+ airoha_fe_rmw(eth, REG_FE_PSE_BUF_SET, PSE_ALLRSV_MASK,
|
||||||
|
+ FIELD_PREP(PSE_ALLRSV_MASK, all_rsv));
|
||||||
|
}
|
||||||
|
- airoha_fe_set(eth, REG_FE_PSE_BUF_SET, all_rsv);
|
||||||
|
|
||||||
|
/* CMD1 */
|
||||||
|
for (q = 0; q < pse_port_num_queues[FE_PSE_PORT_CDM1]; q++)
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
From 285fa6b1e03cff78ead0383e1b259c44b95faf90 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Thu, 2 Apr 2026 14:57:10 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Fix memory leak in airoha_qdma_rx_process()
|
||||||
|
|
||||||
|
If an error occurs on the subsequents buffers belonging to the
|
||||||
|
non-linear part of the skb (e.g. due to an error in the payload length
|
||||||
|
reported by the NIC or if we consumed all the available fragments for
|
||||||
|
the skb), the page_pool fragment will not be linked to the skb so it will
|
||||||
|
not return to the pool in the airoha_qdma_rx_process() error path. Fix the
|
||||||
|
memory leak partially reverting commit 'd6d2b0e1538d ("net: airoha: Fix
|
||||||
|
page recycling in airoha_qdma_rx_process()")' and always running
|
||||||
|
page_pool_put_full_page routine in the airoha_qdma_rx_process() error
|
||||||
|
path.
|
||||||
|
|
||||||
|
Fixes: d6d2b0e1538d ("net: airoha: Fix page recycling in airoha_qdma_rx_process()")
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260402-airoha_qdma_rx_process-mem-leak-fix-v1-1-b5706f402d3c@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -703,9 +703,8 @@ free_frag:
|
||||||
|
if (q->skb) {
|
||||||
|
dev_kfree_skb(q->skb);
|
||||||
|
q->skb = NULL;
|
||||||
|
- } else {
|
||||||
|
- page_pool_put_full_page(q->page_pool, page, true);
|
||||||
|
}
|
||||||
|
+ page_pool_put_full_page(q->page_pool, page, true);
|
||||||
|
}
|
||||||
|
airoha_qdma_fill_rx_queue(q);
|
||||||
|
|
||||||
@ -0,0 +1,164 @@
|
|||||||
|
From 1acdfbdb516b32165a8ecd1d5f8c68e4eac64637 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 09:57:29 +0200
|
||||||
|
Subject: [PATCH] net: airoha: Fix VIP configuration for AN7583 SoC
|
||||||
|
|
||||||
|
EN7581 and AN7583 SoCs have different VIP definitions. Introduce
|
||||||
|
get_vip_port callback in airoha_eth_soc_data struct in order to take
|
||||||
|
into account EN7581 and AN7583 VIP register layout and definition
|
||||||
|
differences.
|
||||||
|
Introduce nbq parameter in airoha_gdm_port struct. At the moment nbq
|
||||||
|
is set statically to value previously used in airhoha_set_gdm2_loopback
|
||||||
|
routine and it will be read from device tree in subsequent patches.
|
||||||
|
|
||||||
|
Fixes: e4e5ce823bdd ("net: airoha: Add AN7583 SoC support")
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha-7583-vip-fix-v1-1-c35e02b054bb@kernel.org
|
||||||
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 66 ++++++++++++++++++------
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.h | 2 +
|
||||||
|
2 files changed, 51 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -107,19 +107,7 @@ static int airoha_set_vip_for_gdm_port(s
|
||||||
|
struct airoha_eth *eth = port->qdma->eth;
|
||||||
|
u32 vip_port;
|
||||||
|
|
||||||
|
- switch (port->id) {
|
||||||
|
- case AIROHA_GDM3_IDX:
|
||||||
|
- /* FIXME: handle XSI_PCIE1_PORT */
|
||||||
|
- vip_port = XSI_PCIE0_VIP_PORT_MASK;
|
||||||
|
- break;
|
||||||
|
- case AIROHA_GDM4_IDX:
|
||||||
|
- /* FIXME: handle XSI_USB_PORT */
|
||||||
|
- vip_port = XSI_ETH_VIP_PORT_MASK;
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
+ vip_port = eth->soc->ops.get_vip_port(port, port->nbq);
|
||||||
|
if (enable) {
|
||||||
|
airoha_fe_set(eth, REG_FE_VIP_PORT_EN, vip_port);
|
||||||
|
airoha_fe_set(eth, REG_FE_IFC_PORT_EN, vip_port);
|
||||||
|
@@ -1738,7 +1726,7 @@ static int airoha_dev_set_macaddr(struct
|
||||||
|
static int airhoha_set_gdm2_loopback(struct airoha_gdm_port *port)
|
||||||
|
{
|
||||||
|
struct airoha_eth *eth = port->qdma->eth;
|
||||||
|
- u32 val, pse_port, chan, nbq;
|
||||||
|
+ u32 val, pse_port, chan;
|
||||||
|
int src_port;
|
||||||
|
|
||||||
|
/* Forward the traffic to the proper GDM port */
|
||||||
|
@@ -1768,9 +1756,7 @@ static int airhoha_set_gdm2_loopback(str
|
||||||
|
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;
|
||||||
|
- src_port = eth->soc->ops.get_src_port_id(port, nbq);
|
||||||
|
+ src_port = eth->soc->ops.get_src_port_id(port, port->nbq);
|
||||||
|
if (src_port < 0)
|
||||||
|
return src_port;
|
||||||
|
|
||||||
|
@@ -2962,6 +2948,8 @@ static int airoha_alloc_gdm_port(struct
|
||||||
|
port->eth = eth;
|
||||||
|
port->dev = dev;
|
||||||
|
port->id = id;
|
||||||
|
+ /* XXX: Read nbq from DTS */
|
||||||
|
+ port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
||||||
|
eth->ports[p] = port;
|
||||||
|
|
||||||
|
return airoha_metadata_dst_alloc(port);
|
||||||
|
@@ -3158,6 +3146,28 @@ static int airoha_en7581_get_src_port_id
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static u32 airoha_en7581_get_vip_port(struct airoha_gdm_port *port, int nbq)
|
||||||
|
+{
|
||||||
|
+ switch (port->id) {
|
||||||
|
+ case AIROHA_GDM3_IDX:
|
||||||
|
+ if (nbq == 4)
|
||||||
|
+ return XSI_PCIE0_VIP_PORT_MASK;
|
||||||
|
+ if (nbq == 5)
|
||||||
|
+ return XSI_PCIE1_VIP_PORT_MASK;
|
||||||
|
+ break;
|
||||||
|
+ case AIROHA_GDM4_IDX:
|
||||||
|
+ if (!nbq)
|
||||||
|
+ return XSI_ETH_VIP_PORT_MASK;
|
||||||
|
+ if (nbq == 1)
|
||||||
|
+ return XSI_USB_VIP_PORT_MASK;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const char * const an7583_xsi_rsts_names[] = {
|
||||||
|
"xsi-mac",
|
||||||
|
"hsi0-mac",
|
||||||
|
@@ -3187,6 +3197,26 @@ static int airoha_an7583_get_src_port_id
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static u32 airoha_an7583_get_vip_port(struct airoha_gdm_port *port, int nbq)
|
||||||
|
+{
|
||||||
|
+ switch (port->id) {
|
||||||
|
+ case AIROHA_GDM3_IDX:
|
||||||
|
+ if (!nbq)
|
||||||
|
+ return XSI_ETH_VIP_PORT_MASK;
|
||||||
|
+ break;
|
||||||
|
+ case AIROHA_GDM4_IDX:
|
||||||
|
+ if (!nbq)
|
||||||
|
+ return XSI_PCIE0_VIP_PORT_MASK;
|
||||||
|
+ if (nbq == 1)
|
||||||
|
+ return XSI_USB_VIP_PORT_MASK;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct airoha_eth_soc_data en7581_soc_data = {
|
||||||
|
.version = 0x7581,
|
||||||
|
.xsi_rsts_names = en7581_xsi_rsts_names,
|
||||||
|
@@ -3194,6 +3224,7 @@ static const struct airoha_eth_soc_data
|
||||||
|
.num_ppe = 2,
|
||||||
|
.ops = {
|
||||||
|
.get_src_port_id = airoha_en7581_get_src_port_id,
|
||||||
|
+ .get_vip_port = airoha_en7581_get_vip_port,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -3204,6 +3235,7 @@ static const struct airoha_eth_soc_data
|
||||||
|
.num_ppe = 1,
|
||||||
|
.ops = {
|
||||||
|
.get_src_port_id = airoha_an7583_get_src_port_id,
|
||||||
|
+ .get_vip_port = airoha_an7583_get_vip_port,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
|
@@ -537,6 +537,7 @@ struct airoha_gdm_port {
|
||||||
|
struct airoha_eth *eth;
|
||||||
|
struct net_device *dev;
|
||||||
|
int id;
|
||||||
|
+ int nbq;
|
||||||
|
|
||||||
|
struct airoha_hw_stats stats;
|
||||||
|
|
||||||
|
@@ -577,6 +578,7 @@ struct airoha_eth_soc_data {
|
||||||
|
int num_ppe;
|
||||||
|
struct {
|
||||||
|
int (*get_src_port_id)(struct airoha_gdm_port *port, int nbq);
|
||||||
|
+ u32 (*get_vip_port)(struct airoha_gdm_port *port, int nbq);
|
||||||
|
} ops;
|
||||||
|
};
|
||||||
|
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
From 360d745a5319f09849a94dee0974c8ead721e392 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 19:13:12 +0200
|
||||||
|
Subject: [PATCH 1/4] net: airoha: Rely on net_device pointer in
|
||||||
|
airoha_dev_setup_tc_block signature
|
||||||
|
|
||||||
|
Remove airoha_gdm_port dependency in airoha_dev_setup_tc_block routine
|
||||||
|
signature and rely on net_device pointer instead. Please note this patch
|
||||||
|
does not introduce any logical change and it is a preliminary patch to
|
||||||
|
support multiple net_devices connected to the GDM3 or GDM4 ports via an
|
||||||
|
external hw arbiter.
|
||||||
|
|
||||||
|
Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha-multi-serdes-preliminary-patch-v1-1-08d5b670ca8f@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 10 +++++-----
|
||||||
|
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -2683,7 +2683,7 @@ static int airoha_dev_setup_tc_block_cb(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_dev_setup_tc_block(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_dev_setup_tc_block(struct net_device *dev,
|
||||||
|
struct flow_block_offload *f)
|
||||||
|
{
|
||||||
|
flow_setup_cb_t *cb = airoha_dev_setup_tc_block_cb;
|
||||||
|
@@ -2696,12 +2696,12 @@ static int airoha_dev_setup_tc_block(str
|
||||||
|
f->driver_block_list = &block_cb_list;
|
||||||
|
switch (f->command) {
|
||||||
|
case FLOW_BLOCK_BIND:
|
||||||
|
- block_cb = flow_block_cb_lookup(f->block, cb, port->dev);
|
||||||
|
+ block_cb = flow_block_cb_lookup(f->block, cb, dev);
|
||||||
|
if (block_cb) {
|
||||||
|
flow_block_cb_incref(block_cb);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
- block_cb = flow_block_cb_alloc(cb, port->dev, port->dev, NULL);
|
||||||
|
+ block_cb = flow_block_cb_alloc(cb, dev, dev, NULL);
|
||||||
|
if (IS_ERR(block_cb))
|
||||||
|
return PTR_ERR(block_cb);
|
||||||
|
|
||||||
|
@@ -2710,7 +2710,7 @@ static int airoha_dev_setup_tc_block(str
|
||||||
|
list_add_tail(&block_cb->driver_list, &block_cb_list);
|
||||||
|
return 0;
|
||||||
|
case FLOW_BLOCK_UNBIND:
|
||||||
|
- block_cb = flow_block_cb_lookup(f->block, cb, port->dev);
|
||||||
|
+ block_cb = flow_block_cb_lookup(f->block, cb, dev);
|
||||||
|
if (!block_cb)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
@@ -2809,7 +2809,7 @@ static int airoha_dev_tc_setup(struct ne
|
||||||
|
return airoha_tc_setup_qdisc_htb(port, type_data);
|
||||||
|
case TC_SETUP_BLOCK:
|
||||||
|
case TC_SETUP_FT:
|
||||||
|
- return airoha_dev_setup_tc_block(port, type_data);
|
||||||
|
+ return airoha_dev_setup_tc_block(dev, type_data);
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
@ -0,0 +1,163 @@
|
|||||||
|
From 8baf4bf72ef94c955ef89d4644f1986603ee8320 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 19:13:13 +0200
|
||||||
|
Subject: [PATCH 2/4] net: airoha: Rely on net_device pointer in HTB callbacks
|
||||||
|
|
||||||
|
Remove airoha_gdm_port dependency in HTB tc callback signatures and rely
|
||||||
|
on net_device pointer instead. Please note this patch does not introduce
|
||||||
|
any logical change and it is a preliminary patch in order to support
|
||||||
|
multiple net_devices connected to the same GDM3 or GDM4 port via an
|
||||||
|
external hw arbiter.
|
||||||
|
|
||||||
|
Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha-multi-serdes-preliminary-patch-v1-2-08d5b670ca8f@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 45 +++++++++++++-----------
|
||||||
|
1 file changed, 24 insertions(+), 21 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -2488,10 +2488,11 @@ static int airoha_qdma_set_trtcm_token_b
|
||||||
|
mode, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_qdma_set_tx_rate_limit(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_qdma_set_tx_rate_limit(struct net_device *dev,
|
||||||
|
int channel, u32 rate,
|
||||||
|
u32 bucket_size)
|
||||||
|
{
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
int i, err;
|
||||||
|
|
||||||
|
for (i = 0; i <= TRTCM_PEAK_MODE; i++) {
|
||||||
|
@@ -2511,21 +2512,20 @@ static int airoha_qdma_set_tx_rate_limit
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_htb_alloc_leaf_queue(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_tc_htb_alloc_leaf_queue(struct net_device *dev,
|
||||||
|
struct tc_htb_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
u32 channel = TC_H_MIN(opt->classid) % AIROHA_NUM_QOS_CHANNELS;
|
||||||
|
u32 rate = div_u64(opt->rate, 1000) << 3; /* kbps */
|
||||||
|
- struct net_device *dev = port->dev;
|
||||||
|
- int num_tx_queues = dev->real_num_tx_queues;
|
||||||
|
- int err;
|
||||||
|
+ int err, num_tx_queues = dev->real_num_tx_queues;
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (opt->parent_classid != TC_HTB_CLASSID_ROOT) {
|
||||||
|
NL_SET_ERR_MSG_MOD(opt->extack, "invalid parent classid");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- err = airoha_qdma_set_tx_rate_limit(port, channel, rate, opt->quantum);
|
||||||
|
+ err = airoha_qdma_set_tx_rate_limit(dev, channel, rate, opt->quantum);
|
||||||
|
if (err) {
|
||||||
|
NL_SET_ERR_MSG_MOD(opt->extack,
|
||||||
|
"failed configuring htb offload");
|
||||||
|
@@ -2537,7 +2537,7 @@ static int airoha_tc_htb_alloc_leaf_queu
|
||||||
|
|
||||||
|
err = netif_set_real_num_tx_queues(dev, num_tx_queues + 1);
|
||||||
|
if (err) {
|
||||||
|
- airoha_qdma_set_tx_rate_limit(port, channel, 0, opt->quantum);
|
||||||
|
+ airoha_qdma_set_tx_rate_limit(dev, channel, 0, opt->quantum);
|
||||||
|
NL_SET_ERR_MSG_MOD(opt->extack,
|
||||||
|
"failed setting real_num_tx_queues");
|
||||||
|
return err;
|
||||||
|
@@ -2724,44 +2724,47 @@ static int airoha_dev_setup_tc_block(str
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void airoha_tc_remove_htb_queue(struct airoha_gdm_port *port, int queue)
|
||||||
|
+static void airoha_tc_remove_htb_queue(struct net_device *dev, int queue)
|
||||||
|
{
|
||||||
|
- struct net_device *dev = port->dev;
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
|
||||||
|
netif_set_real_num_tx_queues(dev, dev->real_num_tx_queues - 1);
|
||||||
|
- airoha_qdma_set_tx_rate_limit(port, queue + 1, 0, 0);
|
||||||
|
+ airoha_qdma_set_tx_rate_limit(dev, queue + 1, 0, 0);
|
||||||
|
clear_bit(queue, port->qos_sq_bmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_htb_delete_leaf_queue(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_tc_htb_delete_leaf_queue(struct net_device *dev,
|
||||||
|
struct tc_htb_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
u32 channel = TC_H_MIN(opt->classid) % AIROHA_NUM_QOS_CHANNELS;
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (!test_bit(channel, port->qos_sq_bmap)) {
|
||||||
|
NL_SET_ERR_MSG_MOD(opt->extack, "invalid queue id");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- airoha_tc_remove_htb_queue(port, channel);
|
||||||
|
+ airoha_tc_remove_htb_queue(dev, channel);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_htb_destroy(struct airoha_gdm_port *port)
|
||||||
|
+static int airoha_tc_htb_destroy(struct net_device *dev)
|
||||||
|
{
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
int q;
|
||||||
|
|
||||||
|
for_each_set_bit(q, port->qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS)
|
||||||
|
- airoha_tc_remove_htb_queue(port, q);
|
||||||
|
+ airoha_tc_remove_htb_queue(dev, q);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_get_htb_get_leaf_queue(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_tc_get_htb_get_leaf_queue(struct net_device *dev,
|
||||||
|
struct tc_htb_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
u32 channel = TC_H_MIN(opt->classid) % AIROHA_NUM_QOS_CHANNELS;
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (!test_bit(channel, port->qos_sq_bmap)) {
|
||||||
|
NL_SET_ERR_MSG_MOD(opt->extack, "invalid queue id");
|
||||||
|
@@ -2773,23 +2776,23 @@ static int airoha_tc_get_htb_get_leaf_qu
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_setup_qdisc_htb(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_tc_setup_qdisc_htb(struct net_device *dev,
|
||||||
|
struct tc_htb_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
switch (opt->command) {
|
||||||
|
case TC_HTB_CREATE:
|
||||||
|
break;
|
||||||
|
case TC_HTB_DESTROY:
|
||||||
|
- return airoha_tc_htb_destroy(port);
|
||||||
|
+ return airoha_tc_htb_destroy(dev);
|
||||||
|
case TC_HTB_NODE_MODIFY:
|
||||||
|
case TC_HTB_LEAF_ALLOC_QUEUE:
|
||||||
|
- return airoha_tc_htb_alloc_leaf_queue(port, opt);
|
||||||
|
+ return airoha_tc_htb_alloc_leaf_queue(dev, opt);
|
||||||
|
case TC_HTB_LEAF_DEL:
|
||||||
|
case TC_HTB_LEAF_DEL_LAST:
|
||||||
|
case TC_HTB_LEAF_DEL_LAST_FORCE:
|
||||||
|
- return airoha_tc_htb_delete_leaf_queue(port, opt);
|
||||||
|
+ return airoha_tc_htb_delete_leaf_queue(dev, opt);
|
||||||
|
case TC_HTB_LEAF_QUERY_QUEUE:
|
||||||
|
- return airoha_tc_get_htb_get_leaf_queue(port, opt);
|
||||||
|
+ return airoha_tc_get_htb_get_leaf_queue(dev, opt);
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
@@ -2806,7 +2809,7 @@ static int airoha_dev_tc_setup(struct ne
|
||||||
|
case TC_SETUP_QDISC_ETS:
|
||||||
|
return airoha_tc_setup_qdisc_ets(port, type_data);
|
||||||
|
case TC_SETUP_QDISC_HTB:
|
||||||
|
- return airoha_tc_setup_qdisc_htb(port, type_data);
|
||||||
|
+ return airoha_tc_setup_qdisc_htb(dev, type_data);
|
||||||
|
case TC_SETUP_BLOCK:
|
||||||
|
case TC_SETUP_FT:
|
||||||
|
return airoha_dev_setup_tc_block(dev, type_data);
|
||||||
@ -0,0 +1,118 @@
|
|||||||
|
From ae32f80018f0f0f4ebc7a0a70d4092d08a1545e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 19:13:14 +0200
|
||||||
|
Subject: [PATCH 3/4] net: airoha: Rely on net_device pointer in ETS callbacks
|
||||||
|
|
||||||
|
Remove airoha_gdm_port dependency in ETS tc callback signatures and rely
|
||||||
|
on net_device pointer instead. Please note this patch does not introduce
|
||||||
|
any logical change and it is a preliminary patch in order to support
|
||||||
|
multiple net_devices connected to the same GDM3 or GDM4 port via an
|
||||||
|
external hw arbiter.
|
||||||
|
|
||||||
|
Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha-multi-serdes-preliminary-patch-v1-3-08d5b670ca8f@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 30 +++++++++++-------------
|
||||||
|
1 file changed, 14 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -2134,10 +2134,11 @@ airoha_ethtool_get_rmon_stats(struct net
|
||||||
|
} while (u64_stats_fetch_retry(&port->stats.syncp, start));
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_qdma_set_chan_tx_sched(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_qdma_set_chan_tx_sched(struct net_device *dev,
|
||||||
|
int channel, enum tx_sched_mode mode,
|
||||||
|
const u16 *weights, u8 n_weights)
|
||||||
|
{
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < AIROHA_NUM_TX_RING; i++)
|
||||||
|
@@ -2169,17 +2170,15 @@ static int airoha_qdma_set_chan_tx_sched
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_qdma_set_tx_prio_sched(struct airoha_gdm_port *port,
|
||||||
|
- int channel)
|
||||||
|
+static int airoha_qdma_set_tx_prio_sched(struct net_device *dev, int channel)
|
||||||
|
{
|
||||||
|
static const u16 w[AIROHA_NUM_QOS_QUEUES] = {};
|
||||||
|
|
||||||
|
- return airoha_qdma_set_chan_tx_sched(port, channel, TC_SCH_SP, w,
|
||||||
|
+ return airoha_qdma_set_chan_tx_sched(dev, channel, TC_SCH_SP, w,
|
||||||
|
ARRAY_SIZE(w));
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_qdma_set_tx_ets_sched(struct airoha_gdm_port *port,
|
||||||
|
- int channel,
|
||||||
|
+static int airoha_qdma_set_tx_ets_sched(struct net_device *dev, int channel,
|
||||||
|
struct tc_ets_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
struct tc_ets_qopt_offload_replace_params *p = &opt->replace_params;
|
||||||
|
@@ -2220,20 +2219,21 @@ static int airoha_qdma_set_tx_ets_sched(
|
||||||
|
else if (nstrict < AIROHA_NUM_QOS_QUEUES - 1)
|
||||||
|
mode = nstrict + 1;
|
||||||
|
|
||||||
|
- return airoha_qdma_set_chan_tx_sched(port, channel, mode, w,
|
||||||
|
+ return airoha_qdma_set_chan_tx_sched(dev, channel, mode, w,
|
||||||
|
ARRAY_SIZE(w));
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_qdma_get_tx_ets_stats(struct airoha_gdm_port *port,
|
||||||
|
- int channel,
|
||||||
|
+static int airoha_qdma_get_tx_ets_stats(struct net_device *dev, int channel,
|
||||||
|
struct tc_ets_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
+ struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
u64 cpu_tx_packets = airoha_qdma_rr(port->qdma,
|
||||||
|
REG_CNTR_VAL(channel << 1));
|
||||||
|
u64 fwd_tx_packets = airoha_qdma_rr(port->qdma,
|
||||||
|
REG_CNTR_VAL((channel << 1) + 1));
|
||||||
|
u64 tx_packets = (cpu_tx_packets - port->cpu_tx_packets) +
|
||||||
|
(fwd_tx_packets - port->fwd_tx_packets);
|
||||||
|
+
|
||||||
|
_bstats_update(opt->stats.bstats, 0, tx_packets);
|
||||||
|
|
||||||
|
port->cpu_tx_packets = cpu_tx_packets;
|
||||||
|
@@ -2242,7 +2242,7 @@ static int airoha_qdma_get_tx_ets_stats(
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int airoha_tc_setup_qdisc_ets(struct airoha_gdm_port *port,
|
||||||
|
+static int airoha_tc_setup_qdisc_ets(struct net_device *dev,
|
||||||
|
struct tc_ets_qopt_offload *opt)
|
||||||
|
{
|
||||||
|
int channel;
|
||||||
|
@@ -2255,12 +2255,12 @@ static int airoha_tc_setup_qdisc_ets(str
|
||||||
|
|
||||||
|
switch (opt->command) {
|
||||||
|
case TC_ETS_REPLACE:
|
||||||
|
- return airoha_qdma_set_tx_ets_sched(port, channel, opt);
|
||||||
|
+ return airoha_qdma_set_tx_ets_sched(dev, channel, opt);
|
||||||
|
case TC_ETS_DESTROY:
|
||||||
|
/* PRIO is default qdisc scheduler */
|
||||||
|
- return airoha_qdma_set_tx_prio_sched(port, channel);
|
||||||
|
+ return airoha_qdma_set_tx_prio_sched(dev, channel);
|
||||||
|
case TC_ETS_STATS:
|
||||||
|
- return airoha_qdma_get_tx_ets_stats(port, channel, opt);
|
||||||
|
+ return airoha_qdma_get_tx_ets_stats(dev, channel, opt);
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
@@ -2803,11 +2803,9 @@ static int airoha_tc_setup_qdisc_htb(str
|
||||||
|
static int airoha_dev_tc_setup(struct net_device *dev, enum tc_setup_type type,
|
||||||
|
void *type_data)
|
||||||
|
{
|
||||||
|
- struct airoha_gdm_port *port = netdev_priv(dev);
|
||||||
|
-
|
||||||
|
switch (type) {
|
||||||
|
case TC_SETUP_QDISC_ETS:
|
||||||
|
- return airoha_tc_setup_qdisc_ets(port, type_data);
|
||||||
|
+ return airoha_tc_setup_qdisc_ets(dev, type_data);
|
||||||
|
case TC_SETUP_QDISC_HTB:
|
||||||
|
return airoha_tc_setup_qdisc_htb(dev, type_data);
|
||||||
|
case TC_SETUP_BLOCK:
|
||||||
@ -0,0 +1,33 @@
|
|||||||
|
From 34e1a98ff2a87cf4b8de3ccebe9d45273f014aeb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Date: Sun, 12 Apr 2026 11:56:25 +0200
|
||||||
|
Subject: [PATCH 4/4] net: airoha: Remove PCE_MC_EN_MASK bit in REG_FE_PCE_CFG
|
||||||
|
configuration
|
||||||
|
|
||||||
|
PCE_MC_EN_MASK bit in REG_FE_PCE_CFG configuration performed in
|
||||||
|
airoha_fe_init() is used to duplicate multicast packets and send a copy
|
||||||
|
to the CPU when the traffic is offloaded. This is necessary just if
|
||||||
|
it is requested by the user. Disable multicast packets duplication by
|
||||||
|
default.
|
||||||
|
|
||||||
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
||||||
|
Link: https://patch.msgid.link/20260412-airoha_fe_init_remove_mc_en_bit-v1-1-7b6a5a25a74d@kernel.org
|
||||||
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
||||||
|
---
|
||||||
|
drivers/net/ethernet/airoha/airoha_eth.c | 5 ++---
|
||||||
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
|
@@ -448,9 +448,8 @@ static int airoha_fe_init(struct airoha_
|
||||||
|
FIELD_PREP(PSE_IQ_RES2_P5_MASK, 0x40) |
|
||||||
|
FIELD_PREP(PSE_IQ_RES2_P4_MASK, 0x34));
|
||||||
|
|
||||||
|
- /* enable FE copy engine for MC/KA/DPI */
|
||||||
|
- airoha_fe_wr(eth, REG_FE_PCE_CFG,
|
||||||
|
- PCE_DPI_EN_MASK | PCE_KA_EN_MASK | PCE_MC_EN_MASK);
|
||||||
|
+ /* enable FE copy engine for KA/DPI */
|
||||||
|
+ airoha_fe_wr(eth, REG_FE_PCE_CFG, PCE_DPI_EN_MASK | PCE_KA_EN_MASK);
|
||||||
|
/* set vip queue selection to ring 1 */
|
||||||
|
airoha_fe_rmw(eth, REG_CDM_FWD_CFG(1), CDM_VIP_QSEL_MASK,
|
||||||
|
FIELD_PREP(CDM_VIP_QSEL_MASK, 0x4));
|
||||||
@ -13,7 +13,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
@@ -1425,6 +1425,10 @@ static int airoha_hw_init(struct platfor
|
@@ -1422,6 +1422,10 @@ static int airoha_hw_init(struct platfor
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
@@ -588,8 +588,11 @@ static int airoha_qdma_get_gdm_port(stru
|
@@ -577,8 +577,11 @@ static int airoha_qdma_get_gdm_port(stru
|
||||||
|
|
||||||
sport = FIELD_GET(QDMA_ETH_RXMSG_SPORT_MASK, msg1);
|
sport = FIELD_GET(QDMA_ETH_RXMSG_SPORT_MASK, msg1);
|
||||||
switch (sport) {
|
switch (sport) {
|
||||||
|
|||||||
@ -15,7 +15,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
@@ -514,8 +514,10 @@ static int airoha_fe_init(struct airoha_
|
@@ -503,8 +503,10 @@ static int airoha_fe_init(struct airoha_
|
||||||
FIELD_PREP(IP_ASSEMBLE_PORT_MASK, 0) |
|
FIELD_PREP(IP_ASSEMBLE_PORT_MASK, 0) |
|
||||||
FIELD_PREP(IP_ASSEMBLE_NBQ_MASK, 22));
|
FIELD_PREP(IP_ASSEMBLE_NBQ_MASK, 22));
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
airoha_fe_crsn_qsel_init(eth);
|
airoha_fe_crsn_qsel_init(eth);
|
||||||
|
|
||||||
@@ -1657,7 +1659,8 @@ static int airoha_dev_open(struct net_de
|
@@ -1654,7 +1656,8 @@ static int airoha_dev_open(struct net_de
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
|||||||
@ -15,7 +15,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
@@ -3127,7 +3127,6 @@ static void airoha_remove(struct platfor
|
@@ -3125,7 +3125,6 @@ static void airoha_remove(struct platfor
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char * const en7581_xsi_rsts_names[] = {
|
static const char * const en7581_xsi_rsts_names[] = {
|
||||||
@ -23,7 +23,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
"hsi0-mac",
|
"hsi0-mac",
|
||||||
"hsi1-mac",
|
"hsi1-mac",
|
||||||
"hsi-mac",
|
"hsi-mac",
|
||||||
@@ -3159,7 +3158,6 @@ static int airoha_en7581_get_src_port_id
|
@@ -3179,7 +3178,6 @@ static u32 airoha_en7581_get_vip_port(st
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char * const an7583_xsi_rsts_names[] = {
|
static const char * const an7583_xsi_rsts_names[] = {
|
||||||
|
|||||||
@ -35,7 +35,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
|
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
|
||||||
{
|
{
|
||||||
struct airoha_eth *eth = port->qdma->eth;
|
struct airoha_eth *eth = port->qdma->eth;
|
||||||
@@ -1654,6 +1660,17 @@ static int airoha_dev_open(struct net_de
|
@@ -1651,6 +1657,17 @@ static int airoha_dev_open(struct net_de
|
||||||
struct airoha_qdma *qdma = port->qdma;
|
struct airoha_qdma *qdma = port->qdma;
|
||||||
u32 pse_port = FE_PSE_PORT_PPE1;
|
u32 pse_port = FE_PSE_PORT_PPE1;
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
netif_tx_start_all_queues(dev);
|
netif_tx_start_all_queues(dev);
|
||||||
err = airoha_set_vip_for_gdm_port(port, true);
|
err = airoha_set_vip_for_gdm_port(port, true);
|
||||||
if (err)
|
if (err)
|
||||||
@@ -1718,6 +1735,11 @@ static int airoha_dev_stop(struct net_de
|
@@ -1715,6 +1732,11 @@ static int airoha_dev_stop(struct net_de
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2849,6 +2871,20 @@ static const struct ethtool_ops airoha_e
|
@@ -2845,6 +2867,20 @@ static const struct ethtool_ops airoha_e
|
||||||
.get_link = ethtool_op_get_link,
|
.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)
|
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -2893,6 +2929,99 @@ bool airoha_is_valid_gdm_port(struct air
|
@@ -2889,6 +2925,99 @@ bool airoha_is_valid_gdm_port(struct air
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,8 +186,8 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
||||||
struct device_node *np)
|
struct device_node *np)
|
||||||
{
|
{
|
||||||
@@ -2964,6 +3093,12 @@ static int airoha_alloc_gdm_port(struct
|
@@ -2962,6 +3091,12 @@ static int airoha_alloc_gdm_port(struct
|
||||||
port->id = id;
|
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
||||||
eth->ports[p] = port;
|
eth->ports[p] = port;
|
||||||
|
|
||||||
+ if (airhoa_is_phy_external(port)) {
|
+ if (airhoa_is_phy_external(port)) {
|
||||||
@ -199,7 +199,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
return airoha_metadata_dst_alloc(port);
|
return airoha_metadata_dst_alloc(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3093,6 +3228,10 @@ error_napi_stop:
|
@@ -3091,6 +3226,10 @@ error_napi_stop:
|
||||||
|
|
||||||
if (port->dev->reg_state == NETREG_REGISTERED)
|
if (port->dev->reg_state == NETREG_REGISTERED)
|
||||||
unregister_netdev(port->dev);
|
unregister_netdev(port->dev);
|
||||||
@ -210,7 +210,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
airoha_metadata_dst_free(port);
|
airoha_metadata_dst_free(port);
|
||||||
}
|
}
|
||||||
airoha_hw_cleanup(eth);
|
airoha_hw_cleanup(eth);
|
||||||
@@ -3119,6 +3258,10 @@ static void airoha_remove(struct platfor
|
@@ -3117,6 +3256,10 @@ static void airoha_remove(struct platfor
|
||||||
|
|
||||||
unregister_netdev(port->dev);
|
unregister_netdev(port->dev);
|
||||||
airoha_metadata_dst_free(port);
|
airoha_metadata_dst_free(port);
|
||||||
@ -223,9 +223,9 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
@@ -538,6 +538,10 @@ struct airoha_gdm_port {
|
@@ -539,6 +539,10 @@ struct airoha_gdm_port {
|
||||||
struct net_device *dev;
|
|
||||||
int id;
|
int id;
|
||||||
|
int nbq;
|
||||||
|
|
||||||
+ struct phylink *phylink;
|
+ struct phylink *phylink;
|
||||||
+ struct phylink_config phylink_config;
|
+ struct phylink_config phylink_config;
|
||||||
|
|||||||
@ -14,7 +14,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
||||||
@@ -599,6 +599,9 @@ static int airoha_qdma_get_gdm_port(stru
|
@@ -588,6 +588,9 @@ static int airoha_qdma_get_gdm_port(stru
|
||||||
case 0x18:
|
case 0x18:
|
||||||
port = 3; /* GDM4 */
|
port = 3; /* GDM4 */
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -28,7 +28,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
|
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
|
||||||
{
|
{
|
||||||
@@ -1663,6 +1665,7 @@ static int airoha_dev_open(struct net_de
|
@@ -1660,6 +1662,7 @@ static int airoha_dev_open(struct net_de
|
||||||
struct airoha_qdma *qdma = port->qdma;
|
struct airoha_qdma *qdma = port->qdma;
|
||||||
u32 pse_port = FE_PSE_PORT_PPE1;
|
u32 pse_port = FE_PSE_PORT_PPE1;
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
if (airhoa_is_phy_external(port)) {
|
if (airhoa_is_phy_external(port)) {
|
||||||
err = phylink_of_phy_connect(port->phylink, dev->dev.of_node, 0);
|
err = phylink_of_phy_connect(port->phylink, dev->dev.of_node, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -1673,6 +1676,7 @@ static int airoha_dev_open(struct net_de
|
@@ -1670,6 +1673,7 @@ static int airoha_dev_open(struct net_de
|
||||||
|
|
||||||
phylink_start(port->phylink);
|
phylink_start(port->phylink);
|
||||||
}
|
}
|
||||||
@ -44,7 +44,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
netif_tx_start_all_queues(dev);
|
netif_tx_start_all_queues(dev);
|
||||||
err = airoha_set_vip_for_gdm_port(port, true);
|
err = airoha_set_vip_for_gdm_port(port, true);
|
||||||
@@ -1738,10 +1742,12 @@ static int airoha_dev_stop(struct net_de
|
@@ -1735,10 +1739,12 @@ static int airoha_dev_stop(struct net_de
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -2874,6 +2880,7 @@ static const struct ethtool_ops airoha_e
|
@@ -2870,6 +2876,7 @@ static const struct ethtool_ops airoha_e
|
||||||
.get_link = ethtool_op_get_link,
|
.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,
|
static struct phylink_pcs *airoha_phylink_mac_select_pcs(struct phylink_config *config,
|
||||||
phy_interface_t interface)
|
phy_interface_t interface)
|
||||||
{
|
{
|
||||||
@@ -2887,6 +2894,7 @@ static void airoha_mac_config(struct phy
|
@@ -2883,6 +2890,7 @@ static void airoha_mac_config(struct phy
|
||||||
const struct phylink_link_state *state)
|
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)
|
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
|
||||||
{
|
{
|
||||||
@@ -2932,6 +2940,7 @@ bool airoha_is_valid_gdm_port(struct air
|
@@ -2928,6 +2936,7 @@ bool airoha_is_valid_gdm_port(struct air
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
static void airoha_mac_link_up(struct phylink_config *config, struct phy_device *phy,
|
static void airoha_mac_link_up(struct phylink_config *config, struct phy_device *phy,
|
||||||
unsigned int mode, phy_interface_t interface,
|
unsigned int mode, phy_interface_t interface,
|
||||||
int speed, int duplex, bool tx_pause, bool rx_pause)
|
int speed, int duplex, bool tx_pause, bool rx_pause)
|
||||||
@@ -3024,6 +3033,7 @@ static int airoha_setup_phylink(struct n
|
@@ -3020,6 +3029,7 @@ static int airoha_setup_phylink(struct n
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -89,8 +89,8 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
||||||
struct device_node *np)
|
struct device_node *np)
|
||||||
@@ -3096,11 +3106,13 @@ static int airoha_alloc_gdm_port(struct
|
@@ -3094,11 +3104,13 @@ static int airoha_alloc_gdm_port(struct
|
||||||
port->id = id;
|
port->nbq = id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
||||||
eth->ports[p] = port;
|
eth->ports[p] = port;
|
||||||
|
|
||||||
+#if defined(CONFIG_PCS_AIROHA)
|
+#if defined(CONFIG_PCS_AIROHA)
|
||||||
@ -103,7 +103,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
return airoha_metadata_dst_alloc(port);
|
return airoha_metadata_dst_alloc(port);
|
||||||
}
|
}
|
||||||
@@ -3231,10 +3243,12 @@ error_napi_stop:
|
@@ -3229,10 +3241,12 @@ error_napi_stop:
|
||||||
|
|
||||||
if (port->dev->reg_state == NETREG_REGISTERED)
|
if (port->dev->reg_state == NETREG_REGISTERED)
|
||||||
unregister_netdev(port->dev);
|
unregister_netdev(port->dev);
|
||||||
@ -116,7 +116,7 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
airoha_metadata_dst_free(port);
|
airoha_metadata_dst_free(port);
|
||||||
}
|
}
|
||||||
airoha_hw_cleanup(eth);
|
airoha_hw_cleanup(eth);
|
||||||
@@ -3261,10 +3275,12 @@ static void airoha_remove(struct platfor
|
@@ -3259,10 +3273,12 @@ static void airoha_remove(struct platfor
|
||||||
|
|
||||||
unregister_netdev(port->dev);
|
unregister_netdev(port->dev);
|
||||||
airoha_metadata_dst_free(port);
|
airoha_metadata_dst_free(port);
|
||||||
@ -131,9 +131,9 @@ Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|||||||
|
|
||||||
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
||||||
@@ -538,9 +538,11 @@ struct airoha_gdm_port {
|
@@ -539,9 +539,11 @@ struct airoha_gdm_port {
|
||||||
struct net_device *dev;
|
|
||||||
int id;
|
int id;
|
||||||
|
int nbq;
|
||||||
|
|
||||||
+#if defined(CONFIG_PCS_AIROHA)
|
+#if defined(CONFIG_PCS_AIROHA)
|
||||||
struct phylink *phylink;
|
struct phylink *phylink;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user