- /* Do nothing unless ISR has been triggered */
- if ( ! undinet_isr_triggered() )
- return;
-
- /* See if this was our interrupt */
- memset ( &undi_isr, 0, sizeof ( undi_isr ) );
- undi_isr.FuncFlag = PXENV_UNDI_ISR_IN_START;
- if ( ( rc = undinet_call ( undinic, PXENV_UNDI_ISR, &undi_isr,
- sizeof ( undi_isr ) ) ) != 0 )
- return;
- if ( undi_isr.FuncFlag != PXENV_UNDI_ISR_OUT_OURS )
- return;
-
- /* Send EOI */
- send_eoi ( undinic->irq );
+ if ( ! undinic->isr_processing ) {
+ /* Do nothing unless ISR has been triggered */
+ if ( ! undinet_isr_triggered() )
+ return;
+
+ /* See if this was our interrupt */
+ memset ( &undi_isr, 0, sizeof ( undi_isr ) );
+ undi_isr.FuncFlag = PXENV_UNDI_ISR_IN_START;
+ if ( ( rc = undinet_call ( undinic, PXENV_UNDI_ISR, &undi_isr,
+ sizeof ( undi_isr ) ) ) != 0 )
+ return;
+ if ( undi_isr.FuncFlag != PXENV_UNDI_ISR_OUT_OURS )
+ return;
+
+ /* Send EOI */
+ send_eoi ( undinic->irq );
+
+ /* Start ISR processing */
+ undinic->isr_processing = 1;
+ undi_isr.FuncFlag = PXENV_UNDI_ISR_IN_PROCESS;
+ } else {
+ /* Continue ISR processing */
+ undi_isr.FuncFlag = PXENV_UNDI_ISR_IN_GET_NEXT;
+ }