]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: ti: icssg-prueth: Fix skb handling for XDP_PASS
authorMeghana Malladi <m-malladi@ti.com>
Sun, 3 Aug 2025 18:02:16 +0000 (23:32 +0530)
committerJakub Kicinski <kuba@kernel.org>
Wed, 6 Aug 2025 01:03:33 +0000 (18:03 -0700)
emac_rx_packet() is a common function for handling traffic
for both xdp and non-xdp use cases. Use common logic for
handling skb with or without xdp to prevent any incorrect
packet processing. This patch fixes ping working with
XDP_PASS for icssg driver.

Fixes: 62aa3246f4623 ("net: ti: icssg-prueth: Add XDP support")
Signed-off-by: Meghana Malladi <m-malladi@ti.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://patch.msgid.link/20250803180216.3569139-1-m-malladi@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ti/icssg/icssg_common.c

index 12f25cec6255e9e00722d965c7efddb9e8a6bc61..57e5f1c88f5098d3cb62875ea31490dbef84c9ca 100644 (file)
@@ -706,9 +706,9 @@ static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state)
        struct page_pool *pool;
        struct sk_buff *skb;
        struct xdp_buff xdp;
+       int headroom, ret;
        u32 *psdata;
        void *pa;
-       int ret;
 
        *xdp_state = 0;
        pool = rx_chn->pg_pool;
@@ -757,22 +757,23 @@ static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state)
                xdp_prepare_buff(&xdp, pa, PRUETH_HEADROOM, pkt_len, false);
 
                *xdp_state = emac_run_xdp(emac, &xdp, page, &pkt_len);
-               if (*xdp_state == ICSSG_XDP_PASS)
-                       skb = xdp_build_skb_from_buff(&xdp);
-               else
+               if (*xdp_state != ICSSG_XDP_PASS)
                        goto requeue;
+               headroom = xdp.data - xdp.data_hard_start;
+               pkt_len = xdp.data_end - xdp.data;
        } else {
-               /* prepare skb and send to n/w stack */
-               skb = napi_build_skb(pa, PAGE_SIZE);
+               headroom = PRUETH_HEADROOM;
        }
 
+       /* prepare skb and send to n/w stack */
+       skb = napi_build_skb(pa, PAGE_SIZE);
        if (!skb) {
                ndev->stats.rx_dropped++;
                page_pool_recycle_direct(pool, page);
                goto requeue;
        }
 
-       skb_reserve(skb, PRUETH_HEADROOM);
+       skb_reserve(skb, headroom);
        skb_put(skb, pkt_len);
        skb->dev = ndev;