}
 
        if (xdp_active) {
-               if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &len, event)) {
+               if (bnxt_rx_xdp(bp, rxr, cons, xdp, data, &data_ptr, &len, event)) {
                        rc = 1;
                        goto next_rx;
                }
 
  * false   - packet should be passed to the stack.
  */
 bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
-                struct xdp_buff xdp, struct page *page, unsigned int *len, u8 *event)
+                struct xdp_buff xdp, struct page *page, u8 **data_ptr,
+                unsigned int *len, u8 *event)
 {
        struct bpf_prog *xdp_prog = READ_ONCE(rxr->xdp_prog);
        struct bnxt_tx_ring_info *txr;
                *event &= ~BNXT_RX_EVENT;
 
        *len = xdp.data_end - xdp.data;
-       if (orig_data != xdp.data)
+       if (orig_data != xdp.data) {
                offset = xdp.data - xdp.data_hard_start;
+               *data_ptr = xdp.data_hard_start + offset;
+       }
 
        switch (act) {
        case XDP_PASS:
 
                                   struct xdp_buff *xdp);
 void bnxt_tx_int_xdp(struct bnxt *bp, struct bnxt_napi *bnapi, int nr_pkts);
 bool bnxt_rx_xdp(struct bnxt *bp, struct bnxt_rx_ring_info *rxr, u16 cons,
-                struct xdp_buff xdp, struct page *page, unsigned int *len,
-                u8 *event);
+                struct xdp_buff xdp, struct page *page, u8 **data_ptr,
+                unsigned int *len, u8 *event);
 int bnxt_xdp(struct net_device *dev, struct netdev_bpf *xdp);
 int bnxt_xdp_xmit(struct net_device *dev, int num_frames,
                  struct xdp_frame **frames, u32 flags);