diff mbox series

[net] net: dsa: mv88e6xxx: Fix clearing of stats counters

Message ID 1541893270-4442-1-git-send-email-andrew@lunn.ch
State Accepted, archived
Delegated to: David Miller
Headers show
Series [net] net: dsa: mv88e6xxx: Fix clearing of stats counters | expand

Commit Message

Andrew Lunn Nov. 10, 2018, 11:41 p.m. UTC
The mv88e6161 would sometime fail to probe with a timeout waiting for
the switch to complete an operation. This operation is supposed to
clear the statistics counters. However, due to a read/modify/write,
without the needed mask, the operation actually carried out was more
random, with invalid parameters, resulting in the switch not
responding. We need to preserve the histogram mode bits, so apply a
mask to keep them.

Reported-by: Chris Healy <Chris.Healy@zii.aero>
Fixes: 40cff8fca9e3 ("net: dsa: mv88e6xxx: Fix stats histogram mode")
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
---
 drivers/net/dsa/mv88e6xxx/global1.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

David Miller Nov. 11, 2018, 6:19 p.m. UTC | #1
From: Andrew Lunn <andrew@lunn.ch>
Date: Sun, 11 Nov 2018 00:41:10 +0100

> The mv88e6161 would sometime fail to probe with a timeout waiting for
> the switch to complete an operation. This operation is supposed to
> clear the statistics counters. However, due to a read/modify/write,
> without the needed mask, the operation actually carried out was more
> random, with invalid parameters, resulting in the switch not
> responding. We need to preserve the histogram mode bits, so apply a
> mask to keep them.
> 
> Reported-by: Chris Healy <Chris.Healy@zii.aero>
> Fixes: 40cff8fca9e3 ("net: dsa: mv88e6xxx: Fix stats histogram mode")
> Signed-off-by: Andrew Lunn <andrew@lunn.ch>

Oops.

Applied and queued up for -stable.
diff mbox series

Patch

diff --git a/drivers/net/dsa/mv88e6xxx/global1.c b/drivers/net/dsa/mv88e6xxx/global1.c
index d721ccf7d8be..38e399e0f30e 100644
--- a/drivers/net/dsa/mv88e6xxx/global1.c
+++ b/drivers/net/dsa/mv88e6xxx/global1.c
@@ -567,6 +567,8 @@  int mv88e6xxx_g1_stats_clear(struct mv88e6xxx_chip *chip)
 	if (err)
 		return err;
 
+	/* Keep the histogram mode bits */
+	val &= MV88E6XXX_G1_STATS_OP_HIST_RX_TX;
 	val |= MV88E6XXX_G1_STATS_OP_BUSY | MV88E6XXX_G1_STATS_OP_FLUSH_ALL;
 
 	err = mv88e6xxx_g1_write(chip, MV88E6XXX_G1_STATS_OP, val);