Refreshed automatically with `make target/linux/refresh V=s`. Signed-off-by: Kenneth Kasilag <kenneth@kasilag.me> Link: https://github.com/openwrt/openwrt/pull/21019 Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
119 lines
4.4 KiB
Diff
119 lines
4.4 KiB
Diff
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
|
|
@@ -2203,10 +2203,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++)
|
|
@@ -2238,17 +2239,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;
|
|
@@ -2289,20 +2288,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;
|
|
@@ -2311,7 +2311,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;
|
|
@@ -2324,12 +2324,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;
|
|
}
|
|
@@ -2872,11 +2872,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:
|