aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2008-09-12 18:13:15 -0400
committerDavid S. Miller <davem@davemloft.net>2008-09-12 18:13:15 -0400
commit80a56ab626c70468be92e74cf3d288ffaed23fdb (patch)
tree8c669bbc8252ad013a5f04296afbb8d5e33f05fc
parentbdba4d6b77fcc76f206986d7cc55f1feb20301f8 (diff)
sparc64: Fix PCI error interrupt registry on PSYCHO.
We need to pass IRQF_SHARED, otherwise we get things like: IRQ handler type mismatch for IRQ 33 current handler: PSYCHO_UE Call Trace: [000000000048394c] request_irq+0xac/0x120 [00000000007c5f6c] psycho_scan_bus+0x98/0x158 [00000000007c2bc0] pcibios_init+0xdc/0x12c [0000000000426a5c] do_one_initcall+0x1c/0x160 [00000000007c0180] kernel_init+0x9c/0xfc [0000000000427050] kernel_thread+0x30/0x60 [00000000006ae1d0] rest_init+0x10/0x60 on e3500 and similar systems. On a single board, the UE interrupts of two Psycho nodes are funneled through the same interrupt, from of_debug=3 dump: /pci@b,4000: direct translate 2ee --> 21 ... /pci@b,2000: direct translate 2ee --> 21 Decimal "33" mentioned above is the hex "21" mentioned here. Thanks to Meelis Roos for dumps and testing. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--arch/sparc64/kernel/pci_psycho.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c
index ef5fe29202c2..e205ade69cfc 100644
--- a/arch/sparc64/kernel/pci_psycho.c
+++ b/arch/sparc64/kernel/pci_psycho.c
@@ -744,16 +744,16 @@ static void psycho_register_error_handlers(struct pci_pbm_info *pbm)
744 * the second will just error out since we do not pass in 744 * the second will just error out since we do not pass in
745 * IRQF_SHARED. 745 * IRQF_SHARED.
746 */ 746 */
747 err = request_irq(op->irqs[1], psycho_ue_intr, 0, 747 err = request_irq(op->irqs[1], psycho_ue_intr, IRQF_SHARED,
748 "PSYCHO_UE", pbm); 748 "PSYCHO_UE", pbm);
749 err = request_irq(op->irqs[2], psycho_ce_intr, 0, 749 err = request_irq(op->irqs[2], psycho_ce_intr, IRQF_SHARED,
750 "PSYCHO_CE", pbm); 750 "PSYCHO_CE", pbm);
751 751
752 /* This one, however, ought not to fail. We can just warn 752 /* This one, however, ought not to fail. We can just warn
753 * about it since the system can still operate properly even 753 * about it since the system can still operate properly even
754 * if this fails. 754 * if this fails.
755 */ 755 */
756 err = request_irq(op->irqs[0], psycho_pcierr_intr, 0, 756 err = request_irq(op->irqs[0], psycho_pcierr_intr, IRQF_SHARED,
757 "PSYCHO_PCIERR", pbm); 757 "PSYCHO_PCIERR", pbm);
758 if (err) 758 if (err)
759 printk(KERN_WARNING "%s: Could not register PCIERR, " 759 printk(KERN_WARNING "%s: Could not register PCIERR, "