From 12f97e2bbfc8ddea104ffa38bbfd04380b1b3d62 Mon Sep 17 00:00:00 2001
From: Yonglong Liu <liuyonglong@huawei.com>
Date: Thu, 1 Apr 2021 14:25:30 +0800
Subject: [PATCH] net: hns: fix wrong display of "Advertised link modes"

driver inclusion
category: bugfix
bugzilla: NA
CVE: NA

-----------------------------

The "Advertised link modes" always shows "1000baseT/Full", because
the driver only assigned this value.

Function ethtool_convert_link_mode_to_legacy_u32() should be called
after function phy_ethtool_ksettings_get() to get the current value
of the phy.

Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
Reviewed-by: li yongxin <liyongxin1@huawei.com>
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Signed-off-by: Cheng Jian <cj.chengjian@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
index 127c96621add..8fcb189ed0ba 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c
@@ -135,11 +135,6 @@ static int hns_nic_get_link_ksettings(struct net_device *net_dev,
 		return -EINVAL;
 	}
 
-	ethtool_convert_link_mode_to_legacy_u32(&supported,
-						cmd->link_modes.supported);
-	ethtool_convert_link_mode_to_legacy_u32(&advertising,
-						cmd->link_modes.advertising);
-
 	/* When there is no phy, autoneg is off. */
 	cmd->base.autoneg = false;
 	cmd->base.speed = speed;
@@ -148,6 +143,11 @@ static int hns_nic_get_link_ksettings(struct net_device *net_dev,
 	if (net_dev->phydev)
 		phy_ethtool_ksettings_get(net_dev->phydev, cmd);
 
+	ethtool_convert_link_mode_to_legacy_u32(&supported,
+						cmd->link_modes.supported);
+	ethtool_convert_link_mode_to_legacy_u32(&advertising,
+						cmd->link_modes.advertising);
+
 	link_stat = hns_nic_get_link(net_dev);
 	if (!link_stat) {
 		cmd->base.speed = (u32)SPEED_UNKNOWN;
@@ -160,7 +160,6 @@ static int hns_nic_get_link_ksettings(struct net_device *net_dev,
 	supported |= h->if_support;
 	if (h->phy_if == PHY_INTERFACE_MODE_SGMII) {
 		supported |= SUPPORTED_TP;
-		advertising |= ADVERTISED_1000baseT_Full;
 	} else if (h->phy_if == PHY_INTERFACE_MODE_XGMII) {
 		supported |= SUPPORTED_FIBRE;
 		advertising |= ADVERTISED_10000baseKR_Full;
-- 
GitLab