From f403a84fb25ea5a49cf9d6d27f522e8f752ef36f Mon Sep 17 00:00:00 2001 From: Huazhong Tan Date: Wed, 7 Nov 2018 12:06:16 +0800 Subject: [PATCH] net: hns3: call roce's reset notify callback when resetting While doing resetting, roce should do its uninitailization part before nic's, and do its initialization part after nic's. Signed-off-by: Huazhong Tan Signed-off-by: Peng Li Signed-off-by: David S. Miller --- .../hisilicon/hns3/hns3pf/hclge_main.c | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 3c327f8cb865..0c0327b733a2 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -2315,6 +2315,34 @@ static int hclge_notify_client(struct hclge_dev *hdev, return 0; } +static int hclge_notify_roce_client(struct hclge_dev *hdev, + enum hnae3_reset_notify_type type) +{ + struct hnae3_client *client = hdev->roce_client; + int ret = 0; + u16 i; + + if (!client) + return 0; + + if (!client->ops->reset_notify) + return -EOPNOTSUPP; + + for (i = 0; i < hdev->num_vmdq_vport + 1; i++) { + struct hnae3_handle *handle = &hdev->vport[i].roce; + + ret = client->ops->reset_notify(handle, type); + if (ret) { + dev_err(&hdev->pdev->dev, + "notify roce client failed %d(%d)", + type, ret); + return ret; + } + } + + return ret; +} + static int hclge_reset_wait(struct hclge_dev *hdev) { #define HCLGE_RESET_WATI_MS 100 @@ -2501,6 +2529,7 @@ static void hclge_reset(struct hclge_dev *hdev) hdev->reset_count++; hdev->last_reset_time = jiffies; /* perform reset of the stack & ae device for a client */ + hclge_notify_roce_client(hdev, HNAE3_DOWN_CLIENT); rtnl_lock(); hclge_notify_client(hdev, HNAE3_DOWN_CLIENT); rtnl_unlock(); @@ -2508,6 +2537,7 @@ static void hclge_reset(struct hclge_dev *hdev) hclge_reset_prepare_wait(hdev); if (!hclge_reset_wait(hdev)) { + hclge_notify_roce_client(hdev, HNAE3_UNINIT_CLIENT); rtnl_lock(); hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT); hclge_reset_ae_dev(hdev->ae_dev); @@ -2524,6 +2554,9 @@ static void hclge_reset(struct hclge_dev *hdev) hclge_notify_client(hdev, HNAE3_UP_CLIENT); rtnl_unlock(); ae_dev->reset_type = HNAE3_NONE_RESET; + + hclge_notify_roce_client(hdev, HNAE3_INIT_CLIENT); + hclge_notify_roce_client(hdev, HNAE3_UP_CLIENT); } static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle) -- 2.45.2