]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
net: ethernet: ti: am65_cpsw: fix tx_cleanup for XDP case
authorRoger Quadros <rogerq@kernel.org>
Mon, 10 Feb 2025 14:52:17 +0000 (16:52 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 13 Feb 2025 04:12:59 +0000 (20:12 -0800)
For XDP transmit case, swdata doesn't contain SKB but the
XDP Frame. Infer the correct swdata based on buffer type
and return the XDP Frame for XDP transmit case.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Fixes: 8acacc40f733 ("net: ethernet: ti: am65-cpsw: Add minimal XDP support")
Link: https://patch.msgid.link/20250210-am65-cpsw-xdp-fixes-v1-3-ec6b1f7f1aca@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/am65-cpsw-nuss.c

index 38f3be310928d8d74c9eaeeb75a0ed09fb2c9bb6..2806238629f823ca4f708fa0c1ba9e86fef4d441 100644 (file)
@@ -828,16 +828,24 @@ static void am65_cpsw_nuss_xmit_free(struct am65_cpsw_tx_chn *tx_chn,
 static void am65_cpsw_nuss_tx_cleanup(void *data, dma_addr_t desc_dma)
 {
        struct am65_cpsw_tx_chn *tx_chn = data;
+       enum am65_cpsw_tx_buf_type buf_type;
        struct cppi5_host_desc_t *desc_tx;
+       struct xdp_frame *xdpf;
        struct sk_buff *skb;
        void **swdata;
 
        desc_tx = k3_cppi_desc_pool_dma2virt(tx_chn->desc_pool, desc_dma);
        swdata = cppi5_hdesc_get_swdata(desc_tx);
-       skb = *(swdata);
-       am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
+       buf_type = am65_cpsw_nuss_buf_type(tx_chn, desc_dma);
+       if (buf_type == AM65_CPSW_TX_BUF_TYPE_SKB) {
+               skb = *(swdata);
+               dev_kfree_skb_any(skb);
+       } else {
+               xdpf = *(swdata);
+               xdp_return_frame(xdpf);
+       }
 
-       dev_kfree_skb_any(skb);
+       am65_cpsw_nuss_xmit_free(tx_chn, desc_tx);
 }
 
 static struct sk_buff *am65_cpsw_build_skb(void *page_addr,