Patch "net: ethernet: ti: icssg: guard PA stat lookups" has been added to the 6.18-stable tree
Subsystems (2)
[email protected]
AppliedThis is a note to let you know that I've just added the patch titled
net: ethernet: ti: icssg: guard PA stat lookups
to the 6.18-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-ethernet-ti-icssg-guard-pa-stat-lookups.patch
and it can be found in the queue-6.18 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
From 27b9daba50609335db6ca81e4cccf50ded21ec76 Mon Sep 17 00:00:00 2001
From: Philippe Schenker <[email protected]>
Date: Thu, 18 Jun 2026 11:30:24 +0200
Subject: net: ethernet: ti: icssg: guard PA stat lookups
From: Philippe Schenker <[email protected]>
commit 27b9daba50609335db6ca81e4cccf50ded21ec76 upstream.
icssg_ndo_get_stats64() unconditionally calls emac_get_stat_by_name() with FW PA stat names regardless of whether the PA stats block is present on the hardware. emac_get_stat_by_name() already guards the PA stats lookup with if (emac->prueth->pa_stats); when that pointer is NULL the lookup falls through to netdev_err() and returns -EINVAL. Because ndo_get_stats64 is polled regularly by the networking stack this produces thousands of log entries of the form:
icssg-prueth icssg1-eth end0: Invalid stats FW_RX_ERROR
A secondary consequence is that the int(-EINVAL) return value is implicitly widened to a near-ULLONG_MAX unsigned value when accumulated into the __u64 fields of rtnl_link_stats64, silently corrupting the rx_errors, rx_dropped and tx_dropped counters reported by ip -s link.
Every other PA-aware code path in the driver is already guarded with the same if (emac->prueth->pa_stats) check. Apply the same guard here.
--- drivers/net/ethernet/ti/icssg/icssg_common.c | 49 +++++++++++++++------------ 1 file changed, 28 insertions(+), 21 deletions(-)
drivers/net/ethernet/ti/icssg/icssg_common.c +28 -21
@@ -1315,28 +1315,35 @@ void icssg_ndo_get_stats64(struct net_de stats->rx_over_errors =emac_get_stat_by_name (emac,"rx_over_errors" ); stats->multicast =emac_get_stat_by_name (emac,"rx_multicast_frames" ); - stats->rx_errors = ndev->stats.rx_errors + -emac_get_stat_by_name (emac,"FW_RX_ERROR" ) + -emac_get_stat_by_name (emac,"FW_RX_EOF_SHORT_FRMERR" ) + -emac_get_stat_by_name (emac,"FW_RX_B0_DROP_EARLY_EOF" ) + -emac_get_stat_by_name (emac,"FW_RX_EXP_FRAG_Q_DROP" ) + -emac_get_stat_by_name (emac,"FW_RX_FIFO_OVERRUN" ); - stats->rx_dropped = ndev->stats.rx_dropped + -emac_get_stat_by_name (emac,"FW_DROPPED_PKT" ) + -emac_get_stat_by_name (emac,"FW_INF_PORT_DISABLED" ) + -emac_get_stat_by_name (emac,"FW_INF_SAV" ) + -emac_get_stat_by_name (emac,"FW_INF_SA_DL" ) + -emac_get_stat_by_name (emac,"FW_INF_PORT_BLOCKED" ) + -emac_get_stat_by_name (emac,"FW_INF_DROP_TAGGED" ) + -emac_get_stat_by_name (emac,"FW_INF_DROP_PRIOTAGGED" ) + -emac_get_stat_by_name (emac,"FW_INF_DROP_NOTAG" ) + -emac_get_stat_by_name (emac,"FW_INF_DROP_NOTMEMBER" ); + stats->rx_errors = ndev->stats.rx_errors; + stats->rx_dropped = ndev->stats.rx_dropped; stats->tx_errors = ndev->stats.tx_errors; - stats->tx_dropped = ndev->stats.tx_dropped + -emac_get_stat_by_name (emac,"FW_RTU_PKT_DROP" ) + -emac_get_stat_by_name (emac,"FW_TX_DROPPED_PACKET" ) + -emac_get_stat_by_name (emac,"FW_TX_TS_DROPPED_PACKET" ) + -emac_get_stat_by_name (emac,"FW_TX_JUMBO_FRM_CUTOFF" ); + stats->tx_dropped = ndev->stats.tx_dropped; + +if (!emac->prueth->pa_stats) +return ; + + stats->rx_errors += +emac_get_stat_by_name (emac,"FW_RX_ERROR" ) + +emac_get_stat_by_name (emac,"FW_RX_EOF_SHORT_FRMERR" ) + +emac_get_stat_by_name (emac,"FW_RX_B0_DROP_EARLY_EOF" ) + +emac_get_stat_by_name (emac,"FW_RX_EXP_FRAG_Q_DROP" ) + +emac_get_stat_by_name (emac,"FW_RX_FIFO_OVERRUN" ); + stats->rx_dropped += +emac_get_stat_by_name (emac,"FW_DROPPED_PKT" ) + +emac_get_stat_by_name (emac,"FW_INF_PORT_DISABLED" ) + +emac_get_stat_by_name (emac,"FW_INF_SAV" ) + +emac_get_stat_by_name (emac,"FW_INF_SA_DL" ) + +emac_get_stat_by_name (emac,"FW_INF_PORT_BLOCKED" ) + +emac_get_stat_by_name (emac,"FW_INF_DROP_TAGGED" ) + +emac_get_stat_by_name (emac,"FW_INF_DROP_PRIOTAGGED" ) + +emac_get_stat_by_name (emac,"FW_INF_DROP_NOTAG" ) + +emac_get_stat_by_name (emac,"FW_INF_DROP_NOTMEMBER" ); + stats->tx_dropped += +emac_get_stat_by_name (emac,"FW_RTU_PKT_DROP" ) + +emac_get_stat_by_name (emac,"FW_TX_DROPPED_PACKET" ) + +emac_get_stat_by_name (emac,"FW_TX_TS_DROPPED_PACKET" ) + +emac_get_stat_by_name (emac,"FW_TX_JUMBO_FRM_CUTOFF" ); }EXPORT_SYMBOL_GPL (icssg_ndo_get_stats64);
Patches currently in stable-queue which might be from [email protected] are
queue-6.18/net-ethernet-ti-icssg-guard-pa-stat-lookups.patch