net/ixgbe/base: create function to restart autoneg
authorGuinan Sun <guinanx.sun@intel.com>
Thu, 9 Jul 2020 08:00:36 +0000 (08:00 +0000)
committerFerruh Yigit <ferruh.yigit@intel.com>
Sat, 11 Jul 2020 04:18:53 +0000 (06:18 +0200)
This patch is for restarting auto negotiation on PHY.

Signed-off-by: Jakub Chylkowski <jakubx.chylkowski@intel.com>
Signed-off-by: Guinan Sun <guinanx.sun@intel.com>
Reviewed-by: Wei Zhao <wei.zhao1@intel.com>
drivers/net/ixgbe/base/ixgbe_phy.c
drivers/net/ixgbe/base/ixgbe_phy.h

index 823cf16..620154a 100644 (file)
@@ -542,6 +542,26 @@ out:
        return status;
 }
 
+/**
+ * ixgbe_restart_auto_neg - Restart auto negotiation on the PHY
+ * @hw: pointer to hardware structure
+ **/
+void ixgbe_restart_auto_neg(struct ixgbe_hw *hw)
+{
+       u16 autoneg_reg;
+
+       /* Check if PHY reset is blocked by MNG FW */
+       if (ixgbe_check_reset_blocked(hw))
+               return;
+
+       /* Restart PHY auto-negotiation. */
+       hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
+                               IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
+       autoneg_reg |= IXGBE_MII_RESTART;
+       hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
+                               IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
+}
+
 /**
  * ixgbe_read_phy_mdi - Reads a value from a specified PHY register without
  * the SWFW lock
@@ -826,19 +846,7 @@ s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
                              IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
                              autoneg_reg);
 
-       /* Blocked by MNG FW so don't reset PHY */
-       if (ixgbe_check_reset_blocked(hw))
-               return status;
-
-       /* Restart PHY auto-negotiation. */
-       hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
-                            IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
-
-       autoneg_reg |= IXGBE_MII_RESTART;
-
-       hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
-                             IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
-
+       ixgbe_restart_auto_neg(hw);
        return status;
 }
 
@@ -1062,19 +1070,7 @@ s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
                                      autoneg_reg);
        }
 
-       /* Blocked by MNG FW so don't reset PHY */
-       if (ixgbe_check_reset_blocked(hw))
-               return status;
-
-       /* Restart PHY auto-negotiation. */
-       hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
-                            IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
-
-       autoneg_reg |= IXGBE_MII_RESTART;
-
-       hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
-                             IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
-
+       ixgbe_restart_auto_neg(hw);
        return status;
 }
 
index a06c3be..e28c52a 100644 (file)
@@ -133,6 +133,7 @@ enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id);
 s32 ixgbe_get_phy_id(struct ixgbe_hw *hw);
 s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw);
 s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw);
+void ixgbe_restart_auto_neg(struct ixgbe_hw *hw);
 s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
                           u16 *phy_data);
 s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,