diff options
author | James Morris <jmorris@namei.org> | 2009-07-14 00:30:40 +1000 |
---|---|---|
committer | James Morris <jmorris@namei.org> | 2009-07-14 00:30:40 +1000 |
commit | 7d45ecafb6792ca68da9517969d37d910601845f (patch) | |
tree | a98b1074e5577e66a97963745f975404d0aac266 /drivers/pci/pci.c | |
parent | be940d6279c30a2d7c4e8d1d5435f957f594d66d (diff) | |
parent | 7638d5322bd89d49e013a03fe2afaeb6d214fabd (diff) |
Merge branch 'master' into next
Conflicts:
include/linux/personality.h
Use Linus' version.
Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 6c93af5ced1..dbd0f947f49 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1517,11 +1517,20 @@ void pci_enable_ari(struct pci_dev *dev) * * Perform INTx swizzling for a device behind one level of bridge. This is * required by section 9.1 of the PCI-to-PCI bridge specification for devices - * behind bridges on add-in cards. + * behind bridges on add-in cards. For devices with ARI enabled, the slot + * number is always 0 (see the Implementation Note in section 2.2.8.1 of + * the PCI Express Base Specification, Revision 2.1) */ u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin) { - return (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1; + int slot; + + if (pci_ari_enabled(dev->bus)) + slot = 0; + else + slot = PCI_SLOT(dev->devfn); + + return (((pin - 1) + slot) % 4) + 1; } int @@ -2171,7 +2180,7 @@ static int pci_parent_bus_reset(struct pci_dev *dev, int probe) u16 ctrl; struct pci_dev *pdev; - if (dev->subordinate) + if (pci_is_root_bus(dev->bus) || dev->subordinate || !dev->bus->self) return -ENOTTY; list_for_each_entry(pdev, &dev->bus->devices, bus_list) |