net: pcs: lynxi: update PCS driver to use neg_mode
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Fri, 16 Jun 2023 12:06:43 +0000 (13:06 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 23 Jun 2023 02:41:01 +0000 (19:41 -0700)
Update the Lynxi PCS driver to use neg_mode rather than the mode
argument. This ensures that the link_up() method will always program
the speed and duplex when negotiation is disabled.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://lore.kernel.org/r/E1qA8Dz-00EaFY-5A@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/pcs/pcs-mtk-lynxi.c

index 8884523..b0f3ede 100644 (file)
@@ -102,13 +102,13 @@ static void mtk_pcs_lynxi_get_state(struct phylink_pcs *pcs,
                                         FIELD_GET(SGMII_LPA, adv));
 }
 
-static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode,
+static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int neg_mode,
                                phy_interface_t interface,
                                const unsigned long *advertising,
                                bool permit_pause_to_mac)
 {
        struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs);
-       bool mode_changed = false, changed, use_an;
+       bool mode_changed = false, changed;
        unsigned int rgc3, sgm_mode, bmcr;
        int advertise, link_timer;
 
@@ -121,30 +121,21 @@ static int mtk_pcs_lynxi_config(struct phylink_pcs *pcs, unsigned int mode,
         * we assume that fixes it's speed at bitrate = line rate (in
         * other words, 1000Mbps or 2500Mbps).
         */
-       if (interface == PHY_INTERFACE_MODE_SGMII) {
+       if (interface == PHY_INTERFACE_MODE_SGMII)
                sgm_mode = SGMII_IF_MODE_SGMII;
-               if (phylink_autoneg_inband(mode)) {
-                       sgm_mode |= SGMII_REMOTE_FAULT_DIS |
-                                   SGMII_SPEED_DUPLEX_AN;
-                       use_an = true;
-               } else {
-                       use_an = false;
-               }
-       } else if (phylink_autoneg_inband(mode)) {
-               /* 1000base-X or 2500base-X autoneg */
-               sgm_mode = SGMII_REMOTE_FAULT_DIS;
-               use_an = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
-                                          advertising);
-       } else {
-               /* 1000base-X or 2500base-X without autoneg */
+       else
                sgm_mode = 0;
-               use_an = false;
-       }
 
-       if (use_an)
+       if (neg_mode & PHYLINK_PCS_NEG_INBAND)
+               sgm_mode |= SGMII_REMOTE_FAULT_DIS;
+
+       if (neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED) {
+               if (interface == PHY_INTERFACE_MODE_SGMII)
+                       sgm_mode |= SGMII_SPEED_DUPLEX_AN;
                bmcr = BMCR_ANENABLE;
-       else
+       } else {
                bmcr = 0;
+       }
 
        if (mpcs->interface != interface) {
                link_timer = phylink_get_link_timer_ns(interface);
@@ -216,14 +207,15 @@ static void mtk_pcs_lynxi_restart_an(struct phylink_pcs *pcs)
        regmap_set_bits(mpcs->regmap, SGMSYS_PCS_CONTROL_1, BMCR_ANRESTART);
 }
 
-static void mtk_pcs_lynxi_link_up(struct phylink_pcs *pcs, unsigned int mode,
+static void mtk_pcs_lynxi_link_up(struct phylink_pcs *pcs,
+                                 unsigned int neg_mode,
                                  phy_interface_t interface, int speed,
                                  int duplex)
 {
        struct mtk_pcs_lynxi *mpcs = pcs_to_mtk_pcs_lynxi(pcs);
        unsigned int sgm_mode;
 
-       if (!phylink_autoneg_inband(mode)) {
+       if (neg_mode != PHYLINK_PCS_NEG_INBAND_ENABLED) {
                /* Force the speed and duplex setting */
                if (speed == SPEED_10)
                        sgm_mode = SGMII_SPEED_10;
@@ -286,6 +278,7 @@ struct phylink_pcs *mtk_pcs_lynxi_create(struct device *dev,
        mpcs->regmap = regmap;
        mpcs->flags = flags;
        mpcs->pcs.ops = &mtk_pcs_lynxi_ops;
+       mpcs->pcs.neg_mode = true;
        mpcs->pcs.poll = true;
        mpcs->interface = PHY_INTERFACE_MODE_NA;