]> git.kernelconcepts.de Git - karo-tx-linux.git/commit
sparc64: Fix wedged irq regression.
authorDavid S. Miller <davem@davemloft.net>
Sat, 26 Apr 2008 09:19:18 +0000 (02:19 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 15 May 2008 14:50:01 +0000 (07:50 -0700)
commita5f56179c861a23a2f08409711926ff812f30d38
treefa63c9dd56350514cfbf2c9e91993b9bd0091a6c
parent8f84dbc5ad1a37fe14a771f756beaa02b04401e6
sparc64: Fix wedged irq regression.

[ Upstream commit: 92aa3573c9cd58fe0bcd1c52c9fd8f5708785917 ]

Kernel bugzilla 10273

As reported by Jos van der Ende, ever since commit
5a606b72a4309a656cd1a19ad137dc5557c4b8ea ("[SPARC64]: Do not ACK an
INO if it is disabled or inprogress.") sun4u interrupts
can get stuck.

What this changset did was add the following conditional to
the various IRQ chip ->enable() handlers on sparc64:

if (unlikely(desc->status & (IRQ_DISABLED|IRQ_INPROGRESS)))
return;

which is correct, however it means that special care is needed
in the ->enable() method.

Specifically we must put the interrupt into IDLE state during
an enable, or else it might never be sent out again.

Setting the INO interrupt state to IDLE resets the state machine,
the interrupt input to the INO is retested by the hardware, and
if an interrupt is being signalled by the device, the INO
moves back into TRANSMIT state, and an interrupt vector is sent
to the cpu.

The two sun4v IRQ chip handlers were already doing this properly,
only sun4u got it wrong.

Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
arch/sparc64/kernel/irq.c