1*3d57b2c0SMichal Kubiak // SPDX-License-Identifier: GPL-2.0-only 2*3d57b2c0SMichal Kubiak /* Copyright (C) 2025 Intel Corporation */ 3*3d57b2c0SMichal Kubiak 4*3d57b2c0SMichal Kubiak #include <net/libeth/xsk.h> 5*3d57b2c0SMichal Kubiak 6*3d57b2c0SMichal Kubiak #include "idpf.h" 7*3d57b2c0SMichal Kubiak #include "xsk.h" 8*3d57b2c0SMichal Kubiak 9*3d57b2c0SMichal Kubiak int idpf_xsk_pool_setup(struct idpf_vport *vport, struct netdev_bpf *bpf) 10*3d57b2c0SMichal Kubiak { 11*3d57b2c0SMichal Kubiak struct xsk_buff_pool *pool = bpf->xsk.pool; 12*3d57b2c0SMichal Kubiak u32 qid = bpf->xsk.queue_id; 13*3d57b2c0SMichal Kubiak bool restart; 14*3d57b2c0SMichal Kubiak int ret; 15*3d57b2c0SMichal Kubiak 16*3d57b2c0SMichal Kubiak restart = idpf_xdp_enabled(vport) && netif_running(vport->netdev); 17*3d57b2c0SMichal Kubiak if (!restart) 18*3d57b2c0SMichal Kubiak goto pool; 19*3d57b2c0SMichal Kubiak 20*3d57b2c0SMichal Kubiak ret = idpf_qp_switch(vport, qid, false); 21*3d57b2c0SMichal Kubiak if (ret) { 22*3d57b2c0SMichal Kubiak NL_SET_ERR_MSG_FMT_MOD(bpf->extack, 23*3d57b2c0SMichal Kubiak "%s: failed to disable queue pair %u: %pe", 24*3d57b2c0SMichal Kubiak netdev_name(vport->netdev), qid, 25*3d57b2c0SMichal Kubiak ERR_PTR(ret)); 26*3d57b2c0SMichal Kubiak return ret; 27*3d57b2c0SMichal Kubiak } 28*3d57b2c0SMichal Kubiak 29*3d57b2c0SMichal Kubiak pool: 30*3d57b2c0SMichal Kubiak ret = libeth_xsk_setup_pool(vport->netdev, qid, pool); 31*3d57b2c0SMichal Kubiak if (ret) { 32*3d57b2c0SMichal Kubiak NL_SET_ERR_MSG_FMT_MOD(bpf->extack, 33*3d57b2c0SMichal Kubiak "%s: failed to configure XSk pool for pair %u: %pe", 34*3d57b2c0SMichal Kubiak netdev_name(vport->netdev), qid, 35*3d57b2c0SMichal Kubiak ERR_PTR(ret)); 36*3d57b2c0SMichal Kubiak return ret; 37*3d57b2c0SMichal Kubiak } 38*3d57b2c0SMichal Kubiak 39*3d57b2c0SMichal Kubiak if (!restart) 40*3d57b2c0SMichal Kubiak return 0; 41*3d57b2c0SMichal Kubiak 42*3d57b2c0SMichal Kubiak ret = idpf_qp_switch(vport, qid, true); 43*3d57b2c0SMichal Kubiak if (ret) { 44*3d57b2c0SMichal Kubiak NL_SET_ERR_MSG_FMT_MOD(bpf->extack, 45*3d57b2c0SMichal Kubiak "%s: failed to enable queue pair %u: %pe", 46*3d57b2c0SMichal Kubiak netdev_name(vport->netdev), qid, 47*3d57b2c0SMichal Kubiak ERR_PTR(ret)); 48*3d57b2c0SMichal Kubiak goto err_dis; 49*3d57b2c0SMichal Kubiak } 50*3d57b2c0SMichal Kubiak 51*3d57b2c0SMichal Kubiak return 0; 52*3d57b2c0SMichal Kubiak 53*3d57b2c0SMichal Kubiak err_dis: 54*3d57b2c0SMichal Kubiak libeth_xsk_setup_pool(vport->netdev, qid, false); 55*3d57b2c0SMichal Kubiak 56*3d57b2c0SMichal Kubiak return ret; 57*3d57b2c0SMichal Kubiak } 58