浏览代码

net: bcmgenet: add support for xmit_more

Delay the update of the TDMA producer index unless this is the last SKB
in a batch, or the queue is already stopped. Move the check for whether
the queue should be stopped before the xmit_more check to avoid locking
the transmit queue in case there was a SKB submitted which has xmit_more
set.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Florian Fainelli 10 年之前
父节点
当前提交
ddd0ca5d60
共有 1 个文件被更改,包括 4 次插入3 次删除
  1. 4 3
      drivers/net/ethernet/broadcom/genet/bcmgenet.c

+ 4 - 3
drivers/net/ethernet/broadcom/genet/bcmgenet.c

@@ -1316,12 +1316,13 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev)
 	ring->prod_index += nr_frags + 1;
 	ring->prod_index += nr_frags + 1;
 	ring->prod_index &= DMA_P_INDEX_MASK;
 	ring->prod_index &= DMA_P_INDEX_MASK;
 
 
-	bcmgenet_tdma_ring_writel(priv, ring->index,
-				  ring->prod_index, TDMA_PROD_INDEX);
-
 	if (ring->free_bds <= (MAX_SKB_FRAGS + 1))
 	if (ring->free_bds <= (MAX_SKB_FRAGS + 1))
 		netif_tx_stop_queue(txq);
 		netif_tx_stop_queue(txq);
 
 
+	if (!skb->xmit_more || netif_xmit_stopped(txq))
+		/* Packets are ready, update producer index */
+		bcmgenet_tdma_ring_writel(priv, ring->index,
+					  ring->prod_index, TDMA_PROD_INDEX);
 out:
 out:
 	spin_unlock_irqrestore(&ring->lock, flags);
 	spin_unlock_irqrestore(&ring->lock, flags);