Loading arch/x86/pci/irq.c +38 −29 Original line number Diff line number Diff line Loading @@ -1041,37 +1041,46 @@ static void __init pcibios_fixup_irqs(void) if (io_apic_assign_pci_irqs) { int irq; if (pin) { if (!pin) continue; /* * interrupt pins are numbered starting * from 1 * 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. * 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 */ 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; irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 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", 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_info(&dev->dev, "PCI->APIC IRQ transform: INT %c " "-> IRQ %d\n", 'A' + pin, irq); dev->irq = irq; } } } #endif /* * Still no IRQ? Try to lookup one... Loading Loading
arch/x86/pci/irq.c +38 −29 Original line number Diff line number Diff line Loading @@ -1041,37 +1041,46 @@ static void __init pcibios_fixup_irqs(void) if (io_apic_assign_pci_irqs) { int irq; if (pin) { if (!pin) continue; /* * interrupt pins are numbered starting * from 1 * 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. * 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 */ 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; irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 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", 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_info(&dev->dev, "PCI->APIC IRQ transform: INT %c " "-> IRQ %d\n", 'A' + pin, irq); dev->irq = irq; } } } #endif /* * Still no IRQ? Try to lookup one... Loading