132 lines
4.9 KiB
Diff
132 lines
4.9 KiB
Diff
From 11b27963cfd8b3fd103dfc960ab380639d58a4c9 Mon Sep 17 00:00:00 2001
|
|
From: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Date: Tue, 11 Oct 2022 23:14:14 +0800
|
|
Subject: [PATCH 181/283] net: hns3: net: hns3: add querying and setting fec
|
|
off mode from firmware
|
|
|
|
mainline inclusion
|
|
from mainline-v6.0-rc2
|
|
commit 08aa17a0c18562a08981e5b103105c1798fa2bfd
|
|
category: feature
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EN3D
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=08aa17a0c185
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
For some new devices, the FEC mode can not be set to OFF in speed 200G.
|
|
In order to flexibly adapt to all types of devices, driver queries
|
|
fec ability from firmware to decide whether OFF mode can be supported.
|
|
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Jiantao Xiao <xiaojiantao1@h-partners.com>
|
|
Reviewed-by: Jian Shen <shenjian15@huawei.com>
|
|
Reviewed-by: YueHaibing <yuehaibing@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 +
|
|
.../net/ethernet/hisilicon/hns3/hns3_ethtool.c | 11 +++++------
|
|
.../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 16 ++++++++++------
|
|
3 files changed, 16 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 5a1d6cb7b2eb..4d35bce95147 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -220,6 +220,7 @@ enum hnae3_fec_mode {
|
|
HNAE3_FEC_BASER,
|
|
HNAE3_FEC_RS,
|
|
HNAE3_FEC_LLRS,
|
|
+ HNAE3_FEC_NONE,
|
|
HNAE3_FEC_USER_DEF,
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index 18a60e8fa746..c9a24d010260 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -1528,10 +1528,8 @@ static unsigned int loc_to_eth_fec(u8 loc_fec)
|
|
eth_fec |= ETHTOOL_FEC_LLRS;
|
|
if (loc_fec & BIT(HNAE3_FEC_BASER))
|
|
eth_fec |= ETHTOOL_FEC_BASER;
|
|
-
|
|
- /* if nothing is set, then FEC is off */
|
|
- if (!eth_fec)
|
|
- eth_fec = ETHTOOL_FEC_OFF;
|
|
+ if (loc_fec & BIT(HNAE3_FEC_NONE))
|
|
+ eth_fec |= ETHTOOL_FEC_OFF;
|
|
|
|
return eth_fec;
|
|
}
|
|
@@ -1542,8 +1540,7 @@ static unsigned int eth_to_loc_fec(unsigned int eth_fec)
|
|
u32 loc_fec = 0;
|
|
|
|
if (eth_fec & ETHTOOL_FEC_OFF)
|
|
- return loc_fec;
|
|
-
|
|
+ loc_fec |= BIT(HNAE3_FEC_NONE);
|
|
if (eth_fec & ETHTOOL_FEC_AUTO)
|
|
loc_fec |= BIT(HNAE3_FEC_AUTO);
|
|
if (eth_fec & ETHTOOL_FEC_RS)
|
|
@@ -1575,6 +1572,8 @@ static int hns3_get_fecparam(struct net_device *netdev,
|
|
|
|
fec->fec = loc_to_eth_fec(fec_ability);
|
|
fec->active_fec = loc_to_eth_fec(fec_mode);
|
|
+ if (!fec->active_fec)
|
|
+ fec->active_fec = ETHTOOL_FEC_OFF;
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 8029fdf580b7..ee10aea14eb1 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -1077,6 +1077,7 @@ static void hclge_update_fec_support(struct hclge_mac *mac)
|
|
linkmode_clear_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT, mac->supported);
|
|
linkmode_clear_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT, mac->supported);
|
|
linkmode_clear_bit(ETHTOOL_LINK_MODE_FEC_LLRS_BIT, mac->supported);
|
|
+ linkmode_clear_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT, mac->supported);
|
|
|
|
if (mac->fec_ability & BIT(HNAE3_FEC_BASER))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT,
|
|
@@ -1087,6 +1088,9 @@ static void hclge_update_fec_support(struct hclge_mac *mac)
|
|
if (mac->fec_ability & BIT(HNAE3_FEC_LLRS))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_LLRS_BIT,
|
|
mac->supported);
|
|
+ if (mac->fec_ability & BIT(HNAE3_FEC_NONE))
|
|
+ linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_NONE_BIT,
|
|
+ mac->supported);
|
|
}
|
|
|
|
static void hclge_convert_setting_sr(u16 speed_ability,
|
|
@@ -1194,17 +1198,17 @@ static void hclge_convert_setting_fec(struct hclge_mac *mac)
|
|
switch (mac->speed) {
|
|
case HCLGE_MAC_SPEED_10G:
|
|
case HCLGE_MAC_SPEED_40G:
|
|
- mac->fec_ability =
|
|
- BIT(HNAE3_FEC_BASER) | BIT(HNAE3_FEC_AUTO);
|
|
+ mac->fec_ability = BIT(HNAE3_FEC_BASER) | BIT(HNAE3_FEC_AUTO) |
|
|
+ BIT(HNAE3_FEC_NONE);
|
|
break;
|
|
case HCLGE_MAC_SPEED_25G:
|
|
case HCLGE_MAC_SPEED_50G:
|
|
- mac->fec_ability =
|
|
- BIT(HNAE3_FEC_BASER) | BIT(HNAE3_FEC_RS) |
|
|
- BIT(HNAE3_FEC_AUTO);
|
|
+ mac->fec_ability = BIT(HNAE3_FEC_BASER) | BIT(HNAE3_FEC_RS) |
|
|
+ BIT(HNAE3_FEC_AUTO) | BIT(HNAE3_FEC_NONE);
|
|
break;
|
|
case HCLGE_MAC_SPEED_100G:
|
|
- mac->fec_ability = BIT(HNAE3_FEC_RS) | BIT(HNAE3_FEC_AUTO);
|
|
+ mac->fec_ability = BIT(HNAE3_FEC_RS) | BIT(HNAE3_FEC_AUTO) |
|
|
+ BIT(HNAE3_FEC_NONE);
|
|
break;
|
|
case HCLGE_MAC_SPEED_200G:
|
|
mac->fec_ability = BIT(HNAE3_FEC_RS) | BIT(HNAE3_FEC_AUTO) |
|
|
--
|
|
2.34.1
|
|
|