diff options
| author | Daniel Golle <daniel@makrotopia.org> | 2026-01-07 18:39:16 +0300 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-01-10 23:01:36 +0300 |
| commit | 9da9633f2f02df7da67ab3b6f84eda4956ae1c5a (patch) | |
| tree | d3a71f6390f7a547b0cfa968e4e8a791847b093c | |
| parent | 72dc44679b14dc62a588b1b18a1ae98284329515 (diff) | |
| download | linux-9da9633f2f02df7da67ab3b6f84eda4956ae1c5a.tar.xz | |
net: phy: mxl-gpy: implement SGMII in-band configuration
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>
| -rw-r--r-- | drivers/net/phy/mxl-gpy.c | 61 |
1 files changed, 47 insertions, 14 deletions
diff --git a/drivers/net/phy/mxl-gpy.c b/drivers/net/phy/mxl-gpy.c index 8e2fd6b942b6..5f99766fb64c 100644 --- a/drivers/net/phy/mxl-gpy.c +++ b/drivers/net/phy/mxl-gpy.c @@ -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, |
