Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d782f33d authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 1def630a
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -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);