{
 #define HCLGE_SERDES_RETRY_MS  10
 #define HCLGE_SERDES_RETRY_NUM 100
+
+#define HCLGE_MAC_LINK_STATUS_MS   20
+#define HCLGE_MAC_LINK_STATUS_NUM  10
+#define HCLGE_MAC_LINK_STATUS_DOWN 0
+#define HCLGE_MAC_LINK_STATUS_UP   1
+
        struct hclge_serdes_lb_cmd *req;
        struct hclge_desc desc;
+       int mac_link_ret = 0;
        int ret, i = 0;
        u8 loop_mode_b;
 
        if (en) {
                req->enable = loop_mode_b;
                req->mask = loop_mode_b;
+               mac_link_ret = HCLGE_MAC_LINK_STATUS_UP;
        } else {
                req->mask = loop_mode_b;
+               mac_link_ret = HCLGE_MAC_LINK_STATUS_DOWN;
        }
 
        ret = hclge_cmd_send(&hdev->hw, &desc, 1);
        }
 
        hclge_cfg_mac_mode(hdev, en);
-       return 0;
+
+       i = 0;
+       do {
+               /* serdes Internal loopback, independent of the network cable.*/
+               msleep(HCLGE_MAC_LINK_STATUS_MS);
+               ret = hclge_get_mac_link_status(hdev);
+               if (ret == mac_link_ret)
+                       return 0;
+       } while (++i < HCLGE_MAC_LINK_STATUS_NUM);
+
+       dev_err(&hdev->pdev->dev, "config mac mode timeout\n");
+
+       return -EBUSY;
 }
 
 static int hclge_tqp_enable(struct hclge_dev *hdev, int tqp_id,