mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	PCI/IOV: Factor out sriov_add_vfs()
Provide sriov_add_vfs() as a wrapper to scan for VFs that cleans up after itself. This is just a code simplification. No functional change. Signed-off-by: Sebastian Ott <sebott@linux.ibm.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
		
							parent
							
								
									651022382c
								
							
						
					
					
						commit
						18f9e9d150
					
				
					 1 changed files with 31 additions and 13 deletions
				
			
		| 
						 | 
				
			
			@ -252,6 +252,24 @@ int __weak pcibios_sriov_disable(struct pci_dev *pdev)
 | 
			
		|||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sriov_add_vfs(struct pci_dev *dev, u16 num_vfs)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < num_vfs; i++) {
 | 
			
		||||
		rc = pci_iov_add_virtfn(dev, i);
 | 
			
		||||
		if (rc)
 | 
			
		||||
			goto failed;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
failed:
 | 
			
		||||
	while (i--)
 | 
			
		||||
		pci_iov_remove_virtfn(dev, i);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
| 
						 | 
				
			
			@ -337,21 +355,15 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
 | 
			
		|||
	msleep(100);
 | 
			
		||||
	pci_cfg_access_unlock(dev);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < initial; i++) {
 | 
			
		||||
		rc = pci_iov_add_virtfn(dev, i);
 | 
			
		||||
		if (rc)
 | 
			
		||||
			goto failed;
 | 
			
		||||
	}
 | 
			
		||||
	rc = sriov_add_vfs(dev, initial);
 | 
			
		||||
	if (rc)
 | 
			
		||||
		goto err_pcibios;
 | 
			
		||||
 | 
			
		||||
	kobject_uevent(&dev->dev.kobj, KOBJ_CHANGE);
 | 
			
		||||
	iov->num_VFs = nr_virtfn;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
failed:
 | 
			
		||||
	while (i--)
 | 
			
		||||
		pci_iov_remove_virtfn(dev, i);
 | 
			
		||||
 | 
			
		||||
err_pcibios:
 | 
			
		||||
	iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
 | 
			
		||||
	pci_cfg_access_lock(dev);
 | 
			
		||||
| 
						 | 
				
			
			@ -368,17 +380,23 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
 | 
			
		|||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void sriov_del_vfs(struct pci_dev *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct pci_sriov *iov = dev->sriov;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < iov->num_VFs; i++)
 | 
			
		||||
		pci_iov_remove_virtfn(dev, i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void sriov_disable(struct pci_dev *dev)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	struct pci_sriov *iov = dev->sriov;
 | 
			
		||||
 | 
			
		||||
	if (!iov->num_VFs)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < iov->num_VFs; i++)
 | 
			
		||||
		pci_iov_remove_virtfn(dev, i);
 | 
			
		||||
 | 
			
		||||
	sriov_del_vfs(dev);
 | 
			
		||||
	iov->ctrl &= ~(PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE);
 | 
			
		||||
	pci_cfg_access_lock(dev);
 | 
			
		||||
	pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue