net: hns3: Fix client initialize state issue when roce client initialize failed
authorJian Shen <shenjian15@huawei.com>
Wed, 19 Sep 2018 17:29:57 +0000 (18:29 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 20 Sep 2018 04:20:22 +0000 (21:20 -0700)
When roce is loaded before nic, the roce client will not be initialized
until nic client is initialized, but roce init flag is set before it.
Furthermore, in this case of nic initialized success and roce failed,
the nic init flag is not set, and roce init flag is not cleared.

This patch fixes it by set init flag only after the client is initialized
successfully.

Fixes: e2cb1dec9779 ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
Fixes: 46a3df9f9718 ("net: hns3: Add HNS3 Acceleration Engine & Compatibility Layer Support")
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/hisilicon/hns3/hnae3.c
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

index fff5be8078ac388102456f3e505a5a0d46b630bf..781e5dee3c7041640b8453f0a758cde99057da92 100644 (file)
@@ -29,8 +29,8 @@ static bool hnae3_client_match(enum hnae3_client_type client_type,
        return false;
 }
 
-static void hnae3_set_client_init_flag(struct hnae3_client *client,
-                                      struct hnae3_ae_dev *ae_dev, int inited)
+void hnae3_set_client_init_flag(struct hnae3_client *client,
+                               struct hnae3_ae_dev *ae_dev, int inited)
 {
        switch (client->type) {
        case HNAE3_CLIENT_KNIC:
@@ -46,6 +46,7 @@ static void hnae3_set_client_init_flag(struct hnae3_client *client,
                break;
        }
 }
+EXPORT_SYMBOL(hnae3_set_client_init_flag);
 
 static int hnae3_get_client_init_flag(struct hnae3_client *client,
                                       struct hnae3_ae_dev *ae_dev)
@@ -86,14 +87,11 @@ static int hnae3_match_n_instantiate(struct hnae3_client *client,
        /* now, (un-)instantiate client by calling lower layer */
        if (is_reg) {
                ret = ae_dev->ops->init_client_instance(client, ae_dev);
-               if (ret) {
+               if (ret)
                        dev_err(&ae_dev->pdev->dev,
                                "fail to instantiate client, ret = %d\n", ret);
-                       return ret;
-               }
 
-               hnae3_set_client_init_flag(client, ae_dev, 1);
-               return 0;
+               return ret;
        }
 
        if (hnae3_get_client_init_flag(client, ae_dev)) {
index c48c187da7b6cdec890ab4a167eaf2e55cd88927..17db631e9ce9c9b1caaed023573861aabfe2fdcd 100644 (file)
@@ -523,4 +523,7 @@ void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
 
 void hnae3_unregister_client(struct hnae3_client *client);
 int hnae3_register_client(struct hnae3_client *client);
+
+void hnae3_set_client_init_flag(struct hnae3_client *client,
+                               struct hnae3_ae_dev *ae_dev, int inited);
 #endif
index 141da18decf14a162c6fd3547af3413aff2323f8..cf365d4ee76105f652c784d58a0ee6a7e6bba673 100644 (file)
@@ -5171,6 +5171,8 @@ static int hclge_init_client_instance(struct hnae3_client *client,
                                goto clear_nic;
                        }
 
+                       hnae3_set_client_init_flag(client, ae_dev, 1);
+
                        if (hdev->roce_client &&
                            hnae3_dev_roce_supported(hdev)) {
                                struct hnae3_client *rc = hdev->roce_client;
@@ -5182,6 +5184,9 @@ static int hclge_init_client_instance(struct hnae3_client *client,
                                ret = rc->ops->init_instance(&vport->roce);
                                if (ret)
                                        goto clear_roce;
+
+                               hnae3_set_client_init_flag(hdev->roce_client,
+                                                          ae_dev, 1);
                        }
 
                        break;
@@ -5193,6 +5198,8 @@ static int hclge_init_client_instance(struct hnae3_client *client,
                        if (ret)
                                goto clear_nic;
 
+                       hnae3_set_client_init_flag(client, ae_dev, 1);
+
                        break;
                case HNAE3_CLIENT_ROCE:
                        if (hnae3_dev_roce_supported(hdev)) {
@@ -5208,6 +5215,8 @@ static int hclge_init_client_instance(struct hnae3_client *client,
                                ret = client->ops->init_instance(&vport->roce);
                                if (ret)
                                        goto clear_roce;
+
+                               hnae3_set_client_init_flag(client, ae_dev, 1);
                        }
                }
        }
index 88cff5ff5fafcccd8a259ac7f04960e2ec59d497..166a2cfcafde2074e2ff6d6a5d69134b674d8a95 100644 (file)
@@ -1626,6 +1626,8 @@ static int hclgevf_init_client_instance(struct hnae3_client *client,
                if (ret)
                        goto clear_nic;
 
+               hnae3_set_client_init_flag(client, ae_dev, 1);
+
                if (hdev->roce_client && hnae3_dev_roce_supported(hdev)) {
                        struct hnae3_client *rc = hdev->roce_client;
 
@@ -1635,6 +1637,9 @@ static int hclgevf_init_client_instance(struct hnae3_client *client,
                        ret = rc->ops->init_instance(&hdev->roce);
                        if (ret)
                                goto clear_roce;
+
+                       hnae3_set_client_init_flag(hdev->roce_client, ae_dev,
+                                                  1);
                }
                break;
        case HNAE3_CLIENT_UNIC:
@@ -1644,6 +1649,8 @@ static int hclgevf_init_client_instance(struct hnae3_client *client,
                ret = client->ops->init_instance(&hdev->nic);
                if (ret)
                        goto clear_nic;
+
+               hnae3_set_client_init_flag(client, ae_dev, 1);
                break;
        case HNAE3_CLIENT_ROCE:
                if (hnae3_dev_roce_supported(hdev)) {
@@ -1660,6 +1667,8 @@ static int hclgevf_init_client_instance(struct hnae3_client *client,
                        if (ret)
                                goto clear_roce;
                }
+
+               hnae3_set_client_init_flag(client, ae_dev, 1);
        }
 
        return 0;