diff options
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-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 |