Skip to content

Commit 2642234

Browse files
elkablodavem330
authored andcommitted
net: dsa: mv88e6xxx: Fix 88E6141/6341 2500mbps SERDES speed
This is a fix for the port_set_speed method for the Topaz family. Currently the same method is used as for the Peridot family, but this is wrong for the SERDES port. On Topaz, the SERDES port is port 5, not 9 and 10 as in Peridot. Moreover setting alt_bit on Topaz only makes sense for port 0 (for (differentiating 100mbps vs 200mbps). The SERDES port does not support more than 2500mbps, so alt_bit does not make any difference. Signed-off-by: Marek Behún <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e943d94 commit 2642234

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed

drivers/net/dsa/mv88e6xxx/chip.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,7 +2907,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
29072907
.port_set_link = mv88e6xxx_port_set_link,
29082908
.port_set_duplex = mv88e6xxx_port_set_duplex,
29092909
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
2910-
.port_set_speed = mv88e6390_port_set_speed,
2910+
.port_set_speed = mv88e6341_port_set_speed,
29112911
.port_tag_remap = mv88e6095_port_tag_remap,
29122912
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
29132913
.port_set_egress_floods = mv88e6352_port_set_egress_floods,
@@ -3528,7 +3528,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
35283528
.port_set_link = mv88e6xxx_port_set_link,
35293529
.port_set_duplex = mv88e6xxx_port_set_duplex,
35303530
.port_set_rgmii_delay = mv88e6390_port_set_rgmii_delay,
3531-
.port_set_speed = mv88e6390_port_set_speed,
3531+
.port_set_speed = mv88e6341_port_set_speed,
35323532
.port_tag_remap = mv88e6095_port_tag_remap,
35333533
.port_set_frame_mode = mv88e6351_port_set_frame_mode,
35343534
.port_set_egress_floods = mv88e6352_port_set_egress_floods,

drivers/net/dsa/mv88e6xxx/port.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,11 @@ static int mv88e6xxx_port_set_speed(struct mv88e6xxx_chip *chip, int port,
228228
ctrl = MV88E6XXX_PORT_MAC_CTL_SPEED_1000;
229229
break;
230230
case 2500:
231-
ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 |
232-
MV88E6390_PORT_MAC_CTL_ALTSPEED;
231+
if (alt_bit)
232+
ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000 |
233+
MV88E6390_PORT_MAC_CTL_ALTSPEED;
234+
else
235+
ctrl = MV88E6390_PORT_MAC_CTL_SPEED_10000;
233236
break;
234237
case 10000:
235238
/* all bits set, fall through... */
@@ -291,6 +294,24 @@ int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
291294
return mv88e6xxx_port_set_speed(chip, port, speed, false, false);
292295
}
293296

297+
/* Support 10, 100, 200, 1000, 2500 Mbps (e.g. 88E6341) */
298+
int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
299+
{
300+
if (speed == SPEED_MAX)
301+
speed = port < 5 ? 1000 : 2500;
302+
303+
if (speed > 2500)
304+
return -EOPNOTSUPP;
305+
306+
if (speed == 200 && port != 0)
307+
return -EOPNOTSUPP;
308+
309+
if (speed == 2500 && port < 5)
310+
return -EOPNOTSUPP;
311+
312+
return mv88e6xxx_port_set_speed(chip, port, speed, !port, true);
313+
}
314+
294315
/* Support 10, 100, 200, 1000 Mbps (e.g. 88E6352 family) */
295316
int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed)
296317
{

drivers/net/dsa/mv88e6xxx/port.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup);
269269

270270
int mv88e6065_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);
271271
int mv88e6185_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);
272+
int mv88e6341_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);
272273
int mv88e6352_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);
273274
int mv88e6390_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);
274275
int mv88e6390x_port_set_speed(struct mv88e6xxx_chip *chip, int port, int speed);

0 commit comments

Comments
 (0)