Skip to content

Commit

Permalink
atl1: do not drop rx/tx interrupts before they are scheduled
Browse files Browse the repository at this point in the history
To prevent interrupts lost they should be dropped only if
they are scheduled via napi interfaces. In other case, there is
exists situation when napi handler process TX interrupt, stay in
RX processing and in that moment any other interrupt received.
Then before this patch TX bit in ISR will be cleaned, napi
schedule will not occur in case of currently processing event and
TX interrupt definitely will be lost.

Signed-off-by: Tony Zelenoff <antonz@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Tony Zelenoff authored and David S. Miller committed Apr 15, 2012
1 parent 2a9bc71 commit 136cd14
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions drivers/net/ethernet/atheros/atlx/atl1.c
Original file line number Diff line number Diff line change
Expand Up @@ -2504,8 +2504,12 @@ static irqreturn_t atl1_intr(int irq, void *data)
if (!status)
return IRQ_NONE;

/* clear CMB interrupt status at once */
adapter->cmb.cmb->int_stats = 0;
/* clear CMB interrupt status at once,
* but leave rx/tx interrupt status in case it should be dropped
* only if rx/tx processing queued. In other case interrupt
* can be lost.
*/
adapter->cmb.cmb->int_stats = status & (ISR_CMB_TX | ISR_CMB_RX);

if (status & ISR_GPHY) /* clear phy status */
atlx_clear_phy_int(adapter);
Expand Down Expand Up @@ -2547,8 +2551,10 @@ static irqreturn_t atl1_intr(int irq, void *data)
}

/* transmit or receive event */
if (status & (ISR_CMB_TX | ISR_CMB_RX))
atl1_sched_rings_clean(adapter);
if (status & (ISR_CMB_TX | ISR_CMB_RX) &&
atl1_sched_rings_clean(adapter))
adapter->cmb.cmb->int_stats = adapter->cmb.cmb->int_stats &
~(ISR_CMB_TX | ISR_CMB_RX);

/* rx exception */
if (unlikely(status & (ISR_RXF_OV | ISR_RFD_UNRUN |
Expand Down

0 comments on commit 136cd14

Please sign in to comment.