Skip to content

Commit 87c36be

Browse files
Suraj Guptagregkh
authored andcommitted
net: xilinx: axienet: Fix RX skb ring management in DMAengine mode
[ Upstream commit fd980bf ] Submit multiple descriptors in axienet_rx_cb() to fill Rx skb ring. This ensures the ring "catches up" on previously missed allocations. Increment Rx skb ring head pointer after BD is successfully allocated. Previously, head pointer was incremented before verifying if descriptor is successfully allocated and has valid entries, which could lead to ring state inconsistency if descriptor setup failed. These changes improve reliability by maintaining adequate descriptor availability and ensuring proper ring buffer state management. Fixes: 6a91b84 ("net: axienet: Introduce dmaengine support") Signed-off-by: Suraj Gupta <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 8d2bf2e commit 87c36be

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

drivers/net/ethernet/xilinx/xilinx_axienet_main.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,7 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
11191119
struct axienet_local *lp = data;
11201120
struct sk_buff *skb;
11211121
u32 *app_metadata;
1122+
int i;
11221123

11231124
skbuf_dma = axienet_get_rx_desc(lp, lp->rx_ring_tail++);
11241125
skb = skbuf_dma->skb;
@@ -1137,7 +1138,10 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
11371138
u64_stats_add(&lp->rx_packets, 1);
11381139
u64_stats_add(&lp->rx_bytes, rx_len);
11391140
u64_stats_update_end(&lp->rx_stat_sync);
1140-
axienet_rx_submit_desc(lp->ndev);
1141+
1142+
for (i = 0; i < CIRC_SPACE(lp->rx_ring_head, lp->rx_ring_tail,
1143+
RX_BUF_NUM_DEFAULT); i++)
1144+
axienet_rx_submit_desc(lp->ndev);
11411145
dma_async_issue_pending(lp->rx_chan);
11421146
}
11431147

@@ -1394,7 +1398,6 @@ static void axienet_rx_submit_desc(struct net_device *ndev)
13941398
if (!skbuf_dma)
13951399
return;
13961400

1397-
lp->rx_ring_head++;
13981401
skb = netdev_alloc_skb(ndev, lp->max_frm_size);
13991402
if (!skb)
14001403
return;
@@ -1419,6 +1422,7 @@ static void axienet_rx_submit_desc(struct net_device *ndev)
14191422
skbuf_dma->desc = dma_rx_desc;
14201423
dma_rx_desc->callback_param = lp;
14211424
dma_rx_desc->callback_result = axienet_dma_rx_cb;
1425+
lp->rx_ring_head++;
14221426
dmaengine_submit(dma_rx_desc);
14231427

14241428
return;

0 commit comments

Comments
 (0)