]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/net/ethernet/stmicro/stmmac/stmmac_xdp.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2021, Intel Corporation. */
4 #include <net/xdp_sock_drv.h>
7 #include "stmmac_xdp.h"
9 static int stmmac_xdp_enable_pool(struct stmmac_priv
*priv
,
10 struct xsk_buff_pool
*pool
, u16 queue
)
12 struct stmmac_channel
*ch
= &priv
->channel
[queue
];
17 if (queue
>= priv
->plat
->rx_queues_to_use
||
18 queue
>= priv
->plat
->tx_queues_to_use
)
21 frame_size
= xsk_pool_get_rx_frame_size(pool
);
22 /* XDP ZC does not span multiple frame, make sure XSK pool buffer
23 * size can at least store Q-in-Q frame.
25 if (frame_size
< ETH_FRAME_LEN
+ VLAN_HLEN
* 2)
28 err
= xsk_pool_dma_map(pool
, priv
->device
, STMMAC_RX_DMA_ATTR
);
30 netdev_err(priv
->dev
, "Failed to map xsk pool\n");
34 need_update
= netif_running(priv
->dev
) && stmmac_xdp_is_enabled(priv
);
37 napi_disable(&ch
->rx_napi
);
38 napi_disable(&ch
->tx_napi
);
39 stmmac_disable_rx_queue(priv
, queue
);
40 stmmac_disable_tx_queue(priv
, queue
);
43 set_bit(queue
, priv
->af_xdp_zc_qps
);
46 stmmac_enable_rx_queue(priv
, queue
);
47 stmmac_enable_tx_queue(priv
, queue
);
48 napi_enable(&ch
->rxtx_napi
);
50 err
= stmmac_xsk_wakeup(priv
->dev
, queue
, XDP_WAKEUP_RX
);
58 static int stmmac_xdp_disable_pool(struct stmmac_priv
*priv
, u16 queue
)
60 struct stmmac_channel
*ch
= &priv
->channel
[queue
];
61 struct xsk_buff_pool
*pool
;
64 if (queue
>= priv
->plat
->rx_queues_to_use
||
65 queue
>= priv
->plat
->tx_queues_to_use
)
68 pool
= xsk_get_pool_from_qid(priv
->dev
, queue
);
72 need_update
= netif_running(priv
->dev
) && stmmac_xdp_is_enabled(priv
);
75 napi_disable(&ch
->rxtx_napi
);
76 stmmac_disable_rx_queue(priv
, queue
);
77 stmmac_disable_tx_queue(priv
, queue
);
81 xsk_pool_dma_unmap(pool
, STMMAC_RX_DMA_ATTR
);
83 clear_bit(queue
, priv
->af_xdp_zc_qps
);
86 stmmac_enable_rx_queue(priv
, queue
);
87 stmmac_enable_tx_queue(priv
, queue
);
88 napi_enable(&ch
->rx_napi
);
89 napi_enable(&ch
->tx_napi
);
95 int stmmac_xdp_setup_pool(struct stmmac_priv
*priv
, struct xsk_buff_pool
*pool
,
98 return pool
? stmmac_xdp_enable_pool(priv
, pool
, queue
) :
99 stmmac_xdp_disable_pool(priv
, queue
);
102 int stmmac_xdp_set_prog(struct stmmac_priv
*priv
, struct bpf_prog
*prog
,
103 struct netlink_ext_ack
*extack
)
105 struct net_device
*dev
= priv
->dev
;
106 struct bpf_prog
*old_prog
;
110 if_running
= netif_running(dev
);
112 if (prog
&& dev
->mtu
> ETH_DATA_LEN
) {
113 /* For now, the driver doesn't support XDP functionality with
114 * jumbo frames so we return error.
116 NL_SET_ERR_MSG_MOD(extack
, "Jumbo frames not supported");
120 need_update
= !!priv
->xdp_prog
!= !!prog
;
121 if (if_running
&& need_update
)
122 stmmac_xdp_release(dev
);
124 old_prog
= xchg(&priv
->xdp_prog
, prog
);
126 bpf_prog_put(old_prog
);
128 /* Disable RX SPH for XDP operation */
129 priv
->sph
= priv
->sph_cap
&& !stmmac_xdp_is_enabled(priv
);
131 if (if_running
&& need_update
)
132 stmmac_xdp_open(dev
);