105 lines
3.9 KiB
Diff
105 lines
3.9 KiB
Diff
From d04406bd4d87014610beeae0dea1f577b0263b44 Mon Sep 17 00:00:00 2001
|
|
From: Peng Li <lipeng321@huawei.com>
|
|
Date: Mon, 15 Nov 2021 19:47:20 +0800
|
|
Subject: [PATCH 134/283] net: hns3: disable sriov before unload hclge layer
|
|
|
|
mainline inclusion
|
|
from mainline-v5.15-rc7
|
|
commit 0dd8a25f355b4df2d41c08df1716340854c7d4c5
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/src-openeuler/kernel/issues/I8EMYT
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=0dd8a25f355b4df2d41c08df1716340854c7d4c5
|
|
|
|
--------------------------------
|
|
|
|
[ Upstream commit 0dd8a25f355b4df2d41c08df1716340854c7d4c5 ]
|
|
|
|
HNS3 driver includes hns3.ko, hnae3.ko and hclge.ko.
|
|
hns3.ko includes network stack and pci_driver, hclge.ko includes
|
|
HW device action, algo_ops and timer task, hnae3.ko includes some
|
|
register function.
|
|
|
|
When SRIOV is enable and hclge.ko is removed, HW device is unloaded
|
|
but VF still exists, PF will not reply VF mbx messages, and cause
|
|
errors.
|
|
|
|
This patch fix it by disable SRIOV before remove hclge.ko.
|
|
|
|
Fixes: e2cb1dec9779 ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support")
|
|
Signed-off-by: Peng Li <lipeng321@huawei.com>
|
|
Signed-off-by: Guangbin Huang <huangguangbin2@huawei.com>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Signed-off-by: Sasha Levin <sashal@kernel.org>
|
|
Signed-off-by: Chen Jun <chenjun102@huawei.com>
|
|
Acked-by: Weilong Chen <chenweilong@huawei.com>
|
|
|
|
Signed-off-by: Chen Jun <chenjun102@huawei.com>
|
|
Signed-off-by: Zheng Zengkai <zhengzengkai@huawei.com>
|
|
Signed-off-by: Xiaodong Li <lixiaodong67@huawei.com>
|
|
---
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.c | 21 +++++++++++++++++++
|
|
drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 +
|
|
.../hisilicon/hns3/hns3pf/hclge_main.c | 1 +
|
|
3 files changed, 23 insertions(+)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
|
|
index 53a87b318713..a90921bd07e7 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c
|
|
@@ -10,6 +10,27 @@ static LIST_HEAD(hnae3_ae_algo_list);
|
|
static LIST_HEAD(hnae3_client_list);
|
|
static LIST_HEAD(hnae3_ae_dev_list);
|
|
|
|
+void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo)
|
|
+{
|
|
+ const struct pci_device_id *pci_id;
|
|
+ struct hnae3_ae_dev *ae_dev;
|
|
+
|
|
+ if (!ae_algo)
|
|
+ return;
|
|
+
|
|
+ list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
|
|
+ if (!hnae3_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))
|
|
+ continue;
|
|
+
|
|
+ pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
|
|
+ if (!pci_id)
|
|
+ continue;
|
|
+ if (IS_ENABLED(CONFIG_PCI_IOV))
|
|
+ pci_disable_sriov(ae_dev->pdev);
|
|
+ }
|
|
+}
|
|
+EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);
|
|
+
|
|
/* we are keeping things simple and using single lock for all the
|
|
* list. This is a non-critical code so other updations, if happen
|
|
* in parallel, can wait.
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 1e53128787f9..46e9e3879826 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -925,6 +925,7 @@ struct hnae3_handle {
|
|
int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
|
|
void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
|
|
|
|
+void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo);
|
|
void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo);
|
|
void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 64371eeaf9e7..8c3cd8e52c7f 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -12224,6 +12224,7 @@ module_init(hclge_init);
|
|
|
|
static void hclge_exit(void)
|
|
{
|
|
+ hnae3_unregister_ae_algo_prepare(&ae_algo);
|
|
hnae3_unregister_ae_algo(&ae_algo);
|
|
destroy_workqueue(hclge_wq);
|
|
}
|
|
--
|
|
2.34.1
|
|
|