aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_irq.c')
-rw-r--r--drivers/acpi/pci_irq.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index e42481f64495..b35e64d71409 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -399,7 +399,7 @@ static struct acpi_prt_entry *
399acpi_pci_irq_derive(struct pci_dev *dev, int pin) 399acpi_pci_irq_derive(struct pci_dev *dev, int pin)
400{ 400{
401 struct acpi_prt_entry *entry = NULL; 401 struct acpi_prt_entry *entry = NULL;
402 struct pci_dev *bridge = dev; 402 struct pci_dev *bridge;
403 u8 bridge_pin = 0, orig_pin = pin; 403 u8 bridge_pin = 0, orig_pin = pin;
404 404
405 405
@@ -407,9 +407,9 @@ acpi_pci_irq_derive(struct pci_dev *dev, int pin)
407 * Attempt to derive an IRQ for this device from a parent bridge's 407 * Attempt to derive an IRQ for this device from a parent bridge's
408 * PCI interrupt routing entry (eg. yenta bridge and add-in card bridge). 408 * PCI interrupt routing entry (eg. yenta bridge and add-in card bridge).
409 */ 409 */
410 while (bridge->bus->self) { 410 bridge = dev->bus->self;
411 pin = (((pin - 1) + PCI_SLOT(bridge->devfn)) % 4) + 1; 411 while (bridge) {
412 bridge = bridge->bus->self; 412 pin = (((pin - 1) + PCI_SLOT(dev->devfn)) % 4) + 1;
413 413
414 if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) { 414 if ((bridge->class >> 8) == PCI_CLASS_BRIDGE_CARDBUS) {
415 /* PC card has the same IRQ as its cardbridge */ 415 /* PC card has the same IRQ as its cardbridge */
@@ -431,6 +431,9 @@ acpi_pci_irq_derive(struct pci_dev *dev, int pin)
431 pci_name(bridge))); 431 pci_name(bridge)));
432 return entry; 432 return entry;
433 } 433 }
434
435 dev = bridge;
436 bridge = dev->bus->self;
434 } 437 }
435 438
436 dev_warn(&dev->dev, "can't derive routing for PCI INT %c\n", 439 dev_warn(&dev->dev, "can't derive routing for PCI INT %c\n",