| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* Copyright (C) 2024-2025 Intel Corporation */ |
| |
| #ifndef __LIBETH_TYPES_H |
| #define __LIBETH_TYPES_H |
| |
| #include <linux/workqueue.h> |
| |
| /* Stats */ |
| |
| /** |
| * struct libeth_rq_napi_stats - "hot" counters to update in Rx polling loop |
| * @packets: received frames counter |
| * @bytes: sum of bytes of received frames above |
| * @fragments: sum of fragments of received S/G frames |
| * @hsplit: number of frames the device performed the header split for |
| * @raw: alias to access all the fields as an array |
| */ |
| struct libeth_rq_napi_stats { |
| union { |
| struct { |
| u32 packets; |
| u32 bytes; |
| u32 fragments; |
| u32 hsplit; |
| }; |
| DECLARE_FLEX_ARRAY(u32, raw); |
| }; |
| }; |
| |
| /** |
| * struct libeth_sq_napi_stats - "hot" counters to update in Tx completion loop |
| * @packets: completed frames counter |
| * @bytes: sum of bytes of completed frames above |
| * @raw: alias to access all the fields as an array |
| */ |
| struct libeth_sq_napi_stats { |
| union { |
| struct { |
| u32 packets; |
| u32 bytes; |
| }; |
| DECLARE_FLEX_ARRAY(u32, raw); |
| }; |
| }; |
| |
| /** |
| * struct libeth_xdpsq_napi_stats - "hot" counters to update in XDP Tx |
| * completion loop |
| * @packets: completed frames counter |
| * @bytes: sum of bytes of completed frames above |
| * @fragments: sum of fragments of completed S/G frames |
| * @raw: alias to access all the fields as an array |
| */ |
| struct libeth_xdpsq_napi_stats { |
| union { |
| struct { |
| u32 packets; |
| u32 bytes; |
| u32 fragments; |
| }; |
| DECLARE_FLEX_ARRAY(u32, raw); |
| }; |
| }; |
| |
| /* XDP */ |
| |
| /* |
| * The following structures should be embedded into driver's queue structure |
| * and passed to the libeth_xdp helpers, never used directly. |
| */ |
| |
| /* XDPSQ sharing */ |
| |
| /** |
| * struct libeth_xdpsq_lock - locking primitive for sharing XDPSQs |
| * @lock: spinlock for locking the queue |
| * @share: whether this particular queue is shared |
| */ |
| struct libeth_xdpsq_lock { |
| spinlock_t lock; |
| bool share; |
| }; |
| |
| /* XDPSQ clean-up timers */ |
| |
| /** |
| * struct libeth_xdpsq_timer - timer for cleaning up XDPSQs w/o interrupts |
| * @xdpsq: queue this timer belongs to |
| * @lock: lock for the queue |
| * @dwork: work performing cleanups |
| * |
| * XDPSQs not using interrupts but lazy cleaning, i.e. only when there's no |
| * space for sending the current queued frame/bulk, must fire up timers to |
| * make sure there are no stale buffers to free. |
| */ |
| struct libeth_xdpsq_timer { |
| void *xdpsq; |
| struct libeth_xdpsq_lock *lock; |
| |
| struct delayed_work dwork; |
| }; |
| |
| /* Rx polling path */ |
| |
| /** |
| * struct libeth_xdp_buff_stash - struct for stashing &xdp_buff onto a queue |
| * @data: pointer to the start of the frame, xdp_buff.data |
| * @headroom: frame headroom, xdp_buff.data - xdp_buff.data_hard_start |
| * @len: frame linear space length, xdp_buff.data_end - xdp_buff.data |
| * @frame_sz: truesize occupied by the frame, xdp_buff.frame_sz |
| * @flags: xdp_buff.flags |
| * |
| * &xdp_buff is 56 bytes long on x64, &libeth_xdp_buff is 64 bytes. This |
| * structure carries only necessary fields to save/restore a partially built |
| * frame on the queue structure to finish it during the next NAPI poll. |
| */ |
| struct libeth_xdp_buff_stash { |
| void *data; |
| u16 headroom; |
| u16 len; |
| |
| u32 frame_sz:24; |
| u32 flags:8; |
| } __aligned_largest; |
| |
| #endif /* __LIBETH_TYPES_H */ |