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