net: hns3: net: hns3: add querying and setting fec off mode from firmware
authorGuangbin Huang <huangguangbin2@huawei.com>
Tue, 30 Aug 2022 11:11:17 +0000 (19:11 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Aug 2022 13:10:49 +0000 (14:10 +0100)
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>
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index d7754b180f5300487e5d666b09513de9cf7dee1a..795df71111196d690115eb01d47211aa1dbd60a4 100644 (file)
@@ -224,6 +224,7 @@ enum hnae3_fec_mode {
        HNAE3_FEC_BASER,
        HNAE3_FEC_RS,
        HNAE3_FEC_LLRS,
+       HNAE3_FEC_NONE,
        HNAE3_FEC_USER_DEF,
 };
 
index 82a48ec206186f8d58151f0a761c4a591c9a466d..3ca9c2b67da492195a611e1622b4a38f93118104 100644 (file)
@@ -1625,10 +1625,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;
 }
@@ -1639,8 +1637,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)
@@ -1672,6 +1669,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;
 }
index 5cc19ff56121872a5807253f021a627714f8cf7e..fcdc978379ff45afa94d06bd89771d9d50402324 100644 (file)
@@ -1008,6 +1008,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,
@@ -1018,6 +1019,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,
@@ -1125,17 +1129,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) |