return 0;
 }
 
-static void hclge_check_speed_dup(struct hclge_dev *hdev, int duplex, int speed)
+static u8 hclge_check_speed_dup(u8 duplex, int speed)
 {
-       struct hclge_mac *mac = &hdev->hw.mac;
 
-       if ((speed == HCLGE_MAC_SPEED_10M) || (speed == HCLGE_MAC_SPEED_100M))
-               mac->duplex = (u8)duplex;
-       else
-               mac->duplex = HCLGE_MAC_FULL;
+       if (!(speed == HCLGE_MAC_SPEED_10M || speed == HCLGE_MAC_SPEED_100M))
+               duplex = HCLGE_MAC_FULL;
 
-       mac->speed = speed;
+       return duplex;
 }
 
-int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex)
+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;
                return ret;
        }
 
-       hclge_check_speed_dup(hdev, duplex, speed);
+       return 0;
+}
+
+int hclge_cfg_mac_speed_dup(struct hclge_dev *hdev, int speed, u8 duplex)
+{
+       int ret;
+
+       duplex = hclge_check_speed_dup(duplex, speed);
+       if (hdev->hw.mac.speed == speed && hdev->hw.mac.duplex == duplex)
+               return 0;
+
+       ret = hclge_cfg_mac_speed_dup_hw(hdev, speed, duplex);
+       if (ret)
+               return ret;
+
+       hdev->hw.mac.speed = speed;
+       hdev->hw.mac.duplex = duplex;
 
        return 0;
 }
        int ret;
        int i;
 
-       ret = hclge_cfg_mac_speed_dup(hdev, hdev->hw.mac.speed, HCLGE_MAC_FULL);
+       hdev->hw.mac.duplex = HCLGE_MAC_FULL;
+       ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed,
+                                        hdev->hw.mac.duplex);
        if (ret) {
                dev_err(&hdev->pdev->dev,
                        "Config mac speed dup fail ret=%d\n", ret);
                return ret;
        }
 
-       if ((mac.speed != speed) || (mac.duplex != duplex)) {
-               ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex);
-               if (ret) {
-                       dev_err(&hdev->pdev->dev,
-                               "mac speed/duplex config failed %d\n", ret);
-                       return ret;
-               }
+       ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "mac speed/duplex config failed %d\n", ret);
+               return ret;
        }
 
        return 0;