diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 887655024e972e972078aba7d3be74919d1ed9f6..7955cae3e440e4e5f843e41cd03224a44d14a5fc 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -8463,6 +8463,9 @@ static int hclge_init_nic_client_instance(struct hnae3_ae_dev *ae_dev, init_nic_err: clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state); + while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) + msleep(HCLGE_WAIT_RESET_DONE); + client->ops->uninit_instance(&vport->nic, 0); return ret; @@ -8509,6 +8512,9 @@ static int hclge_init_roce_client_instance(struct hnae3_ae_dev *ae_dev, init_roce_err: clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); + while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) + msleep(HCLGE_WAIT_RESET_DONE); + hdev->roce_client->ops->uninit_instance(&vport->roce, 0); return ret; @@ -8576,6 +8582,9 @@ static void hclge_uninit_client_instance(struct hnae3_client *client, vport = &hdev->vport[i]; if (hdev->roce_client) { clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); + while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) + msleep(HCLGE_WAIT_RESET_DONE); + hdev->roce_client->ops->uninit_instance(&vport->roce, 0); hdev->roce_client = NULL; @@ -8585,6 +8594,8 @@ static void hclge_uninit_client_instance(struct hnae3_client *client, return; if (hdev->nic_client && client->ops->uninit_instance) { clear_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state); + while (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) + msleep(HCLGE_WAIT_RESET_DONE); client->ops->uninit_instance(&vport->nic, 0); hdev->nic_client = NULL; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index 0fefb0a5fd349031796031d464084fed503b3251..57a9fc00fb1b6c9899e2e2935282361656290ed9 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -646,6 +646,7 @@ struct hclge_mac_tnl_stats { }; #define HCLGE_RESET_INTERVAL (12 * HZ) +#define HCLGE_WAIT_RESET_DONE 100 /* For each bit of TCAM entry, it uses a pair of 'x' and * 'y' to indicate which value to match, like below: