Skip to content

Commit 478a010

Browse files
ffainellidavem330
authored andcommitted
net: bcmgenet: fix TX reclaim accounting for fragments
The GENET driver supports SKB fragments, and succeeds in transmitting them properly, but when reclaiming these transmitted fragments, we will only update the count of free buffer descriptors by 1, even for SKBs with fragments. This leads to the networking stack thinking it has more room than the hardware has when pushing new SKBs, and backing off consequently because we return NETDEV_TX_BUSY. Fix this by accounting for the SKB nr_frags plus one (itself) and update ring->free_bds accordingly with that value for each iteration loop in __bcmgenet_tx_reclaim(). Fixes: 1c1008c ("net: bcmgenet: add main driver file") Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a35165c commit 478a010

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/net/ethernet/broadcom/genet/bcmgenet.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,7 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
875875
int last_tx_cn, last_c_index, num_tx_bds;
876876
struct enet_cb *tx_cb_ptr;
877877
struct netdev_queue *txq;
878+
unsigned int bds_compl;
878879
unsigned int c_index;
879880

880881
/* Compute how many buffers are transmitted since last xmit call */
@@ -899,7 +900,9 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
899900
/* Reclaim transmitted buffers */
900901
while (last_tx_cn-- > 0) {
901902
tx_cb_ptr = ring->cbs + last_c_index;
903+
bds_compl = 0;
902904
if (tx_cb_ptr->skb) {
905+
bds_compl = skb_shinfo(tx_cb_ptr->skb)->nr_frags + 1;
903906
dev->stats.tx_bytes += tx_cb_ptr->skb->len;
904907
dma_unmap_single(&dev->dev,
905908
dma_unmap_addr(tx_cb_ptr, dma_addr),
@@ -916,7 +919,7 @@ static void __bcmgenet_tx_reclaim(struct net_device *dev,
916919
dma_unmap_addr_set(tx_cb_ptr, dma_addr, 0);
917920
}
918921
dev->stats.tx_packets++;
919-
ring->free_bds += 1;
922+
ring->free_bds += bds_compl;
920923

921924
last_c_index++;
922925
last_c_index &= (num_tx_bds - 1);

0 commit comments

Comments
 (0)