mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
net: xilinx: axienet: Fix RX skb ring management in DMAengine mode
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: 6a91b846af
("net: axienet: Introduce dmaengine support")
Signed-off-by: Suraj Gupta <suraj.gupta2@amd.com>
Link: https://patch.msgid.link/20250813135559.1555652-1-suraj.gupta2@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1548549e17
commit
fd980bf6e9
1 changed files with 6 additions and 2 deletions
|
@ -1160,6 +1160,7 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
|
|||
struct axienet_local *lp = data;
|
||||
struct sk_buff *skb;
|
||||
u32 *app_metadata;
|
||||
int i;
|
||||
|
||||
skbuf_dma = axienet_get_rx_desc(lp, lp->rx_ring_tail++);
|
||||
skb = skbuf_dma->skb;
|
||||
|
@ -1178,7 +1179,10 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
|
|||
u64_stats_add(&lp->rx_packets, 1);
|
||||
u64_stats_add(&lp->rx_bytes, rx_len);
|
||||
u64_stats_update_end(&lp->rx_stat_sync);
|
||||
axienet_rx_submit_desc(lp->ndev);
|
||||
|
||||
for (i = 0; i < CIRC_SPACE(lp->rx_ring_head, lp->rx_ring_tail,
|
||||
RX_BUF_NUM_DEFAULT); i++)
|
||||
axienet_rx_submit_desc(lp->ndev);
|
||||
dma_async_issue_pending(lp->rx_chan);
|
||||
}
|
||||
|
||||
|
@ -1457,7 +1461,6 @@ static void axienet_rx_submit_desc(struct net_device *ndev)
|
|||
if (!skbuf_dma)
|
||||
return;
|
||||
|
||||
lp->rx_ring_head++;
|
||||
skb = netdev_alloc_skb(ndev, lp->max_frm_size);
|
||||
if (!skb)
|
||||
return;
|
||||
|
@ -1482,6 +1485,7 @@ static void axienet_rx_submit_desc(struct net_device *ndev)
|
|||
skbuf_dma->desc = dma_rx_desc;
|
||||
dma_rx_desc->callback_param = lp;
|
||||
dma_rx_desc->callback_result = axienet_dma_rx_cb;
|
||||
lp->rx_ring_head++;
|
||||
dmaengine_submit(dma_rx_desc);
|
||||
|
||||
return;
|
||||
|
|
Loading…
Add table
Reference in a new issue