diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-09 16:04:04 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-07-09 16:42:00 +0200 |
commit | 296b60d72a7587d95d6e561bdb2b5a56a0961362 (patch) | |
tree | ef46caad9c582d11640477e5b36348664130ef5e | |
parent | bsps/powerpc: Add ppc_count_leading_zeros() (diff) | |
download | rtems-296b60d72a7587d95d6e561bdb2b5a56a0961362.tar.bz2 |
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.
-rw-r--r-- | 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 d5fd79dd7b..715dbd64fa 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); - } } /* |