[PATCH net 1/2] net: dsa: b53: fix resetting speed and pause on forced link

Jonas Gorski posted 2 patches 3 months, 1 week ago
[PATCH net 1/2] net: dsa: b53: fix resetting speed and pause on forced link
Posted by Jonas Gorski 3 months, 1 week ago
There is no guarantee that the port state override registers have their
default values, as not all switches support being reset via register or
have a reset GPIO.

So when forcing port config, we need to make sure to clear all fields,
which we currently do not do for the speed and flow control
configuration. This can cause flow control stay enabled, or in the case
of speed becoming an illegal value, e.g. configured for 1G (0x2), then
setting 100M (0x1), results in 0x3 which is invalid.

For PORT_OVERRIDE_SPEED_2000M we need to make sure to only clear it on
supported chips, as the bit can have different meanings on other chips,
e.g. for BCM5389 this controls scanning PHYs for link/speed
configuration.

Fixes: 5e004460f874 ("net: dsa: b53: Add helper to set link parameters")
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
---
 drivers/net/dsa/b53/b53_common.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 2f846381d5a7..cb28256ef3cc 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -1372,6 +1372,10 @@ static void b53_force_port_config(struct b53_device *dev, int port,
 	else
 		reg &= ~PORT_OVERRIDE_FULL_DUPLEX;
 
+	reg &= ~(0x3 << GMII_PO_SPEED_S);
+	if (is5301x(dev) || is58xx(dev))
+		reg &= ~PORT_OVERRIDE_SPEED_2000M;
+
 	switch (speed) {
 	case 2000:
 		reg |= PORT_OVERRIDE_SPEED_2000M;
@@ -1390,6 +1394,11 @@ static void b53_force_port_config(struct b53_device *dev, int port,
 		return;
 	}
 
+	if (is5325(dev))
+		reg &= ~PORT_OVERRIDE_LP_FLOW_25;
+	else
+		reg &= ~(PORT_OVERRIDE_RX_FLOW | PORT_OVERRIDE_TX_FLOW);
+
 	if (rx_pause) {
 		if (is5325(dev))
 			reg |= PORT_OVERRIDE_LP_FLOW_25;
-- 
2.43.0
Re: [PATCH net 1/2] net: dsa: b53: fix resetting speed and pause on forced link
Posted by Florian Fainelli 3 months, 1 week ago
On 11/1/25 06:28, Jonas Gorski wrote:
> There is no guarantee that the port state override registers have their
> default values, as not all switches support being reset via register or
> have a reset GPIO.
> 
> So when forcing port config, we need to make sure to clear all fields,
> which we currently do not do for the speed and flow control
> configuration. This can cause flow control stay enabled, or in the case
> of speed becoming an illegal value, e.g. configured for 1G (0x2), then
> setting 100M (0x1), results in 0x3 which is invalid.
> 
> For PORT_OVERRIDE_SPEED_2000M we need to make sure to only clear it on
> supported chips, as the bit can have different meanings on other chips,
> e.g. for BCM5389 this controls scanning PHYs for link/speed
> configuration.
> 
> Fixes: 5e004460f874 ("net: dsa: b53: Add helper to set link parameters")
> Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>

Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
-- 
Florian