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]); }