From 83cf1fc4c65ee78496c9e79192a2d3518ae8a2a7 Mon Sep 17 00:00:00 2001 From: shenjian Date: Mon, 15 Jul 2019 16:43:53 +0800 Subject: [PATCH] net: hns3: do not update link status when net up fail driver inclusion category: bugfix bugzilla: NA CVE: NA In some case, hns3_nic_net_up() may fail. But the firmware is unware of this. It may still send link change message to PF, PF needs to drop it, otherwise it may cause panic when net stack is up and device is down. Feature or Bugfix:Bugfix Signed-off-by: shenjian (K) Reviewed-by: lipeng Reviewed-by: Yunsheng Lin Reviewed-by: Yang Yingliang Signed-off-by: Yang Yingliang --- .../hisilicon/hns3/hns3pf/hclge_main.c | 22 +++++++------------ .../hisilicon/hns3/hns3pf/hclge_main.h | 2 +- .../hisilicon/hns3/hns3pf/hclge_mbx.c | 10 ++------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index a74a7f5a4389..ec27291dc679 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 ae125a5ff4a2..d93304ebb3f1 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 6c9541446e95..ce6ac9a38d5e 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]); } -- GitLab