]> git.dujemihanovic.xyz Git - linux.git/commitdiff
net: dsa: mv88e6xxx: read cmode on mv88e6320/21 serdes only ports
authorSteffen Bätz <steffen@innosonix.de>
Wed, 8 May 2024 07:29:44 +0000 (09:29 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 9 May 2024 09:48:20 +0000 (11:48 +0200)
On the mv88e6320 and 6321 switch family, port 0/1 are serdes only ports.
Modified the mv88e6352_get_port4_serdes_cmode function to pass a port
number since the register set of the 6352 is equal on the 6320/21.

Signed-off-by: Steffen Bätz <steffen@innosonix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Fabio Estevam <festevam@gmail.com>
Link: https://lore.kernel.org/r/20240508072944.54880-3-steffen@innosonix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/mv88e6xxx/chip.c

index 61c0070c7610bd751364c34e8b792fd2f9dbf03c..0918bd6fa81ddfb0a4d0bc6fb98a9a604f094c86 100644 (file)
@@ -637,12 +637,12 @@ static void mv88e6351_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
                                   MAC_1000FD;
 }
 
-static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
+static int mv88e63xx_get_port_serdes_cmode(struct mv88e6xxx_chip *chip, int port)
 {
        u16 reg, val;
        int err;
 
-       err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, &reg);
+       err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &reg);
        if (err)
                return err;
 
@@ -651,16 +651,16 @@ static int mv88e6352_get_port4_serdes_cmode(struct mv88e6xxx_chip *chip)
                return 0xf;
 
        val = reg & ~MV88E6XXX_PORT_STS_PHY_DETECT;
-       err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, val);
+       err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, val);
        if (err)
                return err;
 
-       err = mv88e6xxx_port_read(chip, 4, MV88E6XXX_PORT_STS, &val);
+       err = mv88e6xxx_port_read(chip, port, MV88E6XXX_PORT_STS, &val);
        if (err)
                return err;
 
        /* Restore PHY_DETECT value */
-       err = mv88e6xxx_port_write(chip, 4, MV88E6XXX_PORT_STS, reg);
+       err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_STS, reg);
        if (err)
                return err;
 
@@ -688,7 +688,7 @@ static void mv88e6352_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
                if (err <= 0)
                        return;
 
-               cmode = mv88e6352_get_port4_serdes_cmode(chip);
+               cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
                if (cmode < 0)
                        dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
                                port);
@@ -701,12 +701,23 @@ static void mv88e632x_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,
                                       struct phylink_config *config)
 {
        unsigned long *supported = config->supported_interfaces;
+       int cmode;
 
        /* Translate the default cmode */
        mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported);
 
        config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 |
                                   MAC_1000FD;
+
+       /* Port 0/1 are serdes only ports */
+       if (port == 0 || port == 1) {
+               cmode = mv88e63xx_get_port_serdes_cmode(chip, port);
+               if (cmode < 0)
+                       dev_err(chip->dev, "p%d: failed to read serdes cmode\n",
+                               port);
+               else
+                       mv88e6xxx_translate_cmode(cmode, supported);
+       }
 }
 
 static void mv88e6341_phylink_get_caps(struct mv88e6xxx_chip *chip, int port,