Thread (10 messages) flat view 10 messages, 4 authors, 14d ago

Re: [PATCH V6 3/4] net: xilinx: axienet: Derive RX frame length from residue in dmaengine path

From: Neeli, Srinivas <hidden>
Date: 2026-09-10 15:51:21
Also in: dmaengine, linux-arm-kernel, lkml

Hi Jakub,

I would like to follow up on this patch. The dependent DMA patches (1/4, 
2/4, and 4/4) from this series have already been applied through the 
DMAEngine framework.
Could you please advise if there are any remaining concerns with this 
patch or how you would prefer it to be handled on the netdev side?
Also, I noticed that you were inadvertently included in the CC list 
rather than the To list in the original posting. Apologies for that.

Thanks
Srinivas neeli


On 8/18/2026 11:11 PM, Srinivas Neeli wrote:
quoted hunk ↗ jump to hunk
The dmaengine RX path derived the received frame length from the descriptor
APP metadata. That only works when the optional AXI4-Stream status/control
interface is present, because the hardware populates the APP fields solely
when that interface is enabled. On designs without it the length read back
is invalid.

The AXI DMA engine already reports how many bytes it wrote into the buffer
through the standard dmaengine residue mechanism. Compute the RX frame
length as the posted buffer length minus result->residue, which is
independent of the status/control interface and correct across all designs,
including multi-descriptor frames where the residue is summed over the
chain.

Drop the descriptor metadata lookup, which was only used for this purpose.
Detect a failed transfer from dmaengine_result.result instead of the
metadata pointer return value, and remove the now unused LEN_APP macro.

The transmit path is unaffected. It still passes APP metadata for checksum
offload and derives its length from the skb.

Reviewed-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
Signed-off-by: Srinivas Neeli <srinivas.neeli@amd.com>
---
Changes in V6:
  - No change.

Changes in V5:
  - No change.

Changes in V4:
  - Renamed subject to "Derive RX frame length from residue in dmaengine
    path".
  - Condensed the commit message.
  - Dropped the Fixes tag.

Changes in V3:
  - New patch in this series.
  - This patch enables axienet to work on designs where the AXI4-Stream
    status/control interface is not present. By using the standard
    dmaengine residue mechanism, the driver no longer depends on APP
    fields being populated by hardware.
  - This approach replaces the V2 xferred_bytes mechanism (V2 patch 5/5),
    making the dt-bindings patch (V2 patch 4/5) for xlnx,include-stscntrl-strm
    also unnecessary. Both V2 patches are dropped in this series.
---
  drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 14 +++++---------
  1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 1722b7038f34..f9252880f411 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -53,7 +53,6 @@
  #define TX_BD_NUM_MAX			4096
  #define RX_BD_NUM_MAX			4096
  #define DMA_NUM_APP_WORDS		5
-#define LEN_APP				4
  #define RX_BUF_NUM_DEFAULT		128
  
  /* Must be shorter than length of ethtool_drvinfo.driver field to fit */
@@ -1159,29 +1158,26 @@ axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev)
  static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
  {
  	struct skbuf_dma_descriptor *skbuf_dma;
-	size_t meta_len, meta_max_len, rx_len;
  	struct axienet_local *lp = data;
  	struct sk_buff *skb;
-	u32 *app_metadata;
+	size_t rx_len;
  	int i;
  
  	skbuf_dma = axienet_get_rx_desc(lp, lp->rx_ring_tail++);
  	skb = skbuf_dma->skb;
-	app_metadata = dmaengine_desc_get_metadata_ptr(skbuf_dma->desc, &meta_len,
-						       &meta_max_len);
  	dma_unmap_single(lp->dev, skbuf_dma->dma_address, lp->max_frm_size,
  			 DMA_FROM_DEVICE);
  
-	if (IS_ERR(app_metadata)) {
+	if (result->result != DMA_TRANS_NOERROR) {
  		if (net_ratelimit())
-			netdev_err(lp->ndev, "Failed to get RX metadata pointer\n");
+			netdev_err(lp->ndev, "RX DMA transfer failed\n");
  		dev_kfree_skb_any(skb);
  		lp->ndev->stats.rx_dropped++;
  		goto rx_submit;
  	}
  
-	/* TODO: Derive app word index programmatically */
-	rx_len = (app_metadata[LEN_APP] & 0xFFFF);
+	/* Actual length = posted buffer length - residue. */
+	rx_len = lp->max_frm_size - result->residue;
  	skb_put(skb, rx_len);
  	skb->protocol = eth_type_trans(skb, lp->ndev);
  	skb->ip_summed = CHECKSUM_NONE;
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help