net: phy: marvell: implement config_inband() method
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 3 Dec 2024 15:31:23 +0000 (15:31 +0000)
committerJakub Kicinski <kuba@kernel.org>
Thu, 5 Dec 2024 03:19:07 +0000 (19:19 -0800)
Implement the config_inband() method for Marvell 88E111288E1111,
and Finisar's 88E1111 variant.

Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1tIUrz-006IUO-3r@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/marvell.c

index 3075ebc3f964b6ecf6256b6baa09831298a069b5..b885bc0fe6e0724f7b1e2bbf1b1e57c4e8c7c7a3 100644 (file)
@@ -731,6 +731,34 @@ static unsigned int m88e1111_inband_caps(struct phy_device *phydev,
        return 0;
 }
 
+static int m88e1111_config_inband(struct phy_device *phydev, unsigned int modes)
+{
+       u16 extsr, bmcr;
+       int err;
+
+       if (phydev->interface != PHY_INTERFACE_MODE_1000BASEX &&
+           phydev->interface != PHY_INTERFACE_MODE_SGMII)
+               return -EINVAL;
+
+       if (modes == LINK_INBAND_BYPASS)
+               extsr = MII_M1111_HWCFG_SERIAL_AN_BYPASS;
+       else
+               extsr = 0;
+
+       if (modes == LINK_INBAND_DISABLE)
+               bmcr = 0;
+       else
+               bmcr = BMCR_ANENABLE;
+
+       err = phy_modify(phydev, MII_M1111_PHY_EXT_SR,
+                        MII_M1111_HWCFG_SERIAL_AN_BYPASS, extsr);
+       if (err < 0)
+               return extsr;
+
+       return phy_modify_paged(phydev, MII_MARVELL_FIBER_PAGE, MII_BMCR,
+                               BMCR_ANENABLE, bmcr);
+}
+
 static int m88e1111_config_aneg(struct phy_device *phydev)
 {
        int extsr = phy_read(phydev, MII_M1111_PHY_EXT_SR);
@@ -3692,6 +3720,7 @@ static struct phy_driver marvell_drivers[] = {
                /* PHY_GBIT_FEATURES */
                .probe = marvell_probe,
                .inband_caps = m88e1111_inband_caps,
+               .config_inband = m88e1111_config_inband,
                .config_init = m88e1112_config_init,
                .config_aneg = marvell_config_aneg,
                .config_intr = marvell_config_intr,
@@ -3714,6 +3743,7 @@ static struct phy_driver marvell_drivers[] = {
                .flags = PHY_POLL_CABLE_TEST,
                .probe = marvell_probe,
                .inband_caps = m88e1111_inband_caps,
+               .config_inband = m88e1111_config_inband,
                .config_init = m88e1111gbe_config_init,
                .config_aneg = m88e1111_config_aneg,
                .read_status = marvell_read_status,
@@ -3738,6 +3768,7 @@ static struct phy_driver marvell_drivers[] = {
                /* PHY_GBIT_FEATURES */
                .probe = marvell_probe,
                .inband_caps = m88e1111_inband_caps,
+               .config_inband = m88e1111_config_inband,
                .config_init = m88e1111gbe_config_init,
                .config_aneg = m88e1111_config_aneg,
                .read_status = marvell_read_status,