linux/arch/sparc
David S. Miller d0cac39e4e sparc64: Fix lost interrupts on sun4u.
Based upon a report by Meelis Roos.

Sparc64 SBUS and PCI controllers use a combination of IMAP and ICLR
registers to manage device interrupts.

The IMAP register contains the "valid" enable bit as well as CPU
targetting information.  Whereas the ICLR register is written with
zero at the end of handling an interrupt to reset the state machine
for that interrupt to IDLE so it can be sent again.

For PCI slot and SBUS slot devices we can have multiple interrupts
sharing the same IMAP register.  There are individual ICLR registers
but only one IMAP register for managing those.

We represent each shared case with individual virtual IRQs so the
generic IRQ layer thinks there is only one user of the IRQ instance.

In such shared IMAP cases this is wrong, so if there are multiple
active users then a free_irq() call will prematurely turn off the
interrupt by clearing the Valid bit in the IMAP register even though
there are other active users.

Fix this by simply doing nothing in sun4u_disable_irq() and checking
IRQF_DISABLED during IRQ dispatch.

This situation doesn't exist in the hypervisor sun4v cases, so I left
those alone.

Tested-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: David S. Miller <davem@davemloft.net>
2009-03-04 14:43:47 -08:00
..
boot sparc,sparc64: unify boot/ 2008-12-04 09:17:21 -08:00
configs eeprom: More consistent symbol names 2009-01-26 21:19:57 +01:00
include/asm sparc64: Implement NMI watchdog on capable cpus. 2009-01-30 00:03:53 -08:00
kernel sparc64: Fix lost interrupts on sun4u. 2009-03-04 14:43:47 -08:00
lib sparc64: Fix probe_kernel_{read,write}(). 2009-02-08 22:32:31 -08:00
math-emu sparc64: unify math-emu 2008-12-04 09:16:56 -08:00
mm sparc64: Kill bogus TPC/address truncation during 32-bit faults. 2009-02-03 16:28:23 -08:00
oprofile sparc64: Implement NMI watchdog on capable cpus. 2009-01-30 00:03:53 -08:00
prom sparc: Eliminate PROMLIB_INTERNAL as it does nothing 2009-01-08 16:59:01 -08:00
Kconfig [CVE-2009-0029] sparc: Enable syscall wrappers for 64-bit 2009-01-19 20:21:49 -08:00
Kconfig.debug sparc: unify Kconfig.debug 2008-12-04 09:16:48 -08:00
Makefile sparc: unify kernel/init_task 2008-12-04 13:28:09 -08:00