[ARM] Fix Neponset IRQ handling
While testing the genirq code on ARM, a condition was found whereby the Neponset IRQ handler was being re-entered, causing the system to deadlock. Under the ARM IRQ code, this would not have been a visible problem because the "simple" IRQ handling had no re-entrancy protection. Resolve this by acknowledging the parent interrupt after we mask it when we are going to handle one of our "special" level-based sources (from ethernet or USAR chip.) Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
1def630a6a
commit
d782f33df7
1 changed files with 8 additions and 0 deletions
|
@ -59,6 +59,14 @@ neponset_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *reg
|
||||||
if (irr & (IRR_ETHERNET | IRR_USAR)) {
|
if (irr & (IRR_ETHERNET | IRR_USAR)) {
|
||||||
desc->chip->mask(irq);
|
desc->chip->mask(irq);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ack the interrupt now to prevent re-entering
|
||||||
|
* this neponset handler. Again, this is safe
|
||||||
|
* since we'll check the IRR register prior to
|
||||||
|
* leaving.
|
||||||
|
*/
|
||||||
|
desc->chip->ack(irq);
|
||||||
|
|
||||||
if (irr & IRR_ETHERNET) {
|
if (irr & IRR_ETHERNET) {
|
||||||
d = irq_desc + IRQ_NEPONSET_SMC9196;
|
d = irq_desc + IRQ_NEPONSET_SMC9196;
|
||||||
desc_handle_irq(IRQ_NEPONSET_SMC9196, d, regs);
|
desc_handle_irq(IRQ_NEPONSET_SMC9196, d, regs);
|
||||||
|
|
Loading…
Reference in a new issue