提交 83cf1fc4 编写于 作者: S shenjian 提交者: Xie XiuQi

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: Nshenjian (K) <shenjian15@huawei.com>
Reviewed-by: Nlipeng <lipeng321@huawei.com>
Reviewed-by: NYunsheng Lin <linyunsheng@huawei.com>
Reviewed-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 41c28272
......@@ -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
......
......@@ -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
......@@ -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]);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册