public inbox for linux-m68k@lists.linux-m68k.org
 help / color / mirror / Atom feed
* [PATCH 09/17] [m68k] IRQ: add handle_polled_irq() for timer based soft interrupts
@ 2013-01-31  0:23 Michael Schmitz
  2013-02-10 10:36 ` Geert Uytterhoeven
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Schmitz @ 2013-01-31  0:23 UTC (permalink / raw)
  To: linux-m68k; +Cc: geert

[PATCH 09/17] [m68k] IRQ: add handle_polled_irq() for timer based soft interrupts -
        experimental hack to avoid unhandled interrupt timer to fire
        on EtherNEC/NetUSBee cards that have no hardware interrupt
        and need to be polled from a timer

This patch adds a special 'polled interrupt' handler for timer based software interrupts.

handle_simple_irq() will respond to excessive unhandled interrupts (as are expected for a
polling timer interrupt) by disabling the apparently unhandled interrupt source.

handle_polled_irq() prevents this by setting the IRQS_POLL_INPROGRESS flag which will cause
the unhandled interrupt events to be ignored.

This is a temporary hack to allow timer based polling of the Atari ROM port network and USB
cards only. Suggestions on how to properly handle this in the normal interrupt framework are
most welcome.

Signed-off-by: Michael Schmitz <schmitz@debian.org>
---
 include/linux/irq.h |    1 +
 kernel/irq/chip.c   |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/include/linux/irq.h b/include/linux/irq.h
index fdf2c4a..39bfcff 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -407,6 +407,7 @@ extern void handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_edge_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_edge_eoi_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_simple_irq(unsigned int irq, struct irq_desc *desc);
+extern void handle_polled_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_percpu_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
 extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 3aca9f2..ae7ef4d 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -339,6 +339,42 @@ out_unlock:
 }
 EXPORT_SYMBOL_GPL(handle_simple_irq);
 
+/**
+ *	handle_polled_irq - Simple and software-decoded IRQs.
+ *	@irq:	the interrupt number
+ *	@desc:	the interrupt description structure for this irq
+ *
+ *	Polled interrupts are sent from a demultiplexing software interrupt
+ *	handler, where no interrupt hardware control is necessary.
+ */
+void
+handle_polled_irq(unsigned int irq, struct irq_desc *desc)
+{
+	raw_spin_lock(&desc->lock);
+
+	if (unlikely(irqd_irq_inprogress(&desc->irq_data)))
+		if (!irq_check_poll(desc))
+			goto out_unlock;
+
+	desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);
+	kstat_incr_irqs_this_cpu(irq, desc);
+
+	if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
+		desc->istate |= IRQS_PENDING;
+		goto out_unlock;
+	}
+
+	desc->istate |= IRQS_POLL_INPROGRESS;
+
+	handle_irq_event(desc);
+
+	desc->istate &= ~(IRQS_POLL_INPROGRESS);
+
+out_unlock:
+	raw_spin_unlock(&desc->lock);
+}
+EXPORT_SYMBOL_GPL(handle_polled_irq);
+
 /*
  * Called unconditionally from handle_level_irq() and only for oneshot
  * interrupts from handle_fasteoi_irq()
-- 
1.7.0.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-11-13  7:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-01-31  0:23 [PATCH 09/17] [m68k] IRQ: add handle_polled_irq() for timer based soft interrupts Michael Schmitz
2013-02-10 10:36 ` Geert Uytterhoeven
2013-03-20  8:54   ` Geert Uytterhoeven
2013-11-06 11:30     ` Thomas Gleixner
2013-11-07  7:59       ` Michael Schmitz
2013-11-10  8:33       ` Michael Schmitz
2013-11-12 19:08         ` Thomas Gleixner
2013-11-13  7:57           ` Michael Schmitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox