ag71xx driver: NAPI poll cleanup
authorGabor Juhos <juhosg@openwrt.org>
Sun, 7 Dec 2008 09:46:41 +0000 (09:46 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Sun, 7 Dec 2008 09:46:41 +0000 (09:46 +0000)
SVN-Revision: 13538

target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h
target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

index d5f7743d4ca0508e633279a02e16841ae3481772..80c8e18ab1079d4d3d39d33ebe33e431d863003d 100644 (file)
@@ -38,7 +38,7 @@
 #define ETH_FCS_LEN    4
 
 #define AG71XX_DRV_NAME                "ag71xx"
-#define AG71XX_DRV_VERSION     "0.5.11"
+#define AG71XX_DRV_VERSION     "0.5.12"
 
 #define AG71XX_NAPI_WEIGHT     64
 
index 78189693553a20350872125018a8118452e207d7..aa4730ce20c6279e2196e29b05ee3be22ab740ae 100644 (file)
@@ -687,9 +687,16 @@ static int ag71xx_poll(struct napi_struct *napi, int limit)
                ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE);
        }
 
-       if ((done < limit) && ((status & RX_STATUS_PR) == 0)) {
-               DBG("%s: disable polling mode, done=%d, status=%x\n",
-                       dev->name, done, status);
+       if (done < limit) {
+               if (status & RX_STATUS_PR)
+                       goto more;
+
+               status = ag71xx_rr(ag, AG71XX_REG_TX_STATUS);
+               if (status & TX_STATUS_PS)
+                       goto more;
+
+               DBG("%s: disable polling mode, done=%d, limit=%d\n",
+                       dev->name, done, limit);
 
                netif_rx_complete(dev, napi);
 
@@ -697,12 +704,13 @@ static int ag71xx_poll(struct napi_struct *napi, int limit)
                spin_lock_irqsave(&ag->lock, flags);
                ag71xx_int_enable(ag, AG71XX_INT_POLL);
                spin_unlock_irqrestore(&ag->lock, flags);
-               return 0;
+               return done;
        }
 
-       DBG("%s: stay in polling mode, done=%d, status=%x\n",
-                       dev->name, done, status);
-       return 1;
+ more:
+       DBG("%s: stay in polling mode, done=%d, limit=%d\n",
+                       dev->name, done, limit);
+       return done;
 }
 
 static irqreturn_t ag71xx_interrupt(int irq, void *dev_id)