]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: airoha: Move {cpu,fwd}_tx_packets in airoha_gdm_dev struct
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 27 May 2026 10:21:19 +0000 (12:21 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 2 Jun 2026 20:24:26 +0000 (13:24 -0700)
Since now multiple net_devices connected to different QDMA blocks can
share the same GDM port, cpu_tx_packets and fwd_tx_packets fields can
be overwritten with the value from a different QDMA block. In order to
fix the issue move cpu_tx_packets and fwd_tx_packets fields from
airoha_gdm_port struct to airoha_gdm_dev one.

Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://patch.msgid.link/20260527-airoha-eth-multi-serdes-preliminary-v1-5-ec6ed73ef7fc@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/airoha/airoha_eth.c
drivers/net/ethernet/airoha/airoha_eth.h

index 4f77a0c22162f9be234743bfda316f3168997962..72c6f554508cefce4d75e4ce657ff71ebff651f4 100644 (file)
@@ -2315,19 +2315,17 @@ static int airoha_qdma_get_tx_ets_stats(struct net_device *netdev, int channel,
                                        struct tc_ets_qopt_offload *opt)
 {
        struct airoha_gdm_dev *dev = netdev_priv(netdev);
-       struct airoha_gdm_port *port = dev->port;
+       struct airoha_qdma *qdma = dev->qdma;
 
-       u64 cpu_tx_packets = airoha_qdma_rr(dev->qdma,
-                                           REG_CNTR_VAL(channel << 1));
-       u64 fwd_tx_packets = airoha_qdma_rr(dev->qdma,
+       u64 cpu_tx_packets = airoha_qdma_rr(qdma, REG_CNTR_VAL(channel << 1));
+       u64 fwd_tx_packets = airoha_qdma_rr(qdma,
                                            REG_CNTR_VAL((channel << 1) + 1));
-       u64 tx_packets = (cpu_tx_packets - port->cpu_tx_packets) +
-                        (fwd_tx_packets - port->fwd_tx_packets);
+       u64 tx_packets = (cpu_tx_packets - dev->cpu_tx_packets) +
+                        (fwd_tx_packets - dev->fwd_tx_packets);
 
        _bstats_update(opt->stats.bstats, 0, tx_packets);
-
-       port->cpu_tx_packets = cpu_tx_packets;
-       port->fwd_tx_packets = fwd_tx_packets;
+       dev->cpu_tx_packets = cpu_tx_packets;
+       dev->fwd_tx_packets = fwd_tx_packets;
 
        return 0;
 }
index a308a770116b61ec4616bc0bf5cb388dc0255007..fbb50dc73af8411d22d1551d74eddb2ebdd0df85 100644 (file)
@@ -544,6 +544,9 @@ struct airoha_gdm_dev {
        struct airoha_eth *eth;
 
        DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
+       /* qos stats counters */
+       u64 cpu_tx_packets;
+       u64 fwd_tx_packets;
 };
 
 struct airoha_gdm_port {
@@ -553,10 +556,6 @@ struct airoha_gdm_port {
 
        struct airoha_hw_stats stats;
 
-       /* qos stats counters */
-       u64 cpu_tx_packets;
-       u64 fwd_tx_packets;
-
        struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
 };