summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
authorDavid S. Miller2015-03-13 20:52:38 +0100
committerDavid S. Miller2015-03-13 20:52:38 +0100
commit2801be4a0ea4cd0965f9c12ff813a91892a8e157 (patch)
tree974239fd13e2133fedb00e2096adfca16983440b /drivers/net/ethernet
parentnet: bcmgenet: rewrite bcmgenet_rx_refill() (diff)
parentnet: bcmgenet: add support for xmit_more (diff)
downloadkernel-qcow2-linux-2801be4a0ea4cd0965f9c12ff813a91892a8e157.tar.gz
kernel-qcow2-linux-2801be4a0ea4cd0965f9c12ff813a91892a8e157.tar.xz
kernel-qcow2-linux-2801be4a0ea4cd0965f9c12ff813a91892a8e157.zip
Merge branch 'bcmgenet_xmit_more'
Florian Fainelli says: ==================== net: bcmgenet: xmit_more support This patch series adds xmit_more support to the GENET driver by allowing the deferal of the producer index write to the TDMA engine. Changes in v2: - move the netif_tx_stop_queue check *before* updating the producer index ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 875967e8d719..e74ae628bbb9 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1130,11 +1130,6 @@ static int bcmgenet_xmit_single(struct net_device *dev,
dmadesc_set(priv, tx_cb_ptr->bd_addr, mapping, length_status);
- /* Decrement total BD count and advance our write pointer */
- ring->free_bds -= 1;
- ring->prod_index += 1;
- ring->prod_index &= DMA_P_INDEX_MASK;
-
return 0;
}
@@ -1173,11 +1168,6 @@ static int bcmgenet_xmit_frag(struct net_device *dev,
(frag->size << DMA_BUFLENGTH_SHIFT) | dma_desc_flags |
(priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT));
-
- ring->free_bds -= 1;
- ring->prod_index += 1;
- ring->prod_index &= DMA_P_INDEX_MASK;
-
return 0;
}
@@ -1321,15 +1311,18 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev)
skb_tx_timestamp(skb);
- /* we kept a software copy of how much we should advance the TDMA
- * producer index, now write it down to the hardware
- */
- bcmgenet_tdma_ring_writel(priv, ring->index,
- ring->prod_index, TDMA_PROD_INDEX);
+ /* Decrement total BD count and advance our write pointer */
+ ring->free_bds -= nr_frags + 1;
+ ring->prod_index += nr_frags + 1;
+ ring->prod_index &= DMA_P_INDEX_MASK;
if (ring->free_bds <= (MAX_SKB_FRAGS + 1))
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:
spin_unlock_irqrestore(&ring->lock, flags);