732-net-phy-mxl-gpy-don-t-use-SGMII-AN-if-using-phylink.patch 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. From a969b663c866129ed9eb217785a6574fbe826f1d Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Thu, 6 Apr 2023 23:36:50 +0100
  4. Subject: [PATCH] net: phy: mxl-gpy: don't use SGMII AN if using phylink
  5. MAC drivers using phylink expect SGMII in-band-status to be switched off
  6. when attached to a PHY. Make sure this is the case also for mxl-gpy which
  7. keeps SGMII in-band-status in case of SGMII interface mode is used.
  8. Signed-off-by: Daniel Golle <[email protected]>
  9. ---
  10. drivers/net/phy/mxl-gpy.c | 19 ++++++++++++++++---
  11. 1 file changed, 16 insertions(+), 3 deletions(-)
  12. --- a/drivers/net/phy/mxl-gpy.c
  13. +++ b/drivers/net/phy/mxl-gpy.c
  14. @@ -371,8 +371,11 @@ static bool gpy_2500basex_chk(struct phy
  15. phydev->speed = SPEED_2500;
  16. phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  17. - phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
  18. - VSPEC1_SGMII_CTRL_ANEN, 0);
  19. +
  20. + if (!phydev->phylink)
  21. + phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
  22. + VSPEC1_SGMII_CTRL_ANEN, 0);
  23. +
  24. return true;
  25. }
  26. @@ -396,6 +399,14 @@ static int gpy_config_aneg(struct phy_de
  27. u32 adv;
  28. int ret;
  29. + /* Disable SGMII auto-negotiation if using phylink */
  30. + if (phydev->phylink) {
  31. + ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
  32. + VSPEC1_SGMII_CTRL_ANEN, 0);
  33. + if (ret < 0)
  34. + return ret;
  35. + }
  36. +
  37. if (phydev->autoneg == AUTONEG_DISABLE) {
  38. /* Configure half duplex with genphy_setup_forced,
  39. * because genphy_c45_pma_setup_forced does not support.
  40. @@ -486,6 +497,8 @@ static void gpy_update_interface(struct
  41. switch (phydev->speed) {
  42. case SPEED_2500:
  43. phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
  44. + if (phydev->phylink)
  45. + break;
  46. ret = phy_modify_mmd(phydev, MDIO_MMD_VEND1, VSPEC1_SGMII_CTRL,
  47. VSPEC1_SGMII_CTRL_ANEN, 0);
  48. if (ret < 0)
  49. @@ -497,7 +510,7 @@ static void gpy_update_interface(struct
  50. case SPEED_100:
  51. case SPEED_10:
  52. phydev->interface = PHY_INTERFACE_MODE_SGMII;
  53. - if (gpy_sgmii_aneg_en(phydev))
  54. + if (phydev->phylink || gpy_sgmii_aneg_en(phydev))
  55. break;
  56. /* Enable and restart SGMII ANEG for 10/100/1000Mbps link speed
  57. * if ANEG is disabled (in 2500-BaseX mode).