diff options
Diffstat (limited to 'drivers/xen/xen-pciback/vpci.c')
| -rw-r--r-- | drivers/xen/xen-pciback/vpci.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/xen/xen-pciback/vpci.c b/drivers/xen/xen-pciback/vpci.c index 46d140baebd..0f478ac483c 100644 --- a/drivers/xen/xen-pciback/vpci.c +++ b/drivers/xen/xen-pciback/vpci.c @@ -89,9 +89,15 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,  	mutex_lock(&vpci_dev->lock); -	/* Keep multi-function devices together on the virtual PCI bus */ -	for (slot = 0; slot < PCI_SLOT_MAX; slot++) { -		if (!list_empty(&vpci_dev->dev_list[slot])) { +	/* +	 * Keep multi-function devices together on the virtual PCI bus, except +	 * virtual functions. +	 */ +	if (!dev->is_virtfn) { +		for (slot = 0; slot < PCI_SLOT_MAX; slot++) { +			if (list_empty(&vpci_dev->dev_list[slot])) +				continue; +  			t = list_entry(list_first(&vpci_dev->dev_list[slot]),  				       struct pci_dev_entry, list); @@ -116,7 +122,7 @@ static int __xen_pcibk_add_pci_dev(struct xen_pcibk_device *pdev,  			       pci_name(dev), slot);  			list_add_tail(&dev_entry->list,  				      &vpci_dev->dev_list[slot]); -			func = PCI_FUNC(dev->devfn); +			func = dev->is_virtfn ? 0 : PCI_FUNC(dev->devfn);  			goto unlock;  		}  	}  |