| // SPDX-License-Identifier: GPL-2.0-only |
| /* Copyright (C) 2025 Intel Corporation */ |
| |
| #define DEFAULT_SYMBOL_NAMESPACE "LIBETH" |
| |
| #include <net/libeth/xdp.h> |
| |
| #include "priv.h" |
| |
| /* Tx buffer completion */ |
| |
| DEFINE_STATIC_CALL_NULL(bulk, libeth_xdp_return_buff_bulk); |
| DEFINE_STATIC_CALL_NULL(xsk, libeth_xsk_buff_free_slow); |
| |
| /** |
| * libeth_tx_complete_any - perform Tx completion for one SQE of any type |
| * @sqe: Tx buffer to complete |
| * @cp: polling params |
| * |
| * Can be used to complete both regular and XDP SQEs, for example when |
| * destroying queues. |
| * When libeth_xdp is not loaded, XDPSQEs won't be handled. |
| */ |
| void libeth_tx_complete_any(struct libeth_sqe *sqe, struct libeth_cq_pp *cp) |
| { |
| if (sqe->type >= __LIBETH_SQE_XDP_START) |
| __libeth_xdp_complete_tx(sqe, cp, static_call(bulk), |
| static_call(xsk)); |
| else |
| libeth_tx_complete(sqe, cp); |
| } |
| EXPORT_SYMBOL_GPL(libeth_tx_complete_any); |
| |
| /* Module */ |
| |
| void libeth_attach_xdp(const struct libeth_xdp_ops *ops) |
| { |
| static_call_update(bulk, ops ? ops->bulk : NULL); |
| static_call_update(xsk, ops ? ops->xsk : NULL); |
| } |
| EXPORT_SYMBOL_GPL(libeth_attach_xdp); |