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: Mark Rustad <mark.d.rustad@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
897b9349f0
commit
ae8140aa6b
2 changed files with 44 additions and 21 deletions
|
@ -729,40 +729,62 @@ s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_get_copper_speeds_supported - Get copper link speed from phy
|
||||||
|
* @hw: pointer to hardware structure
|
||||||
|
*
|
||||||
|
* Determines the supported link capabilities by reading the PHY auto
|
||||||
|
* negotiation register.
|
||||||
|
*/
|
||||||
|
static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
|
||||||
|
{
|
||||||
|
u16 speed_ability;
|
||||||
|
s32 status;
|
||||||
|
|
||||||
|
status = hw->phy.ops.read_reg(hw, MDIO_SPEED, MDIO_MMD_PMAPMD,
|
||||||
|
&speed_ability);
|
||||||
|
if (status)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
if (speed_ability & MDIO_SPEED_10G)
|
||||||
|
hw->phy.speeds_supported |= IXGBE_LINK_SPEED_10GB_FULL;
|
||||||
|
if (speed_ability & MDIO_PMA_SPEED_1000)
|
||||||
|
hw->phy.speeds_supported |= IXGBE_LINK_SPEED_1GB_FULL;
|
||||||
|
if (speed_ability & MDIO_PMA_SPEED_100)
|
||||||
|
hw->phy.speeds_supported |= 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
|
* ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
|
||||||
* @hw: pointer to hardware structure
|
* @hw: pointer to hardware structure
|
||||||
* @speed: pointer to link speed
|
* @speed: pointer to link speed
|
||||||
* @autoneg: boolean auto-negotiation value
|
* @autoneg: boolean auto-negotiation value
|
||||||
*
|
|
||||||
* Determines the link capabilities by reading the AUTOC register.
|
|
||||||
*/
|
*/
|
||||||
s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
|
||||||
ixgbe_link_speed *speed,
|
ixgbe_link_speed *speed,
|
||||||
bool *autoneg)
|
bool *autoneg)
|
||||||
{
|
{
|
||||||
s32 status;
|
s32 status = 0;
|
||||||
u16 speed_ability;
|
|
||||||
|
|
||||||
*speed = 0;
|
|
||||||
*autoneg = true;
|
*autoneg = true;
|
||||||
|
if (!hw->phy.speeds_supported)
|
||||||
|
status = ixgbe_get_copper_speeds_supported(hw);
|
||||||
|
|
||||||
status = hw->phy.ops.read_reg(hw, MDIO_SPEED, MDIO_MMD_PMAPMD,
|
*speed = hw->phy.speeds_supported;
|
||||||
&speed_ability);
|
|
||||||
|
|
||||||
if (status == 0) {
|
|
||||||
if (speed_ability & MDIO_SPEED_10G)
|
|
||||||
*speed |= IXGBE_LINK_SPEED_10GB_FULL;
|
|
||||||
if (speed_ability & MDIO_PMA_SPEED_1000)
|
|
||||||
*speed |= IXGBE_LINK_SPEED_1GB_FULL;
|
|
||||||
if (speed_ability & MDIO_PMA_SPEED_100)
|
|
||||||
*speed |= IXGBE_LINK_SPEED_100_FULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Internal PHY does not support 100 Mbps */
|
|
||||||
if (hw->mac.type == ixgbe_mac_X550EM_x)
|
|
||||||
*speed &= ~IXGBE_LINK_SPEED_100_FULL;
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue