| From b1fa560df4868601df81e2dee362aa44cc432d55 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 19 Sep 2018 18:29:57 +0100 |
| Subject: net: hns3: Fix client initialize state issue when roce client |
| initialize failed |
| |
| From: Jian Shen <shenjian15@huawei.com> |
| |
| [ Upstream commit d9f28fc23d544f673d087b00a6c7132d972f89ea ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/hisilicon/hns3/hnae3.c | 12 +++++------- |
| drivers/net/ethernet/hisilicon/hns3/hnae3.h | 3 +++ |
| .../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 9 +++++++++ |
| .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 9 +++++++++ |
| 4 files changed, 26 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c |
| index 0594a6c3dccda..2097f92e14c5c 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c |
| @@ -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)) { |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
| index 67befff0bfc50..f5c7fc9c5e5cc 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
| @@ -521,4 +521,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 |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
| index c5e617fdb809f..b04df79f393f8 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
| @@ -5485,6 +5485,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; |
| @@ -5496,6 +5498,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; |
| @@ -5507,6 +5512,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)) { |
| @@ -5522,6 +5529,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); |
| } |
| } |
| } |
| diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| index 83fcdd326de71..beae1e2cd59b1 100644 |
| --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
| @@ -1631,6 +1631,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; |
| |
| @@ -1640,6 +1642,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: |
| @@ -1649,6 +1654,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)) { |
| @@ -1665,6 +1672,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; |
| -- |
| 2.20.1 |
| |