Commit ae8140aa authored by Mark Rustad's avatar Mark Rustad Committed by Jeff Kirsher

ixgbe: Avoid needless PHY access on copper phys

Avoid a needless PHY access on copper phys to save the 10ms wait
time for each PHY access. A helper function is introduced to
actually do the register access and process the contents.
Signed-off-by: default avatarMark Rustad <mark.d.rustad@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 897b9349
...@@ -730,39 +730,61 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw, ...@@ -730,39 +730,61 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
} }
/** /**
* ixgbe_get_copper_link_capabilities_generic - Determines link capabilities * ixgbe_get_copper_speeds_supported - Get copper link speed from phy
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
* @speed: pointer to link speed
* @autoneg: boolean auto-negotiation value
* *
* Determines the link capabilities by reading the AUTOC register. * Determines the supported link capabilities by reading the PHY auto
* negotiation register.
*/ */
s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
ixgbe_link_speed *speed,
bool *autoneg)
{ {
s32 status;
u16 speed_ability; u16 speed_ability;
s32 status;
*speed = 0;
*autoneg = true;
status = hw->phy.ops.read_reg(hw, MDIO_SPEED, MDIO_MMD_PMAPMD, status = hw->phy.ops.read_reg(hw, MDIO_SPEED, MDIO_MMD_PMAPMD,
&speed_ability); &speed_ability);
if (status)
return status;
if (status == 0) { if (speed_ability & MDIO_SPEED_10G)
if (speed_ability & MDIO_SPEED_10G) hw->phy.speeds_supported |= IXGBE_LINK_SPEED_10GB_FULL;
*speed |= IXGBE_LINK_SPEED_10GB_FULL; if (speed_ability & MDIO_PMA_SPEED_1000)
if (speed_ability & MDIO_PMA_SPEED_1000) hw->phy.speeds_supported |= IXGBE_LINK_SPEED_1GB_FULL;
*speed |= IXGBE_LINK_SPEED_1GB_FULL; if (speed_ability & MDIO_PMA_SPEED_100)
if (speed_ability & MDIO_PMA_SPEED_100) hw->phy.speeds_supported |= IXGBE_LINK_SPEED_100_FULL;
*speed |= IXGBE_LINK_SPEED_100_FULL;
switch (hw->mac.type) {
case ixgbe_mac_X550:
hw->phy.speeds_supported |= IXGBE_LINK_SPEED_2_5GB_FULL;
hw->phy.speeds_supported |= IXGBE_LINK_SPEED_5GB_FULL;
break;
case ixgbe_mac_X550EM_x:
hw->phy.speeds_supported &= ~IXGBE_LINK_SPEED_100_FULL;
break;
default:
break;
} }
/* Internal PHY does not support 100 Mbps */ return 0;
if (hw->mac.type == ixgbe_mac_X550EM_x) }
*speed &= ~IXGBE_LINK_SPEED_100_FULL;
/**
* ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
* @hw: pointer to hardware structure
* @speed: pointer to link speed
* @autoneg: boolean auto-negotiation value
*/
s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
ixgbe_link_speed *speed,
bool *autoneg)
{
s32 status = 0;
*autoneg = true;
if (!hw->phy.speeds_supported)
status = ixgbe_get_copper_speeds_supported(hw);
*speed = hw->phy.speeds_supported;
return status; return status;
} }
......
...@@ -3384,6 +3384,7 @@ struct ixgbe_phy_info { ...@@ -3384,6 +3384,7 @@ struct ixgbe_phy_info {
u32 phy_semaphore_mask; u32 phy_semaphore_mask;
bool reset_disable; bool reset_disable;
ixgbe_autoneg_advertised autoneg_advertised; ixgbe_autoneg_advertised autoneg_advertised;
ixgbe_link_speed speeds_supported;
enum ixgbe_smart_speed smart_speed; enum ixgbe_smart_speed smart_speed;
bool smart_speed_active; bool smart_speed_active;
bool multispeed_fiber; bool multispeed_fiber;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment