forked from Imagelibrary/rtems
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.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user