Skip to content

Commit

Permalink
be2net: fix spurious interrupt handling in intx mode
Browse files Browse the repository at this point in the history
Occasionally we may see an interrupt without an event in the eq.
In intx, we currently see the event queue and return IRQ_NONE causing
a the irq to be disabled ("no one cared".) Instead, read the CEV_ISR
reg to check the existence of the interrupt.

Signed-off-by: Sathya Perla <sathyap@serverengines.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Sathya Perla authored and David S. Miller committed Jul 4, 2009
1 parent 7d3cabb commit c001c21
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 7 deletions.
4 changes: 4 additions & 0 deletions drivers/net/benet/be_hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@
#define MEMBAR_CTRL_INT_CTRL_PFUNC_MASK 0x7 /* bits 26 - 28 */
#define MEMBAR_CTRL_INT_CTRL_PFUNC_SHIFT 26

/********* ISR0 Register offset **********/
#define CEV_ISR0_OFFSET 0xC18
#define CEV_ISR_SIZE 4

/********* Event Q door bell *************/
#define DB_EQ_OFFSET DB_CQ_OFFSET
#define DB_EQ_RING_ID_MASK 0x1FF /* bits 0 - 8 */
Expand Down
16 changes: 9 additions & 7 deletions drivers/net/benet/be_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1274,15 +1274,17 @@ static irqreturn_t be_intx(int irq, void *dev)
{
struct be_adapter *adapter = dev;
struct be_ctrl_info *ctrl = &adapter->ctrl;
int rx, tx;
int isr;

tx = event_handle(ctrl, &adapter->tx_eq);
rx = event_handle(ctrl, &adapter->rx_eq);
isr = ioread32(ctrl->csr + CEV_ISR0_OFFSET +
ctrl->pci_func * CEV_ISR_SIZE);
if (!isr)
return IRQ_NONE;

if (rx || tx)
return IRQ_HANDLED;
else
return IRQ_NONE;
event_handle(ctrl, &adapter->tx_eq);
event_handle(ctrl, &adapter->rx_eq);

return IRQ_HANDLED;
}

static irqreturn_t be_msix_rx(int irq, void *dev)
Expand Down

0 comments on commit c001c21

Please sign in to comment.