forked from Minki/linux
ixgbe: Modularize SR-IOV enablement code
In preparation for enable/disable of SR-IOV via the PCI sysfs interface move some core SR-IOV enablement code that would be common to module parameter usage or callback from the PCI bus driver to a separate function so that it can be used by either method. Signed-off-by: Greg Rose <gregory.v.rose@intel.com> CC: Don Dutile <ddutile@redhat.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>
This commit is contained in:
parent
60a1a6800d
commit
66dcfd7569
@ -44,49 +44,11 @@
|
||||
#include "ixgbe_sriov.h"
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
void ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
||||
static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
int num_vf_macvlans, i;
|
||||
struct vf_macvlans *mv_list;
|
||||
int pre_existing_vfs = 0;
|
||||
|
||||
pre_existing_vfs = pci_num_vf(adapter->pdev);
|
||||
if (!pre_existing_vfs && !adapter->num_vfs)
|
||||
return;
|
||||
|
||||
/* If there are pre-existing VFs then we have to force
|
||||
* use of that many because they were not deleted the last
|
||||
* time someone removed the PF driver. That would have
|
||||
* been because they were allocated to guest VMs and can't
|
||||
* be removed. Go ahead and just re-enable the old amount.
|
||||
* If the user wants to change the number of VFs they can
|
||||
* use ethtool while making sure no VFs are allocated to
|
||||
* guest VMs... i.e. the right way.
|
||||
*/
|
||||
if (pre_existing_vfs) {
|
||||
adapter->num_vfs = pre_existing_vfs;
|
||||
dev_warn(&adapter->pdev->dev, "Virtual Functions already "
|
||||
"enabled for this device - Please reload all "
|
||||
"VF drivers to avoid spoofed packet errors\n");
|
||||
} else {
|
||||
int err;
|
||||
/*
|
||||
* The 82599 supports up to 64 VFs per physical function
|
||||
* but this implementation limits allocation to 63 so that
|
||||
* basic networking resources are still available to the
|
||||
* physical function. If the user requests greater thn
|
||||
* 63 VFs then it is an error - reset to default of zero.
|
||||
*/
|
||||
adapter->num_vfs = min_t(unsigned int, adapter->num_vfs, 63);
|
||||
|
||||
err = pci_enable_sriov(adapter->pdev, adapter->num_vfs);
|
||||
if (err) {
|
||||
e_err(probe, "Failed to enable PCI sriov: %d\n", err);
|
||||
adapter->num_vfs = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
adapter->flags |= IXGBE_FLAG_SRIOV_ENABLED;
|
||||
e_info(probe, "SR-IOV enabled with %d VFs\n", adapter->num_vfs);
|
||||
@ -150,10 +112,62 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
||||
/* enable spoof checking for all VFs */
|
||||
for (i = 0; i < adapter->num_vfs; i++)
|
||||
adapter->vfinfo[i].spoofchk_enabled = true;
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Oh oh */
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Note this function is called when the user wants to enable SR-IOV
|
||||
* VFs using the now deprecated module parameter
|
||||
*/
|
||||
void ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
int pre_existing_vfs = 0;
|
||||
|
||||
pre_existing_vfs = pci_num_vf(adapter->pdev);
|
||||
if (!pre_existing_vfs && !adapter->num_vfs)
|
||||
return;
|
||||
|
||||
if (!pre_existing_vfs)
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"Enabling SR-IOV VFs using the module parameter is deprecated - please use the pci sysfs interface.\n");
|
||||
|
||||
/* If there are pre-existing VFs then we have to force
|
||||
* use of that many - over ride any module parameter value.
|
||||
* This may result from the user unloading the PF driver
|
||||
* while VFs were assigned to guest VMs or because the VFs
|
||||
* have been created via the new PCI SR-IOV sysfs interface.
|
||||
*/
|
||||
if (pre_existing_vfs) {
|
||||
adapter->num_vfs = pre_existing_vfs;
|
||||
dev_warn(&adapter->pdev->dev,
|
||||
"Virtual Functions already enabled for this device - Please reload all VF drivers to avoid spoofed packet errors\n");
|
||||
} else {
|
||||
int err;
|
||||
/*
|
||||
* The 82599 supports up to 64 VFs per physical function
|
||||
* but this implementation limits allocation to 63 so that
|
||||
* basic networking resources are still available to the
|
||||
* physical function. If the user requests greater thn
|
||||
* 63 VFs then it is an error - reset to default of zero.
|
||||
*/
|
||||
adapter->num_vfs = min_t(unsigned int, adapter->num_vfs, 63);
|
||||
|
||||
err = pci_enable_sriov(adapter->pdev, adapter->num_vfs);
|
||||
if (err) {
|
||||
e_err(probe, "Failed to enable PCI sriov: %d\n", err);
|
||||
adapter->num_vfs = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!__ixgbe_enable_sriov(adapter))
|
||||
return;
|
||||
|
||||
/* If we have gotten to this point then there is no memory available
|
||||
* to manage the VF devices - print message and bail.
|
||||
*/
|
||||
e_err(probe, "Unable to allocate memory for VF Data Storage - "
|
||||
"SRIOV disabled\n");
|
||||
ixgbe_disable_sriov(adapter);
|
||||
|
Loading…
Reference in New Issue
Block a user