diff options
author | Alexander Duyck <alexander.h.duyck@intel.com> | 2012-05-09 04:09:25 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-07-21 19:02:09 -0400 |
commit | 99d744875d01d57d832b8dbfc36d9a1990d503b8 (patch) | |
tree | 993e5373e56d489f5662ea6b4d648697a23e788a /drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |
parent | 186e868786f97c8026f0a81400b451ace306b3a4 (diff) |
ixgbe: Drop probe_vf and merge functionality into ixgbe_enable_sriov
This is meant to fix a bug in which we were not checking for pre-existing
VFs if we were not setting the max_vfs value at driver load. What happens
now is that we always call ixgbe_enable_sriov and this checks for
pre-existing VFs ore requested VFs prior to deciding on no SR-IOV.
Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: Sibai Li <sibai.li@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index a825d4808cd2..593fdd54f9ab 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -82,7 +82,6 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, | |||
82 | const struct ixgbe_info *ii) | 82 | const struct ixgbe_info *ii) |
83 | { | 83 | { |
84 | struct ixgbe_hw *hw = &adapter->hw; | 84 | struct ixgbe_hw *hw = &adapter->hw; |
85 | int err = 0; | ||
86 | int num_vf_macvlans, i; | 85 | int num_vf_macvlans, i; |
87 | struct vf_macvlans *mv_list; | 86 | struct vf_macvlans *mv_list; |
88 | int pre_existing_vfs = 0; | 87 | int pre_existing_vfs = 0; |
@@ -106,10 +105,21 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, | |||
106 | "enabled for this device - Please reload all " | 105 | "enabled for this device - Please reload all " |
107 | "VF drivers to avoid spoofed packet errors\n"); | 106 | "VF drivers to avoid spoofed packet errors\n"); |
108 | } else { | 107 | } else { |
108 | int err; | ||
109 | /* | ||
110 | * The 82599 supports up to 64 VFs per physical function | ||
111 | * but this implementation limits allocation to 63 so that | ||
112 | * basic networking resources are still available to the | ||
113 | * physical function. If the user requests greater thn | ||
114 | * 63 VFs then it is an error - reset to default of zero. | ||
115 | */ | ||
116 | adapter->num_vfs = min_t(unsigned int, adapter->num_vfs, 63); | ||
117 | |||
109 | err = pci_enable_sriov(adapter->pdev, adapter->num_vfs); | 118 | err = pci_enable_sriov(adapter->pdev, adapter->num_vfs); |
110 | if (err) { | 119 | if (err) { |
111 | e_err(probe, "Failed to enable PCI sriov: %d\n", err); | 120 | e_err(probe, "Failed to enable PCI sriov: %d\n", err); |
112 | goto err_novfs; | 121 | adapter->num_vfs = 0; |
122 | return; | ||
113 | } | 123 | } |
114 | } | 124 | } |
115 | 125 | ||
@@ -193,11 +203,7 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, | |||
193 | /* Oh oh */ | 203 | /* Oh oh */ |
194 | e_err(probe, "Unable to allocate memory for VF Data Storage - " | 204 | e_err(probe, "Unable to allocate memory for VF Data Storage - " |
195 | "SRIOV disabled\n"); | 205 | "SRIOV disabled\n"); |
196 | pci_disable_sriov(adapter->pdev); | 206 | ixgbe_disable_sriov(adapter); |
197 | |||
198 | err_novfs: | ||
199 | adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED; | ||
200 | adapter->num_vfs = 0; | ||
201 | } | 207 | } |
202 | #endif /* #ifdef CONFIG_PCI_IOV */ | 208 | #endif /* #ifdef CONFIG_PCI_IOV */ |
203 | 209 | ||
@@ -219,6 +225,10 @@ void ixgbe_disable_sriov(struct ixgbe_adapter *adapter) | |||
219 | kfree(adapter->mv_list); | 225 | kfree(adapter->mv_list); |
220 | adapter->mv_list = NULL; | 226 | adapter->mv_list = NULL; |
221 | 227 | ||
228 | /* if SR-IOV is already disabled then there is nothing to do */ | ||
229 | if (!(adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)) | ||
230 | return; | ||
231 | |||
222 | #ifdef CONFIG_PCI_IOV | 232 | #ifdef CONFIG_PCI_IOV |
223 | /* disable iov and allow time for transactions to clear */ | 233 | /* disable iov and allow time for transactions to clear */ |
224 | pci_disable_sriov(adapter->pdev); | 234 | pci_disable_sriov(adapter->pdev); |