return RX_AGG_CMP_VALID(agg, *raw_cons);
 }
 
-static inline struct sk_buff *bnxt_copy_skb(struct bnxt_napi *bnapi, u8 *data,
-                                           unsigned int len,
-                                           dma_addr_t mapping)
+static struct sk_buff *bnxt_copy_data(struct bnxt_napi *bnapi, u8 *data,
+                                     unsigned int len,
+                                     dma_addr_t mapping)
 {
        struct bnxt *bp = bnapi->bp;
        struct pci_dev *pdev = bp->pdev;
                                   bp->rx_dir);
 
        skb_put(skb, len);
+
+       return skb;
+}
+
+static struct sk_buff *bnxt_copy_skb(struct bnxt_napi *bnapi, u8 *data,
+                                    unsigned int len,
+                                    dma_addr_t mapping)
+{
+       return bnxt_copy_data(bnapi, data, len, mapping);
+}
+
+static struct sk_buff *bnxt_copy_xdp(struct bnxt_napi *bnapi,
+                                    struct xdp_buff *xdp,
+                                    unsigned int len,
+                                    dma_addr_t mapping)
+{
+       unsigned int metasize = 0;
+       u8 *data = xdp->data;
+       struct sk_buff *skb;
+
+       len = xdp->data_end - xdp->data_meta;
+       metasize = xdp->data - xdp->data_meta;
+       data = xdp->data_meta;
+
+       skb = bnxt_copy_data(bnapi, data, len, mapping);
+       if (!skb)
+               return skb;
+
+       if (metasize) {
+               skb_metadata_set(skb, metasize);
+               __skb_pull(skb, metasize);
+       }
+
        return skb;
 }
 
        }
 
        if (len <= bp->rx_copy_thresh) {
-               skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr);
+               if (!xdp_active)
+                       skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr);
+               else
+                       skb = bnxt_copy_xdp(bnapi, &xdp, len, dma_addr);
                bnxt_reuse_rx_data(rxr, cons, data);
                if (!skb) {
                        if (agg_bufs) {
 
        dma_sync_single_for_cpu(&pdev->dev, mapping + offset, len, bp->rx_dir);
 
        xdp_init_buff(xdp, buflen, &rxr->xdp_rxq);
-       xdp_prepare_buff(xdp, data_ptr - offset, offset, len, false);
+       xdp_prepare_buff(xdp, data_ptr - offset, offset, len, true);
 }
 
 void bnxt_xdp_buff_frags_free(struct bnxt_rx_ring_info *rxr,