]> pilppa.com Git - linux-2.6-omap-h63xx.git/commitdiff
gianfar: Continue polling until both tx and rx are empty
authorAndy Fleming <afleming@freescale.com>
Thu, 18 Dec 2008 00:52:30 +0000 (16:52 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Dec 2008 00:52:30 +0000 (16:52 -0800)
gfar_poll would declare polling done once the rx queue was empty,
but the tx queue could still have packets left.

Stolen mostly from the e1000 driver.

Signed-off-by: Andy Fleming <afleming@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/gianfar.c

index d243c9eea43aeceec4b1585bf485cffc191bd773..13f49643ba0bed2d59443af6c14d5988371a88e2 100644 (file)
@@ -1843,7 +1843,8 @@ static int gfar_poll(struct napi_struct *napi, int budget)
 {
        struct gfar_private *priv = container_of(napi, struct gfar_private, napi);
        struct net_device *dev = priv->dev;
-       int howmany;
+       int tx_cleaned = 0;
+       int rx_cleaned = 0;
        unsigned long flags;
 
        /* Clear IEVENT, so interrupts aren't called again
@@ -1852,13 +1853,16 @@ static int gfar_poll(struct napi_struct *napi, int budget)
 
        /* If we fail to get the lock, don't bother with the TX BDs */
        if (spin_trylock_irqsave(&priv->txlock, flags)) {
-               gfar_clean_tx_ring(dev);
+               tx_cleaned = gfar_clean_tx_ring(dev);
                spin_unlock_irqrestore(&priv->txlock, flags);
        }
 
-       howmany = gfar_clean_rx_ring(dev, budget);
+       rx_cleaned = gfar_clean_rx_ring(dev, budget);
 
-       if (howmany < budget) {
+       if (tx_cleaned)
+               return budget;
+
+       if (rx_cleaned < budget) {
                netif_rx_complete(dev, napi);
 
                /* Clear the halt bit in RSTAT */
@@ -1878,7 +1882,7 @@ static int gfar_poll(struct napi_struct *napi, int budget)
                }
        }
 
-       return howmany;
+       return rx_cleaned;
 }
 
 #ifdef CONFIG_NET_POLL_CONTROLLER