diff --git a/drivers/char/ip2/ip2main.c b/drivers/char/ip2/ip2main.c index 150e1e364ca7..e04e66cf2c68 100644 --- a/drivers/char/ip2/ip2main.c +++ b/drivers/char/ip2/ip2main.c @@ -752,7 +752,7 @@ retry: continue; rc = request_irq( ip2config.irq[i], ip2_interrupt, IP2_SA_FLAGS | (ip2config.type[i] == PCI ? IRQF_SHARED : 0), - pcName, (void *)&pcName); + pcName, i2BoardPtrTable[i]); if (rc) { printk(KERN_ERR "IP2: an request_irq failed: error %d\n",rc); ip2config.irq[i] = CIR_POLL; @@ -1191,12 +1191,12 @@ ip2_irq_work(i2eBordStrPtr pB) #endif /* USE_IQI */ } -static irqreturn_t -ip2_interrupt(int irq, void *dev_id) +static void +ip2_polled_interrupt(void) { int i; i2eBordStrPtr pB; - int handled = 0; + const int irq = 0; ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, irq ); @@ -1208,7 +1208,6 @@ ip2_interrupt(int irq, void *dev_id) // IRQ = 0 for polled boards, we won't poll "IRQ" boards if ( pB && (pB->i2eUsingIrq == irq) ) { - handled = 1; ip2_irq_work(pB); } } @@ -1216,7 +1215,21 @@ ip2_interrupt(int irq, void *dev_id) ++irq_counter; ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 ); - return IRQ_RETVAL(handled); +} + +static irqreturn_t +ip2_interrupt(int irq, void *dev_id) +{ + i2eBordStrPtr pB = dev_id; + + ip2trace (ITRC_NO_PORT, ITRC_INTR, 99, 1, pB->i2eUsingIrq ); + + ip2_irq_work(pB); + + ++irq_counter; + + ip2trace (ITRC_NO_PORT, ITRC_INTR, ITRC_RETURN, 0 ); + return IRQ_HANDLED; } /******************************************************************************/ @@ -1239,7 +1252,7 @@ ip2_poll(unsigned long arg) // Just polled boards, IRQ = 0 will hit all non-interrupt boards. // It will NOT poll boards handled by hard interrupts. // The issue of queued BH interrups is handled in ip2_interrupt(). - ip2_interrupt(0, NULL); + ip2_polled_interrupt(); PollTimer.expires = POLL_TIMEOUT; add_timer( &PollTimer );