diff options
| author | David S. Miller <davem@davemloft.net> | 2008-09-12 18:13:15 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-09-12 18:13:15 -0400 |
| commit | 80a56ab626c70468be92e74cf3d288ffaed23fdb (patch) | |
| tree | 8c669bbc8252ad013a5f04296afbb8d5e33f05fc | |
| parent | bdba4d6b77fcc76f206986d7cc55f1feb20301f8 (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.c | 6 |
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, " |
