diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 87c5cb0f4c8c..02a06988cf5f 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -2902,7 +2902,8 @@ static int hclge_notify_roce_client(struct hclge_dev *hdev, int ret = 0; u16 i; - if (!client) + if (!test_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state) || + !client) return 0; if (!client->ops->reset_notify) @@ -8205,6 +8206,8 @@ static int hclge_init_client_instance(struct hnae3_client *client, if (ret) goto clear_roce; + set_bit(HCLGE_STATE_ROCE_REGISTERED, + &hdev->state); hnae3_set_client_init_flag(hdev->roce_client, ae_dev, 1); } @@ -8236,6 +8239,8 @@ static int hclge_init_client_instance(struct hnae3_client *client, if (ret) goto clear_roce; + set_bit(HCLGE_STATE_ROCE_REGISTERED, + &hdev->state); hnae3_set_client_init_flag(client, ae_dev, 1); } @@ -8267,6 +8272,7 @@ static void hclge_uninit_client_instance(struct hnae3_client *client, for (i = 0; i < hdev->num_vmdq_vport + 1; i++) { vport = &hdev->vport[i]; if (hdev->roce_client) { + clear_bit(HCLGE_STATE_ROCE_REGISTERED, &hdev->state); hdev->roce_client->ops->uninit_instance(&vport->roce, 0); hdev->roce_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 43901ffeaf4e..2b3bc95ccbdf 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h @@ -202,6 +202,7 @@ enum HCLGE_DEV_STATE { HCLGE_STATE_DISABLED, HCLGE_STATE_REMOVING, HCLGE_STATE_NIC_REGISTERED, + HCLGE_STATE_ROCE_REGISTERED, HCLGE_STATE_SERVICE_INITED, HCLGE_STATE_SERVICE_SCHED, HCLGE_STATE_RST_SERVICE_SCHED,