Skip to content

Commit

Permalink
ixgbe: create function to restart autoneg
Browse files Browse the repository at this point in the history
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>

Approved by:	imp
Obtained from:	DPDK (664ea2614eafbec8eda5c86764ff047475a1e5c6)
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D31621

(cherry picked from commit 80a39a2)
  • Loading branch information
Guinan Sun authored and kev009 committed Sep 14, 2021
1 parent bd6a3f4 commit 74e5adf
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 26 deletions.
48 changes: 22 additions & 26 deletions sys/dev/ixgbe/ixgbe_phy.c
Expand Up @@ -573,6 +573,26 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
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
Expand Down Expand Up @@ -857,19 +877,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;
}

Expand Down Expand Up @@ -1093,19 +1101,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;
}

Expand Down
1 change: 1 addition & 0 deletions sys/dev/ixgbe/ixgbe_phy.h
Expand Up @@ -163,6 +163,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,
Expand Down

0 comments on commit 74e5adf

Please sign in to comment.