diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
index a74a7f5a4389da9c61e441f2f2b1ba1354b3d8a3..ec27291dc679711318e777afd57f04591c236982 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
@@ -2600,7 +2600,7 @@ static void hclge_reset_task_schedule(struct hclge_dev *hdev)
 			      &hdev->rst_service_task);
 }
 
-static void hclge_task_schedule(struct hclge_dev *hdev)
+void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
 {
 	if (!test_bit(HCLGE_STATE_DOWN, &hdev->state) &&
 	    !test_bit(HCLGE_STATE_REMOVING, &hdev->state) &&
@@ -2609,7 +2609,7 @@ static void hclge_task_schedule(struct hclge_dev *hdev)
 		hdev->fd_arfs_expire_timer++;
 		mod_delayed_work_on(cpumask_first(&hdev->affinity_mask),
 				    system_wq, &hdev->service_task,
-				    round_jiffies_relative(HZ));
+				    round_jiffies_relative(delay_time));
 	}
 }
 
@@ -2658,17 +2658,20 @@ static int hclge_get_mac_phy_link(struct hclge_dev *hdev)
 	return !!link_stat;
 }
 
-void hclge_link_status_change(struct hclge_dev *hdev, int state)
+static void hclge_update_link_status(struct hclge_dev *hdev)
 {
 	struct hnae3_client *rclient = hdev->roce_client;
 	struct hnae3_client *client = hdev->nic_client;
 	struct hnae3_handle *rhandle;
 	struct hnae3_handle *handle;
+	int state;
 	int i;
 
 	if (!client)
 		return;
 
+	state = hclge_get_mac_phy_link(hdev);
+
 	if (state != hdev->hw.mac.link) {
 		for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
 			handle = &hdev->vport[i].nic;
@@ -2683,15 +2686,6 @@ void hclge_link_status_change(struct hclge_dev *hdev, int state)
 	}
 }
 
-static void hclge_update_link_status(struct hclge_dev *hdev)
-{
-	int state;
-
-	state = hclge_get_mac_phy_link(hdev);
-
-	hclge_link_status_change(hdev, state);
-}
-
 static void hclge_update_port_capability(struct hclge_mac *mac)
 {
 #ifdef HAVE_ETHTOOL_CONVERT_U32_AND_LINK_MODE
@@ -3834,7 +3828,7 @@ static void hclge_service_task(struct work_struct *work)
 		hdev->fd_arfs_expire_timer = 0;
 	}
 
-	hclge_task_schedule(hdev);
+	hclge_task_schedule(hdev, HZ);
 }
 
 struct hclge_vport *hclge_get_vport(struct hnae3_handle *handle)
@@ -6541,7 +6535,7 @@ static void hclge_enable_timer_task(struct hnae3_handle *handle, bool enable)
 	struct hclge_dev *hdev = vport->back;
 
 	if (enable) {
-		hclge_task_schedule(hdev);
+		hclge_task_schedule(hdev, HZ);
 	} else {
 		/* Set the DOWN flag here to disable the service to be
 		 * scheduled again
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
index ae125a5ff4a2d38f5fdb312eb0238f9b9e26e48e..d93304ebb3f1f197d5ecf3f2bd24fdc74ce685b5 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
@@ -1041,7 +1041,7 @@ int hclge_push_vf_port_base_vlan_info(struct hclge_vport *vport, u8 vfid,
 				      u16 vlan_proto);
 enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
 					    unsigned long *addr);
-void hclge_link_status_change(struct hclge_dev *hdev, int state);
+void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time);
 int hclge_query_bd_num_cmd_send(struct hclge_dev *hdev,
 				struct hclge_desc *desc);
 #endif
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index 6c9541446e9580a53a621318332fbd2436c7a334..ce6ac9a38d5e40a3c42a32f7f8aa4b555a2004c3 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -596,17 +596,11 @@ static void hclge_handle_link_change_event(struct hclge_dev *hdev,
 #define LINK_STATUS_OFFSET	1
 #define LINK_FAIL_CODE_OFFSET	2
 
-	struct phy_device *phydev = hdev->hw.mac.phydev;
 	int link_status = req->msg[LINK_STATUS_OFFSET];
 
-	if (phydev) {
-		if (phydev->state == PHY_RUNNING)
-			link_status = link_status & phydev->link;
-		else
-			link_status = 0;
-	}
+	clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
+	hclge_task_schedule(hdev, 0);
 
-	hclge_link_status_change(hdev, link_status);
 	if (!link_status)
 		hclge_link_fail_parse(hdev, req->msg[LINK_FAIL_CODE_OFFSET]);
 }