On Thu, Jan 31, 2013 at 1:23 AM, Michael Schmitz <schmitz...@gmail.com> wrote: > [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.
Adding Thomas and lkml. > 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 <schm...@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 Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/