From: Fuyun Liang <liangfuy...@huawei.com>

If the client instance is initializd failed, we do not need to uninit it.
This patch adds a state check to check init state of client instance.

Fixes: 38caee9d3ee8 ("net: hns3: Add support of the HNAE3 framework")
Signed-off-by: Fuyun Liang <liangfuy...@huawei.com>
Signed-off-by: Peng Li <lipeng...@huawei.com>
Signed-off-by: Salil Mehta <salil.me...@huawei.com>
---
 drivers/net/ethernet/hisilicon/hns3/hnae3.c | 15 ++++++++++++---
 drivers/net/ethernet/hisilicon/hns3/hnae3.h |  1 +
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c 
b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
index ab2e72c..21cb0c5 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
@@ -50,13 +50,22 @@ 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\n");
-               return ret;
+                       return ret;
+               }
+
+               hnae_set_bit(ae_dev->flag, HNAE3_CLIENT_INITED_B, 1);
+               return 0;
+       }
+
+       if (hnae_get_bit(ae_dev->flag, HNAE3_CLIENT_INITED_B)) {
+               ae_dev->ops->uninit_client_instance(client, ae_dev);
+
+               hnae_set_bit(ae_dev->flag, HNAE3_CLIENT_INITED_B, 0);
        }
 
-       ae_dev->ops->uninit_client_instance(client, ae_dev);
        return 0;
 }
 
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h 
b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
index 804ea83..ffec231 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
@@ -52,6 +52,7 @@
 #define HNAE3_DEV_INITED_B                     0x0
 #define HNAE3_DEV_SUPPORT_ROCE_B               0x1
 #define HNAE3_DEV_SUPPORT_DCB_B                        0x2
+#define HNAE3_CLIENT_INITED_B                  0x3
 
 #define HNAE3_DEV_SUPPORT_ROCE_DCB_BITS (BIT(HNAE3_DEV_SUPPORT_DCB_B) |\
                BIT(HNAE3_DEV_SUPPORT_ROCE_B))
-- 
2.7.4


Reply via email to