diff options
| author | Sathya Perla <sathya.perla@emulex.com> | 2013-05-07 22:05:47 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-05-08 14:59:47 -0400 |
| commit | b4c1df9378bc6ce9f7fc4fd18afa3a98b676c5fa (patch) | |
| tree | a28ca1072ed3e7280a954d01856c665e4b94c2f2 | |
| parent | de9c9f86be0dc3495de98dc65c80abe6e7c7d643 (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>
| -rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 21 |
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); | ||
| 2796 | done: | 2797 | done: |
| 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; |
| 2948 | err: | 2953 | err: |
| 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 |
