|
@@ -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,
|
|
|
|
- ixgbe_link_speed *speed,
|
|
|
|
- bool *autoneg)
|
|
|
|
|
|
+static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
|
|
{
|
|
{
|
|
- s32 status;
|
|
|
|
u16 speed_ability;
|
|
u16 speed_ability;
|
|
-
|
|
|
|
- *speed = 0;
|
|
|
|
- *autoneg = true;
|
|
|
|
|
|
+ s32 status;
|
|
|
|
|
|
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)
|
|
|
|
- *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;
|
|
|
|
|
|
+ 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;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Internal PHY does not support 100 Mbps */
|
|
|
|
- if (hw->mac.type == ixgbe_mac_X550EM_x)
|
|
|
|
- *speed &= ~IXGBE_LINK_SPEED_100_FULL;
|
|
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * 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;
|
|
}
|
|
}
|
|
|
|
|