[ar71xx] ag71xx driver: NAPI poll cleanup
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 7 Dec 2008 09:46:41 +0000 (09:46 +0000)
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Sun, 7 Dec 2008 09:46:41 +0000 (09:46 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13538 3c298f89-4303-0410-b956-a3cf2f4a3e73

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

index d5f7743..80c8e18 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 7818969..aa4730c 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)