IXP4xx: Ethernet and WAN drivers now support "high" hardware queues.
authorKrzysztof Hałasa <khc@pm.waw.pl>
Sat, 23 May 2009 21:14:10 +0000 (23:14 +0200)
committerKrzysztof Hałasa <khc@pm.waw.pl>
Sat, 23 May 2009 21:14:10 +0000 (23:14 +0200)
Signed-off-by: Krzysztof Hałasa <khc@pm.waw.pl>
drivers/net/arm/ixp4xx_eth.c
drivers/net/wan/ixp4xx_hss.c

index a740053..d304c73 100644 (file)
@@ -456,7 +456,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
        debug_desc(phys, desc);
        BUG_ON(phys & 0x1F);
        qmgr_put_entry(queue, phys);
-       BUG_ON(qmgr_stat_overflow(queue));
+       /* Don't check for queue overflow here, we've allocated sufficient
+          length and queues >= 32 don't support this check anyway. */
 }
 
 
@@ -512,8 +513,8 @@ static int eth_poll(struct napi_struct *napi, int budget)
 #endif
                        napi_complete(napi);
                        qmgr_enable_irq(rxq);
-                       if (!qmgr_stat_empty(rxq) &&
-                           napi_reschedule(napi)) {
+                       if (!qmgr_stat_nearly_empty(rxq) &&
+                           napi_reschedule(napi)) { /* really empty in fact */
 #if DEBUG_RX
                                printk(KERN_DEBUG "%s: eth_poll"
                                       " napi_reschedule successed\n",
@@ -630,7 +631,8 @@ static void eth_txdone_irq(void *unused)
                        port->tx_buff_tab[n_desc] = NULL;
                }
 
-               start = qmgr_stat_empty(port->plat->txreadyq);
+               /* really empty in fact */
+               start = qmgr_stat_nearly_empty(port->plat->txreadyq);
                queue_put_desc(port->plat->txreadyq, phys, desc);
                if (start) {
 #if DEBUG_TX
@@ -708,13 +710,14 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev)
        queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc);
        dev->trans_start = jiffies;
 
-       if (qmgr_stat_empty(txreadyq)) {
+       if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
 #if DEBUG_TX
                printk(KERN_DEBUG "%s: eth_xmit queue full\n", dev->name);
 #endif
                netif_stop_queue(dev);
                /* we could miss TX ready interrupt */
-               if (!qmgr_stat_empty(txreadyq)) {
+               /* really empty in fact */
+               if (!qmgr_stat_nearly_empty(txreadyq)) {
 #if DEBUG_TX
                        printk(KERN_DEBUG "%s: eth_xmit ready again\n",
                               dev->name);
index 765a7f5..1e56e58 100644 (file)
@@ -579,7 +579,8 @@ static inline void queue_put_desc(unsigned int queue, u32 phys,
        debug_desc(phys, desc);
        BUG_ON(phys & 0x1F);
        qmgr_put_entry(queue, phys);
-       BUG_ON(qmgr_stat_overflow(queue));
+       /* Don't check for queue overflow here, we've allocated sufficient
+          length and queues >= 32 don't support this check anyway. */
 }
 
 
@@ -789,7 +790,8 @@ static void hss_hdlc_txdone_irq(void *pdev)
                free_buffer_irq(port->tx_buff_tab[n_desc]);
                port->tx_buff_tab[n_desc] = NULL;
 
-               start = qmgr_stat_empty(port->plat->txreadyq);
+               /* really empty in fact */
+               start = qmgr_stat_nearly_empty(port->plat->txreadyq);
                queue_put_desc(port->plat->txreadyq,
                               tx_desc_phys(port, n_desc), desc);
                if (start) {
@@ -867,13 +869,13 @@ static int hss_hdlc_xmit(struct sk_buff *skb, struct net_device *dev)
        queue_put_desc(queue_ids[port->id].tx, tx_desc_phys(port, n), desc);
        dev->trans_start = jiffies;
 
-       if (qmgr_stat_empty(txreadyq)) {
+       if (qmgr_stat_nearly_empty(txreadyq)) { /* really empty in fact */
 #if DEBUG_TX
                printk(KERN_DEBUG "%s: hss_hdlc_xmit queue full\n", dev->name);
 #endif
                netif_stop_queue(dev);
                /* we could miss TX ready interrupt */
-               if (!qmgr_stat_empty(txreadyq)) {
+               if (!qmgr_stat_nearly_empty(txreadyq)) {
 #if DEBUG_TX
                        printk(KERN_DEBUG "%s: hss_hdlc_xmit ready again\n",
                               dev->name);