]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: airoha: Rely on net_device pointer in ETS callbacks
authorLorenzo Bianconi <lorenzo@kernel.org>
Sun, 12 Apr 2026 17:13:14 +0000 (19:13 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 13 Apr 2026 23:48:38 +0000 (16:48 -0700)
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

index c2b5fcffce82b88cde80189a083e4789085b5eb4..d426dc173d993d23edcb71b54e1518a68f9218ce 100644 (file)
@@ -2138,10 +2138,11 @@ airoha_ethtool_get_rmon_stats(struct net_device *dev,
        } 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++)
@@ -2173,17 +2174,15 @@ static int airoha_qdma_set_chan_tx_sched(struct airoha_gdm_port *port,
        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;
@@ -2224,20 +2223,21 @@ static int airoha_qdma_set_tx_ets_sched(struct airoha_gdm_port *port,
        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;
@@ -2246,7 +2246,7 @@ static int airoha_qdma_get_tx_ets_stats(struct airoha_gdm_port *port,
        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;
@@ -2259,12 +2259,12 @@ static int airoha_tc_setup_qdisc_ets(struct airoha_gdm_port *port,
 
        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;
        }
@@ -2807,11 +2807,9 @@ static int airoha_tc_setup_qdisc_htb(struct net_device *dev,
 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: