[PATCH net v2 1/2] net: usb: lan78xx: do not update statistics after a failed read
From: Wei Jie Law
Date: Sun Oct 18 2026 - 02:18:50 EST
From: Wei Jie Law <98lawweijie@xxxxxxxxx>
lan78xx_update_stats() reads the hardware counters into an on-stack
struct lan78xx_statstage. If lan78xx_read_stats() fails, only the
rollover check is skipped: the counters are still recomputed from the
uninitialized stack buffer and stored in dev->stats.curr_stat, which is
then reported to user space by ethtool -S.
Keep the previous values when the read fails.
Found by code review with LLM assistance. Tested together with the next
patch, which makes short reads fail: with an emulated device, ethtool -S
then keeps reporting the previous counters.
Fixes: 20ff55655a93 ("lan78xx: handle statistics counter rollover")
Cc: stable@xxxxxxxxxxxxxxx
Assisted-by: LLM
---
drivers/net/usb/lan78xx.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index 5655941f1478..cb8204371f5c 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -789,11 +789,13 @@ static void lan78xx_update_stats(struct lan78xx_net *dev)
mutex_lock(&dev->stats.access_lock);
- if (lan78xx_read_stats(dev, &lan78xx_stats) > 0)
+ if (lan78xx_read_stats(dev, &lan78xx_stats) > 0) {
lan78xx_check_stat_rollover(dev, &lan78xx_stats);
- for (i = 0; i < (sizeof(lan78xx_stats) / (sizeof(u32))); i++)
- data[i] = (u64)p[i] + ((u64)count[i] * ((u64)max[i] + 1));
+ for (i = 0; i < (sizeof(lan78xx_stats) / (sizeof(u32))); i++)
+ data[i] = (u64)p[i] +
+ ((u64)count[i] * ((u64)max[i] + 1));
+ }
mutex_unlock(&dev->stats.access_lock);
--
2.43.0