// SPDX-License-Identifier: GPL-2.0-only /* Copyright (C) 2025 Intel Corporation */ #define DEFAULT_SYMBOL_NAMESPACE "LIBETH" #include #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);