From 5981b152de1bfac22c650b1f63d793eab46fa40c Mon Sep 17 00:00:00 2001 From: Shaun Ruffell Date: Fri, 16 May 2014 01:47:13 -0500 Subject: [PATCH] wctc4xxp: Handle all known interrupts regardless of mask. When switching to polling mode it was possible that we would mask off the receive complete interrupt until the next timer fired. Now go ahead and handle anything we know how to handle regardless of the current mask. Also, no need to update the reg local anymore since it isn't used to ack any interrupts. We now always ack all the interrupts first and inspect them all. Signed-off-by: Shaun Ruffell Signed-off-by: Russ Meyerriecks --- drivers/dahdi/wctc4xxp/base.c | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/drivers/dahdi/wctc4xxp/base.c b/drivers/dahdi/wctc4xxp/base.c index 6959d91..006ab49 100644 --- a/drivers/dahdi/wctc4xxp/base.c +++ b/drivers/dahdi/wctc4xxp/base.c @@ -2670,7 +2670,9 @@ DAHDI_IRQ_HANDLER(wctc4xxp_interrupt) { struct wcdte *wc = dev_id; u32 ints; - u32 reg; +#define NORMAL_INTERRUPT_SUMMARY (1<<16) +#define ABNORMAL_INTERRUPT_SUMMARY (1<<15) + #define TX_COMPLETE_INTERRUPT 0x00000001 #define RX_COMPLETE_INTERRUPT 0x00000040 #define TIMER_INTERRUPT (1<<11) @@ -2680,25 +2682,16 @@ DAHDI_IRQ_HANDLER(wctc4xxp_interrupt) /* Read and clear interrupts */ ints = __wctc4xxp_getctl(wc, 0x0028); - ints &= wc->intmask; - - if (!ints) + if (!(ints & (NORMAL_INTERRUPT_SUMMARY|ABNORMAL_INTERRUPT_SUMMARY))) return IRQ_NONE; + /* Clear all the pending interrupts. */ + __wctc4xxp_setctl(wc, 0x0028, ints); + if (likely(ints & NORMAL_INTERRUPTS)) { - reg = 0; - if (ints & TX_COMPLETE_INTERRUPT) - reg |= TX_COMPLETE_INTERRUPT; - if (ints & RX_COMPLETE_INTERRUPT) { + if (ints & (RX_COMPLETE_INTERRUPT | TIMER_INTERRUPT)) wctc4xxp_handle_receive_ring(wc); - reg |= RX_COMPLETE_INTERRUPT; - } - - if (ints & TIMER_INTERRUPT) { - wctc4xxp_handle_receive_ring(wc); - reg |= TIMER_INTERRUPT; - } #if DEFERRED_PROCESSING == WORKQUEUE schedule_work(&wc->deferred_work); @@ -2709,7 +2702,6 @@ DAHDI_IRQ_HANDLER(wctc4xxp_interrupt) #error "Define a deferred processing function in kernel/wctc4xxp/wctc4xxp.h" #endif - __wctc4xxp_setctl(wc, 0x0028, reg); } else { if ((ints & 0x00008000) && debug) dev_info(&wc->pdev->dev, "Abnormal Interrupt.\n"); @@ -2736,9 +2728,6 @@ DAHDI_IRQ_HANDLER(wctc4xxp_interrupt) dev_info(&wc->pdev->dev, "Transmit Processor Stopped INT\n"); } - - /* Clear all the pending interrupts. */ - __wctc4xxp_setctl(wc, 0x0028, ints); } return IRQ_HANDLED; }