From 22810caf59db43b2fbe6bd7e1e681713646205f8 Mon Sep 17 00:00:00 2001 From: Tony Zelenoff Date: Fri, 13 Apr 2012 06:09:54 +0000 Subject: [PATCH] --- yaml --- r: 300769 b: refs/heads/master c: 136cd14e1ea2bfde66d212d8e18e81552c94e4e3 h: refs/heads/master i: 300767: 1a760396bf7dc84bae6402855066aad527a1d56b v: v3 --- [refs] | 2 +- trunk/drivers/net/ethernet/atheros/atlx/atl1.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 490b911985d9..5f7ef7e051f5 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 2a9bc71e9a1a099e1aab745f1755a3c15a745ad8 +refs/heads/master: 136cd14e1ea2bfde66d212d8e18e81552c94e4e3 diff --git a/trunk/drivers/net/ethernet/atheros/atlx/atl1.c b/trunk/drivers/net/ethernet/atheros/atlx/atl1.c index 066b980cc2f0..7f1e498c3c06 100644 --- a/trunk/drivers/net/ethernet/atheros/atlx/atl1.c +++ b/trunk/drivers/net/ethernet/atheros/atlx/atl1.c @@ -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); @@ -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 |