From 856587688ed2cdcb09b90629dc3113d427bb8e78 Mon Sep 17 00:00:00 2001 From: juhosg Date: Fri, 5 Dec 2008 20:08:00 +0000 Subject: [PATCH] [ar71xx] ag71xx driver: improve poll routine git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13525 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../ar71xx/files/drivers/net/ag71xx/ag71xx.h | 2 +- .../files/drivers/net/ag71xx/ag71xx_main.c | 27 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h index cddf3a072..c4a7044af 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h @@ -37,7 +37,7 @@ #define ETH_FCS_LEN 4 #define AG71XX_DRV_NAME "ag71xx" -#define AG71XX_DRV_VERSION "0.5.8" +#define AG71XX_DRV_VERSION "0.5.9" #define AG71XX_NAPI_TX 1 diff --git a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c index 16dc0297c..5e31438b3 100644 --- a/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c +++ b/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c @@ -624,6 +624,8 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit) break; } + ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_PR); + skb = ring->buf[i].skb; pktlen = ag71xx_desc_pktlen(desc); pktlen -= ETH_FCS_LEN; @@ -643,8 +645,6 @@ static int ag71xx_rx_packets(struct ag71xx *ag, int limit) ring->buf[i].skb = NULL; done++; - ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_PR); - ring->curr++; if ((ring->curr - ring->dirty) > (AG71XX_RX_RING_SIZE / 4)) ag71xx_ring_rx_refill(ag); @@ -679,10 +679,16 @@ static int ag71xx_poll(struct napi_struct *napi, int limit) /* TODO: add OOM handler */ - status = ag71xx_rr(ag, AG71XX_REG_INT_STATUS); - status &= AG71XX_INT_POLL; + status = ag71xx_rr(ag, AG71XX_REG_RX_STATUS); + if (unlikely(status & RX_STATUS_OF)) { + ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_OF); + dev->stats.rx_fifo_errors++; + + /* restart RX */ + ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE); + } - if ((done < limit) && (!status)) { + if ((done < limit) && ((status & RX_STATUS_PR) == 0)) { DBG("%s: disable polling mode, done=%d, status=%x\n", dev->name, done, status); @@ -695,17 +701,6 @@ static int ag71xx_poll(struct napi_struct *napi, int limit) return 0; } - if (status & AG71XX_INT_RX_OF) { - if (netif_msg_rx_err(ag)) - printk(KERN_ALERT "%s: rx owerflow, restarting dma\n", - dev->name); - - /* ack interrupt */ - ag71xx_wr(ag, AG71XX_REG_RX_STATUS, RX_STATUS_OF); - /* restart RX */ - ag71xx_wr(ag, AG71XX_REG_RX_CTRL, RX_CTRL_RXE); - } - DBG("%s: stay in polling mode, done=%d, status=%x\n", dev->name, done, status); return 1; -- 2.20.1