diff options
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_main.c | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 10 | ||||
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net_main.c | 22 |
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 | ||
131 | err_sriov_disable: | 130 | err_sriov_disable: |
132 | pci_disable_sriov(pdev); | ||
133 | err_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 | ||
490 | static void nfp_net_pci_unmap_mem(struct nfp_pf *pf) | 485 | static void nfp_net_pci_unmap_mem(struct nfp_pf *pf) |
@@ -559,7 +554,7 @@ err_unmap_ctrl: | |||
559 | 554 | ||
560 | static void nfp_net_pci_remove_finish(struct nfp_pf *pf) | 555 | static 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 | ||
781 | err_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); | ||
781 | err_stop_app: | 785 | err_stop_app: |
782 | nfp_net_pf_app_stop(pf); | 786 | nfp_net_pf_app_stop_ctrl(pf); |
783 | err_free_irqs: | 787 | err_free_irqs: |
784 | nfp_net_pf_free_irqs(pf); | 788 | nfp_net_pf_free_irqs(pf); |
785 | err_free_vnics: | 789 | err_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); |