Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

powerpc: Fix i8259 cascade on pSeries with XICS interrupt controller

It turns out that commit f9bd170a87948a9e077149b70fb192c563770fdf
broke the cascade from XICS to i8259 on pSeries machines; specifically
we ended up not ever doing the EOI on the XICS for the cascade. The
result was that interrupts from the serial ports (and presumably any
other devices using ISA interrupts) didn't get through. This fixes
it and also simplifies the code, by doing the EOI on the XICS in the
xics_get_irq routine after reading and acking the interrupt on the
i8259.

Signed-off-by: Paul Mackerras <paulus@samba.org>

+3 -18
+3 -18
arch/powerpc/platforms/pseries/xics.c
··· 48 48 .set_affinity = xics_set_affinity 49 49 }; 50 50 51 - static struct hw_interrupt_type xics_8259_pic = { 52 - .typename = " XICS/8259", 53 - .ack = xics_mask_and_ack_irq, 54 - }; 55 - 56 51 /* This is used to map real irq numbers to virtual */ 57 52 static struct radix_tree_root irq_map = RADIX_TREE_INIT(GFP_ATOMIC); 58 53 ··· 362 367 /* for sanity, this had better be < NR_IRQS - 16 */ 363 368 if (vec == xics_irq_8259_cascade_real) { 364 369 irq = i8259_irq(regs); 365 - if (irq == -1) { 366 - /* Spurious cascaded interrupt. Still must ack xics */ 367 - xics_end_irq(irq_offset_up(xics_irq_8259_cascade)); 368 - 369 - irq = -1; 370 - } 370 + xics_end_irq(irq_offset_up(xics_irq_8259_cascade)); 371 371 } else if (vec == XICS_IRQ_SPURIOUS) { 372 372 irq = -1; 373 373 } else { ··· 532 542 xics_irq_8259_cascade_real = *ireg; 533 543 xics_irq_8259_cascade 534 544 = virt_irq_create_mapping(xics_irq_8259_cascade_real); 545 + i8259_init(0, 0); 535 546 of_node_put(np); 536 547 } 537 548 ··· 556 565 #endif /* CONFIG_SMP */ 557 566 } 558 567 559 - xics_8259_pic.enable = i8259_pic.enable; 560 - xics_8259_pic.disable = i8259_pic.disable; 561 - xics_8259_pic.end = i8259_pic.end; 562 - for (i = 0; i < 16; ++i) 563 - get_irq_desc(i)->handler = &xics_8259_pic; 564 - for (; i < NR_IRQS; ++i) 568 + for (i = irq_offset_value(); i < NR_IRQS; ++i) 565 569 get_irq_desc(i)->handler = &xics_pic; 566 570 567 571 xics_setup_cpu(); ··· 576 590 no_action, 0, "8259 cascade", NULL)) 577 591 printk(KERN_ERR "xics_setup_i8259: couldn't get 8259 " 578 592 "cascade\n"); 579 - i8259_init(0, 0); 580 593 } 581 594 return 0; 582 595 }