aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_main.c24
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c11
2 files changed, 30 insertions, 5 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index f4c8776e42b6..948d1a4b4643 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -294,6 +294,9 @@ static int nfp_pcie_sriov_disable(struct pci_dev *pdev)
294 294
295static int nfp_pcie_sriov_configure(struct pci_dev *pdev, int num_vfs) 295static int nfp_pcie_sriov_configure(struct pci_dev *pdev, int num_vfs)
296{ 296{
297 if (!pci_get_drvdata(pdev))
298 return -ENOENT;
299
297 if (num_vfs == 0) 300 if (num_vfs == 0)
298 return nfp_pcie_sriov_disable(pdev); 301 return nfp_pcie_sriov_disable(pdev);
299 else 302 else
@@ -720,9 +723,13 @@ err_pci_disable:
720 return err; 723 return err;
721} 724}
722 725
723static void nfp_pci_remove(struct pci_dev *pdev) 726static void __nfp_pci_shutdown(struct pci_dev *pdev, bool unload_fw)
724{ 727{
725 struct nfp_pf *pf = pci_get_drvdata(pdev); 728 struct nfp_pf *pf;
729
730 pf = pci_get_drvdata(pdev);
731 if (!pf)
732 return;
726 733
727 nfp_hwmon_unregister(pf); 734 nfp_hwmon_unregister(pf);
728 735
@@ -733,7 +740,7 @@ static void nfp_pci_remove(struct pci_dev *pdev)
733 vfree(pf->dumpspec); 740 vfree(pf->dumpspec);
734 kfree(pf->rtbl); 741 kfree(pf->rtbl);
735 nfp_mip_close(pf->mip); 742 nfp_mip_close(pf->mip);
736 if (pf->fw_loaded) 743 if (unload_fw && pf->fw_loaded)
737 nfp_fw_unload(pf); 744 nfp_fw_unload(pf);
738 745
739 destroy_workqueue(pf->wq); 746 destroy_workqueue(pf->wq);
@@ -749,11 +756,22 @@ static void nfp_pci_remove(struct pci_dev *pdev)
749 pci_disable_device(pdev); 756 pci_disable_device(pdev);
750} 757}
751 758
759static void nfp_pci_remove(struct pci_dev *pdev)
760{
761 __nfp_pci_shutdown(pdev, true);
762}
763
764static void nfp_pci_shutdown(struct pci_dev *pdev)
765{
766 __nfp_pci_shutdown(pdev, false);
767}
768
752static struct pci_driver nfp_pci_driver = { 769static struct pci_driver nfp_pci_driver = {
753 .name = nfp_driver_name, 770 .name = nfp_driver_name,
754 .id_table = nfp_pci_device_ids, 771 .id_table = nfp_pci_device_ids,
755 .probe = nfp_pci_probe, 772 .probe = nfp_pci_probe,
756 .remove = nfp_pci_remove, 773 .remove = nfp_pci_remove,
774 .shutdown = nfp_pci_shutdown,
757 .sriov_configure = nfp_pcie_sriov_configure, 775 .sriov_configure = nfp_pcie_sriov_configure,
758}; 776};
759 777
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c b/drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c
index 1145849ca7ba..e4977cdf7678 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_netvf_main.c
@@ -282,8 +282,14 @@ err_free_vf:
282 282
283static void nfp_netvf_pci_remove(struct pci_dev *pdev) 283static void nfp_netvf_pci_remove(struct pci_dev *pdev)
284{ 284{
285 struct nfp_net_vf *vf = pci_get_drvdata(pdev); 285 struct nfp_net_vf *vf;
286 struct nfp_net *nn = vf->nn; 286 struct nfp_net *nn;
287
288 vf = pci_get_drvdata(pdev);
289 if (!vf)
290 return;
291
292 nn = vf->nn;
287 293
288 /* Note, the order is slightly different from above as we need 294 /* Note, the order is slightly different from above as we need
289 * to keep the nn pointer around till we have freed everything. 295 * to keep the nn pointer around till we have freed everything.
@@ -317,4 +323,5 @@ struct pci_driver nfp_netvf_pci_driver = {
317 .id_table = nfp_netvf_pci_device_ids, 323 .id_table = nfp_netvf_pci_device_ids,
318 .probe = nfp_netvf_pci_probe, 324 .probe = nfp_netvf_pci_probe,
319 .remove = nfp_netvf_pci_remove, 325 .remove = nfp_netvf_pci_remove,
326 .shutdown = nfp_netvf_pci_remove,
320}; 327};