[rtems commit] bsp/virtex: Fix interrupt handling

Sebastian Huber sebh at rtems.org
Tue Jul 9 14:36:12 UTC 2013


Module:    rtems
Branch:    master
Commit:    296b60d72a7587d95d6e561bdb2b5a56a0961362
Changeset: http://git.rtems.org/rtems/commit/?id=296b60d72a7587d95d6e561bdb2b5a56a0961362

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jul  9 16:04:04 2013 +0200

bsp/virtex: Fix interrupt handling

Some modules like the XPS UART Lite use event triggered interrupts.  If
we acknowledge the interrupts after the interrupt service we may loose
these events.

---

 c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c |   14 +++++---------
 1 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
index d5fd79d..715dbd6 100644
--- a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
+++ b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
@@ -81,11 +81,13 @@ static void BSP_irq_disable_at_opbintc (rtems_irq_number irqnum)
  */
 static void BSP_irq_handle_at_opbintc(void)
 {
-  uint32_t ipr, mask, i, c;
+  uint32_t ipr, i, c;
+
+  /* Get pending interrupts */
   ipr = get_ipr();
 
-  c = 0;
-  mask = 0;
+  /* Acknowledge all pending interrupts now and service them afterwards */
+  set_iar(ipr);
 
   for (i = 0;
        (i < BSP_OPBINTC_PER_IRQ_NUMBER)
@@ -95,17 +97,11 @@ static void BSP_irq_handle_at_opbintc(void)
 
     if ((ipr & c) != 0) {
       /* interrupt is asserted */
-      mask |= c;
       ipr &= ~c;
 
       bsp_interrupt_handler_dispatch(i+BSP_OPBINTC_IRQ_LOWEST_OFFSET);
     }
   }
-
-  if (mask) {
-    /* ack all the interrupts we serviced */
-    set_iar(mask);
-  }
 }
 
 /*




More information about the vc mailing list