tg3: Add skb->xmit_more support
authorPrashant Sreedharan <prashant@broadcom.com>
Mon, 13 Oct 2014 16:21:42 +0000 (09:21 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Oct 2014 19:59:37 +0000 (15:59 -0400)
Ring TX doorbell only if xmit_more is not set or the queue is stopped.

Suggested-by: Daniel Borkmann <dborkman@redhat.com>
Signed-off-by: Prashant Sreedharan <prashant@broadcom.com>
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/tg3.c

index ba499489969a03af0e4500c574c41d98bca0deae..dbb41c1923e60cf1a152bf414ef3428c2d0f2167 100644 (file)
@@ -8099,9 +8099,6 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
        /* Sync BD data before updating mailbox */
        wmb();
 
-       /* Packets are ready, update Tx producer idx local and on card. */
-       tw32_tx_mbox(tnapi->prodmbox, entry);
-
        tnapi->tx_prod = entry;
        if (unlikely(tg3_tx_avail(tnapi) <= (MAX_SKB_FRAGS + 1))) {
                netif_tx_stop_queue(txq);
@@ -8116,7 +8113,12 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
                        netif_tx_wake_queue(txq);
        }
 
-       mmiowb();
+       if (!skb->xmit_more || netif_xmit_stopped(txq)) {
+               /* Packets are ready, update Tx producer idx on card. */
+               tw32_tx_mbox(tnapi->prodmbox, entry);
+               mmiowb();
+       }
+
        return NETDEV_TX_OK;
 
 dma_error: