197 lines
7.8 KiB
Diff
197 lines
7.8 KiB
Diff
From fb7e7586b438f7eebcbcf758b5aacb7cde09cfad Mon Sep 17 00:00:00 2001
|
|
From: Hao Lan <lanhao@huawei.com>
|
|
Date: Tue, 11 Oct 2022 23:14:13 +0800
|
|
Subject: [PATCH 180/283] net: hns3: add querying and setting fec llrs mode
|
|
from firmware
|
|
|
|
mainline inclusion
|
|
from mainline-v6.0-rc2
|
|
commit 5c4f72842d1df19337b171fd4677239d2e11d047
|
|
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=5c4f72842d1d
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
This patch supports llrs fec mode in speed 200G for some new devices, and
|
|
suppoprts querying llrs fec ability from firmware.
|
|
|
|
Signed-off-by: Hao Lan <lanhao@huawei.com>
|
|
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>
|
|
|
|
Conflicts:
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
|
|
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 +
|
|
.../hns3/hns3_common/hclge_comm_cmd.h | 19 +++++++++++++++++++
|
|
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 4 ++++
|
|
.../hisilicon/hns3/hns3pf/hclge_cmd.h | 1 +
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 15 ++++++++++++++-
|
|
include/uapi/linux/ethtool.h | 2 ++
|
|
6 files changed, 41 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 60918a9c3953..5a1d6cb7b2eb 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -219,6 +219,7 @@ enum hnae3_fec_mode {
|
|
HNAE3_FEC_AUTO = 0,
|
|
HNAE3_FEC_BASER,
|
|
HNAE3_FEC_RS,
|
|
+ HNAE3_FEC_LLRS,
|
|
HNAE3_FEC_USER_DEF,
|
|
};
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
index 5164c666cae7..52fc4b830772 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
|
|
@@ -12,6 +12,25 @@
|
|
#define HCLGE_COMM_SEND_SYNC(flag) \
|
|
((flag) & HCLGE_COMM_CMD_FLAG_NO_INTR)
|
|
|
|
+#define HCLGE_COMM_LINK_EVENT_REPORT_EN_B 0
|
|
+#define HCLGE_COMM_NCSI_ERROR_REPORT_EN_B 1
|
|
+#define HCLGE_COMM_PHY_IMP_EN_B 2
|
|
+#define HCLGE_COMM_MAC_STATS_EXT_EN_B 3
|
|
+#define HCLGE_COMM_SYNC_RX_RING_HEAD_EN_B 4
|
|
+#define HCLGE_COMM_LLRS_FEC_EN_B 5
|
|
+
|
|
+#define hclge_comm_dev_phy_imp_supported(ae_dev) \
|
|
+ test_bit(HNAE3_DEV_SUPPORT_PHY_IMP_B, (ae_dev)->caps)
|
|
+
|
|
+#define HCLGE_COMM_TYPE_CRQ 0
|
|
+#define HCLGE_COMM_TYPE_CSQ 1
|
|
+
|
|
+#define HCLGE_COMM_CMDQ_CLEAR_WAIT_TIME 200
|
|
+
|
|
+/* bar registers for cmdq */
|
|
+#define HCLGE_COMM_NIC_CSQ_BASEADDR_L_REG 0x27000
|
|
+#define HCLGE_COMM_NIC_CSQ_BASEADDR_H_REG 0x27004
|
|
+#define HCLGE_COMM_NIC_CSQ_DEPTH_REG 0x27008
|
|
#define HCLGE_COMM_NIC_CSQ_TAIL_REG 0x27010
|
|
#define HCLGE_COMM_NIC_CSQ_HEAD_REG 0x27014
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
index 3646738ef4bc..18a60e8fa746 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
|
|
@@ -1524,6 +1524,8 @@ static unsigned int loc_to_eth_fec(u8 loc_fec)
|
|
eth_fec |= ETHTOOL_FEC_AUTO;
|
|
if (loc_fec & BIT(HNAE3_FEC_RS))
|
|
eth_fec |= ETHTOOL_FEC_RS;
|
|
+ if (loc_fec & BIT(HNAE3_FEC_LLRS))
|
|
+ eth_fec |= ETHTOOL_FEC_LLRS;
|
|
if (loc_fec & BIT(HNAE3_FEC_BASER))
|
|
eth_fec |= ETHTOOL_FEC_BASER;
|
|
|
|
@@ -1546,6 +1548,8 @@ static unsigned int eth_to_loc_fec(unsigned int eth_fec)
|
|
loc_fec |= BIT(HNAE3_FEC_AUTO);
|
|
if (eth_fec & ETHTOOL_FEC_RS)
|
|
loc_fec |= BIT(HNAE3_FEC_RS);
|
|
+ if (eth_fec & ETHTOOL_FEC_LLRS)
|
|
+ loc_fec |= BIT(HNAE3_FEC_LLRS);
|
|
if (eth_fec & ETHTOOL_FEC_BASER)
|
|
loc_fec |= BIT(HNAE3_FEC_BASER);
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
index 991d6de9009c..234647cd6a4c 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
|
|
@@ -707,6 +707,7 @@ struct hclge_sfp_info_cmd {
|
|
#define HCLGE_MAC_FEC_OFF 0
|
|
#define HCLGE_MAC_FEC_BASER 1
|
|
#define HCLGE_MAC_FEC_RS 2
|
|
+#define HCLGE_MAC_FEC_LLRS 3
|
|
struct hclge_config_fec_cmd {
|
|
u8 fec_mode;
|
|
u8 default_config;
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 330483b99c01..8029fdf580b7 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -1076,6 +1076,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);
|
|
|
|
if (mac->fec_ability & BIT(HNAE3_FEC_BASER))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT,
|
|
@@ -1083,6 +1084,9 @@ static void hclge_update_fec_support(struct hclge_mac *mac)
|
|
if (mac->fec_ability & BIT(HNAE3_FEC_RS))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT,
|
|
mac->supported);
|
|
+ if (mac->fec_ability & BIT(HNAE3_FEC_LLRS))
|
|
+ linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_LLRS_BIT,
|
|
+ mac->supported);
|
|
}
|
|
|
|
static void hclge_convert_setting_sr(u16 speed_ability,
|
|
@@ -1200,9 +1204,12 @@ static void hclge_convert_setting_fec(struct hclge_mac *mac)
|
|
BIT(HNAE3_FEC_AUTO);
|
|
break;
|
|
case HCLGE_MAC_SPEED_100G:
|
|
- case HCLGE_MAC_SPEED_200G:
|
|
mac->fec_ability = BIT(HNAE3_FEC_RS) | BIT(HNAE3_FEC_AUTO);
|
|
break;
|
|
+ case HCLGE_MAC_SPEED_200G:
|
|
+ mac->fec_ability = BIT(HNAE3_FEC_RS) | BIT(HNAE3_FEC_AUTO) |
|
|
+ BIT(HNAE3_FEC_LLRS);
|
|
+ break;
|
|
default:
|
|
mac->fec_ability = 0;
|
|
break;
|
|
@@ -2795,6 +2802,9 @@ static int hclge_set_fec_hw(struct hclge_dev *hdev, u32 fec_mode)
|
|
if (fec_mode & BIT(HNAE3_FEC_RS))
|
|
hnae3_set_field(req->fec_mode, HCLGE_MAC_CFG_FEC_MODE_M,
|
|
HCLGE_MAC_CFG_FEC_MODE_S, HCLGE_MAC_FEC_RS);
|
|
+ if (fec_mode & BIT(HNAE3_FEC_LLRS))
|
|
+ hnae3_set_field(req->fec_mode, HCLGE_MAC_CFG_FEC_MODE_M,
|
|
+ HCLGE_MAC_CFG_FEC_MODE_S, HCLGE_MAC_FEC_LLRS);
|
|
if (fec_mode & BIT(HNAE3_FEC_BASER))
|
|
hnae3_set_field(req->fec_mode, HCLGE_MAC_CFG_FEC_MODE_M,
|
|
HCLGE_MAC_CFG_FEC_MODE_S, HCLGE_MAC_FEC_BASER);
|
|
@@ -3040,6 +3050,9 @@ static void hclge_update_fec_advertising(struct hclge_mac *mac)
|
|
if (mac->fec_mode & BIT(HNAE3_FEC_RS))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_RS_BIT,
|
|
mac->advertising);
|
|
+ else if (mac->fec_mode & BIT(HNAE3_FEC_LLRS))
|
|
+ linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_LLRS_BIT,
|
|
+ mac->advertising);
|
|
else if (mac->fec_mode & BIT(HNAE3_FEC_BASER))
|
|
linkmode_set_bit(ETHTOOL_LINK_MODE_FEC_BASER_BIT,
|
|
mac->advertising);
|
|
diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h
|
|
index 047f880edff9..e57b68fad155 100644
|
|
--- a/include/uapi/linux/ethtool.h
|
|
+++ b/include/uapi/linux/ethtool.h
|
|
@@ -1372,6 +1372,7 @@ enum ethtool_fec_config_bits {
|
|
ETHTOOL_FEC_OFF_BIT,
|
|
ETHTOOL_FEC_RS_BIT,
|
|
ETHTOOL_FEC_BASER_BIT,
|
|
+ ETHTOOL_FEC_LLRS_BIT,
|
|
};
|
|
|
|
#define ETHTOOL_FEC_NONE (1 << ETHTOOL_FEC_NONE_BIT)
|
|
@@ -1379,6 +1380,7 @@ enum ethtool_fec_config_bits {
|
|
#define ETHTOOL_FEC_OFF (1 << ETHTOOL_FEC_OFF_BIT)
|
|
#define ETHTOOL_FEC_RS (1 << ETHTOOL_FEC_RS_BIT)
|
|
#define ETHTOOL_FEC_BASER (1 << ETHTOOL_FEC_BASER_BIT)
|
|
+#define ETHTOOL_FEC_LLRS (1 << ETHTOOL_FEC_LLRS_BIT)
|
|
|
|
/* CMDs currently supported */
|
|
#define ETHTOOL_GSET 0x00000001 /* DEPRECATED, Get settings.
|
|
--
|
|
2.34.1
|
|
|