aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_main.c16
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_common.c10
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfp_net_main.c22
3 files changed, 26 insertions, 22 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c
index d67969d3e484..3f199db2002e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c
@@ -98,21 +98,20 @@ static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs)
98 struct nfp_pf *pf = pci_get_drvdata(pdev); 98 struct nfp_pf *pf = pci_get_drvdata(pdev);
99 int err; 99 int err;
100 100
101 mutex_lock(&pf->lock);
102
103 if (num_vfs > pf->limit_vfs) { 101 if (num_vfs > pf->limit_vfs) {
104 nfp_info(pf->cpp, "Firmware limits number of VFs to %u\n", 102 nfp_info(pf->cpp, "Firmware limits number of VFs to %u\n",
105 pf->limit_vfs); 103 pf->limit_vfs);
106 err = -EINVAL; 104 return -EINVAL;
107 goto err_unlock;
108 } 105 }
109 106
110 err = pci_enable_sriov(pdev, num_vfs); 107 err = pci_enable_sriov(pdev, num_vfs);
111 if (err) { 108 if (err) {
112 dev_warn(&pdev->dev, "Failed to enable PCI SR-IOV: %d\n", err); 109 dev_warn(&pdev->dev, "Failed to enable PCI SR-IOV: %d\n", err);
113 goto err_unlock; 110 return err;
114 } 111 }
115 112
113 mutex_lock(&pf->lock);
114
116 err = nfp_app_sriov_enable(pf->app, num_vfs); 115 err = nfp_app_sriov_enable(pf->app, num_vfs);
117 if (err) { 116 if (err) {
118 dev_warn(&pdev->dev, 117 dev_warn(&pdev->dev,
@@ -129,9 +128,8 @@ static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs)
129 return num_vfs; 128 return num_vfs;
130 129
131err_sriov_disable: 130err_sriov_disable:
132 pci_disable_sriov(pdev);
133err_unlock:
134 mutex_unlock(&pf->lock); 131 mutex_unlock(&pf->lock);
132 pci_disable_sriov(pdev);
135 return err; 133 return err;
136#endif 134#endif
137 return 0; 135 return 0;
@@ -158,10 +156,10 @@ static int nfp_pcie_sriov_disable(struct pci_dev *pdev)
158 156
159 pf->num_vfs = 0; 157 pf->num_vfs = 0;
160 158
159 mutex_unlock(&pf->lock);
160
161 pci_disable_sriov(pdev); 161 pci_disable_sriov(pdev);
162 dev_dbg(&pdev->dev, "Removed VFs.\n"); 162 dev_dbg(&pdev->dev, "Removed VFs.\n");
163
164 mutex_unlock(&pf->lock);
165#endif 163#endif
166 return 0; 164 return 0;
167} 165}
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 9f77ce038a4a..1ff0c577819e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -1751,6 +1751,10 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1751 continue; 1751 continue;
1752 } 1752 }
1753 1753
1754 nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr);
1755
1756 nfp_net_rx_give_one(dp, rx_ring, new_frag, new_dma_addr);
1757
1754 if (likely(!meta.portid)) { 1758 if (likely(!meta.portid)) {
1755 netdev = dp->netdev; 1759 netdev = dp->netdev;
1756 } else { 1760 } else {
@@ -1759,16 +1763,12 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
1759 nn = netdev_priv(dp->netdev); 1763 nn = netdev_priv(dp->netdev);
1760 netdev = nfp_app_repr_get(nn->app, meta.portid); 1764 netdev = nfp_app_repr_get(nn->app, meta.portid);
1761 if (unlikely(!netdev)) { 1765 if (unlikely(!netdev)) {
1762 nfp_net_rx_drop(dp, r_vec, rx_ring, rxbuf, skb); 1766 nfp_net_rx_drop(dp, r_vec, rx_ring, NULL, skb);
1763 continue; 1767 continue;
1764 } 1768 }
1765 nfp_repr_inc_rx_stats(netdev, pkt_len); 1769 nfp_repr_inc_rx_stats(netdev, pkt_len);
1766 } 1770 }
1767 1771
1768 nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr);
1769
1770 nfp_net_rx_give_one(dp, rx_ring, new_frag, new_dma_addr);
1771
1772 skb_reserve(skb, pkt_off); 1772 skb_reserve(skb, pkt_off);
1773 skb_put(skb, pkt_len); 1773 skb_put(skb, pkt_len);
1774 1774
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
index 5797dbf2b507..1aca4e57bf41 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c
@@ -456,10 +456,6 @@ static int nfp_net_pf_app_start(struct nfp_pf *pf)
456{ 456{
457 int err; 457 int err;
458 458
459 err = nfp_net_pf_app_start_ctrl(pf);
460 if (err)
461 return err;
462
463 err = nfp_app_start(pf->app, pf->ctrl_vnic); 459 err = nfp_app_start(pf->app, pf->ctrl_vnic);
464 if (err) 460 if (err)
465 goto err_ctrl_stop; 461 goto err_ctrl_stop;
@@ -484,7 +480,6 @@ static void nfp_net_pf_app_stop(struct nfp_pf *pf)
484 if (pf->num_vfs) 480 if (pf->num_vfs)
485 nfp_app_sriov_disable(pf->app); 481 nfp_app_sriov_disable(pf->app);
486 nfp_app_stop(pf->app); 482 nfp_app_stop(pf->app);
487 nfp_net_pf_app_stop_ctrl(pf);
488} 483}
489 484
490static void nfp_net_pci_unmap_mem(struct nfp_pf *pf) 485static void nfp_net_pci_unmap_mem(struct nfp_pf *pf)
@@ -559,7 +554,7 @@ err_unmap_ctrl:
559 554
560static void nfp_net_pci_remove_finish(struct nfp_pf *pf) 555static void nfp_net_pci_remove_finish(struct nfp_pf *pf)
561{ 556{
562 nfp_net_pf_app_stop(pf); 557 nfp_net_pf_app_stop_ctrl(pf);
563 /* stop app first, to avoid double free of ctrl vNIC's ddir */ 558 /* stop app first, to avoid double free of ctrl vNIC's ddir */
564 nfp_net_debugfs_dir_clean(&pf->ddir); 559 nfp_net_debugfs_dir_clean(&pf->ddir);
565 560
@@ -690,6 +685,7 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
690{ 685{
691 struct nfp_net_fw_version fw_ver; 686 struct nfp_net_fw_version fw_ver;
692 u8 __iomem *ctrl_bar, *qc_bar; 687 u8 __iomem *ctrl_bar, *qc_bar;
688 struct nfp_net *nn;
693 int stride; 689 int stride;
694 int err; 690 int err;
695 691
@@ -766,7 +762,7 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
766 if (err) 762 if (err)
767 goto err_free_vnics; 763 goto err_free_vnics;
768 764
769 err = nfp_net_pf_app_start(pf); 765 err = nfp_net_pf_app_start_ctrl(pf);
770 if (err) 766 if (err)
771 goto err_free_irqs; 767 goto err_free_irqs;
772 768
@@ -774,12 +770,20 @@ int nfp_net_pci_probe(struct nfp_pf *pf)
774 if (err) 770 if (err)
775 goto err_stop_app; 771 goto err_stop_app;
776 772
773 err = nfp_net_pf_app_start(pf);
774 if (err)
775 goto err_clean_vnics;
776
777 mutex_unlock(&pf->lock); 777 mutex_unlock(&pf->lock);
778 778
779 return 0; 779 return 0;
780 780
781err_clean_vnics:
782 list_for_each_entry(nn, &pf->vnics, vnic_list)
783 if (nfp_net_is_data_vnic(nn))
784 nfp_net_pf_clean_vnic(pf, nn);
781err_stop_app: 785err_stop_app:
782 nfp_net_pf_app_stop(pf); 786 nfp_net_pf_app_stop_ctrl(pf);
783err_free_irqs: 787err_free_irqs:
784 nfp_net_pf_free_irqs(pf); 788 nfp_net_pf_free_irqs(pf);
785err_free_vnics: 789err_free_vnics:
@@ -803,6 +807,8 @@ void nfp_net_pci_remove(struct nfp_pf *pf)
803 if (list_empty(&pf->vnics)) 807 if (list_empty(&pf->vnics))
804 goto out; 808 goto out;
805 809
810 nfp_net_pf_app_stop(pf);
811
806 list_for_each_entry(nn, &pf->vnics, vnic_list) 812 list_for_each_entry(nn, &pf->vnics, vnic_list)
807 if (nfp_net_is_data_vnic(nn)) 813 if (nfp_net_is_data_vnic(nn))
808 nfp_net_pf_clean_vnic(pf, nn); 814 nfp_net_pf_clean_vnic(pf, nn);