net: hns3: refine function hclge_cfg_mac_speed_dup_hw()
authorGuangbin Huang <huangguangbin2@huawei.com>
Mon, 29 Nov 2021 14:00:22 +0000 (22:00 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Nov 2021 14:26:17 +0000 (14:26 +0000)
To reuse the code of converting speed of driver to speed of firmware in
function hclge_cfg_mac_speed_dup_hw(), encapsulate them into a new
function hclge_convert_to_fw_speed().

Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

index 5282f26..7de4c56 100644 (file)
@@ -2653,11 +2653,38 @@ static u8 hclge_check_speed_dup(u8 duplex, int speed)
        return duplex;
 }
 
+struct hclge_mac_speed_map hclge_mac_speed_map_to_fw[] = {
+       {HCLGE_MAC_SPEED_10M, HCLGE_FW_MAC_SPEED_10M},
+       {HCLGE_MAC_SPEED_100M, HCLGE_FW_MAC_SPEED_100M},
+       {HCLGE_MAC_SPEED_1G, HCLGE_FW_MAC_SPEED_1G},
+       {HCLGE_MAC_SPEED_10G, HCLGE_FW_MAC_SPEED_10G},
+       {HCLGE_MAC_SPEED_25G, HCLGE_FW_MAC_SPEED_25G},
+       {HCLGE_MAC_SPEED_40G, HCLGE_FW_MAC_SPEED_40G},
+       {HCLGE_MAC_SPEED_50G, HCLGE_FW_MAC_SPEED_50G},
+       {HCLGE_MAC_SPEED_100G, HCLGE_FW_MAC_SPEED_100G},
+       {HCLGE_MAC_SPEED_200G, HCLGE_FW_MAC_SPEED_200G},
+};
+
+static int hclge_convert_to_fw_speed(u32 speed_drv, u32 *speed_fw)
+{
+       u16 i;
+
+       for (i = 0; i < ARRAY_SIZE(hclge_mac_speed_map_to_fw); i++) {
+               if (hclge_mac_speed_map_to_fw[i].speed_drv == speed_drv) {
+                       *speed_fw = hclge_mac_speed_map_to_fw[i].speed_fw;
+                       return 0;
+               }
+       }
+
+       return -EINVAL;
+}
+
 static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
                                      u8 duplex)
 {
        struct hclge_config_mac_speed_dup_cmd *req;
        struct hclge_desc desc;
+       u32 speed_fw;
        int ret;
 
        req = (struct hclge_config_mac_speed_dup_cmd *)desc.data;
@@ -2667,48 +2694,14 @@ static int hclge_cfg_mac_speed_dup_hw(struct hclge_dev *hdev, int speed,
        if (duplex)
                hnae3_set_bit(req->speed_dup, HCLGE_CFG_DUPLEX_B, 1);
 
-       switch (speed) {
-       case HCLGE_MAC_SPEED_10M:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_10M);
-               break;
-       case HCLGE_MAC_SPEED_100M:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_100M);
-               break;
-       case HCLGE_MAC_SPEED_1G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_1G);
-               break;
-       case HCLGE_MAC_SPEED_10G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_10G);
-               break;
-       case HCLGE_MAC_SPEED_25G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_25G);
-               break;
-       case HCLGE_MAC_SPEED_40G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_40G);
-               break;
-       case HCLGE_MAC_SPEED_50G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_50G);
-               break;
-       case HCLGE_MAC_SPEED_100G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_100G);
-               break;
-       case HCLGE_MAC_SPEED_200G:
-               hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M,
-                               HCLGE_CFG_SPEED_S, HCLGE_FW_MAC_SPEED_200G);
-               break;
-       default:
+       ret = hclge_convert_to_fw_speed(speed, &speed_fw);
+       if (ret) {
                dev_err(&hdev->pdev->dev, "invalid speed (%d)\n", speed);
-               return -EINVAL;
+               return ret;
        }
 
+       hnae3_set_field(req->speed_dup, HCLGE_CFG_SPEED_M, HCLGE_CFG_SPEED_S,
+                       speed_fw);
        hnae3_set_bit(req->mac_change_fec_en, HCLGE_CFG_MAC_SPEED_CHANGE_EN_B,
                      1);
 
index 42ce1ee..a51418f 100644 (file)
@@ -1095,6 +1095,11 @@ struct hclge_speed_bit_map {
        u32 speed_bit;
 };
 
+struct hclge_mac_speed_map {
+       u32 speed_drv; /* speed defined in driver */
+       u32 speed_fw; /* speed defined in firmware */
+};
+
 int hclge_set_vport_promisc_mode(struct hclge_vport *vport, bool en_uc_pmc,
                                 bool en_mc_pmc, bool en_bc_pmc);
 int hclge_add_uc_addr_common(struct hclge_vport *vport,