From 296b60d72a7587d95d6e561bdb2b5a56a0961362 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 9 Jul 2013 16:04:04 +0200 Subject: 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 file 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); - } } /* -- cgit v1.2.3