提交 7366234e 编写于 作者: L liweihang 提交者: Xie XiuQi

net: hns3: add exception handling when enable NIC/Roce hw error interrupts

driver inclusion
category: bugfix
bugzilla: NA
CVE: NA

If we failed to enable NIC/Roce hw error interrupts during client initialization
in some cases, we should do exception handling to clear flags and free the
resources.

Feature or Bugfix: Bugfix
Signed-off-by: Nliweihang <liweihang@huawei.com>
Reviewed-by: Nlipeng <lipeng321@huawei.com>
Reviewed-by: NYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 1ec93727
...@@ -8442,25 +8442,30 @@ static int hclge_init_nic_client_instance(struct hnae3_ae_dev *ae_dev, ...@@ -8442,25 +8442,30 @@ static int hclge_init_nic_client_instance(struct hnae3_ae_dev *ae_dev,
set_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state); set_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
rst_cnt != hdev->rst_stats.reset_cnt) { rst_cnt != hdev->rst_stats.reset_cnt) {
clear_bit(HCLGE_STATE_NIC_REGISTERED, ret = -EBUSY;
&hdev->state); goto init_nic_err;
client->ops->uninit_instance(&vport->nic, 0);
return -EBUSY;
} }
hnae3_set_client_init_flag(client, ae_dev, 1);
/* Enable nic hw error interrupts */ /* Enable nic hw error interrupts */
ret = hclge_config_nic_hw_error(hdev, true); ret = hclge_config_nic_hw_error(hdev, true);
if (ret) if (ret) {
dev_err(&ae_dev->pdev->dev, dev_err(&ae_dev->pdev->dev,
"fail(%d) to enable hw error interrupts\n", ret); "fail(%d) to enable hw error interrupts\n", ret);
goto init_nic_err;
}
hnae3_set_client_init_flag(client, ae_dev, 1);
if (netif_msg_drv(&hdev->vport->nic)) if (netif_msg_drv(&hdev->vport->nic))
hclge_info_show(hdev); hclge_info_show(hdev);
return ret; return ret;
init_nic_err:
clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state);
client->ops->uninit_instance(&vport->nic, 0);
return ret;
} }
static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev, static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,
...@@ -8486,24 +8491,27 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev, ...@@ -8486,24 +8491,27 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev,
set_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); set_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
rst_cnt != hdev->rst_stats.reset_cnt) { rst_cnt != hdev->rst_stats.reset_cnt) {
clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); ret = -EBUSY;
goto init_roce_err; goto init_roce_err;
} }
hnae3_set_client_init_flag(client, ae_dev, 1);
/* Enable roce ras interrupts */ /* Enable roce ras interrupts */
ret = hclge_config_rocee_ras_interrupt(hdev, true); ret = hclge_config_rocee_ras_interrupt(hdev, true);
if (ret) if (ret) {
dev_err(&ae_dev->pdev->dev, dev_err(&ae_dev->pdev->dev,
"fail(%d) to enable roce ras interrupts\n", ret); "fail(%d) to enable roce ras interrupts\n", ret);
goto init_roce_err;
}
hnae3_set_client_init_flag(client, ae_dev, 1);
return ret; return ret;
init_roce_err: init_roce_err:
clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state);
hdev->roce_client->ops->uninit_instance(&vport->roce, 0); hdev->roce_client->ops->uninit_instance(&vport->roce, 0);
return -EBUSY; return ret;
} }
static int hclge_init_client_instance(struct hnae3_client *client, static int hclge_init_client_instance(struct hnae3_client *client,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册