]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: hns3: disable sriov before unload hclge layer
authorPeng Li <lipeng321@huawei.com>
Tue, 19 Oct 2021 14:16:35 +0000 (22:16 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Oct 2021 07:54:26 +0000 (09:54 +0200)
[ 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: 8d24118d4958 ("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>
drivers/net/ethernet/hisilicon/hns3/hnae3.c
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

index 03ca7d925e8e0405e8e8155a64bceb84025fe955..2e38c7d214c458336be534b32e8d3a14ac31bf21 100644 (file)
@@ -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.
index 0db835d87d09dce86655e23144b104d3fc965788..6cf8490110642742c35a8d4d3942f31786c665ae 100644 (file)
@@ -666,6 +666,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);
 
index f44e8401496b1bdaaf89d96b79ab6f5ae64bbcdf..8ecfabaefa85b1ec960baaa075b1ee62c9b4e0b4 100644 (file)
@@ -10274,6 +10274,7 @@ static int hclge_init(void)
 
 static void hclge_exit(void)
 {
+       hnae3_unregister_ae_algo_prepare(&ae_algo);
        hnae3_unregister_ae_algo(&ae_algo);
 }
 module_init(hclge_init);