Re: better leve triggered IRQ management needed
From: Russell King
Date: Mon Apr 24 2006 - 15:15:57 EST
On Mon, Apr 24, 2006 at 12:02:47PM -0700, Linus Torvalds wrote:
> On Mon, 24 Apr 2006, Stephen Hemminger wrote:
> > We should fail request_irq() if the SA_SHIRQ but the irq is edge-triggered.
> That would be HORRIBLE.
> Edge-triggered works perfectly fine for SA_SHIRQ, as long as there is just
> one user and the driver is properly written. Making request_irq() fail
> would break existing and working setups.
Sorry, untrue. If you take a serial port and a network card on the same
edge triggered interrupt line, take the following sequence of events:
1. serial port receives characters, asserts interrupt.
2. interrupt handlers get called, serial starts reading characters from
the port. Interrupt does not change state because there's still
characters in the FIFO to be read.
3. meanwhile, the network interface receives a packet and asserts it's
interrupt. Interrupt does not change state since it's already asserted.
4. serial interrupt handler continues to service serial ports until it is
damned sure all serial ports have released the interrupt line, and
returns. Interrupt does not change state because the network device
is holding it asserted.
5. network interrupt handler gets invoked next (it's next in the chain)
but hasn't acknowledged the interrupt. Hence, the interrupt line has
remained asserted since step 1.
6. serial port receives another character, asserting it's interrupt output.
7. network interrupt handler services network device. Network device is
no longer holding the interrupt line in the asserted state. But the
serial device is, so still no change in interrupt line state since
8. all handlers complete, kernel returns to foreground task.
9. No further serial or network interrupts because there's _no_ edge to
trigger the interrupt. Your serial and network are dead.
If you allow shared interrupts, no matter how hard you try in a driver,
you can NOT get around this problem. It has to be handled at a higher
Linux kernel 2.6 ARM Linux - http://www.arm.linux.org.uk/
maintainer of: 2.6 Serial core
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/