|
@@ -1041,35 +1041,44 @@ static void __init pcibios_fixup_irqs(void)
|
|
if (io_apic_assign_pci_irqs) {
|
|
if (io_apic_assign_pci_irqs) {
|
|
int irq;
|
|
int irq;
|
|
|
|
|
|
- if (pin) {
|
|
|
|
- /*
|
|
|
|
- * interrupt pins are numbered starting
|
|
|
|
- * from 1
|
|
|
|
- */
|
|
|
|
- pin--;
|
|
|
|
- irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
|
|
|
|
- PCI_SLOT(dev->devfn), pin);
|
|
|
|
- /*
|
|
|
|
- * Busses behind bridges are typically not listed in the MP-table.
|
|
|
|
- * In this case we have to look up the IRQ based on the parent bus,
|
|
|
|
- * parent slot, and pin number. The SMP code detects such bridged
|
|
|
|
- * busses itself so we should get into this branch reliably.
|
|
|
|
- */
|
|
|
|
- if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
|
|
|
|
- struct pci_dev *bridge = dev->bus->self;
|
|
|
|
-
|
|
|
|
- pin = (pin + PCI_SLOT(dev->devfn)) % 4;
|
|
|
|
- irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
|
|
|
|
- PCI_SLOT(bridge->devfn), pin);
|
|
|
|
- if (irq >= 0)
|
|
|
|
- dev_warn(&dev->dev, "using bridge %s INT %c to get IRQ %d\n",
|
|
|
|
- pci_name(bridge),
|
|
|
|
- 'A' + pin, irq);
|
|
|
|
- }
|
|
|
|
- if (irq >= 0) {
|
|
|
|
- dev_info(&dev->dev, "PCI->APIC IRQ transform: INT %c -> IRQ %d\n", 'A' + pin, irq);
|
|
|
|
- dev->irq = irq;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!pin)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * interrupt pins are numbered starting from 1
|
|
|
|
+ */
|
|
|
|
+ pin--;
|
|
|
|
+ irq = IO_APIC_get_PCI_irq_vector(dev->bus->number,
|
|
|
|
+ PCI_SLOT(dev->devfn), pin);
|
|
|
|
+ /*
|
|
|
|
+ * Busses behind bridges are typically not listed in the
|
|
|
|
+ * MP-table. In this case we have to look up the IRQ
|
|
|
|
+ * based on the parent bus, parent slot, and pin number.
|
|
|
|
+ * The SMP code detects such bridged busses itself so we
|
|
|
|
+ * should get into this branch reliably.
|
|
|
|
+ */
|
|
|
|
+ if (irq < 0 && dev->bus->parent) {
|
|
|
|
+ /* go back to the bridge */
|
|
|
|
+ struct pci_dev *bridge = dev->bus->self;
|
|
|
|
+ int bus;
|
|
|
|
+
|
|
|
|
+ pin = (pin + PCI_SLOT(dev->devfn)) % 4;
|
|
|
|
+ bus = bridge->bus->number;
|
|
|
|
+ irq = IO_APIC_get_PCI_irq_vector(bus,
|
|
|
|
+ PCI_SLOT(bridge->devfn), pin);
|
|
|
|
+ if (irq >= 0)
|
|
|
|
+ dev_warn(&dev->dev,
|
|
|
|
+ "using bridge %s INT %c to "
|
|
|
|
+ "get IRQ %d\n",
|
|
|
|
+ pci_name(bridge),
|
|
|
|
+ 'A' + pin, irq);
|
|
|
|
+ }
|
|
|
|
+ if (irq >= 0) {
|
|
|
|
+ dev_info(&dev->dev,
|
|
|
|
+ "PCI->APIC IRQ transform: INT %c "
|
|
|
|
+ "-> IRQ %d\n",
|
|
|
|
+ 'A' + pin, irq);
|
|
|
|
+ dev->irq = irq;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|