|
@@ -154,100 +154,60 @@ static int ixgbe_get_settings(struct net_device *netdev,
|
|
|
{
|
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
struct ixgbe_hw *hw = &adapter->hw;
|
|
|
+ ixgbe_link_speed supported_link;
|
|
|
u32 link_speed = 0;
|
|
|
+ bool autoneg;
|
|
|
bool link_up;
|
|
|
|
|
|
- ecmd->supported = SUPPORTED_10000baseT_Full;
|
|
|
- ecmd->autoneg = AUTONEG_ENABLE;
|
|
|
- ecmd->transceiver = XCVR_EXTERNAL;
|
|
|
- if ((hw->phy.media_type == ixgbe_media_type_copper) ||
|
|
|
- (hw->phy.multispeed_fiber)) {
|
|
|
- ecmd->supported |= (SUPPORTED_1000baseT_Full |
|
|
|
- SUPPORTED_Autoneg);
|
|
|
-
|
|
|
- switch (hw->mac.type) {
|
|
|
- case ixgbe_mac_X540:
|
|
|
- ecmd->supported |= SUPPORTED_100baseT_Full;
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- ecmd->advertising = ADVERTISED_Autoneg;
|
|
|
- if (hw->phy.autoneg_advertised) {
|
|
|
- if (hw->phy.autoneg_advertised &
|
|
|
- IXGBE_LINK_SPEED_100_FULL)
|
|
|
- ecmd->advertising |= ADVERTISED_100baseT_Full;
|
|
|
- if (hw->phy.autoneg_advertised &
|
|
|
- IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
- ecmd->advertising |= ADVERTISED_10000baseT_Full;
|
|
|
- if (hw->phy.autoneg_advertised &
|
|
|
- IXGBE_LINK_SPEED_1GB_FULL)
|
|
|
- ecmd->advertising |= ADVERTISED_1000baseT_Full;
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * Default advertised modes in case
|
|
|
- * phy.autoneg_advertised isn't set.
|
|
|
- */
|
|
|
- ecmd->advertising |= (ADVERTISED_10000baseT_Full |
|
|
|
- ADVERTISED_1000baseT_Full);
|
|
|
- if (hw->mac.type == ixgbe_mac_X540)
|
|
|
- ecmd->advertising |= ADVERTISED_100baseT_Full;
|
|
|
- }
|
|
|
-
|
|
|
- if (hw->phy.media_type == ixgbe_media_type_copper) {
|
|
|
- ecmd->supported |= SUPPORTED_TP;
|
|
|
- ecmd->advertising |= ADVERTISED_TP;
|
|
|
- ecmd->port = PORT_TP;
|
|
|
- } else {
|
|
|
- ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
- ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
- ecmd->port = PORT_FIBRE;
|
|
|
- }
|
|
|
- } else if (hw->phy.media_type == ixgbe_media_type_backplane) {
|
|
|
- /* Set as FIBRE until SERDES defined in kernel */
|
|
|
- if (hw->device_id == IXGBE_DEV_ID_82598_BX) {
|
|
|
- ecmd->supported = (SUPPORTED_1000baseT_Full |
|
|
|
- SUPPORTED_FIBRE);
|
|
|
- ecmd->advertising = (ADVERTISED_1000baseT_Full |
|
|
|
- ADVERTISED_FIBRE);
|
|
|
- ecmd->port = PORT_FIBRE;
|
|
|
- ecmd->autoneg = AUTONEG_DISABLE;
|
|
|
- } else if ((hw->device_id == IXGBE_DEV_ID_82599_COMBO_BACKPLANE) ||
|
|
|
- (hw->device_id == IXGBE_DEV_ID_82599_KX4_MEZZ)) {
|
|
|
- ecmd->supported |= (SUPPORTED_1000baseT_Full |
|
|
|
- SUPPORTED_Autoneg |
|
|
|
- SUPPORTED_FIBRE);
|
|
|
- ecmd->advertising = (ADVERTISED_10000baseT_Full |
|
|
|
- ADVERTISED_1000baseT_Full |
|
|
|
- ADVERTISED_Autoneg |
|
|
|
- ADVERTISED_FIBRE);
|
|
|
- ecmd->port = PORT_FIBRE;
|
|
|
- } else {
|
|
|
- ecmd->supported |= (SUPPORTED_1000baseT_Full |
|
|
|
- SUPPORTED_FIBRE);
|
|
|
- ecmd->advertising = (ADVERTISED_10000baseT_Full |
|
|
|
- ADVERTISED_1000baseT_Full |
|
|
|
- ADVERTISED_FIBRE);
|
|
|
- ecmd->port = PORT_FIBRE;
|
|
|
- }
|
|
|
+ hw->mac.ops.get_link_capabilities(hw, &supported_link, &autoneg);
|
|
|
+
|
|
|
+ /* set the supported link speeds */
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
+ ecmd->supported |= SUPPORTED_10000baseT_Full;
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_1GB_FULL)
|
|
|
+ ecmd->supported |= SUPPORTED_1000baseT_Full;
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_100_FULL)
|
|
|
+ ecmd->supported |= SUPPORTED_100baseT_Full;
|
|
|
+
|
|
|
+ /* set the advertised speeds */
|
|
|
+ if (hw->phy.autoneg_advertised) {
|
|
|
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_100baseT_Full;
|
|
|
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_10000baseT_Full;
|
|
|
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_1000baseT_Full;
|
|
|
} else {
|
|
|
- ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
- ecmd->advertising = (ADVERTISED_10000baseT_Full |
|
|
|
- ADVERTISED_FIBRE);
|
|
|
- ecmd->port = PORT_FIBRE;
|
|
|
- ecmd->autoneg = AUTONEG_DISABLE;
|
|
|
+ /* default modes in case phy.autoneg_advertised isn't set */
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_10000baseT_Full;
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_1GB_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_1000baseT_Full;
|
|
|
+ if (supported_link & IXGBE_LINK_SPEED_100_FULL)
|
|
|
+ ecmd->advertising |= ADVERTISED_100baseT_Full;
|
|
|
}
|
|
|
|
|
|
- /* Get PHY type */
|
|
|
+ if (autoneg) {
|
|
|
+ ecmd->supported |= SUPPORTED_Autoneg;
|
|
|
+ ecmd->advertising |= ADVERTISED_Autoneg;
|
|
|
+ ecmd->autoneg = AUTONEG_ENABLE;
|
|
|
+ } else
|
|
|
+ ecmd->autoneg = AUTONEG_DISABLE;
|
|
|
+
|
|
|
+ ecmd->transceiver = XCVR_EXTERNAL;
|
|
|
+
|
|
|
+ /* Determine the remaining settings based on the PHY type. */
|
|
|
switch (adapter->hw.phy.type) {
|
|
|
case ixgbe_phy_tn:
|
|
|
case ixgbe_phy_aq:
|
|
|
case ixgbe_phy_cu_unknown:
|
|
|
- /* Copper 10G-BASET */
|
|
|
+ ecmd->supported |= SUPPORTED_TP;
|
|
|
+ ecmd->advertising |= ADVERTISED_TP;
|
|
|
ecmd->port = PORT_TP;
|
|
|
break;
|
|
|
case ixgbe_phy_qt:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_FIBRE;
|
|
|
break;
|
|
|
case ixgbe_phy_nl:
|
|
@@ -257,42 +217,59 @@ static int ixgbe_get_settings(struct net_device *netdev,
|
|
|
case ixgbe_phy_sfp_avago:
|
|
|
case ixgbe_phy_sfp_intel:
|
|
|
case ixgbe_phy_sfp_unknown:
|
|
|
- switch (adapter->hw.phy.sfp_type) {
|
|
|
/* SFP+ devices, further checking needed */
|
|
|
+ switch (adapter->hw.phy.sfp_type) {
|
|
|
case ixgbe_sfp_type_da_cu:
|
|
|
case ixgbe_sfp_type_da_cu_core0:
|
|
|
case ixgbe_sfp_type_da_cu_core1:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_DA;
|
|
|
break;
|
|
|
case ixgbe_sfp_type_sr:
|
|
|
case ixgbe_sfp_type_lr:
|
|
|
case ixgbe_sfp_type_srlr_core0:
|
|
|
case ixgbe_sfp_type_srlr_core1:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_FIBRE;
|
|
|
break;
|
|
|
case ixgbe_sfp_type_not_present:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_NONE;
|
|
|
break;
|
|
|
case ixgbe_sfp_type_1g_cu_core0:
|
|
|
case ixgbe_sfp_type_1g_cu_core1:
|
|
|
+ ecmd->supported |= SUPPORTED_TP;
|
|
|
+ ecmd->advertising |= ADVERTISED_TP;
|
|
|
ecmd->port = PORT_TP;
|
|
|
- ecmd->supported = SUPPORTED_TP;
|
|
|
- ecmd->advertising = (ADVERTISED_1000baseT_Full |
|
|
|
- ADVERTISED_TP);
|
|
|
+ break;
|
|
|
+ case ixgbe_sfp_type_1g_sx_core0:
|
|
|
+ case ixgbe_sfp_type_1g_sx_core1:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
+ ecmd->port = PORT_FIBRE;
|
|
|
break;
|
|
|
case ixgbe_sfp_type_unknown:
|
|
|
default:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_OTHER;
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
case ixgbe_phy_xaui:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_NONE;
|
|
|
break;
|
|
|
case ixgbe_phy_unknown:
|
|
|
case ixgbe_phy_generic:
|
|
|
case ixgbe_phy_sfp_unsupported:
|
|
|
default:
|
|
|
+ ecmd->supported |= SUPPORTED_FIBRE;
|
|
|
+ ecmd->advertising |= ADVERTISED_FIBRE;
|
|
|
ecmd->port = PORT_OTHER;
|
|
|
break;
|
|
|
}
|