#include <linux/netdevice.h>
 #include <linux/pci.h>
 #include <linux/io-64-nonatomic-hi-lo.h>
+#include <net/xdp.h>
 
 #include "nfp_net_ctrl.h"
 
  * @rxds:       Virtual address of FL/RX ring in host memory
  * @dma:        DMA address of the FL/RX ring
  * @size:       Size, in bytes, of the FL/RX ring (needed to free)
+ * @xdp_rxq:    RX-ring info avail for XDP
  */
 struct nfp_net_rx_ring {
        struct nfp_net_r_vector *r_vec;
        u32 idx;
 
        int fl_qcidx;
+       unsigned int size;
        u8 __iomem *qcp_fl;
 
        struct nfp_net_rx_buf *rxbufs;
        struct nfp_net_rx_desc *rxds;
 
        dma_addr_t dma;
-       unsigned int size;
+       struct xdp_rxq_info xdp_rxq;
 } ____cacheline_aligned;
 
 /**
 
        unsigned int true_bufsz;
        struct sk_buff *skb;
        int pkts_polled = 0;
+       struct xdp_buff xdp;
        int idx;
 
        rcu_read_lock();
        xdp_prog = READ_ONCE(dp->xdp_prog);
        true_bufsz = xdp_prog ? PAGE_SIZE : dp->fl_bufsz;
+       xdp.rxq = &rx_ring->xdp_rxq;
        tx_ring = r_vec->xdp_ring;
 
        while (pkts_polled < budget) {
                                  dp->bpf_offload_xdp) && !meta.portid) {
                        void *orig_data = rxbuf->frag + pkt_off;
                        unsigned int dma_off;
-                       struct xdp_buff xdp;
                        int act;
 
                        xdp.data_hard_start = rxbuf->frag + NFP_NET_RX_BUF_HEADROOM;
        struct nfp_net_r_vector *r_vec = rx_ring->r_vec;
        struct nfp_net_dp *dp = &r_vec->nfp_net->dp;
 
+       xdp_rxq_info_unreg(&rx_ring->xdp_rxq);
        kfree(rx_ring->rxbufs);
 
        if (rx_ring->rxds)
 static int
 nfp_net_rx_ring_alloc(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring)
 {
-       int sz;
+       int sz, err;
+
+       err = xdp_rxq_info_reg(&rx_ring->xdp_rxq, dp->netdev, rx_ring->idx);
+       if (err < 0)
+               return err;
 
        rx_ring->cnt = dp->rxd_cnt;
        rx_ring->size = sizeof(*rx_ring->rxds) * rx_ring->cnt;