Skip to content

Commit 0dd8a25

Browse files
321lipengdavem330
authored andcommitted
net: hns3: disable sriov before unload hclge layer
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: e2cb1de ("net: hns3: Add HNS3 VF HCL(Hardware Compatibility Layer) Support") Signed-off-by: Peng Li <[email protected]> Signed-off-by: Guangbin Huang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1385cc8 commit 0dd8a25

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

drivers/net/ethernet/hisilicon/hns3/hnae3.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,27 @@ static LIST_HEAD(hnae3_ae_algo_list);
1010
static LIST_HEAD(hnae3_client_list);
1111
static LIST_HEAD(hnae3_ae_dev_list);
1212

13+
void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo)
14+
{
15+
const struct pci_device_id *pci_id;
16+
struct hnae3_ae_dev *ae_dev;
17+
18+
if (!ae_algo)
19+
return;
20+
21+
list_for_each_entry(ae_dev, &hnae3_ae_dev_list, node) {
22+
if (!hnae3_get_bit(ae_dev->flag, HNAE3_DEV_INITED_B))
23+
continue;
24+
25+
pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
26+
if (!pci_id)
27+
continue;
28+
if (IS_ENABLED(CONFIG_PCI_IOV))
29+
pci_disable_sriov(ae_dev->pdev);
30+
}
31+
}
32+
EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);
33+
1334
/* we are keeping things simple and using single lock for all the
1435
* list. This is a non-critical code so other updations, if happen
1536
* in parallel, can wait.

drivers/net/ethernet/hisilicon/hns3/hnae3.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,7 @@ struct hnae3_handle {
853853
int hnae3_register_ae_dev(struct hnae3_ae_dev *ae_dev);
854854
void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev);
855855

856+
void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo);
856857
void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo);
857858
void hnae3_register_ae_algo(struct hnae3_ae_algo *ae_algo);
858859

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13065,6 +13065,7 @@ static int hclge_init(void)
1306513065

1306613066
static void hclge_exit(void)
1306713067
{
13068+
hnae3_unregister_ae_algo_prepare(&ae_algo);
1306813069
hnae3_unregister_ae_algo(&ae_algo);
1306913070
destroy_workqueue(hclge_wq);
1307013071
}

0 commit comments

Comments
 (0)