]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
i40e: Fix to show correct Advertised Link Modes when link is down
authorAvinash Dayanand <avinash.dayanand@intel.com>
Mon, 20 Jun 2016 16:10:33 +0000 (09:10 -0700)
committerDhaval Giani <dhaval.giani@oracle.com>
Wed, 8 Mar 2017 00:30:50 +0000 (19:30 -0500)
Orabug: 24568124

When link is down, Advertised Link Modes was wrongly displaying full
supported link modes instead of Advertised link mode. Added conditional
checks in order to make sure correct Advertised link modes are
displayed when the link is down.

Change-ID: I8a61413f9ee174149c7a33157b5f0b0a8da9842d
Signed-off-by: Avinash Dayanand <avinash.dayanand@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
(cherry picked from commit 2853704f112836387b7dab319b1e92b576666056)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Signed-off-by: Dhaval Giani <dhaval.giani@oracle.com>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c

index bdbfee97dceee19ddac55f4b0e0ff7429b940267..3bdd03eaa68f833818033732f2afd7be063fb135 100644 (file)
@@ -272,15 +272,16 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
                                     u32 *advertising)
 {
        enum i40e_aq_capabilities_phy_type phy_types = pf->hw.phy.phy_types;
-
+       struct i40e_link_status *hw_link_info = &pf->hw.phy.link_info;
        *supported = 0x0;
        *advertising = 0x0;
 
        if (phy_types & I40E_CAP_PHY_TYPE_SGMII) {
                *supported |= SUPPORTED_Autoneg |
                              SUPPORTED_1000baseT_Full;
-               *advertising |= ADVERTISED_Autoneg |
-                               ADVERTISED_1000baseT_Full;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
+                       *advertising |= ADVERTISED_1000baseT_Full;
                if (pf->flags & I40E_FLAG_100M_SGMII_CAPABLE) {
                        *supported |= SUPPORTED_100baseT_Full;
                        *advertising |= ADVERTISED_100baseT_Full;
@@ -299,8 +300,9 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
            phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR) {
                *supported |= SUPPORTED_Autoneg |
                              SUPPORTED_10000baseT_Full;
-               *advertising |= ADVERTISED_Autoneg |
-                               ADVERTISED_10000baseT_Full;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+                       *advertising |= ADVERTISED_10000baseT_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
            phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
@@ -310,14 +312,16 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
            phy_types & I40E_CAP_PHY_TYPE_40GBASE_CR4) {
                *supported |= SUPPORTED_Autoneg |
                              SUPPORTED_40000baseCR4_Full;
-               *advertising |= ADVERTISED_Autoneg |
-                               ADVERTISED_40000baseCR4_Full;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_40GB)
+                       *advertising |= ADVERTISED_40000baseCR4_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_100BASE_TX) {
                *supported |= SUPPORTED_Autoneg |
                              SUPPORTED_100baseT_Full;
-               *advertising |= ADVERTISED_Autoneg |
-                               ADVERTISED_100baseT_Full;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_100MB)
+                       *advertising |= ADVERTISED_100baseT_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
            phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
@@ -325,8 +329,9 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
            phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL) {
                *supported |= SUPPORTED_Autoneg |
                              SUPPORTED_1000baseT_Full;
-               *advertising |= ADVERTISED_Autoneg |
-                               ADVERTISED_1000baseT_Full;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
+                       *advertising |= ADVERTISED_1000baseT_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_40GBASE_SR4)
                *supported |= SUPPORTED_40000baseSR4_Full;
@@ -341,26 +346,30 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf, u32 *supported,
        if (phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2) {
                *supported |= SUPPORTED_20000baseKR2_Full |
                              SUPPORTED_Autoneg;
-               *advertising |= ADVERTISED_20000baseKR2_Full |
-                               ADVERTISED_Autoneg;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_20GB)
+                       *advertising |= ADVERTISED_20000baseKR2_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR) {
                *supported |= SUPPORTED_10000baseKR_Full |
                              SUPPORTED_Autoneg;
-               *advertising |= ADVERTISED_10000baseKR_Full |
-                               ADVERTISED_Autoneg;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+                       *advertising |= ADVERTISED_10000baseKR_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4) {
                *supported |= SUPPORTED_10000baseKX4_Full |
                              SUPPORTED_Autoneg;
-               *advertising |= ADVERTISED_10000baseKX4_Full |
-                               ADVERTISED_Autoneg;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
+                       *advertising |= ADVERTISED_10000baseKX4_Full;
        }
        if (phy_types & I40E_CAP_PHY_TYPE_1000BASE_KX) {
                *supported |= SUPPORTED_1000baseKX_Full |
                              SUPPORTED_Autoneg;
-               *advertising |= ADVERTISED_1000baseKX_Full |
-                               ADVERTISED_Autoneg;
+               *advertising |= ADVERTISED_Autoneg;
+               if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
+                       *advertising |= ADVERTISED_1000baseKX_Full;
        }
 }