mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 15:49:42 -04:00
net: hns3: add querying and setting fec llrs mode from firmware
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>
This commit is contained in:
@@ -223,6 +223,7 @@ enum hnae3_fec_mode {
|
||||
HNAE3_FEC_AUTO = 0,
|
||||
HNAE3_FEC_BASER,
|
||||
HNAE3_FEC_RS,
|
||||
HNAE3_FEC_LLRS,
|
||||
HNAE3_FEC_USER_DEF,
|
||||
};
|
||||
|
||||
|
||||
@@ -91,6 +91,7 @@ int hclge_comm_firmware_compat_config(struct hnae3_ae_dev *ae_dev,
|
||||
hnae3_set_bit(compat, HCLGE_COMM_PHY_IMP_EN_B, 1);
|
||||
hnae3_set_bit(compat, HCLGE_COMM_MAC_STATS_EXT_EN_B, 1);
|
||||
hnae3_set_bit(compat, HCLGE_COMM_SYNC_RX_RING_HEAD_EN_B, 1);
|
||||
hnae3_set_bit(compat, HCLGE_COMM_LLRS_FEC_EN_B, 1);
|
||||
|
||||
req->compat = cpu_to_le32(compat);
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#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)
|
||||
|
||||
@@ -1621,6 +1621,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;
|
||||
|
||||
@@ -1643,6 +1645,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);
|
||||
|
||||
|
||||
@@ -360,6 +360,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;
|
||||
|
||||
@@ -1007,6 +1007,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,
|
||||
@@ -1014,6 +1015,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,
|
||||
@@ -1131,9 +1135,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;
|
||||
@@ -2756,6 +2763,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);
|
||||
@@ -3000,6 +3010,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);
|
||||
|
||||
Reference in New Issue
Block a user