aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/pci/irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/pci/irq.c')
-rw-r--r--arch/x86/pci/irq.c143
1 files changed, 48 insertions, 95 deletions
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index c422e10337be..6a06a2eb0597 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -102,8 +102,7 @@ static struct irq_routing_table * __init pirq_find_routing_table(void)
102 return rt; 102 return rt;
103 printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n"); 103 printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
104 } 104 }
105 for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); 105 for (addr = (u8 *) __va(0xf0000); addr < (u8 *) __va(0x100000); addr += 16) {
106 addr += 16) {
107 rt = pirq_check_routing_table(addr); 106 rt = pirq_check_routing_table(addr);
108 if (rt) 107 if (rt)
109 return rt; 108 return rt;
@@ -125,17 +124,14 @@ static void __init pirq_peer_trick(void)
125 struct irq_info *e; 124 struct irq_info *e;
126 125
127 memset(busmap, 0, sizeof(busmap)); 126 memset(busmap, 0, sizeof(busmap));
128 for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / 127 for (i = 0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
129 sizeof(struct irq_info); i++) {
130 e = &rt->slots[i]; 128 e = &rt->slots[i];
131#ifdef DEBUG 129#ifdef DEBUG
132 { 130 {
133 int j; 131 int j;
134 DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, 132 DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot);
135 e->devfn/8, e->slot);
136 for (j = 0; j < 4; j++) 133 for (j = 0; j < 4; j++)
137 DBG(" %d:%02x/%04x", j, e->irq[j].link, 134 DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap);
138 e->irq[j].bitmap);
139 DBG("\n"); 135 DBG("\n");
140 } 136 }
141#endif 137#endif
@@ -180,8 +176,7 @@ void eisa_set_level_irq(unsigned int irq)
180 * Common IRQ routing practice: nibbles in config space, 176 * Common IRQ routing practice: nibbles in config space,
181 * offset by some magic constant. 177 * offset by some magic constant.
182 */ 178 */
183static unsigned int 179static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
184read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
185{ 180{
186 u8 x; 181 u8 x;
187 unsigned reg = offset + (nr >> 1); 182 unsigned reg = offset + (nr >> 1);
@@ -208,18 +203,15 @@ static void write_config_nybble(struct pci_dev *router, unsigned offset,
208 */ 203 */
209static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq) 204static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
210{ 205{
211 static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 206 static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
212 11, 0, 12, 0, 14, 0, 15 };
213 207
214 WARN_ON_ONCE(pirq > 16); 208 WARN_ON_ONCE(pirq > 16);
215 return irqmap[read_config_nybble(router, 0x48, pirq-1)]; 209 return irqmap[read_config_nybble(router, 0x48, pirq-1)];
216} 210}
217 211
218static int 212static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
219pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
220{ 213{
221 static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 214 static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
222 3, 9, 11, 0, 13, 15 };
223 unsigned int val = irqmap[irq]; 215 unsigned int val = irqmap[irq];
224 216
225 WARN_ON_ONCE(pirq > 16); 217 WARN_ON_ONCE(pirq > 16);
@@ -242,8 +234,7 @@ static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
242 return (x < 16) ? x : 0; 234 return (x < 16) ? x : 0;
243} 235}
244 236
245static int 237static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
246pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
247{ 238{
248 pci_write_config_byte(router, pirq, irq); 239 pci_write_config_byte(router, pirq, irq);
249 return 1; 240 return 1;
@@ -259,8 +250,7 @@ static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
259 return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq); 250 return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
260} 251}
261 252
262static int 253static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
263pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
264{ 254{
265 write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq); 255 write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
266 return 1; 256 return 1;
@@ -271,8 +261,7 @@ pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
271 * but without the ugly irq number munging. 261 * but without the ugly irq number munging.
272 * However, for 82C586, nibble map is different . 262 * However, for 82C586, nibble map is different .
273 */ 263 */
274static int 264static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
275pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
276{ 265{
277 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; 266 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
278 267
@@ -280,8 +269,7 @@ pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
280 return read_config_nybble(router, 0x55, pirqmap[pirq-1]); 269 return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
281} 270}
282 271
283static int 272static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
284pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
285{ 273{
286 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 }; 274 static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
287 275
@@ -303,8 +291,7 @@ static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
303 return read_config_nybble(router, 0x43, pirqmap[pirq-1]); 291 return read_config_nybble(router, 0x43, pirqmap[pirq-1]);
304} 292}
305 293
306static int 294static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
307pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
308{ 295{
309 static const unsigned char pirqmap[4] = { 1, 0, 2, 3 }; 296 static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
310 297
@@ -322,8 +309,7 @@ static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
322 return read_config_nybble(router, 0xb8, pirq >> 4); 309 return read_config_nybble(router, 0xb8, pirq >> 4);
323} 310}
324 311
325static int 312static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
326pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
327{ 313{
328 write_config_nybble(router, 0xb8, pirq >> 4, irq); 314 write_config_nybble(router, 0xb8, pirq >> 4, irq);
329 return 1; 315 return 1;
@@ -339,8 +325,7 @@ static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
339 return read_config_nybble(router, 0x5C, (pirq-1)^1); 325 return read_config_nybble(router, 0x5C, (pirq-1)^1);
340} 326}
341 327
342static int 328static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
343pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
344{ 329{
345 write_config_nybble(router, 0x5C, (pirq-1)^1, irq); 330 write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
346 return 1; 331 return 1;
@@ -423,8 +408,7 @@ static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
423 return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK); 408 return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK);
424} 409}
425 410
426static int 411static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
427pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
428{ 412{
429 u8 x; 413 u8 x;
430 int reg; 414 int reg;
@@ -458,8 +442,7 @@ static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
458 return read_config_nybble(router, 0x74, pirq-1); 442 return read_config_nybble(router, 0x74, pirq-1);
459} 443}
460 444
461static int 445static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
462pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
463{ 446{
464 WARN_ON_ONCE(pirq >= 9); 447 WARN_ON_ONCE(pirq >= 9);
465 if (pirq > 8) { 448 if (pirq > 8) {
@@ -481,8 +464,7 @@ pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
481 * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1, 464 * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1,
482 * and 0x03 for SMBus. 465 * and 0x03 for SMBus.
483 */ 466 */
484static int 467static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
485pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
486{ 468{
487 outb(pirq, 0xc00); 469 outb(pirq, 0xc00);
488 return inb(0xc01) & 0xf; 470 return inb(0xc01) & 0xf;
@@ -504,24 +486,20 @@ static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev,
504 * offset 0x56 0-3 PIRQA 4-7 PIRQB 486 * offset 0x56 0-3 PIRQA 4-7 PIRQB
505 * offset 0x57 0-3 PIRQC 4-7 PIRQD 487 * offset 0x57 0-3 PIRQC 4-7 PIRQD
506 */ 488 */
507static int 489static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
508pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
509{ 490{
510 u8 irq; 491 u8 irq;
511 irq = 0; 492 irq = 0;
512 if (pirq <= 4) 493 if (pirq <= 4)
513 irq = read_config_nybble(router, 0x56, pirq - 1); 494 irq = read_config_nybble(router, 0x56, pirq - 1);
514 printk(KERN_INFO 495 printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
515 "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
516 dev->vendor, dev->device, pirq, irq); 496 dev->vendor, dev->device, pirq, irq);
517 return irq; 497 return irq;
518} 498}
519 499
520static int 500static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
521pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
522{ 501{
523 printk(KERN_INFO 502 printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n",
524 "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n",
525 dev->vendor, dev->device, pirq, irq); 503 dev->vendor, dev->device, pirq, irq);
526 if (pirq <= 4) 504 if (pirq <= 4)
527 write_config_nybble(router, 0x56, pirq - 1, irq); 505 write_config_nybble(router, 0x56, pirq - 1, irq);
@@ -550,8 +528,7 @@ static int pirq_pico_set(struct pci_dev *router, struct pci_dev *dev, int pirq,
550 528
551#ifdef CONFIG_PCI_BIOS 529#ifdef CONFIG_PCI_BIOS
552 530
553static int 531static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
554pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
555{ 532{
556 struct pci_dev *bridge; 533 struct pci_dev *bridge;
557 int pin = pci_get_interrupt_pin(dev, &bridge); 534 int pin = pci_get_interrupt_pin(dev, &bridge);
@@ -560,14 +537,11 @@ pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
560 537
561#endif 538#endif
562 539
563static __init int 540static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
564intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
565{ 541{
566 static struct pci_device_id __initdata pirq_440gx[] = { 542 static struct pci_device_id __initdata pirq_440gx[] = {
567 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 543 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
568 PCI_DEVICE_ID_INTEL_82443GX_0) }, 544 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
569 { PCI_DEVICE(PCI_VENDOR_ID_INTEL,
570 PCI_DEVICE_ID_INTEL_82443GX_2) },
571 { }, 545 { },
572 }; 546 };
573 547
@@ -677,8 +651,7 @@ static __init int via_router_probe(struct irq_router *r,
677 return 0; 651 return 0;
678} 652}
679 653
680static __init int 654static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
681vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
682{ 655{
683 switch (device) { 656 switch (device) {
684 case PCI_DEVICE_ID_VLSI_82C534: 657 case PCI_DEVICE_ID_VLSI_82C534:
@@ -705,8 +678,7 @@ static __init int serverworks_router_probe(struct irq_router *r,
705 return 0; 678 return 0;
706} 679}
707 680
708static __init int 681static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
709sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
710{ 682{
711 if (device != PCI_DEVICE_ID_SI_503) 683 if (device != PCI_DEVICE_ID_SI_503)
712 return 0; 684 return 0;
@@ -717,8 +689,7 @@ sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
717 return 1; 689 return 1;
718} 690}
719 691
720static __init int 692static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
721cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
722{ 693{
723 switch (device) { 694 switch (device) {
724 case PCI_DEVICE_ID_CYRIX_5520: 695 case PCI_DEVICE_ID_CYRIX_5520:
@@ -730,8 +701,7 @@ cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
730 return 0; 701 return 0;
731} 702}
732 703
733static __init int 704static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
734opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
735{ 705{
736 switch (device) { 706 switch (device) {
737 case PCI_DEVICE_ID_OPTI_82C700: 707 case PCI_DEVICE_ID_OPTI_82C700:
@@ -743,8 +713,7 @@ opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
743 return 0; 713 return 0;
744} 714}
745 715
746static __init int 716static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
747ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
748{ 717{
749 switch (device) { 718 switch (device) {
750 case PCI_DEVICE_ID_ITE_IT8330G_0: 719 case PCI_DEVICE_ID_ITE_IT8330G_0:
@@ -756,8 +725,7 @@ ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
756 return 0; 725 return 0;
757} 726}
758 727
759static __init int 728static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
760ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
761{ 729{
762 switch (device) { 730 switch (device) {
763 case PCI_DEVICE_ID_AL_M1533: 731 case PCI_DEVICE_ID_AL_M1533:
@@ -771,8 +739,7 @@ ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
771 return 0; 739 return 0;
772} 740}
773 741
774static __init int 742static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
775amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
776{ 743{
777 switch (device) { 744 switch (device) {
778 case PCI_DEVICE_ID_AMD_VIPER_740B: 745 case PCI_DEVICE_ID_AMD_VIPER_740B:
@@ -792,8 +759,7 @@ amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
792 return 1; 759 return 1;
793} 760}
794 761
795static __init int 762static __init int pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
796pico_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
797{ 763{
798 switch (device) { 764 switch (device) {
799 case PCI_DEVICE_ID_PICOPOWER_PT86C523: 765 case PCI_DEVICE_ID_PICOPOWER_PT86C523:
@@ -1030,9 +996,8 @@ static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
1030 (!(pci_probe & PCI_USE_PIRQ_MASK) || \ 996 (!(pci_probe & PCI_USE_PIRQ_MASK) || \
1031 ((1 << dev2->irq) & mask))) { 997 ((1 << dev2->irq) & mask))) {
1032#ifndef CONFIG_PCI_MSI 998#ifndef CONFIG_PCI_MSI
1033 printk(KERN_INFO 999 printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
1034 "IRQ routing conflict for %s, have irq %d, want irq %d\n", 1000 pci_name(dev2), dev2->irq, irq);
1035 pci_name(dev2), dev2->irq, irq);
1036#endif 1001#endif
1037 continue; 1002 continue;
1038 } 1003 }
@@ -1098,23 +1063,18 @@ static void __init pcibios_fixup_irqs(void)
1098 * parent slot, and pin number. The SMP code detects such bridged 1063 * parent slot, and pin number. The SMP code detects such bridged
1099 * busses itself so we should get into this branch reliably. 1064 * busses itself so we should get into this branch reliably.
1100 */ 1065 */
1101 if (irq < 0 && dev->bus->parent) { 1066 if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
1102 /* go back to the bridge */
1103 struct pci_dev *bridge = dev->bus->self; 1067 struct pci_dev *bridge = dev->bus->self;
1104 1068
1105 pin = (pin + PCI_SLOT(dev->devfn)) % 4; 1069 pin = (pin + PCI_SLOT(dev->devfn)) % 4;
1106 irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 1070 irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number,
1107 PCI_SLOT(bridge->devfn), 1071 PCI_SLOT(bridge->devfn), pin);
1108 pin);
1109 if (irq >= 0) 1072 if (irq >= 0)
1110 printk(KERN_WARNING 1073 printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
1111 "PCI: using PPB %s[%c] to get irq %d\n", 1074 pci_name(bridge), 'A' + pin, irq);
1112 pci_name(bridge),
1113 'A' + pin, irq);
1114 } 1075 }
1115 if (irq >= 0) { 1076 if (irq >= 0) {
1116 printk(KERN_INFO 1077 printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
1117 "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
1118 pci_name(dev), 'A' + pin, irq); 1078 pci_name(dev), 'A' + pin, irq);
1119 dev->irq = irq; 1079 dev->irq = irq;
1120 } 1080 }
@@ -1180,7 +1140,7 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = {
1180 { } 1140 { }
1181}; 1141};
1182 1142
1183static int __init pcibios_irq_init(void) 1143int __init pcibios_irq_init(void)
1184{ 1144{
1185 DBG(KERN_DEBUG "PCI: IRQ init\n"); 1145 DBG(KERN_DEBUG "PCI: IRQ init\n");
1186 1146
@@ -1218,9 +1178,6 @@ static int __init pcibios_irq_init(void)
1218 return 0; 1178 return 0;
1219} 1179}
1220 1180
1221subsys_initcall(pcibios_irq_init);
1222
1223
1224static void pirq_penalize_isa_irq(int irq, int active) 1181static void pirq_penalize_isa_irq(int irq, int active)
1225{ 1182{
1226 /* 1183 /*
@@ -1259,19 +1216,15 @@ static int pirq_enable_irq(struct pci_dev *dev)
1259 if (io_apic_assign_pci_irqs) { 1216 if (io_apic_assign_pci_irqs) {
1260 int irq; 1217 int irq;
1261 1218
1262 irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, 1219 irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
1263 PCI_SLOT(dev->devfn), pin);
1264 /* 1220 /*
1265 * Busses behind bridges are typically not 1221 * Busses behind bridges are typically not listed in the MP-table.
1266 * listed in the MP-table. In this case we have 1222 * In this case we have to look up the IRQ based on the parent bus,
1267 * to look up the IRQ based on the parent bus, 1223 * parent slot, and pin number. The SMP code detects such bridged
1268 * parent slot, and pin number. The SMP code 1224 * busses itself so we should get into this branch reliably.
1269 * detects such bridged busses itself so we
1270 * should get into this branch reliably.
1271 */ 1225 */
1272 temp_dev = dev; 1226 temp_dev = dev;
1273 while (irq < 0 && dev->bus->parent) { 1227 while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
1274 /* go back to the bridge */
1275 struct pci_dev *bridge = dev->bus->self; 1228 struct pci_dev *bridge = dev->bus->self;
1276 1229
1277 pin = (pin + PCI_SLOT(dev->devfn)) % 4; 1230 pin = (pin + PCI_SLOT(dev->devfn)) % 4;