|
@@ -151,6 +151,34 @@ static const char ixgbe_gstrings_test[][ETH_GSTRING_LEN] = {
|
|
|
};
|
|
|
#define IXGBE_TEST_LEN sizeof(ixgbe_gstrings_test) / ETH_GSTRING_LEN
|
|
|
|
|
|
+/* currently supported speeds for 10G */
|
|
|
+#define ADVRTSD_MSK_10G (SUPPORTED_10000baseT_Full | \
|
|
|
+ SUPPORTED_10000baseKX4_Full | \
|
|
|
+ SUPPORTED_10000baseKR_Full)
|
|
|
+
|
|
|
+#define ixgbe_isbackplane(type) ((type) == ixgbe_media_type_backplane)
|
|
|
+
|
|
|
+static u32 ixgbe_get_supported_10gtypes(struct ixgbe_hw *hw)
|
|
|
+{
|
|
|
+ if (!ixgbe_isbackplane(hw->phy.media_type))
|
|
|
+ return SUPPORTED_10000baseT_Full;
|
|
|
+
|
|
|
+ switch (hw->device_id) {
|
|
|
+ case IXGBE_DEV_ID_82598:
|
|
|
+ case IXGBE_DEV_ID_82599_KX4:
|
|
|
+ case IXGBE_DEV_ID_82599_KX4_MEZZ:
|
|
|
+ case IXGBE_DEV_ID_X550EM_X_KX4:
|
|
|
+ return SUPPORTED_10000baseKX4_Full;
|
|
|
+ case IXGBE_DEV_ID_82598_BX:
|
|
|
+ case IXGBE_DEV_ID_82599_KR:
|
|
|
+ case IXGBE_DEV_ID_X550EM_X_KR:
|
|
|
+ return SUPPORTED_10000baseKR_Full;
|
|
|
+ default:
|
|
|
+ return SUPPORTED_10000baseKX4_Full |
|
|
|
+ SUPPORTED_10000baseKR_Full;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int ixgbe_get_settings(struct net_device *netdev,
|
|
|
struct ethtool_cmd *ecmd)
|
|
|
{
|
|
@@ -165,29 +193,30 @@ static int ixgbe_get_settings(struct net_device *netdev,
|
|
|
|
|
|
/* set the supported link speeds */
|
|
|
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
- ecmd->supported |= SUPPORTED_10000baseT_Full;
|
|
|
+ ecmd->supported |= ixgbe_get_supported_10gtypes(hw);
|
|
|
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;
|
|
|
+ ecmd->supported |= ixgbe_isbackplane(hw->phy.media_type) ?
|
|
|
+ SUPPORTED_1000baseKX_Full :
|
|
|
+ SUPPORTED_1000baseT_Full;
|
|
|
|
|
|
+ /* default advertised speed if phy.autoneg_advertised isn't set */
|
|
|
+ ecmd->advertising = ecmd->supported;
|
|
|
/* set the advertised speeds */
|
|
|
if (hw->phy.autoneg_advertised) {
|
|
|
+ ecmd->advertising = 0;
|
|
|
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;
|
|
|
+ ecmd->advertising |= ecmd->supported & ADVRTSD_MSK_10G;
|
|
|
+ if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) {
|
|
|
+ if (ecmd->supported & SUPPORTED_1000baseKX_Full)
|
|
|
+ ecmd->advertising |= ADVERTISED_1000baseKX_Full;
|
|
|
+ else
|
|
|
+ ecmd->advertising |= ADVERTISED_1000baseT_Full;
|
|
|
+ }
|
|
|
} else {
|
|
|
- /* 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;
|
|
|
-
|
|
|
if (hw->phy.multispeed_fiber && !autoneg) {
|
|
|
if (supported_link & IXGBE_LINK_SPEED_10GB_FULL)
|
|
|
ecmd->advertising = ADVERTISED_10000baseT_Full;
|
|
@@ -225,6 +254,10 @@ static int ixgbe_get_settings(struct net_device *netdev,
|
|
|
case ixgbe_phy_sfp_avago:
|
|
|
case ixgbe_phy_sfp_intel:
|
|
|
case ixgbe_phy_sfp_unknown:
|
|
|
+ case ixgbe_phy_qsfp_passive_unknown:
|
|
|
+ case ixgbe_phy_qsfp_active_unknown:
|
|
|
+ case ixgbe_phy_qsfp_intel:
|
|
|
+ case ixgbe_phy_qsfp_unknown:
|
|
|
/* SFP+ devices, further checking needed */
|
|
|
switch (adapter->hw.phy.sfp_type) {
|
|
|
case ixgbe_sfp_type_da_cu:
|