Commit 80a56ab6 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parent bdba4d6b
...@@ -744,16 +744,16 @@ static void psycho_register_error_handlers(struct pci_pbm_info *pbm) ...@@ -744,16 +744,16 @@ static void psycho_register_error_handlers(struct pci_pbm_info *pbm)
* the second will just error out since we do not pass in * the second will just error out since we do not pass in
* IRQF_SHARED. * IRQF_SHARED.
*/ */
err = request_irq(op->irqs[1], psycho_ue_intr, 0, err = request_irq(op->irqs[1], psycho_ue_intr, IRQF_SHARED,
"PSYCHO_UE", pbm); "PSYCHO_UE", pbm);
err = request_irq(op->irqs[2], psycho_ce_intr, 0, err = request_irq(op->irqs[2], psycho_ce_intr, IRQF_SHARED,
"PSYCHO_CE", pbm); "PSYCHO_CE", pbm);
/* This one, however, ought not to fail. We can just warn /* This one, however, ought not to fail. We can just warn
* about it since the system can still operate properly even * about it since the system can still operate properly even
* if this fails. * if this fails.
*/ */
err = request_irq(op->irqs[0], psycho_pcierr_intr, 0, err = request_irq(op->irqs[0], psycho_pcierr_intr, IRQF_SHARED,
"PSYCHO_PCIERR", pbm); "PSYCHO_PCIERR", pbm);
if (err) if (err)
printk(KERN_WARNING "%s: Could not register PCIERR, " printk(KERN_WARNING "%s: Could not register PCIERR, "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment