Skip to content

Commit 4e6da79

Browse files
elkablodavem330
authored andcommitted
net: dsa: mv88e6xxx: support 2500base-x in SGMII IRQ handler
The mv88e6390_serdes_irq_link_sgmii IRQ handler reads the SERDES PHY status register to determine speed, among other things. If cmode of the port is set to 2500base-x, though, the PHY still reports 1000 Mbps (the PHY register itself does not differentiate between 1000 Mbps and 2500 Mbps - it thinks it is running at 1000 Mbps, although clock is 2.5x faster). Look at the cmode and set SPEED_2500 if cmode is set to 2500base-x. Also tell mv88e6xxx_port_setup_mac the PHY interface mode corresponding to current cmode in terms of phy_interface_t. Signed-off-by: Marek Behún <[email protected]> Reviewed-by: Andrew Lunn <[email protected]> Tested-by: Vivien Didelot <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e93b4f0 commit 4e6da79

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

drivers/net/dsa/mv88e6xxx/serdes.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,11 @@ int mv88e6390x_serdes_power(struct mv88e6xxx_chip *chip, int port, bool on)
505505
static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip,
506506
int port, int lane)
507507
{
508+
u8 cmode = chip->ports[port].cmode;
508509
struct dsa_switch *ds = chip->ds;
509510
int duplex = DUPLEX_UNKNOWN;
510511
int speed = SPEED_UNKNOWN;
512+
phy_interface_t mode;
511513
int link, err;
512514
u16 status;
513515

@@ -527,7 +529,10 @@ static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip,
527529

528530
switch (status & MV88E6390_SGMII_PHY_STATUS_SPEED_MASK) {
529531
case MV88E6390_SGMII_PHY_STATUS_SPEED_1000:
530-
speed = SPEED_1000;
532+
if (cmode == MV88E6XXX_PORT_STS_CMODE_2500BASEX)
533+
speed = SPEED_2500;
534+
else
535+
speed = SPEED_1000;
531536
break;
532537
case MV88E6390_SGMII_PHY_STATUS_SPEED_100:
533538
speed = SPEED_100;
@@ -541,8 +546,22 @@ static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip,
541546
}
542547
}
543548

549+
switch (cmode) {
550+
case MV88E6XXX_PORT_STS_CMODE_SGMII:
551+
mode = PHY_INTERFACE_MODE_SGMII;
552+
break;
553+
case MV88E6XXX_PORT_STS_CMODE_1000BASE_X:
554+
mode = PHY_INTERFACE_MODE_1000BASEX;
555+
break;
556+
case MV88E6XXX_PORT_STS_CMODE_2500BASEX:
557+
mode = PHY_INTERFACE_MODE_2500BASEX;
558+
break;
559+
default:
560+
mode = PHY_INTERFACE_MODE_NA;
561+
}
562+
544563
err = mv88e6xxx_port_setup_mac(chip, port, link, speed, duplex,
545-
PAUSE_OFF, PHY_INTERFACE_MODE_NA);
564+
PAUSE_OFF, mode);
546565
if (err)
547566
dev_err(chip->dev, "can't propagate PHY settings to MAC: %d\n",
548567
err);

0 commit comments

Comments
 (0)