nfp_net_set_vxlan_port(nn, idx, 0);
 }
 
-static int nfp_net_xdp_setup(struct nfp_net *nn, struct netdev_xdp *xdp)
+static int
+nfp_net_xdp_setup_drv(struct nfp_net *nn, struct bpf_prog *prog,
+                     struct netlink_ext_ack *extack)
 {
        struct bpf_prog *old_prog = nn->dp.xdp_prog;
-       struct bpf_prog *prog = xdp->prog;
        struct nfp_net_dp *dp;
        int err;
 
        if (prog && nn->dp.xdp_prog) {
                prog = xchg(&nn->dp.xdp_prog, prog);
                bpf_prog_put(prog);
-               nfp_app_xdp_offload(nn->app, nn, nn->dp.xdp_prog);
                return 0;
        }
 
        dp->rx_dma_off = prog ? XDP_PACKET_HEADROOM - nn->dp.rx_offset : 0;
 
        /* We need RX reconfig to remap the buffers (BIDIR vs FROM_DEV) */
-       err = nfp_net_ring_reconfig(nn, dp, xdp->extack);
+       err = nfp_net_ring_reconfig(nn, dp, extack);
        if (err)
                return err;
 
        if (old_prog)
                bpf_prog_put(old_prog);
 
+       return 0;
+}
+
+static int
+nfp_net_xdp_setup(struct nfp_net *nn, struct bpf_prog *prog,
+                 struct netlink_ext_ack *extack)
+{
+       int err;
+
+       err = nfp_net_xdp_setup_drv(nn, prog, extack);
+       if (err)
+               return err;
+
        nfp_app_xdp_offload(nn->app, nn, nn->dp.xdp_prog);
 
        return 0;
 
        switch (xdp->command) {
        case XDP_SETUP_PROG:
-               return nfp_net_xdp_setup(nn, xdp);
+               return nfp_net_xdp_setup(nn, xdp->prog, xdp->extack);
        case XDP_QUERY_PROG:
                xdp->prog_attached = !!nn->dp.xdp_prog;
                xdp->prog_id = nn->dp.xdp_prog ? nn->dp.xdp_prog->aux->id : 0;