mv643xx_eth: fix NAPI 'rotting packet' issue

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Thursday, August 28, 2008 - 12:59 pm

Gitweb:     http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=819ddc...
Commit:     819ddcafb33136f2ba18018a22edcf857f640528
Parent:     6a55617ed5d1aa62b850de2cf66f5ede2eef4825
Author:     Lennert Buytenhek <buytenh@wantstofly.org>
AuthorDate: Sun Aug 24 02:45:32 2008 +0200
Committer:  Lennert Buytenhek <buytenh@marvell.com>
CommitDate: Sun Aug 24 03:32:56 2008 +0200

    mv643xx_eth: fix NAPI 'rotting packet' issue
    
    When a receive interrupt occurs, mv643xx_eth would first process the
    receive descriptors and then ACK the receive interrupt, instead of the
    other way round.
    
    This would leave a small race window between processing the last
    receive descriptor and clearing the receive interrupt status in which
    a new packet could come in, which would then 'rot' in the receive
    ring until the next receive interrupt would come in.
    
    Fix this by ACKing (clearing) the receive interrupt condition before
    processing the receive descriptors.
    
    Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
---
 drivers/net/mv643xx_eth.c |    3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 46819af..af279f2 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -650,8 +650,6 @@ static int mv643xx_eth_poll(struct napi_struct *napi, int budget)
 
 	if (rx < budget) {
 		netif_rx_complete(mp->dev, napi);
-		wrl(mp, INT_CAUSE(mp->port_num), 0);
-		wrl(mp, INT_CAUSE_EXT(mp->port_num), 0);
 		wrl(mp, INT_MASK(mp->port_num), INT_TX_END | INT_RX | INT_EXT);
 	}
 
@@ -1796,6 +1794,7 @@ static irqreturn_t mv643xx_eth_irq(int irq, void *dev_id)
 	 */
 #ifdef MV643XX_ETH_NAPI
 	if (int_cause & INT_RX) {
+		wrl(mp, INT_CAUSE(mp->port_num), ~(int_cause & INT_RX));
 		wrl(mp, INT_MASK(mp->port_num), 0x00000000);
 		rdl(mp, INT_MASK(mp->port_num));
 
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
mv643xx_eth: fix NAPI 'rotting packet' issue, Linux Kernel Mailing ..., (Thu Aug 28, 12:59 pm)