ixgbe: Modularize SR-IOV enablement code
authorGreg Rose <gregory.v.rose@intel.com>
Tue, 11 Dec 2012 08:26:38 +0000 (08:26 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 23 Jan 2013 22:34:01 +0000 (14:34 -0800)
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>
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c

index 029c863cac8149d3732ace764f9f0e805e25a924..8a284ac4b4009b590e2dd39580b0370dd144ad56 100644 (file)
 #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 0;
+       }
+
+       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;
+               }
        }
 
-       /* Oh oh */
+       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);