From 42c7becf6a81fb47f6e55e6698f53bba9a37a6fa Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Thu, 11 Dec 2008 11:24:23 -0700 Subject: [PATCH] --- yaml --- r: 127366 b: refs/heads/master c: 57c2cf71c12318b72ebaa5720d210476b6bac4d4 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/pci/pci.c | 16 +++++++++++++++- trunk/include/linux/pci.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index dd6cb38e917b..b5a915ff0beb 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 12b955ff63db0b75cfc2d4939696c57b31891ec6 +refs/heads/master: 57c2cf71c12318b72ebaa5720d210476b6bac4d4 diff --git a/trunk/drivers/pci/pci.c b/trunk/drivers/pci/pci.c index bd52ca4c2893..d4d71fae6233 100644 --- a/trunk/drivers/pci/pci.c +++ b/trunk/drivers/pci/pci.c @@ -1366,6 +1366,20 @@ void pci_enable_ari(struct pci_dev *dev) bridge->ari_enabled = 1; } +/** + * pci_swizzle_interrupt_pin - swizzle INTx for device behind bridge + * @dev: the PCI device + * @pin: the INTx pin (1=INTA, 2=INTB, 3=INTD, 4=INTD) + * + * 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. + */ +u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin) +{ + return (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1; +} + int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge) { @@ -1376,7 +1390,7 @@ pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge) return -1; while (dev->bus->self) { - pin = (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1; + pin = pci_swizzle_interrupt_pin(dev, pin); dev = dev->bus->self; } *bridge = dev; diff --git a/trunk/include/linux/pci.h b/trunk/include/linux/pci.h index bfcb39ca8879..58357d14f94c 100644 --- a/trunk/include/linux/pci.h +++ b/trunk/include/linux/pci.h @@ -532,6 +532,7 @@ int __must_check pci_bus_add_device(struct pci_dev *dev); void pci_read_bridge_bases(struct pci_bus *child); struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); +u8 pci_swizzle_interrupt_pin(struct pci_dev *dev, u8 pin); int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); extern struct pci_dev *pci_dev_get(struct pci_dev *dev); extern void pci_dev_put(struct pci_dev *dev);