]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: phy: mxl-gpy: implement SGMII in-band configuration
authorDaniel Golle <daniel@makrotopia.org>
Wed, 7 Jan 2026 15:39:16 +0000 (15:39 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 10 Jan 2026 20:01:36 +0000 (12:01 -0800)
SGMII in-band autonegotiation was previously kept untouched (and restored
after switching back from 2500Base-X to SGMII). Now that the kernel offers
a way to announce in-band capabilities and nable/disable in-band AN,
implement the .inband_caps and .config_inband driver ops.
This moves the responsibility to configure SGMII in-band AN from the PHY
driver to phylink.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Link: https://patch.msgid.link/70f07e46dd96e239a9711e6073e8c04c1d8672d4.1767800226.git.daniel@makrotopia.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/mxl-gpy.c

index 8e2fd6b942b648042311ef028573f5c5d1796e3f..5f99766fb64c3c2c9be98be18efde39bcd222758 100644 (file)
@@ -603,20 +603,6 @@ static int gpy_update_interface(struct phy_device *phydev)
        case SPEED_100:
        case SPEED_10:
                phydev->interface = PHY_INTERFACE_MODE_SGMII;
-               if (gpy_sgmii_aneg_en(phydev))
-                       break;
-               /* Enable and restart SGMII ANEG for 10/100/1000Mbps link speed
-                * if ANEG is disabled (in 2500-BaseX mode).
-                */
-               ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
-                                    VSPEC1_SGMII_ANEN_ANRS,
-                                    VSPEC1_SGMII_ANEN_ANRS);
-               if (ret < 0) {
-                       phydev_err(phydev,
-                                  "Error: Enable of SGMII ANEG failed: %d\n",
-                                  ret);
-                       return ret;
-               }
                break;
        }
 
@@ -1060,6 +1046,27 @@ static int gpy_led_polarity_set(struct phy_device *phydev, int index,
        return -EINVAL;
 }
 
+static unsigned int gpy_inband_caps(struct phy_device *phydev,
+                                   phy_interface_t interface)
+{
+       switch (interface) {
+       case PHY_INTERFACE_MODE_SGMII:
+               return LINK_INBAND_DISABLE | LINK_INBAND_ENABLE;
+       case PHY_INTERFACE_MODE_2500BASEX:
+               return LINK_INBAND_DISABLE;
+       default:
+               return 0;
+       }
+}
+
+static int gpy_config_inband(struct phy_device *phydev, unsigned int modes)
+{
+       return phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
+                             VSPEC1_SGMII_ANEN_ANRS,
+                             (modes == LINK_INBAND_DISABLE) ? 0 :
+                             VSPEC1_SGMII_ANEN_ANRS);
+}
+
 static struct phy_driver gpy_drivers[] = {
        {
                PHY_ID_MATCH_MODEL(PHY_ID_GPY2xx),
@@ -1067,6 +1074,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1090,6 +1099,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1112,6 +1123,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1135,6 +1148,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1157,6 +1172,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1179,6 +1196,8 @@ static struct phy_driver gpy_drivers[] = {
                .name           = "Maxlinear Ethernet GPY212B",
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .probe          = gpy_probe,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
@@ -1202,6 +1221,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1225,6 +1246,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1247,6 +1270,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy21x_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1269,6 +1294,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1286,6 +1313,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1303,6 +1332,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,
@@ -1320,6 +1351,8 @@ static struct phy_driver gpy_drivers[] = {
                .get_features   = genphy_c45_pma_read_abilities,
                .config_init    = gpy_config_init,
                .probe          = gpy_probe,
+               .inband_caps    = gpy_inband_caps,
+               .config_inband  = gpy_config_inband,
                .suspend        = genphy_suspend,
                .resume         = genphy_resume,
                .config_aneg    = gpy_config_aneg,