be2net: fix spurious interrupt handling in intx mode
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>
This commit is contained in:
parent
7d3cabbcc8
commit
c001c213b1
2 changed files with 13 additions and 7 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue