-ENOATTACHMENT (also a common issue...)
now fixed.
Jan
--
Best regards,
Dmitry Adamushko
diff -upr xenomai-SVN/include/nucleus/intr.h xenomai/include/nucleus/intr.h --- xenomai-SVN/include/nucleus/intr.h 2006-07-20 11:09:01.000000000 +0200 +++ xenomai/include/nucleus/intr.h 2006-08-29 21:20:19.000000000 +0200 @@ -43,6 +43,8 @@ typedef struct xnintr { #if defined(CONFIG_XENO_OPT_SHIRQ_LEVEL) || defined(CONFIG_XENO_OPT_SHIRQ_EDGE) struct xnintr *next; /* !< Next object in the IRQ-sharing chain. */ +#else + unsigned unhandled; /* !< Number of consequent unhandled interrupts */ #endif /* CONFIG_XENO_OPT_SHIRQ_LEVEL || CONFIG_XENO_OPT_SHIRQ_EDGE */ xnisr_t isr; /* !< Interrupt service routine. */ diff -upr xenomai-SVN/ksrc/nucleus/intr.c xenomai/ksrc/nucleus/intr.c --- xenomai-SVN/ksrc/nucleus/intr.c 2006-07-20 12:35:40.000000000 +0200 +++ xenomai/ksrc/nucleus/intr.c 2006-08-29 21:52:49.000000000 +0200 @@ -159,6 +159,8 @@ int xnintr_init(xnintr_t *intr, intr->flags = flags; #if defined(CONFIG_XENO_OPT_SHIRQ_LEVEL) || defined(CONFIG_XENO_OPT_SHIRQ_EDGE) intr->next = NULL; +#else + intr->unhandled = 0; #endif /* CONFIG_XENO_OPT_SHIRQ_LEVEL || CONFIG_XENO_OPT_SHIRQ_EDGE */ return 0; @@ -374,6 +376,7 @@ void xnintr_clock_handler(void) xnintr_irq_handler(nkclock.irq, &nkclock); } +#define XNINTR_MAX_UNHANDLED 1000 /* * Low-level interrupt handler dispatching the ISRs -- Called with * interrupts off. @@ -393,6 +396,14 @@ static void xnintr_irq_handler(unsigned s = intr->isr(intr); ++intr->hits; + if (unlikely(s == XN_ISR_NONE && ++intr->unhandled == XNINTR_MAX_UNHANDLED)) { + xnlogerr("xnintr_check_status: %d of unhandled consequent interrupts. " + "Disabling the IRQ line #%d\n", + XNINTR_MAX_UNHANDLED, irq); + s |= XN_ISR_NOENABLE; + } else + intr->unhandled = 0; + if (s & XN_ISR_PROPAGATE) xnarch_chain_irq(irq); else if (!(s & XN_ISR_NOENABLE)) @@ -422,6 +433,7 @@ static void xnintr_irq_handler(unsigned typedef struct xnintr_shirq { xnintr_t *handlers; + int unhandled; #ifdef CONFIG_SMP atomic_counter_t active; #endif /* CONFIG_SMP */ @@ -482,12 +494,21 @@ static void xnintr_shirq_handler(unsigne intr = shirq->handlers; while (intr) { - s |= intr->isr(intr) & XN_ISR_BITMASK; + s |= intr->isr(intr); ++intr->hits; intr = intr->next; } + xnintr_shirq_unlock(shirq); + if (unlikely(s == XN_ISR_NONE && ++shirq->unhandled == XNINTR_MAX_UNHANDLED)) { + xnlogerr("xnintr_irq_handler: %d of unhandled consequent interrupts. " + "Disabling the IRQ line #%d\n", + XNINTR_MAX_UNHANDLED, irq); + s |= XN_ISR_NOENABLE; + } else + shirq->unhandled = 0; + if (s & XN_ISR_PROPAGATE) xnarch_chain_irq(irq); else if (!(s & XN_ISR_NOENABLE)) @@ -527,16 +548,15 @@ static void xnintr_edge_shirq_handler(un intr = shirq->handlers; while (intr != end) { - int ret, code, bits; + int ret, code; ret = intr->isr(intr); code = ret & ~XN_ISR_BITMASK; - bits = ret & XN_ISR_BITMASK; + s |= ret; if (code == XN_ISR_HANDLED) { ++intr->hits; end = NULL; - s |= bits; } else if (code == XN_ISR_NONE && end == NULL) end = intr; @@ -554,6 +574,14 @@ static void xnintr_edge_shirq_handler(un ("xnintr_edge_shirq_handler() : failed to get the IRQ%d line free.\n", irq); + if (unlikely(s == XN_ISR_NONE && ++shirq->unhandled == XNINTR_MAX_UNHANDLED)) { + xnlogerr("xnintr_irq_handler: %d of unhandled consequent interrupts. " + "Disabling the IRQ line #%d\n", + XNINTR_MAX_UNHANDLED, irq); + s |= XN_ISR_NOENABLE; + } else + shirq->unhandled = 0; + if (s & XN_ISR_PROPAGATE) xnarch_chain_irq(irq); else if (!(s & XN_ISR_NOENABLE)) @@ -613,6 +641,7 @@ static int xnintr_shirq_attach(xnintr_t handler = &xnintr_edge_shirq_handler; #endif /* CONFIG_XENO_OPT_SHIRQ_EDGE */ } + shirq->unhandled = 0; err = xnarch_hook_irq(intr->irq, handler, intr->iack, intr); if (err)
_______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core