Mark F. Haigh wrote:

--- arch/i386/kernel/pci-irq.c.orig 2005-02-07 19:55:23.852531544 -0800 +++ arch/i386/kernel/pci-irq.c 2005-02-07 20:13:38.835068896 -0800

Apologies. Patch now -p1-able.


Mark F. Haigh [EMAIL PROTECTED]

Signed-off-by: Mark F. Haigh  <[EMAIL PROTECTED]>

--- linux-2.4.29-bk8/arch/i386/kernel/pci-irq.c.orig    2005-02-07 
19:55:23.000000000 -0800
+++ linux-2.4.29-bk8/arch/i386/kernel/pci-irq.c 2005-02-07 20:13:38.000000000 
-0800
@@ -1127,6 +1127,8 @@
        if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
                char *msg;
 
+               pin--;          /* interrupt pins are numbered starting from 1 
*/
+
                /* With IDE legacy devices the IRQ lookup failure is not a 
problem.. */
                if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 
0x5))
                        return;
@@ -1134,42 +1136,39 @@
                if (io_apic_assign_pci_irqs) {
                        int irq;
 
-                       if (pin) {
-                               pin--;          /* interrupt pins are numbered 
starting from 1 */
-                               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.
-                                */
-                               temp_dev = dev;
-                               while (irq < 0 && dev->bus->parent) { /* go 
back to the bridge */
-                                       struct pci_dev * bridge = 
dev->bus->self;
+                       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.
+                        */
+                       temp_dev = dev;
+                       while (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)
-                                               printk(KERN_WARNING "PCI: using 
PPB(B%d,I%d,P%d) to get irq %d\n", 
-                                                       bridge->bus->number, 
PCI_SLOT(bridge->devfn), pin, irq);
-                                       dev = bridge;
-                               }
-                               dev = temp_dev;
-                               if (irq >= 0) {
-                                       printk(KERN_INFO "PCI->APIC IRQ 
transform: (B%d,I%d,P%d) -> %d\n",
-                                               dev->bus->number, 
PCI_SLOT(dev->devfn), pin, irq);
-                                       dev->irq = irq;
-                                       return;
-                               } else
-                                       msg = " Probably buggy MP table.";
+                               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)
+                                       printk(KERN_WARNING "PCI: using 
PPB(B%d,I%d,P%d) to get irq %d\n", 
+                                               bridge->bus->number, 
PCI_SLOT(bridge->devfn), pin, irq);
+                               dev = bridge;
                        }
+                       dev = temp_dev;
+                       if (irq >= 0) {
+                               printk(KERN_INFO "PCI->APIC IRQ transform: 
(B%d,I%d,P%d) -> %d\n",
+                                       dev->bus->number, PCI_SLOT(dev->devfn), 
pin, irq);
+                               dev->irq = irq;
+                               return;
+                       } else
+                               msg = " Probably buggy MP table.";
                } else if (pci_probe & PCI_BIOS_IRQ_SCAN)
                        msg = "";
                else
                        msg = " Please try using pci=biosirq.";
                printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of 
device %s.%s\n",
-                      'A' + pin - 1, dev->slot_name, msg);
+                      'A' + pin, dev->slot_name, msg);
        }
        /* VIA bridges use interrupt line for apic/pci steering across
           the V-Link */

Reply via email to