Commit 02337f1f authored by Brett Creeley's avatar Brett Creeley Committed by Jeff Kirsher

ice: Simplify ice_sriov_configure

Add a new function for checking if SR-IOV can be configured based on
the PF and/or device's state/capabilities. Also, simplify the flow in
ice_sriov_configure().
Signed-off-by: default avatarBrett Creeley <brett.creeley@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent ac371613
...@@ -1460,6 +1460,8 @@ static bool ice_pf_state_is_nominal(struct ice_pf *pf) ...@@ -1460,6 +1460,8 @@ static bool ice_pf_state_is_nominal(struct ice_pf *pf)
* ice_pci_sriov_ena - Enable or change number of VFs * ice_pci_sriov_ena - Enable or change number of VFs
* @pf: pointer to the PF structure * @pf: pointer to the PF structure
* @num_vfs: number of VFs to allocate * @num_vfs: number of VFs to allocate
*
* Returns 0 on success and negative on failure
*/ */
static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs) static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs)
{ {
...@@ -1467,20 +1469,10 @@ static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs) ...@@ -1467,20 +1469,10 @@ static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs)
struct device *dev = ice_pf_to_dev(pf); struct device *dev = ice_pf_to_dev(pf);
int err; int err;
if (!ice_pf_state_is_nominal(pf)) {
dev_err(dev, "Cannot enable SR-IOV, device not ready\n");
return -EBUSY;
}
if (!test_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags)) {
dev_err(dev, "This device is not capable of SR-IOV\n");
return -EOPNOTSUPP;
}
if (pre_existing_vfs && pre_existing_vfs != num_vfs) if (pre_existing_vfs && pre_existing_vfs != num_vfs)
ice_free_vfs(pf); ice_free_vfs(pf);
else if (pre_existing_vfs && pre_existing_vfs == num_vfs) else if (pre_existing_vfs && pre_existing_vfs == num_vfs)
return num_vfs; return 0;
if (num_vfs > pf->num_vfs_supported) { if (num_vfs > pf->num_vfs_supported) {
dev_err(dev, "Can't enable %d VFs, max VFs supported is %d\n", dev_err(dev, "Can't enable %d VFs, max VFs supported is %d\n",
...@@ -1496,37 +1488,69 @@ static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs) ...@@ -1496,37 +1488,69 @@ static int ice_pci_sriov_ena(struct ice_pf *pf, int num_vfs)
} }
set_bit(ICE_FLAG_SRIOV_ENA, pf->flags); set_bit(ICE_FLAG_SRIOV_ENA, pf->flags);
return num_vfs; return 0;
} }
/** /**
* ice_sriov_configure - Enable or change number of VFs via sysfs * ice_check_sriov_allowed - check if SR-IOV is allowed based on various checks
* @pdev: pointer to a pci_dev structure * @pf: PF to enabled SR-IOV on
* @num_vfs: number of VFs to allocate
*
* This function is called when the user updates the number of VFs in sysfs.
*/ */
int ice_sriov_configure(struct pci_dev *pdev, int num_vfs) static int ice_check_sriov_allowed(struct ice_pf *pf)
{ {
struct ice_pf *pf = pci_get_drvdata(pdev);
struct device *dev = ice_pf_to_dev(pf); struct device *dev = ice_pf_to_dev(pf);
if (!test_bit(ICE_FLAG_SRIOV_CAPABLE, pf->flags)) {
dev_err(dev, "This device is not capable of SR-IOV\n");
return -EOPNOTSUPP;
}
if (ice_is_safe_mode(pf)) { if (ice_is_safe_mode(pf)) {
dev_err(dev, "SR-IOV cannot be configured - Device is in Safe Mode\n"); dev_err(dev, "SR-IOV cannot be configured - Device is in Safe Mode\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
if (num_vfs) if (!ice_pf_state_is_nominal(pf)) {
return ice_pci_sriov_ena(pf, num_vfs); dev_err(dev, "Cannot enable SR-IOV, device not ready\n");
return -EBUSY;
}
return 0;
}
/**
* ice_sriov_configure - Enable or change number of VFs via sysfs
* @pdev: pointer to a pci_dev structure
* @num_vfs: number of VFs to allocate or 0 to free VFs
*
* This function is called when the user updates the number of VFs in sysfs. On
* success return whatever num_vfs was set to by the caller. Return negative on
* failure.
*/
int ice_sriov_configure(struct pci_dev *pdev, int num_vfs)
{
struct ice_pf *pf = pci_get_drvdata(pdev);
struct device *dev = ice_pf_to_dev(pf);
int err;
err = ice_check_sriov_allowed(pf);
if (err)
return err;
if (!num_vfs) {
if (!pci_vfs_assigned(pdev)) { if (!pci_vfs_assigned(pdev)) {
ice_free_vfs(pf); ice_free_vfs(pf);
} else { return 0;
}
dev_err(dev, "can't free VFs because some are assigned to VMs.\n"); dev_err(dev, "can't free VFs because some are assigned to VMs.\n");
return -EBUSY; return -EBUSY;
} }
return 0; err = ice_pci_sriov_ena(pf, num_vfs);
if (err)
return err;
return num_vfs;
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment