Index: sys/dev/ixgbe/if_ix.c =================================================================== --- sys/dev/ixgbe/if_ix.c +++ sys/dev/ixgbe/if_ix.c @@ -184,7 +184,7 @@ static void ixgbe_add_hw_stats(struct adapter *adapter); static int ixgbe_set_flowcntl(struct adapter *, int); static int ixgbe_set_advertise(struct adapter *, int); -static int ixgbe_get_advertise(struct adapter *); +static int ixgbe_get_default_advertise(struct adapter *); static void ixgbe_setup_vlan_hw_support(if_ctx_t ctx); static void ixgbe_config_gpie(struct adapter *adapter); static void ixgbe_config_delay_values(struct adapter *adapter); @@ -1114,7 +1114,7 @@ /* Set an initial dmac value */ adapter->dmac = 0; /* Set initial advertised speeds (if applicable) */ - adapter->advertise = ixgbe_get_advertise(adapter); + adapter->advertise = ixgbe_get_default_advertise(adapter); if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) ixgbe_define_iov_schemas(dev, &error); @@ -1279,6 +1279,11 @@ if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T) ifmedia_add(adapter->media, IFM_ETHER | IFM_10_T, 0, NULL); + if (hw->mac.type == ixgbe_mac_X550) { + ifmedia_add(adapter->media, IFM_ETHER | IFM_2500_T, 0, NULL); + ifmedia_add(adapter->media, IFM_ETHER | IFM_5000_T, 0, NULL); + } + if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU || layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) ifmedia_add(adapter->media, IFM_ETHER | IFM_10G_TWINAX, 0, @@ -1400,6 +1405,36 @@ &negotiate); if (err) return; + + if (hw->mac.type == ixgbe_mac_X550 && + hw->phy.autoneg_advertised == 0) { + /* + * 2.5G and 5G autonegotiation speeds on X550 + * are disabled by default due to reported + * interoperability issues with some switches. + * + * The second condition checks if any operations + * involving setting autonegotiation speeds have + * been performed prior to this ixgbe_config_link() + * call. + * + * If hw->phy.autoneg_advertised does not + * equal 0, this means that the user might have + * set autonegotiation speeds via the sysctl + * before bringing the interface up. In this + * case, we should not disable 2.5G and 5G + * since that speeds might be selected by the + * user. + * + * Otherwise (i.e. if hw->phy.autoneg_advertised + * is set to 0), it is the first time we set + * autonegotiation preferences and the default + * set of speeds should exclude 2.5G and 5G. + */ + autoneg &= ~(IXGBE_LINK_SPEED_2_5GB_FULL | + IXGBE_LINK_SPEED_5GB_FULL); + } + if (hw->mac.ops.setup_link) err = hw->mac.ops.setup_link(hw, autoneg, adapter->link_up); @@ -2147,6 +2182,15 @@ ifmr->ifm_active |= IFM_10_T | IFM_FDX; break; } + if (hw->mac.type == ixgbe_mac_X550) + switch (adapter->link_speed) { + case IXGBE_LINK_SPEED_5GB_FULL: + ifmr->ifm_active |= IFM_5000_T | IFM_FDX; + break; + case IXGBE_LINK_SPEED_2_5GB_FULL: + ifmr->ifm_active |= IFM_2500_T | IFM_FDX; + break; + } if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU || layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) switch (adapter->link_speed) { @@ -2323,6 +2367,12 @@ case IFM_10G_TWINAX: speed |= IXGBE_LINK_SPEED_10GB_FULL; break; + case IFM_5000_T: + speed |= IXGBE_LINK_SPEED_5GB_FULL; + break; + case IFM_2500_T: + speed |= IXGBE_LINK_SPEED_2_5GB_FULL; + break; case IFM_100_TX: speed |= IXGBE_LINK_SPEED_100_FULL; break; @@ -2336,10 +2386,12 @@ hw->mac.autotry_restart = TRUE; hw->mac.ops.setup_link(hw, speed, TRUE); adapter->advertise = - ((speed & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) | - ((speed & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) | - ((speed & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) | - ((speed & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0); + ((speed & IXGBE_LINK_SPEED_10GB_FULL) ? 0x4 : 0) | + ((speed & IXGBE_LINK_SPEED_5GB_FULL) ? 0x20 : 0) | + ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) | + ((speed & IXGBE_LINK_SPEED_1GB_FULL) ? 0x2 : 0) | + ((speed & IXGBE_LINK_SPEED_100_FULL) ? 0x1 : 0) | + ((speed & IXGBE_LINK_SPEED_10_FULL) ? 0x8 : 0); return (0); @@ -4004,10 +4056,13 @@ * ixgbe_set_advertise - Control advertised link speed * * Flags: - * 0x1 - advertise 100 Mb - * 0x2 - advertise 1G - * 0x4 - advertise 10G - * 0x8 - advertise 10 Mb (yes, Mb) + * 0x1 - advertise 100 Mb + * 0x2 - advertise 1G + * 0x4 - advertise 10G + * 0x8 - advertise 10 Mb (yes, Mb) + * 0x10 - advertise 2.5G (disabled by default) + * 0x20 - advertise 5G (disabled by default) + * ************************************************************************/ static int ixgbe_set_advertise(struct adapter *adapter, int advertise) @@ -4035,8 +4090,8 @@ return (EINVAL); } - if (advertise < 0x1 || advertise > 0xF) { - device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0xF\n"); + if (advertise < 0x1 || advertise > 0x3F) { + device_printf(dev, "Invalid advertised speed; valid modes are 0x1 through 0x3F\n"); return (EINVAL); } @@ -4078,6 +4133,20 @@ } speed |= IXGBE_LINK_SPEED_10_FULL; } + if (advertise & 0x10) { + if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) { + device_printf(dev, "Interface does not support 2.5G advertised speed\n"); + return (EINVAL); + } + speed |= IXGBE_LINK_SPEED_2_5GB_FULL; + } + if (advertise & 0x20) { + if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) { + device_printf(dev, "Interface does not support 5G advertised speed\n"); + return (EINVAL); + } + speed |= IXGBE_LINK_SPEED_5GB_FULL; + } hw->mac.autotry_restart = TRUE; hw->mac.ops.setup_link(hw, speed, TRUE); @@ -4087,7 +4156,7 @@ } /* ixgbe_set_advertise */ /************************************************************************ - * ixgbe_get_advertise - Get current advertised speed settings + * ixgbe_get_default_advertise - Get default advertised speed settings * * Formatted for sysctl usage. * Flags: @@ -4095,9 +4164,11 @@ * 0x2 - advertise 1G * 0x4 - advertise 10G * 0x8 - advertise 10 Mb (yes, Mb) + * 0x10 - advertise 2.5G (disabled by default) + * 0x20 - advertise 5G (disabled by default) ************************************************************************/ static int -ixgbe_get_advertise(struct adapter *adapter) +ixgbe_get_default_advertise(struct adapter *adapter) { struct ixgbe_hw *hw = &adapter->hw; int speed; @@ -4117,14 +4188,26 @@ if (err != IXGBE_SUCCESS) return (0); + if (hw->mac.type == ixgbe_mac_X550) { + /* + * 2.5G and 5G autonegotiation speeds on X550 + * are disabled by default due to reported + * interoperability issues with some switches. + */ + link_caps &= ~(IXGBE_LINK_SPEED_2_5GB_FULL | + IXGBE_LINK_SPEED_5GB_FULL); + } + speed = - ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 4 : 0) | - ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 2 : 0) | - ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0) | - ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 8 : 0); + ((link_caps & IXGBE_LINK_SPEED_10GB_FULL) ? 0x4 : 0) | + ((link_caps & IXGBE_LINK_SPEED_5GB_FULL) ? 0x20 : 0) | + ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) | + ((link_caps & IXGBE_LINK_SPEED_1GB_FULL) ? 0x2 : 0) | + ((link_caps & IXGBE_LINK_SPEED_100_FULL) ? 0x1 : 0) | + ((link_caps & IXGBE_LINK_SPEED_10_FULL) ? 0x8 : 0); return speed; -} /* ixgbe_get_advertise */ +} /* ixgbe_get_default_advertise */ /************************************************************************ * ixgbe_sysctl_dmac - Manage DMA Coalescing Index: sys/dev/ixgbe/ixgbe.h =================================================================== --- sys/dev/ixgbe/ixgbe.h +++ sys/dev/ixgbe/ixgbe.h @@ -527,6 +527,8 @@ "\t0x2 - advertise 1G\n" \ "\t0x4 - advertise 10G\n" \ "\t0x8 - advertise 10M\n\n" \ + "\t0x10 - advertise 2.5G\n" \ + "\t0x20 - advertise 5G\n\n" \ "\t100M and 10M are only supported on certain adapters.\n" #define IXGBE_SYSCTL_DESC_SET_FC \