]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: dsa: sja1105: fix displaced ethtool statistics counters
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 18 Mar 2025 11:57:14 +0000 (13:57 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 24 Mar 2025 22:20:23 +0000 (15:20 -0700)
Port counters with no name (aka
sja1105_port_counters[__SJA1105_COUNTER_UNUSED]) are skipped when
reporting sja1105_get_sset_count(), but are not skipped during
sja1105_get_strings() and sja1105_get_ethtool_stats().

As a consequence, the first reported counter has an empty name and a
bogus value (reads from area 0, aka MAC, from offset 0, bits start:end
0:0). Also, the last counter (N_NOT_REACH on E/T, N_RX_BCAST on P/Q/R/S)
gets pushed out of the statistics counters that get shown.

Skip __SJA1105_COUNTER_UNUSED consistently, so that the bogus counter
with an empty name disappears, and in its place appears a valid counter.

Fixes: 039b167d68a3 ("net: dsa: sja1105: don't use burst SPI reads for port statistics")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250318115716.2124395-2-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/sja1105/sja1105_ethtool.c

index 2ea64b1d026d73a461c71d92f8dfcfb30b260d4b..84d7d3f66bd03740fed403314bfb1b576e824984 100644 (file)
@@ -571,6 +571,9 @@ void sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data)
                max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER;
 
        for (i = 0; i < max_ctr; i++) {
+               if (!strlen(sja1105_port_counters[i].name))
+                       continue;
+
                rc = sja1105_port_counter_read(priv, port, i, &data[k++]);
                if (rc) {
                        dev_err(ds->dev,
@@ -596,8 +599,12 @@ void sja1105_get_strings(struct dsa_switch *ds, int port,
        else
                max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER;
 
-       for (i = 0; i < max_ctr; i++)
+       for (i = 0; i < max_ctr; i++) {
+               if (!strlen(sja1105_port_counters[i].name))
+                       continue;
+
                ethtool_puts(&data, sja1105_port_counters[i].name);
+       }
 }
 
 int sja1105_get_sset_count(struct dsa_switch *ds, int port, int sset)