net: hns3: Add a check for client instance init state
authorFuyun Liang <liangfuyun1@huawei.com>
Tue, 15 May 2018 18:20:07 +0000 (19:20 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 May 2018 15:33:07 +0000 (11:33 -0400)
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 <liangfuyun1@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

index ab2e72ccceb12940a2608359743ad3a4dcd20352..21cb0c5e5b31a368872fbcbdd0b2f77b8cf92f32 100644 (file)
@@ -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;
 }
 
index 804ea83e1713f811037677524723c4b6e9fb5174..ffec2318cf5081b6ad545dd14d1fb03aa628d273 100644 (file)
@@ -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))