net: pcs: lynx: consolidate sgmii and 1000base-x config code
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Thu, 23 Jun 2022 12:25:30 +0000 (13:25 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 24 Jun 2022 18:27:24 +0000 (11:27 -0700)
Consolidate lynx_pcs_config_1000basex() and lynx_pcs_config_sgmii() into
a single function. The differences between these two are:

- The value that the link timer is set to.
- The value of the IF_MODE register.

Everything else is identical.

This patch depends on "net: phylink: add QSGMII support to
phylink_mii_c22_pcs_encode_advertisement()".

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/pcs/pcs-lynx.c

index bdad8e2..7d5fc7f 100644 (file)
@@ -122,53 +122,39 @@ static void lynx_pcs_get_state(struct phylink_pcs *pcs,
                state->link, state->an_enabled, state->an_complete);
 }
 
-static int lynx_pcs_config_1000basex(struct mdio_device *pcs,
-                                    unsigned int mode,
-                                    const unsigned long *advertising)
+static int lynx_pcs_config_giga(struct mdio_device *pcs, unsigned int mode,
+                               phy_interface_t interface,
+                               const unsigned long *advertising)
 {
        u32 link_timer;
-       int err;
-
-       link_timer = LINK_TIMER_VAL(IEEE8023_LINK_TIMER_NS);
-       mdiodev_write(pcs, LINK_TIMER_LO, link_timer & 0xffff);
-       mdiodev_write(pcs, LINK_TIMER_HI, link_timer >> 16);
-
-       err = mdiodev_modify(pcs, IF_MODE,
-                            IF_MODE_SGMII_EN | IF_MODE_USE_SGMII_AN,
-                            0);
-       if (err)
-               return err;
-
-       return phylink_mii_c22_pcs_config(pcs, mode,
-                                         PHY_INTERFACE_MODE_1000BASEX,
-                                         advertising);
-}
-
-static int lynx_pcs_config_sgmii(struct mdio_device *pcs, unsigned int mode,
-                                const unsigned long *advertising)
-{
        u16 if_mode;
        int err;
 
-       if_mode = IF_MODE_SGMII_EN;
-       if (mode == MLO_AN_INBAND) {
-               u32 link_timer;
-
-               if_mode |= IF_MODE_USE_SGMII_AN;
-
-               /* Adjust link timer for SGMII */
-               link_timer = LINK_TIMER_VAL(SGMII_AN_LINK_TIMER_NS);
+       if (interface == PHY_INTERFACE_MODE_1000BASEX) {
+               link_timer = LINK_TIMER_VAL(IEEE8023_LINK_TIMER_NS);
                mdiodev_write(pcs, LINK_TIMER_LO, link_timer & 0xffff);
                mdiodev_write(pcs, LINK_TIMER_HI, link_timer >> 16);
+
+               if_mode = 0;
+       } else {
+               if_mode = IF_MODE_SGMII_EN;
+               if (mode == MLO_AN_INBAND) {
+                       if_mode |= IF_MODE_USE_SGMII_AN;
+
+                       /* Adjust link timer for SGMII */
+                       link_timer = LINK_TIMER_VAL(SGMII_AN_LINK_TIMER_NS);
+                       mdiodev_write(pcs, LINK_TIMER_LO, link_timer & 0xffff);
+                       mdiodev_write(pcs, LINK_TIMER_HI, link_timer >> 16);
+               }
        }
+
        err = mdiodev_modify(pcs, IF_MODE,
                             IF_MODE_SGMII_EN | IF_MODE_USE_SGMII_AN,
                             if_mode);
        if (err)
                return err;
 
-       return phylink_mii_c22_pcs_config(pcs, mode, PHY_INTERFACE_MODE_SGMII,
-                                        advertising);
+       return phylink_mii_c22_pcs_config(pcs, mode, interface, advertising);
 }
 
 static int lynx_pcs_config_usxgmii(struct mdio_device *pcs, unsigned int mode,
@@ -198,10 +184,10 @@ static int lynx_pcs_config(struct phylink_pcs *pcs, unsigned int mode,
 
        switch (ifmode) {
        case PHY_INTERFACE_MODE_1000BASEX:
-               return lynx_pcs_config_1000basex(lynx->mdio, mode, advertising);
        case PHY_INTERFACE_MODE_SGMII:
        case PHY_INTERFACE_MODE_QSGMII:
-               return lynx_pcs_config_sgmii(lynx->mdio, mode, advertising);
+               return lynx_pcs_config_giga(lynx->mdio, mode, ifmode,
+                                           advertising);
        case PHY_INTERFACE_MODE_2500BASEX:
                if (phylink_autoneg_inband(mode)) {
                        dev_err(&lynx->mdio->dev,