xref: /linux/drivers/net/ethernet/intel/idpf/xsk.c (revision 3d57b2c00f09afb321bfc203c86a3eb674c0ff2c)
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