aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex
diff options
context:
space:
mode:
authorSathya Perla <sathya.perla@emulex.com>2013-05-07 22:05:47 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-08 14:59:47 -0400
commitb4c1df9378bc6ce9f7fc4fd18afa3a98b676c5fa (patch)
treea28ca1072ed3e7280a954d01856c665e4b94c2f2 /drivers/net/ethernet/emulex
parentde9c9f86be0dc3495de98dc65c80abe6e7c7d643 (diff)
be2net: provision VF resources before enabling SR-IOV
When the PF driver calls pci_enable_sriov(), the VFs may be probed inline before the call returns. So, the resources required for all VFs must be provisioned by the PF driver *before* calling pci_enable_sriov(); else, VF probe will fail. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 6c52a60dcdb7..b304b837f5bd 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2783,6 +2783,8 @@ static void be_vf_clear(struct be_adapter *adapter)
2783 goto done; 2783 goto done;
2784 } 2784 }
2785 2785
2786 pci_disable_sriov(adapter->pdev);
2787
2786 for_all_vfs(adapter, vf_cfg, vf) { 2788 for_all_vfs(adapter, vf_cfg, vf) {
2787 if (lancer_chip(adapter)) 2789 if (lancer_chip(adapter))
2788 be_cmd_set_mac_list(adapter, NULL, 0, vf + 1); 2790 be_cmd_set_mac_list(adapter, NULL, 0, vf + 1);
@@ -2792,7 +2794,6 @@ static void be_vf_clear(struct be_adapter *adapter)
2792 2794
2793 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1); 2795 be_cmd_if_destroy(adapter, vf_cfg->if_handle, vf + 1);
2794 } 2796 }
2795 pci_disable_sriov(adapter->pdev);
2796done: 2797done:
2797 kfree(adapter->vf_cfg); 2798 kfree(adapter->vf_cfg);
2798 adapter->num_vfs = 0; 2799 adapter->num_vfs = 0;
@@ -2889,13 +2890,8 @@ static int be_vf_setup(struct be_adapter *adapter)
2889 dev_info(dev, "Device supports %d VFs and not %d\n", 2890 dev_info(dev, "Device supports %d VFs and not %d\n",
2890 adapter->dev_num_vfs, num_vfs); 2891 adapter->dev_num_vfs, num_vfs);
2891 adapter->num_vfs = min_t(u16, num_vfs, adapter->dev_num_vfs); 2892 adapter->num_vfs = min_t(u16, num_vfs, adapter->dev_num_vfs);
2892 2893 if (!adapter->num_vfs)
2893 status = pci_enable_sriov(adapter->pdev, num_vfs);
2894 if (status) {
2895 dev_err(dev, "SRIOV enable failed\n");
2896 adapter->num_vfs = 0;
2897 return 0; 2894 return 0;
2898 }
2899 } 2895 }
2900 2896
2901 status = be_vf_setup_init(adapter); 2897 status = be_vf_setup_init(adapter);
@@ -2944,6 +2940,15 @@ static int be_vf_setup(struct be_adapter *adapter)
2944 2940
2945 be_cmd_enable_vf(adapter, vf + 1); 2941 be_cmd_enable_vf(adapter, vf + 1);
2946 } 2942 }
2943
2944 if (!old_vfs) {
2945 status = pci_enable_sriov(adapter->pdev, adapter->num_vfs);
2946 if (status) {
2947 dev_err(dev, "SRIOV enable failed\n");
2948 adapter->num_vfs = 0;
2949 goto err;
2950 }
2951 }
2947 return 0; 2952 return 0;
2948err: 2953err:
2949 dev_err(dev, "VF setup failed\n"); 2954 dev_err(dev, "VF setup failed\n");
@@ -3198,7 +3203,7 @@ static int be_setup(struct be_adapter *adapter)
3198 be_cmd_set_flow_control(adapter, adapter->tx_fc, 3203 be_cmd_set_flow_control(adapter, adapter->tx_fc,
3199 adapter->rx_fc); 3204 adapter->rx_fc);
3200 3205
3201 if (be_physfn(adapter) && num_vfs) { 3206 if (be_physfn(adapter)) {
3202 if (adapter->dev_num_vfs) 3207 if (adapter->dev_num_vfs)
3203 be_vf_setup(adapter); 3208 be_vf_setup(adapter);
3204 else 3209 else