xref: /freebsd/sys/dev/iavf/iavf_iflib.h (revision ca853dee3b8f26f53d48d685f32ec0b8396369e8)
1*ca853deeSEric Joyner /* SPDX-License-Identifier: BSD-3-Clause */
2*ca853deeSEric Joyner /*  Copyright (c) 2021, Intel Corporation
3*ca853deeSEric Joyner  *  All rights reserved.
4*ca853deeSEric Joyner  *
5*ca853deeSEric Joyner  *  Redistribution and use in source and binary forms, with or without
6*ca853deeSEric Joyner  *  modification, are permitted provided that the following conditions are met:
7*ca853deeSEric Joyner  *
8*ca853deeSEric Joyner  *   1. Redistributions of source code must retain the above copyright notice,
9*ca853deeSEric Joyner  *      this list of conditions and the following disclaimer.
10*ca853deeSEric Joyner  *
11*ca853deeSEric Joyner  *   2. Redistributions in binary form must reproduce the above copyright
12*ca853deeSEric Joyner  *      notice, this list of conditions and the following disclaimer in the
13*ca853deeSEric Joyner  *      documentation and/or other materials provided with the distribution.
14*ca853deeSEric Joyner  *
15*ca853deeSEric Joyner  *   3. Neither the name of the Intel Corporation nor the names of its
16*ca853deeSEric Joyner  *      contributors may be used to endorse or promote products derived from
17*ca853deeSEric Joyner  *      this software without specific prior written permission.
18*ca853deeSEric Joyner  *
19*ca853deeSEric Joyner  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20*ca853deeSEric Joyner  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21*ca853deeSEric Joyner  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22*ca853deeSEric Joyner  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23*ca853deeSEric Joyner  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*ca853deeSEric Joyner  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*ca853deeSEric Joyner  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*ca853deeSEric Joyner  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*ca853deeSEric Joyner  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*ca853deeSEric Joyner  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*ca853deeSEric Joyner  *  POSSIBILITY OF SUCH DAMAGE.
30*ca853deeSEric Joyner  */
31*ca853deeSEric Joyner /*$FreeBSD$*/
32*ca853deeSEric Joyner 
33*ca853deeSEric Joyner /**
34*ca853deeSEric Joyner  * @file iavf_iflib.h
35*ca853deeSEric Joyner  * @brief main header for the iflib driver
36*ca853deeSEric Joyner  *
37*ca853deeSEric Joyner  * Contains definitions for various driver structures used throughout the
38*ca853deeSEric Joyner  * driver code. This header is used by the iflib implementation.
39*ca853deeSEric Joyner  */
40*ca853deeSEric Joyner #ifndef _IAVF_IFLIB_H_
41*ca853deeSEric Joyner #define _IAVF_IFLIB_H_
42*ca853deeSEric Joyner 
43*ca853deeSEric Joyner #include "iavf_opts.h"
44*ca853deeSEric Joyner 
45*ca853deeSEric Joyner #include <sys/param.h>
46*ca853deeSEric Joyner #include <sys/systm.h>
47*ca853deeSEric Joyner #include <sys/buf_ring.h>
48*ca853deeSEric Joyner #include <sys/mbuf.h>
49*ca853deeSEric Joyner #include <sys/protosw.h>
50*ca853deeSEric Joyner #include <sys/socket.h>
51*ca853deeSEric Joyner #include <sys/malloc.h>
52*ca853deeSEric Joyner #include <sys/kernel.h>
53*ca853deeSEric Joyner #include <sys/module.h>
54*ca853deeSEric Joyner #include <sys/sockio.h>
55*ca853deeSEric Joyner #include <sys/eventhandler.h>
56*ca853deeSEric Joyner #include <sys/syslog.h>
57*ca853deeSEric Joyner 
58*ca853deeSEric Joyner #include <net/if.h>
59*ca853deeSEric Joyner #include <net/if_var.h>
60*ca853deeSEric Joyner #include <net/if_arp.h>
61*ca853deeSEric Joyner #include <net/bpf.h>
62*ca853deeSEric Joyner #include <net/if_dl.h>
63*ca853deeSEric Joyner #include <net/if_media.h>
64*ca853deeSEric Joyner 
65*ca853deeSEric Joyner #include <net/bpf.h>
66*ca853deeSEric Joyner #include <net/if_types.h>
67*ca853deeSEric Joyner #include <net/if_vlan_var.h>
68*ca853deeSEric Joyner 
69*ca853deeSEric Joyner #include <netinet/in_systm.h>
70*ca853deeSEric Joyner #include <netinet/in.h>
71*ca853deeSEric Joyner #include <netinet/if_ether.h>
72*ca853deeSEric Joyner #include <netinet/ip.h>
73*ca853deeSEric Joyner #include <netinet/ip6.h>
74*ca853deeSEric Joyner #include <netinet/tcp.h>
75*ca853deeSEric Joyner #include <netinet/tcp_lro.h>
76*ca853deeSEric Joyner #include <netinet/udp.h>
77*ca853deeSEric Joyner #include <netinet/sctp.h>
78*ca853deeSEric Joyner 
79*ca853deeSEric Joyner #include <machine/in_cksum.h>
80*ca853deeSEric Joyner 
81*ca853deeSEric Joyner #include <sys/bus.h>
82*ca853deeSEric Joyner #include <sys/pciio.h>
83*ca853deeSEric Joyner #include <machine/bus.h>
84*ca853deeSEric Joyner #include <sys/rman.h>
85*ca853deeSEric Joyner #include <machine/resource.h>
86*ca853deeSEric Joyner #include <vm/vm.h>
87*ca853deeSEric Joyner #include <vm/pmap.h>
88*ca853deeSEric Joyner #include <machine/clock.h>
89*ca853deeSEric Joyner #include <dev/pci/pcivar.h>
90*ca853deeSEric Joyner #include <dev/pci/pcireg.h>
91*ca853deeSEric Joyner #include <sys/proc.h>
92*ca853deeSEric Joyner #include <sys/endian.h>
93*ca853deeSEric Joyner #include <sys/taskqueue.h>
94*ca853deeSEric Joyner #include <sys/pcpu.h>
95*ca853deeSEric Joyner #include <sys/smp.h>
96*ca853deeSEric Joyner #include <sys/sbuf.h>
97*ca853deeSEric Joyner #include <machine/smp.h>
98*ca853deeSEric Joyner #include <machine/stdarg.h>
99*ca853deeSEric Joyner #include <net/ethernet.h>
100*ca853deeSEric Joyner #include <net/iflib.h>
101*ca853deeSEric Joyner #include "ifdi_if.h"
102*ca853deeSEric Joyner 
103*ca853deeSEric Joyner #include "iavf_lib.h"
104*ca853deeSEric Joyner 
105*ca853deeSEric Joyner #define IAVF_CSUM_TCP \
106*ca853deeSEric Joyner 	(CSUM_IP_TCP|CSUM_IP_TSO|CSUM_IP6_TSO|CSUM_IP6_TCP)
107*ca853deeSEric Joyner #define IAVF_CSUM_UDP \
108*ca853deeSEric Joyner 	(CSUM_IP_UDP|CSUM_IP6_UDP)
109*ca853deeSEric Joyner #define IAVF_CSUM_SCTP \
110*ca853deeSEric Joyner 	(CSUM_IP_SCTP|CSUM_IP6_SCTP)
111*ca853deeSEric Joyner #define IAVF_CSUM_IPV4 \
112*ca853deeSEric Joyner 	(CSUM_IP|CSUM_IP_TSO)
113*ca853deeSEric Joyner 
114*ca853deeSEric Joyner #define IAVF_CAPS \
115*ca853deeSEric Joyner 	(IFCAP_TSO4 | IFCAP_TSO6 | \
116*ca853deeSEric Joyner 	 IFCAP_TXCSUM | IFCAP_TXCSUM_IPV6 | \
117*ca853deeSEric Joyner 	 IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | \
118*ca853deeSEric Joyner 	 IFCAP_VLAN_HWFILTER | IFCAP_VLAN_HWTSO | \
119*ca853deeSEric Joyner 	 IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM | \
120*ca853deeSEric Joyner 	 IFCAP_VLAN_MTU | IFCAP_JUMBO_MTU | IFCAP_LRO)
121*ca853deeSEric Joyner 
122*ca853deeSEric Joyner #define iavf_sc_from_ctx(_ctx) \
123*ca853deeSEric Joyner     ((struct iavf_sc *)iflib_get_softc(_ctx))
124*ca853deeSEric Joyner 
125*ca853deeSEric Joyner /* Use the correct assert function for each lock type */
126*ca853deeSEric Joyner #define IFLIB_CTX_ASSERT(_ctx) \
127*ca853deeSEric Joyner     sx_assert(iflib_ctx_lock_get(_ctx), SA_XLOCKED)
128*ca853deeSEric Joyner 
129*ca853deeSEric Joyner #define IAVF_VC_LOCK(_sc)                mtx_lock(&(_sc)->vc_mtx)
130*ca853deeSEric Joyner #define IAVF_VC_UNLOCK(_sc)              mtx_unlock(&(_sc)->vc_mtx)
131*ca853deeSEric Joyner #define IAVF_VC_LOCK_DESTROY(_sc)        mtx_destroy(&(_sc)->vc_mtx)
132*ca853deeSEric Joyner #define IAVF_VC_TRYLOCK(_sc)             mtx_trylock(&(_sc)->vc_mtx)
133*ca853deeSEric Joyner #define IAVF_VC_LOCK_ASSERT(_sc)         mtx_assert(&(_sc)->vc_mtx, MA_OWNED)
134*ca853deeSEric Joyner 
135*ca853deeSEric Joyner /**
136*ca853deeSEric Joyner  * @struct tx_ring
137*ca853deeSEric Joyner  * @brief Transmit ring control struct
138*ca853deeSEric Joyner  *
139*ca853deeSEric Joyner  * Structure used to track the hardware Tx ring data.
140*ca853deeSEric Joyner  */
141*ca853deeSEric Joyner struct tx_ring {
142*ca853deeSEric Joyner         struct iavf_tx_queue	*que;
143*ca853deeSEric Joyner 	u32			tail;
144*ca853deeSEric Joyner 	struct iavf_tx_desc	*tx_base;
145*ca853deeSEric Joyner 	u64			tx_paddr;
146*ca853deeSEric Joyner 	u32			packets;
147*ca853deeSEric Joyner 	u32			me;
148*ca853deeSEric Joyner 
149*ca853deeSEric Joyner 	/*
150*ca853deeSEric Joyner 	 * For reporting completed packet status
151*ca853deeSEric Joyner 	 * in descriptor writeback mdoe
152*ca853deeSEric Joyner 	 */
153*ca853deeSEric Joyner 	qidx_t			*tx_rsq;
154*ca853deeSEric Joyner 	qidx_t			tx_rs_cidx;
155*ca853deeSEric Joyner 	qidx_t			tx_rs_pidx;
156*ca853deeSEric Joyner 	qidx_t			tx_cidx_processed;
157*ca853deeSEric Joyner 
158*ca853deeSEric Joyner 	/* Used for Dynamic ITR calculation */
159*ca853deeSEric Joyner 	u32			bytes;
160*ca853deeSEric Joyner 	u32			itr;
161*ca853deeSEric Joyner 	u32			latency;
162*ca853deeSEric Joyner 
163*ca853deeSEric Joyner 	/* Soft Stats */
164*ca853deeSEric Joyner 	u64			tx_bytes;
165*ca853deeSEric Joyner 	u64			tx_packets;
166*ca853deeSEric Joyner 	u64			mss_too_small;
167*ca853deeSEric Joyner };
168*ca853deeSEric Joyner 
169*ca853deeSEric Joyner /**
170*ca853deeSEric Joyner  * @struct rx_ring
171*ca853deeSEric Joyner  * @brief Receive ring control struct
172*ca853deeSEric Joyner  *
173*ca853deeSEric Joyner  * Structure used to track the hardware Rx ring data.
174*ca853deeSEric Joyner  */
175*ca853deeSEric Joyner struct rx_ring {
176*ca853deeSEric Joyner         struct iavf_rx_queue	*que;
177*ca853deeSEric Joyner 	union iavf_rx_desc	*rx_base;
178*ca853deeSEric Joyner 	uint64_t		rx_paddr;
179*ca853deeSEric Joyner 	bool			discard;
180*ca853deeSEric Joyner 	u32			itr;
181*ca853deeSEric Joyner 	u32			latency;
182*ca853deeSEric Joyner 	u32			mbuf_sz;
183*ca853deeSEric Joyner 	u32			tail;
184*ca853deeSEric Joyner 	u32			me;
185*ca853deeSEric Joyner 
186*ca853deeSEric Joyner 	/* Used for Dynamic ITR calculation */
187*ca853deeSEric Joyner 	u32			packets;
188*ca853deeSEric Joyner 	u32			bytes;
189*ca853deeSEric Joyner 
190*ca853deeSEric Joyner 	/* Soft stats */
191*ca853deeSEric Joyner 	u64			rx_packets;
192*ca853deeSEric Joyner 	u64			rx_bytes;
193*ca853deeSEric Joyner 	u64			desc_errs;
194*ca853deeSEric Joyner };
195*ca853deeSEric Joyner 
196*ca853deeSEric Joyner /**
197*ca853deeSEric Joyner  * @struct iavf_tx_queue
198*ca853deeSEric Joyner  * @brief Driver Tx queue structure
199*ca853deeSEric Joyner  *
200*ca853deeSEric Joyner  * Structure to track the Tx ring, IRQ, MSI-X vector, and some software stats
201*ca853deeSEric Joyner  * for a Tx queue.
202*ca853deeSEric Joyner  */
203*ca853deeSEric Joyner struct iavf_tx_queue {
204*ca853deeSEric Joyner 	struct iavf_vsi		*vsi;
205*ca853deeSEric Joyner 	struct tx_ring		txr;
206*ca853deeSEric Joyner 	struct if_irq		que_irq;
207*ca853deeSEric Joyner 	u32			msix;
208*ca853deeSEric Joyner 
209*ca853deeSEric Joyner 	/* Stats */
210*ca853deeSEric Joyner 	u64			irqs;
211*ca853deeSEric Joyner 	u64			tso;
212*ca853deeSEric Joyner 	u32			pkt_too_small;
213*ca853deeSEric Joyner };
214*ca853deeSEric Joyner 
215*ca853deeSEric Joyner /**
216*ca853deeSEric Joyner  * @struct iavf_rx_queue
217*ca853deeSEric Joyner  * @brief Driver Rx queue structure
218*ca853deeSEric Joyner  *
219*ca853deeSEric Joyner  * Structure to track the Rx ring, IRQ, MSI-X vector, and some software stats
220*ca853deeSEric Joyner  * for an Rx queue.
221*ca853deeSEric Joyner  */
222*ca853deeSEric Joyner struct iavf_rx_queue {
223*ca853deeSEric Joyner 	struct iavf_vsi		*vsi;
224*ca853deeSEric Joyner 	struct rx_ring		rxr;
225*ca853deeSEric Joyner 	struct if_irq		que_irq;
226*ca853deeSEric Joyner 	u32			msix;
227*ca853deeSEric Joyner 
228*ca853deeSEric Joyner 	/* Stats */
229*ca853deeSEric Joyner 	u64			irqs;
230*ca853deeSEric Joyner };
231*ca853deeSEric Joyner 
232*ca853deeSEric Joyner /**
233*ca853deeSEric Joyner  * @struct iavf_vsi
234*ca853deeSEric Joyner  * @brief Virtual Station Interface
235*ca853deeSEric Joyner  *
236*ca853deeSEric Joyner  * Data tracking a VSI for an iavf device.
237*ca853deeSEric Joyner  */
238*ca853deeSEric Joyner struct iavf_vsi {
239*ca853deeSEric Joyner 	if_ctx_t		ctx;
240*ca853deeSEric Joyner 	if_softc_ctx_t		shared;
241*ca853deeSEric Joyner 	struct ifnet		*ifp;
242*ca853deeSEric Joyner 	struct iavf_sc		*back;
243*ca853deeSEric Joyner 	device_t		dev;
244*ca853deeSEric Joyner 	struct iavf_hw		*hw;
245*ca853deeSEric Joyner 
246*ca853deeSEric Joyner 	int			id;
247*ca853deeSEric Joyner 	u16			num_rx_queues;
248*ca853deeSEric Joyner 	u16			num_tx_queues;
249*ca853deeSEric Joyner 	u32			rx_itr_setting;
250*ca853deeSEric Joyner 	u32			tx_itr_setting;
251*ca853deeSEric Joyner 	u16			max_frame_size;
252*ca853deeSEric Joyner 	bool			enable_head_writeback;
253*ca853deeSEric Joyner 
254*ca853deeSEric Joyner 	bool			link_active;
255*ca853deeSEric Joyner 
256*ca853deeSEric Joyner 	struct iavf_tx_queue	*tx_queues;
257*ca853deeSEric Joyner 	struct iavf_rx_queue	*rx_queues;
258*ca853deeSEric Joyner 	struct if_irq		irq;
259*ca853deeSEric Joyner 
260*ca853deeSEric Joyner 	u16			num_vlans;
261*ca853deeSEric Joyner 	u16			num_macs;
262*ca853deeSEric Joyner 
263*ca853deeSEric Joyner 	/* Per-VSI stats from hardware */
264*ca853deeSEric Joyner 	struct iavf_eth_stats	eth_stats;
265*ca853deeSEric Joyner 	struct iavf_eth_stats	eth_stats_offsets;
266*ca853deeSEric Joyner 	bool			stat_offsets_loaded;
267*ca853deeSEric Joyner 	/* VSI stat counters */
268*ca853deeSEric Joyner 	u64			ipackets;
269*ca853deeSEric Joyner 	u64			ierrors;
270*ca853deeSEric Joyner 	u64			opackets;
271*ca853deeSEric Joyner 	u64			oerrors;
272*ca853deeSEric Joyner 	u64			ibytes;
273*ca853deeSEric Joyner 	u64			obytes;
274*ca853deeSEric Joyner 	u64			imcasts;
275*ca853deeSEric Joyner 	u64			omcasts;
276*ca853deeSEric Joyner 	u64			iqdrops;
277*ca853deeSEric Joyner 	u64			oqdrops;
278*ca853deeSEric Joyner 	u64			noproto;
279*ca853deeSEric Joyner 
280*ca853deeSEric Joyner 	/* Misc. */
281*ca853deeSEric Joyner 	u64			flags;
282*ca853deeSEric Joyner 	struct sysctl_oid	*vsi_node;
283*ca853deeSEric Joyner 	struct sysctl_ctx_list  sysctl_ctx;
284*ca853deeSEric Joyner };
285*ca853deeSEric Joyner 
286*ca853deeSEric Joyner /**
287*ca853deeSEric Joyner  * @struct iavf_mac_filter
288*ca853deeSEric Joyner  * @brief MAC Address filter data
289*ca853deeSEric Joyner  *
290*ca853deeSEric Joyner  * Entry in the MAC filter list describing a MAC address filter used to
291*ca853deeSEric Joyner  * program hardware to filter a specific MAC address.
292*ca853deeSEric Joyner  */
293*ca853deeSEric Joyner struct iavf_mac_filter {
294*ca853deeSEric Joyner 	SLIST_ENTRY(iavf_mac_filter)  next;
295*ca853deeSEric Joyner 	u8      macaddr[ETHER_ADDR_LEN];
296*ca853deeSEric Joyner 	u16     flags;
297*ca853deeSEric Joyner };
298*ca853deeSEric Joyner 
299*ca853deeSEric Joyner /**
300*ca853deeSEric Joyner  * @struct mac_list
301*ca853deeSEric Joyner  * @brief MAC filter list head
302*ca853deeSEric Joyner  *
303*ca853deeSEric Joyner  * List head type for a singly-linked list of MAC address filters.
304*ca853deeSEric Joyner  */
305*ca853deeSEric Joyner SLIST_HEAD(mac_list, iavf_mac_filter);
306*ca853deeSEric Joyner 
307*ca853deeSEric Joyner /**
308*ca853deeSEric Joyner  * @struct iavf_vlan_filter
309*ca853deeSEric Joyner  * @brief VLAN filter data
310*ca853deeSEric Joyner  *
311*ca853deeSEric Joyner  * Entry in the VLAN filter list describing a VLAN filter used to
312*ca853deeSEric Joyner  * program hardware to filter traffic on a specific VLAN.
313*ca853deeSEric Joyner  */
314*ca853deeSEric Joyner struct iavf_vlan_filter {
315*ca853deeSEric Joyner 	SLIST_ENTRY(iavf_vlan_filter)  next;
316*ca853deeSEric Joyner 	u16     vlan;
317*ca853deeSEric Joyner 	u16     flags;
318*ca853deeSEric Joyner };
319*ca853deeSEric Joyner 
320*ca853deeSEric Joyner /**
321*ca853deeSEric Joyner  * @struct vlan_list
322*ca853deeSEric Joyner  * @brief VLAN filter list head
323*ca853deeSEric Joyner  *
324*ca853deeSEric Joyner  * List head type for a singly-linked list of VLAN filters.
325*ca853deeSEric Joyner  */
326*ca853deeSEric Joyner SLIST_HEAD(vlan_list, iavf_vlan_filter);
327*ca853deeSEric Joyner 
328*ca853deeSEric Joyner /**
329*ca853deeSEric Joyner  * @struct iavf_sc
330*ca853deeSEric Joyner  * @brief Main context structure for the iavf driver
331*ca853deeSEric Joyner  *
332*ca853deeSEric Joyner  * Software context structure used to store information about a single device
333*ca853deeSEric Joyner  * that is loaded by the iavf driver.
334*ca853deeSEric Joyner  */
335*ca853deeSEric Joyner struct iavf_sc {
336*ca853deeSEric Joyner 	struct iavf_vsi		vsi;
337*ca853deeSEric Joyner 
338*ca853deeSEric Joyner 	struct iavf_hw		hw;
339*ca853deeSEric Joyner 	struct iavf_osdep	osdep;
340*ca853deeSEric Joyner 	device_t		dev;
341*ca853deeSEric Joyner 
342*ca853deeSEric Joyner 	struct resource		*pci_mem;
343*ca853deeSEric Joyner 
344*ca853deeSEric Joyner 	/* driver state flags, only access using atomic functions */
345*ca853deeSEric Joyner 	u32			state;
346*ca853deeSEric Joyner 
347*ca853deeSEric Joyner 	struct ifmedia		*media;
348*ca853deeSEric Joyner 	struct virtchnl_version_info version;
349*ca853deeSEric Joyner 	enum iavf_dbg_mask	dbg_mask;
350*ca853deeSEric Joyner 	u16			promisc_flags;
351*ca853deeSEric Joyner 
352*ca853deeSEric Joyner 	bool			link_up;
353*ca853deeSEric Joyner 	union {
354*ca853deeSEric Joyner 		enum virtchnl_link_speed link_speed;
355*ca853deeSEric Joyner 		u32		link_speed_adv;
356*ca853deeSEric Joyner 	};
357*ca853deeSEric Joyner 
358*ca853deeSEric Joyner 	/* Tunable settings */
359*ca853deeSEric Joyner 	int			tx_itr;
360*ca853deeSEric Joyner 	int			rx_itr;
361*ca853deeSEric Joyner 	int			dynamic_tx_itr;
362*ca853deeSEric Joyner 	int			dynamic_rx_itr;
363*ca853deeSEric Joyner 
364*ca853deeSEric Joyner 	/* Filter lists */
365*ca853deeSEric Joyner 	struct mac_list		*mac_filters;
366*ca853deeSEric Joyner 	struct vlan_list	*vlan_filters;
367*ca853deeSEric Joyner 
368*ca853deeSEric Joyner 	/* Virtual comm channel */
369*ca853deeSEric Joyner 	struct virtchnl_vf_resource *vf_res;
370*ca853deeSEric Joyner 	struct virtchnl_vsi_resource *vsi_res;
371*ca853deeSEric Joyner 
372*ca853deeSEric Joyner 	/* Misc stats maintained by the driver */
373*ca853deeSEric Joyner 	u64			admin_irq;
374*ca853deeSEric Joyner 
375*ca853deeSEric Joyner 	/* Buffer used for reading AQ responses */
376*ca853deeSEric Joyner 	u8			aq_buffer[IAVF_AQ_BUF_SZ];
377*ca853deeSEric Joyner 
378*ca853deeSEric Joyner 	/* State flag used in init/stop */
379*ca853deeSEric Joyner 	u32			queues_enabled;
380*ca853deeSEric Joyner 	u8			enable_queues_chan;
381*ca853deeSEric Joyner 	u8			disable_queues_chan;
382*ca853deeSEric Joyner 
383*ca853deeSEric Joyner 	/* For virtchnl message processing task */
384*ca853deeSEric Joyner 	struct task		vc_task;
385*ca853deeSEric Joyner 	struct taskqueue	*vc_tq;
386*ca853deeSEric Joyner 	char			vc_mtx_name[16];
387*ca853deeSEric Joyner 	struct mtx		vc_mtx;
388*ca853deeSEric Joyner };
389*ca853deeSEric Joyner 
390*ca853deeSEric Joyner /* Function prototypes */
391*ca853deeSEric Joyner void		 iavf_init_tx_ring(struct iavf_vsi *vsi, struct iavf_tx_queue *que);
392*ca853deeSEric Joyner void		 iavf_get_default_rss_key(u32 *);
393*ca853deeSEric Joyner const char *	iavf_vc_stat_str(struct iavf_hw *hw,
394*ca853deeSEric Joyner     enum virtchnl_status_code stat_err);
395*ca853deeSEric Joyner void		iavf_init_tx_rsqs(struct iavf_vsi *vsi);
396*ca853deeSEric Joyner void		iavf_init_tx_cidx(struct iavf_vsi *vsi);
397*ca853deeSEric Joyner u64		iavf_max_vc_speed_to_value(u8 link_speeds);
398*ca853deeSEric Joyner void		iavf_add_vsi_sysctls(device_t dev, struct iavf_vsi *vsi,
399*ca853deeSEric Joyner 		    struct sysctl_ctx_list *ctx, const char *sysctl_name);
400*ca853deeSEric Joyner void		iavf_add_sysctls_eth_stats(struct sysctl_ctx_list *ctx,
401*ca853deeSEric Joyner 		    struct sysctl_oid_list *child,
402*ca853deeSEric Joyner 		    struct iavf_eth_stats *eth_stats);
403*ca853deeSEric Joyner void		iavf_add_queues_sysctls(device_t dev, struct iavf_vsi *vsi);
404*ca853deeSEric Joyner 
405*ca853deeSEric Joyner void	iavf_enable_intr(struct iavf_vsi *);
406*ca853deeSEric Joyner void	iavf_disable_intr(struct iavf_vsi *);
407*ca853deeSEric Joyner #endif /* _IAVF_IFLIB_H_ */
408