The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/iavf/if_iavf_iflib.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* SPDX-License-Identifier: BSD-3-Clause */
    2 /*  Copyright (c) 2021, Intel Corporation
    3  *  All rights reserved.
    4  *
    5  *  Redistribution and use in source and binary forms, with or without
    6  *  modification, are permitted provided that the following conditions are met:
    7  *
    8  *   1. Redistributions of source code must retain the above copyright notice,
    9  *      this list of conditions and the following disclaimer.
   10  *
   11  *   2. Redistributions in binary form must reproduce the above copyright
   12  *      notice, this list of conditions and the following disclaimer in the
   13  *      documentation and/or other materials provided with the distribution.
   14  *
   15  *   3. Neither the name of the Intel Corporation nor the names of its
   16  *      contributors may be used to endorse or promote products derived from
   17  *      this software without specific prior written permission.
   18  *
   19  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   20  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   23  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  *  POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 /*$FreeBSD$*/
   32 
   33 /**
   34  * @file if_iavf_iflib.c
   35  * @brief iflib driver implementation
   36  *
   37  * Contains the main entry point for the iflib driver implementation. It
   38  * implements the various ifdi driver methods, and sets up the module and
   39  * driver values to load an iflib driver.
   40  */
   41 
   42 #include "iavf_iflib.h"
   43 #include "iavf_vc_common.h"
   44 
   45 #include "iavf_drv_info.h"
   46 #include "iavf_sysctls_iflib.h"
   47 
   48 /*********************************************************************
   49  *  Function prototypes
   50  *********************************************************************/
   51 static void      *iavf_register(device_t dev);
   52 static int       iavf_if_attach_pre(if_ctx_t ctx);
   53 static int       iavf_if_attach_post(if_ctx_t ctx);
   54 static int       iavf_if_detach(if_ctx_t ctx);
   55 static int       iavf_if_shutdown(if_ctx_t ctx);
   56 static int       iavf_if_suspend(if_ctx_t ctx);
   57 static int       iavf_if_resume(if_ctx_t ctx);
   58 static int       iavf_if_msix_intr_assign(if_ctx_t ctx, int msix);
   59 static void      iavf_if_enable_intr(if_ctx_t ctx);
   60 static void      iavf_if_disable_intr(if_ctx_t ctx);
   61 static int       iavf_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid);
   62 static int       iavf_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid);
   63 static int       iavf_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets);
   64 static int       iavf_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nqs, int nqsets);
   65 static void      iavf_if_queues_free(if_ctx_t ctx);
   66 static void      iavf_if_update_admin_status(if_ctx_t ctx);
   67 static void      iavf_if_multi_set(if_ctx_t ctx);
   68 static int       iavf_if_mtu_set(if_ctx_t ctx, uint32_t mtu);
   69 static void      iavf_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr);
   70 static int       iavf_if_media_change(if_ctx_t ctx);
   71 static int       iavf_if_promisc_set(if_ctx_t ctx, int flags);
   72 static void      iavf_if_timer(if_ctx_t ctx, uint16_t qid);
   73 static void      iavf_if_vlan_register(if_ctx_t ctx, u16 vtag);
   74 static void      iavf_if_vlan_unregister(if_ctx_t ctx, u16 vtag);
   75 static uint64_t  iavf_if_get_counter(if_ctx_t ctx, ift_counter cnt);
   76 static void      iavf_if_init(if_ctx_t ctx);
   77 static void      iavf_if_stop(if_ctx_t ctx);
   78 
   79 static int      iavf_allocate_pci_resources(struct iavf_sc *);
   80 static void     iavf_free_pci_resources(struct iavf_sc *);
   81 static void     iavf_setup_interface(struct iavf_sc *);
   82 static void     iavf_add_device_sysctls(struct iavf_sc *);
   83 static void     iavf_enable_queue_irq(struct iavf_hw *, int);
   84 static void     iavf_disable_queue_irq(struct iavf_hw *, int);
   85 static void     iavf_stop(struct iavf_sc *);
   86 
   87 static int      iavf_del_mac_filter(struct iavf_sc *sc, u8 *macaddr);
   88 static int      iavf_msix_que(void *);
   89 static int      iavf_msix_adminq(void *);
   90 static void     iavf_configure_itr(struct iavf_sc *sc);
   91 
   92 static int      iavf_sysctl_queue_interrupt_table(SYSCTL_HANDLER_ARGS);
   93 #ifdef IAVF_DEBUG
   94 static int      iavf_sysctl_vf_reset(SYSCTL_HANDLER_ARGS);
   95 static int      iavf_sysctl_vflr_reset(SYSCTL_HANDLER_ARGS);
   96 #endif
   97 
   98 static enum iavf_status iavf_process_adminq(struct iavf_sc *, u16 *);
   99 static void     iavf_vc_task(void *arg, int pending __unused);
  100 static int      iavf_setup_vc_tq(struct iavf_sc *sc);
  101 static int      iavf_vc_sleep_wait(struct iavf_sc *sc, u32 op);
  102 
  103 /*********************************************************************
  104  *  FreeBSD Device Interface Entry Points
  105  *********************************************************************/
  106 
  107 /**
  108  * @var iavf_methods
  109  * @brief device methods for the iavf driver
  110  *
  111  * Device method callbacks used to interact with the driver. For iflib this
  112  * primarily resolves to the default iflib implementations.
  113  */
  114 static device_method_t iavf_methods[] = {
  115         /* Device interface */
  116         DEVMETHOD(device_register, iavf_register),
  117         DEVMETHOD(device_probe, iflib_device_probe),
  118         DEVMETHOD(device_attach, iflib_device_attach),
  119         DEVMETHOD(device_detach, iflib_device_detach),
  120         DEVMETHOD(device_shutdown, iflib_device_shutdown),
  121         DEVMETHOD_END
  122 };
  123 
  124 static driver_t iavf_driver = {
  125         "iavf", iavf_methods, sizeof(struct iavf_sc),
  126 };
  127 
  128 DRIVER_MODULE(iavf, pci, iavf_driver, 0, 0);
  129 MODULE_VERSION(iavf, 1);
  130 
  131 MODULE_DEPEND(iavf, pci, 1, 1, 1);
  132 MODULE_DEPEND(iavf, ether, 1, 1, 1);
  133 MODULE_DEPEND(iavf, iflib, 1, 1, 1);
  134 
  135 IFLIB_PNP_INFO(pci, iavf, iavf_vendor_info_array);
  136 
  137 /**
  138  * @var M_IAVF
  139  * @brief main iavf driver allocation type
  140  *
  141  * malloc(9) allocation type used by the majority of memory allocations in the
  142  * iavf iflib driver.
  143  */
  144 MALLOC_DEFINE(M_IAVF, "iavf", "iavf driver allocations");
  145 
  146 static device_method_t iavf_if_methods[] = {
  147         DEVMETHOD(ifdi_attach_pre, iavf_if_attach_pre),
  148         DEVMETHOD(ifdi_attach_post, iavf_if_attach_post),
  149         DEVMETHOD(ifdi_detach, iavf_if_detach),
  150         DEVMETHOD(ifdi_shutdown, iavf_if_shutdown),
  151         DEVMETHOD(ifdi_suspend, iavf_if_suspend),
  152         DEVMETHOD(ifdi_resume, iavf_if_resume),
  153         DEVMETHOD(ifdi_init, iavf_if_init),
  154         DEVMETHOD(ifdi_stop, iavf_if_stop),
  155         DEVMETHOD(ifdi_msix_intr_assign, iavf_if_msix_intr_assign),
  156         DEVMETHOD(ifdi_intr_enable, iavf_if_enable_intr),
  157         DEVMETHOD(ifdi_intr_disable, iavf_if_disable_intr),
  158         DEVMETHOD(ifdi_rx_queue_intr_enable, iavf_if_rx_queue_intr_enable),
  159         DEVMETHOD(ifdi_tx_queue_intr_enable, iavf_if_tx_queue_intr_enable),
  160         DEVMETHOD(ifdi_tx_queues_alloc, iavf_if_tx_queues_alloc),
  161         DEVMETHOD(ifdi_rx_queues_alloc, iavf_if_rx_queues_alloc),
  162         DEVMETHOD(ifdi_queues_free, iavf_if_queues_free),
  163         DEVMETHOD(ifdi_update_admin_status, iavf_if_update_admin_status),
  164         DEVMETHOD(ifdi_multi_set, iavf_if_multi_set),
  165         DEVMETHOD(ifdi_mtu_set, iavf_if_mtu_set),
  166         DEVMETHOD(ifdi_media_status, iavf_if_media_status),
  167         DEVMETHOD(ifdi_media_change, iavf_if_media_change),
  168         DEVMETHOD(ifdi_promisc_set, iavf_if_promisc_set),
  169         DEVMETHOD(ifdi_timer, iavf_if_timer),
  170         DEVMETHOD(ifdi_vlan_register, iavf_if_vlan_register),
  171         DEVMETHOD(ifdi_vlan_unregister, iavf_if_vlan_unregister),
  172         DEVMETHOD(ifdi_get_counter, iavf_if_get_counter),
  173         DEVMETHOD_END
  174 };
  175 
  176 static driver_t iavf_if_driver = {
  177         "iavf_if", iavf_if_methods, sizeof(struct iavf_sc)
  178 };
  179 
  180 extern struct if_txrx iavf_txrx_hwb;
  181 extern struct if_txrx iavf_txrx_dwb;
  182 
  183 static struct if_shared_ctx iavf_sctx = {
  184         .isc_magic = IFLIB_MAGIC,
  185         .isc_q_align = PAGE_SIZE,
  186         .isc_tx_maxsize = IAVF_MAX_FRAME,
  187         .isc_tx_maxsegsize = IAVF_MAX_FRAME,
  188         .isc_tso_maxsize = IAVF_TSO_SIZE + sizeof(struct ether_vlan_header),
  189         .isc_tso_maxsegsize = IAVF_MAX_DMA_SEG_SIZE,
  190         .isc_rx_maxsize = IAVF_MAX_FRAME,
  191         .isc_rx_nsegments = IAVF_MAX_RX_SEGS,
  192         .isc_rx_maxsegsize = IAVF_MAX_FRAME,
  193         .isc_nfl = 1,
  194         .isc_ntxqs = 1,
  195         .isc_nrxqs = 1,
  196 
  197         .isc_admin_intrcnt = 1,
  198         .isc_vendor_info = iavf_vendor_info_array,
  199         .isc_driver_version = __DECONST(char *, iavf_driver_version),
  200         .isc_driver = &iavf_if_driver,
  201         .isc_flags = IFLIB_NEED_SCRATCH | IFLIB_NEED_ZERO_CSUM | IFLIB_TSO_INIT_IP | IFLIB_IS_VF,
  202 
  203         .isc_nrxd_min = {IAVF_MIN_RING},
  204         .isc_ntxd_min = {IAVF_MIN_RING},
  205         .isc_nrxd_max = {IAVF_MAX_RING},
  206         .isc_ntxd_max = {IAVF_MAX_RING},
  207         .isc_nrxd_default = {IAVF_DEFAULT_RING},
  208         .isc_ntxd_default = {IAVF_DEFAULT_RING},
  209 };
  210 
  211 /*** Functions ***/
  212 
  213 /**
  214  * iavf_register - iflib callback to obtain the shared context pointer
  215  * @dev: the device being registered
  216  *
  217  * Called when the driver is first being attached to the driver. This function
  218  * is used by iflib to obtain a pointer to the shared context structure which
  219  * describes the device features.
  220  *
  221  * @returns a pointer to the iavf shared context structure.
  222  */
  223 static void *
  224 iavf_register(device_t dev __unused)
  225 {
  226         return (&iavf_sctx);
  227 }
  228 
  229 /**
  230  * iavf_allocate_pci_resources - Allocate PCI resources
  231  * @sc: the device private softc
  232  *
  233  * Allocate PCI resources used by the iflib driver.
  234  *
  235  * @returns zero or a non-zero error code on failure
  236  */
  237 static int
  238 iavf_allocate_pci_resources(struct iavf_sc *sc)
  239 {
  240         return iavf_allocate_pci_resources_common(sc);
  241 }
  242 
  243 /**
  244  * iavf_if_attach_pre - Begin attaching the device to the driver
  245  * @ctx: the iflib context pointer
  246  *
  247  * Called by iflib to begin the attach process. Allocates resources and
  248  * initializes the hardware for operation.
  249  *
  250  * @returns zero or a non-zero error code on failure.
  251  */
  252 static int
  253 iavf_if_attach_pre(if_ctx_t ctx)
  254 {
  255         device_t dev;
  256         struct iavf_sc *sc;
  257         struct iavf_hw *hw;
  258         struct iavf_vsi *vsi;
  259         if_softc_ctx_t scctx;
  260         int error = 0;
  261 
  262         /* Setup pointers */
  263         dev = iflib_get_dev(ctx);
  264         sc = iavf_sc_from_ctx(ctx);
  265 
  266         vsi = &sc->vsi;
  267         vsi->back = sc;
  268         sc->dev = sc->osdep.dev = dev;
  269         hw = &sc->hw;
  270 
  271         vsi->dev = dev;
  272         vsi->hw = &sc->hw;
  273         vsi->num_vlans = 0;
  274         vsi->ctx = ctx;
  275         sc->media = iflib_get_media(ctx);
  276         vsi->ifp = iflib_get_ifp(ctx);
  277         vsi->shared = scctx = iflib_get_softc_ctx(ctx);
  278 
  279         iavf_save_tunables(sc);
  280 
  281         /* Setup VC mutex */
  282         snprintf(sc->vc_mtx_name, sizeof(sc->vc_mtx_name),
  283                  "%s:vc", device_get_nameunit(dev));
  284         mtx_init(&sc->vc_mtx, sc->vc_mtx_name, NULL, MTX_DEF);
  285 
  286         /* Do PCI setup - map BAR0, etc */
  287         error = iavf_allocate_pci_resources(sc);
  288         if (error) {
  289                 device_printf(dev, "%s: Allocation of PCI resources failed\n",
  290                     __func__);
  291                 goto err_early;
  292         }
  293 
  294         iavf_dbg_init(sc, "Allocated PCI resources and MSI-X vectors\n");
  295 
  296         error = iavf_set_mac_type(hw);
  297         if (error) {
  298                 device_printf(dev, "%s: set_mac_type failed: %d\n",
  299                     __func__, error);
  300                 goto err_pci_res;
  301         }
  302 
  303         error = iavf_reset_complete(hw);
  304         if (error) {
  305                 device_printf(dev, "%s: Device is still being reset\n",
  306                     __func__);
  307                 goto err_pci_res;
  308         }
  309 
  310         iavf_dbg_init(sc, "VF Device is ready for configuration\n");
  311 
  312         /* Sets up Admin Queue */
  313         error = iavf_setup_vc(sc);
  314         if (error) {
  315                 device_printf(dev, "%s: Error setting up PF comms, %d\n",
  316                     __func__, error);
  317                 goto err_pci_res;
  318         }
  319 
  320         iavf_dbg_init(sc, "PF API version verified\n");
  321 
  322         /* Need API version before sending reset message */
  323         error = iavf_reset(sc);
  324         if (error) {
  325                 device_printf(dev, "VF reset failed; reload the driver\n");
  326                 goto err_aq;
  327         }
  328 
  329         iavf_dbg_init(sc, "VF reset complete\n");
  330 
  331         /* Ask for VF config from PF */
  332         error = iavf_vf_config(sc);
  333         if (error) {
  334                 device_printf(dev, "Error getting configuration from PF: %d\n",
  335                     error);
  336                 goto err_aq;
  337         }
  338 
  339         iavf_print_device_info(sc);
  340 
  341         error = iavf_get_vsi_res_from_vf_res(sc);
  342         if (error)
  343                 goto err_res_buf;
  344 
  345         iavf_dbg_init(sc, "Resource Acquisition complete\n");
  346 
  347         /* Setup taskqueue to service VC messages */
  348         error = iavf_setup_vc_tq(sc);
  349         if (error)
  350                 goto err_vc_tq;
  351 
  352         iavf_set_mac_addresses(sc);
  353         iflib_set_mac(ctx, hw->mac.addr);
  354 
  355         /* Allocate filter lists */
  356         iavf_init_filters(sc);
  357 
  358         /* Fill out more iflib parameters */
  359         scctx->isc_ntxqsets_max = scctx->isc_nrxqsets_max =
  360             sc->vsi_res->num_queue_pairs;
  361         if (vsi->enable_head_writeback) {
  362                 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0]
  363                     * sizeof(struct iavf_tx_desc) + sizeof(u32), DBA_ALIGN);
  364                 scctx->isc_txrx = &iavf_txrx_hwb;
  365         } else {
  366                 scctx->isc_txqsizes[0] = roundup2(scctx->isc_ntxd[0]
  367                     * sizeof(struct iavf_tx_desc), DBA_ALIGN);
  368                 scctx->isc_txrx = &iavf_txrx_dwb;
  369         }
  370         scctx->isc_rxqsizes[0] = roundup2(scctx->isc_nrxd[0]
  371             * sizeof(union iavf_32byte_rx_desc), DBA_ALIGN);
  372         scctx->isc_msix_bar = PCIR_BAR(IAVF_MSIX_BAR);
  373         scctx->isc_tx_nsegments = IAVF_MAX_TX_SEGS;
  374         scctx->isc_tx_tso_segments_max = IAVF_MAX_TSO_SEGS;
  375         scctx->isc_tx_tso_size_max = IAVF_TSO_SIZE;
  376         scctx->isc_tx_tso_segsize_max = IAVF_MAX_DMA_SEG_SIZE;
  377         scctx->isc_rss_table_size = IAVF_RSS_VSI_LUT_SIZE;
  378         scctx->isc_capabilities = scctx->isc_capenable = IAVF_CAPS;
  379         scctx->isc_tx_csum_flags = CSUM_OFFLOAD;
  380 
  381         /* Update OS cache of MSIX control register values */
  382         iavf_update_msix_devinfo(dev);
  383 
  384         return (0);
  385 
  386 err_vc_tq:
  387         taskqueue_free(sc->vc_tq);
  388 err_res_buf:
  389         free(sc->vf_res, M_IAVF);
  390 err_aq:
  391         iavf_shutdown_adminq(hw);
  392 err_pci_res:
  393         iavf_free_pci_resources(sc);
  394 err_early:
  395         IAVF_VC_LOCK_DESTROY(sc);
  396         return (error);
  397 }
  398 
  399 /**
  400  * iavf_vc_task - task used to process VC messages
  401  * @arg: device softc
  402  * @pending: unused
  403  *
  404  * Processes the admin queue, in order to process the virtual
  405  * channel messages received from the PF.
  406  */
  407 static void
  408 iavf_vc_task(void *arg, int pending __unused)
  409 {
  410         struct iavf_sc *sc = (struct iavf_sc *)arg;
  411         u16 var;
  412 
  413         iavf_process_adminq(sc, &var);
  414 }
  415 
  416 /**
  417  * iavf_setup_vc_tq - Setup task queues
  418  * @sc: device softc
  419  *
  420  * Create taskqueue and tasklet for processing virtual channel messages. This
  421  * is done in a separate non-iflib taskqueue so that the iflib context lock
  422  * does not need to be held for VC messages to be processed.
  423  *
  424  * @returns zero on success, or an error code on failure.
  425  */
  426 static int
  427 iavf_setup_vc_tq(struct iavf_sc *sc)
  428 {
  429         device_t dev = sc->dev;
  430         int error = 0;
  431 
  432         TASK_INIT(&sc->vc_task, 0, iavf_vc_task, sc);
  433 
  434         sc->vc_tq = taskqueue_create_fast("iavf_vc", M_NOWAIT,
  435             taskqueue_thread_enqueue, &sc->vc_tq);
  436         if (!sc->vc_tq) {
  437                 device_printf(dev, "taskqueue_create_fast (for VC task) returned NULL!\n");
  438                 return (ENOMEM);
  439         }
  440         error = taskqueue_start_threads(&sc->vc_tq, 1, PI_NET, "%s vc",
  441             device_get_nameunit(dev));
  442         if (error) {
  443                 device_printf(dev, "taskqueue_start_threads (for VC task) error: %d\n",
  444                     error);
  445                 taskqueue_free(sc->vc_tq);
  446                 return (error);
  447         }
  448 
  449         return (error);
  450 }
  451 
  452 /**
  453  * iavf_if_attach_post - Finish attaching the device to the driver
  454  * @ctx: the iflib context pointer
  455  *
  456  * Called by iflib after it has setup queues and interrupts. Used to finish up
  457  * the attach process for a device. Attach logic which must occur after Tx and
  458  * Rx queues are setup belongs here.
  459  *
  460  * @returns zero or a non-zero error code on failure
  461  */
  462 static int
  463 iavf_if_attach_post(if_ctx_t ctx)
  464 {
  465 #ifdef IXL_DEBUG
  466         device_t dev = iflib_get_dev(ctx);
  467 #endif
  468         struct iavf_sc  *sc;
  469         struct iavf_hw  *hw;
  470         struct iavf_vsi *vsi;
  471         int error = 0;
  472 
  473         INIT_DBG_DEV(dev, "begin");
  474 
  475         sc = iavf_sc_from_ctx(ctx);
  476         vsi = &sc->vsi;
  477         hw = &sc->hw;
  478 
  479         /* Save off determined number of queues for interface */
  480         vsi->num_rx_queues = vsi->shared->isc_nrxqsets;
  481         vsi->num_tx_queues = vsi->shared->isc_ntxqsets;
  482 
  483         /* Setup the stack interface */
  484         iavf_setup_interface(sc);
  485 
  486         iavf_dbg_init(sc, "Interface setup complete\n");
  487 
  488         /* Initialize statistics & add sysctls */
  489         bzero(&sc->vsi.eth_stats, sizeof(struct iavf_eth_stats));
  490         iavf_add_device_sysctls(sc);
  491 
  492         atomic_store_rel_32(&sc->queues_enabled, 0);
  493         iavf_set_state(&sc->state, IAVF_STATE_INITIALIZED);
  494 
  495         /* We want AQ enabled early for init */
  496         iavf_enable_adminq_irq(hw);
  497 
  498         INIT_DBG_DEV(dev, "end");
  499 
  500         return (error);
  501 }
  502 
  503 /**
  504  * iavf_if_detach - Detach a device from the driver
  505  * @ctx: the iflib context of the device to detach
  506  *
  507  * Called by iflib to detach a given device from the driver. Clean up any
  508  * resources associated with the driver and shut the device down.
  509  *
  510  * @remark iflib always ignores the return value of IFDI_DETACH, so this
  511  * function is effectively not allowed to fail. Instead, it should clean up
  512  * and release as much as possible even if something goes wrong.
  513  *
  514  * @returns zero
  515  */
  516 static int
  517 iavf_if_detach(if_ctx_t ctx)
  518 {
  519         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  520         struct iavf_hw *hw = &sc->hw;
  521         device_t dev = sc->dev;
  522         enum iavf_status status;
  523 
  524         INIT_DBG_DEV(dev, "begin");
  525 
  526         iavf_clear_state(&sc->state, IAVF_STATE_INITIALIZED);
  527 
  528         /* Drain admin queue taskqueue */
  529         taskqueue_free(sc->vc_tq);
  530         IAVF_VC_LOCK_DESTROY(sc);
  531 
  532         /* Remove all the media and link information */
  533         ifmedia_removeall(sc->media);
  534 
  535         iavf_disable_adminq_irq(hw);
  536         status = iavf_shutdown_adminq(&sc->hw);
  537         if (status != IAVF_SUCCESS) {
  538                 device_printf(dev,
  539                     "iavf_shutdown_adminq() failed with status %s\n",
  540                     iavf_stat_str(hw, status));
  541         }
  542 
  543         free(sc->vf_res, M_IAVF);
  544         sc->vf_res = NULL;
  545         iavf_free_pci_resources(sc);
  546         iavf_free_filters(sc);
  547 
  548         INIT_DBG_DEV(dev, "end");
  549         return (0);
  550 }
  551 
  552 /**
  553  * iavf_if_shutdown - called by iflib to handle shutdown
  554  * @ctx: the iflib context pointer
  555  *
  556  * Callback for the IFDI_SHUTDOWN iflib function.
  557  *
  558  * @returns zero or an error code on failure
  559  */
  560 static int
  561 iavf_if_shutdown(if_ctx_t ctx __unused)
  562 {
  563         return (0);
  564 }
  565 
  566 /**
  567  * iavf_if_suspend - called by iflib to handle suspend
  568  * @ctx: the iflib context pointer
  569  *
  570  * Callback for the IFDI_SUSPEND iflib function.
  571  *
  572  * @returns zero or an error code on failure
  573  */
  574 static int
  575 iavf_if_suspend(if_ctx_t ctx __unused)
  576 {
  577         return (0);
  578 }
  579 
  580 /**
  581  * iavf_if_resume - called by iflib to handle resume
  582  * @ctx: the iflib context pointer
  583  *
  584  * Callback for the IFDI_RESUME iflib function.
  585  *
  586  * @returns zero or an error code on failure
  587  */
  588 static int
  589 iavf_if_resume(if_ctx_t ctx __unused)
  590 {
  591         return (0);
  592 }
  593 
  594 /**
  595  * iavf_vc_sleep_wait - Sleep for a response from a VC message
  596  * @sc: device softc
  597  * @op: the op code to sleep on
  598  *
  599  * Sleep until a response from the PF for the VC message sent by the
  600  * given op.
  601  *
  602  * @returns zero on success, or EWOULDBLOCK if the sleep times out.
  603  */
  604 static int
  605 iavf_vc_sleep_wait(struct iavf_sc *sc, u32 op)
  606 {
  607         int error = 0;
  608 
  609         IAVF_VC_LOCK_ASSERT(sc);
  610 
  611         iavf_dbg_vc(sc, "Sleeping for op %b\n", op, IAVF_FLAGS);
  612 
  613         error = mtx_sleep(iavf_vc_get_op_chan(sc, op),
  614             &sc->vc_mtx, PRI_MAX, "iavf_vc", IAVF_AQ_TIMEOUT);
  615 
  616         return (error);
  617 }
  618 
  619 /**
  620  * iavf_send_vc_msg_sleep - Send a virtchnl message and wait for a response
  621  * @sc: device softc
  622  * @op: the op code to send
  623  *
  624  * Send a virtchnl message to the PF, and sleep or busy wait for a response
  625  * from the PF, depending on iflib context lock type.
  626  *
  627  * @remark this function does not wait if the device is detaching, on kernels
  628  * that support indicating to the driver that the device is detaching
  629  *
  630  * @returns zero or an error code on failure.
  631  */
  632 int
  633 iavf_send_vc_msg_sleep(struct iavf_sc *sc, u32 op)
  634 {
  635         if_ctx_t ctx = sc->vsi.ctx;
  636         int error = 0;
  637 
  638         IAVF_VC_LOCK(sc);
  639         error = iavf_vc_send_cmd(sc, op);
  640         if (error != 0) {
  641                 iavf_dbg_vc(sc, "Error sending %b: %d\n", op, IAVF_FLAGS, error);
  642                 goto release_lock;
  643         }
  644 
  645         /* Don't wait for a response if the device is being detached. */
  646         if (!iflib_in_detach(ctx)) {
  647                 error = iavf_vc_sleep_wait(sc, op);
  648                 IAVF_VC_LOCK_ASSERT(sc);
  649 
  650                 if (error == EWOULDBLOCK)
  651                         device_printf(sc->dev, "%b timed out\n", op, IAVF_FLAGS);
  652         }
  653 release_lock:
  654         IAVF_VC_UNLOCK(sc);
  655         return (error);
  656 }
  657 
  658 /**
  659  * iavf_send_vc_msg - Send a virtchnl message to the PF
  660  * @sc: device softc
  661  * @op: the op code to send
  662  *
  663  * Send a virtchnl message to the PF and do not wait for a response.
  664  *
  665  * @returns zero on success, or an error code on failure.
  666  */
  667 int
  668 iavf_send_vc_msg(struct iavf_sc *sc, u32 op)
  669 {
  670         int error = 0;
  671 
  672         error = iavf_vc_send_cmd(sc, op);
  673         if (error != 0)
  674                 iavf_dbg_vc(sc, "Error sending %b: %d\n", op, IAVF_FLAGS, error);
  675 
  676         return (error);
  677 }
  678 
  679 /**
  680  * iavf_init_queues - initialize Tx and Rx queues
  681  * @vsi: the VSI to initialize
  682  *
  683  * Refresh the Tx and Rx ring contents and update the tail pointers for each
  684  * queue.
  685  */
  686 static void
  687 iavf_init_queues(struct iavf_vsi *vsi)
  688 {
  689         struct iavf_tx_queue *tx_que = vsi->tx_queues;
  690         struct iavf_rx_queue *rx_que = vsi->rx_queues;
  691         struct rx_ring *rxr;
  692         uint32_t mbuf_sz;
  693 
  694         mbuf_sz = iflib_get_rx_mbuf_sz(vsi->ctx);
  695         MPASS(mbuf_sz <= UINT16_MAX);
  696 
  697         for (int i = 0; i < vsi->num_tx_queues; i++, tx_que++)
  698                 iavf_init_tx_ring(vsi, tx_que);
  699 
  700         for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++) {
  701                 rxr = &rx_que->rxr;
  702 
  703                 rxr->mbuf_sz = mbuf_sz;
  704                 wr32(vsi->hw, rxr->tail, 0);
  705         }
  706 }
  707 
  708 /**
  709  * iavf_if_init - Initialize device for operation
  710  * @ctx: the iflib context pointer
  711  *
  712  * Initializes a device for operation. Called by iflib in response to an
  713  * interface up event from the stack.
  714  *
  715  * @remark this function does not return a value and thus cannot indicate
  716  * failure to initialize.
  717  */
  718 static void
  719 iavf_if_init(if_ctx_t ctx)
  720 {
  721         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  722         struct iavf_vsi *vsi = &sc->vsi;
  723         struct iavf_hw *hw = &sc->hw;
  724         if_t ifp = iflib_get_ifp(ctx);
  725         u8 tmpaddr[ETHER_ADDR_LEN];
  726         enum iavf_status status;
  727         device_t dev = sc->dev;
  728         int error = 0;
  729 
  730         INIT_DBG_IF(ifp, "begin");
  731 
  732         IFLIB_CTX_ASSERT(ctx);
  733 
  734         error = iavf_reset_complete(hw);
  735         if (error) {
  736                 device_printf(sc->dev, "%s: VF reset failed\n",
  737                     __func__);
  738         }
  739 
  740         if (!iavf_check_asq_alive(hw)) {
  741                 iavf_dbg_info(sc, "ASQ is not alive, re-initializing AQ\n");
  742                 pci_enable_busmaster(dev);
  743 
  744                 status = iavf_shutdown_adminq(hw);
  745                 if (status != IAVF_SUCCESS) {
  746                         device_printf(dev,
  747                             "%s: iavf_shutdown_adminq failed: %s\n",
  748                             __func__, iavf_stat_str(hw, status));
  749                         return;
  750                 }
  751 
  752                 status = iavf_init_adminq(hw);
  753                 if (status != IAVF_SUCCESS) {
  754                         device_printf(dev,
  755                         "%s: iavf_init_adminq failed: %s\n",
  756                             __func__, iavf_stat_str(hw, status));
  757                         return;
  758                 }
  759         }
  760 
  761         /* Make sure queues are disabled */
  762         iavf_disable_queues_with_retries(sc);
  763 
  764         bcopy(if_getlladdr(ifp), tmpaddr, ETHER_ADDR_LEN);
  765         if (!cmp_etheraddr(hw->mac.addr, tmpaddr) &&
  766             (iavf_validate_mac_addr(tmpaddr) == IAVF_SUCCESS)) {
  767                 error = iavf_del_mac_filter(sc, hw->mac.addr);
  768                 if (error == 0)
  769                         iavf_send_vc_msg(sc, IAVF_FLAG_AQ_DEL_MAC_FILTER);
  770 
  771                 bcopy(tmpaddr, hw->mac.addr, ETH_ALEN);
  772         }
  773 
  774         error = iavf_add_mac_filter(sc, hw->mac.addr, 0);
  775         if (!error || error == EEXIST)
  776                 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_MAC_FILTER);
  777         iflib_set_mac(ctx, hw->mac.addr);
  778 
  779         /* Prepare the queues for operation */
  780         iavf_init_queues(vsi);
  781 
  782         /* Set initial ITR values */
  783         iavf_configure_itr(sc);
  784 
  785         iavf_send_vc_msg(sc, IAVF_FLAG_AQ_CONFIGURE_QUEUES);
  786 
  787         /* Set up RSS */
  788         iavf_config_rss(sc);
  789 
  790         /* Map vectors */
  791         iavf_send_vc_msg(sc, IAVF_FLAG_AQ_MAP_VECTORS);
  792 
  793         /* Init SW TX ring indices */
  794         if (vsi->enable_head_writeback)
  795                 iavf_init_tx_cidx(vsi);
  796         else
  797                 iavf_init_tx_rsqs(vsi);
  798 
  799         /* Configure promiscuous mode */
  800         iavf_config_promisc(sc, if_getflags(ifp));
  801 
  802         /* Enable queues */
  803         iavf_send_vc_msg_sleep(sc, IAVF_FLAG_AQ_ENABLE_QUEUES);
  804 
  805         iavf_set_state(&sc->state, IAVF_STATE_RUNNING);
  806 }
  807 
  808 /**
  809  * iavf_if_msix_intr_assign - Assign MSI-X interrupts
  810  * @ctx: the iflib context pointer
  811  * @msix: the number of MSI-X vectors available
  812  *
  813  * Called by iflib to assign MSI-X interrupt vectors to queues. Assigns and
  814  * sets up vectors for each Tx and Rx queue, as well as the administrative
  815  * control interrupt.
  816  *
  817  * @returns zero or an error code on failure
  818  */
  819 static int
  820 iavf_if_msix_intr_assign(if_ctx_t ctx, int msix __unused)
  821 {
  822         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  823         struct iavf_vsi *vsi = &sc->vsi;
  824         struct iavf_rx_queue *rx_que = vsi->rx_queues;
  825         struct iavf_tx_queue *tx_que = vsi->tx_queues;
  826         int err, i, rid, vector = 0;
  827         char buf[16];
  828 
  829         MPASS(vsi->shared->isc_nrxqsets > 0);
  830         MPASS(vsi->shared->isc_ntxqsets > 0);
  831 
  832         /* Admin Que is vector 0*/
  833         rid = vector + 1;
  834         err = iflib_irq_alloc_generic(ctx, &vsi->irq, rid, IFLIB_INTR_ADMIN,
  835             iavf_msix_adminq, sc, 0, "aq");
  836         if (err) {
  837                 iflib_irq_free(ctx, &vsi->irq);
  838                 device_printf(iflib_get_dev(ctx),
  839                     "Failed to register Admin Que handler");
  840                 return (err);
  841         }
  842 
  843         /* Now set up the stations */
  844         for (i = 0, vector = 1; i < vsi->shared->isc_nrxqsets; i++, vector++, rx_que++) {
  845                 rid = vector + 1;
  846 
  847                 snprintf(buf, sizeof(buf), "rxq%d", i);
  848                 err = iflib_irq_alloc_generic(ctx, &rx_que->que_irq, rid,
  849                     IFLIB_INTR_RXTX, iavf_msix_que, rx_que, rx_que->rxr.me, buf);
  850                 if (err) {
  851                         device_printf(iflib_get_dev(ctx),
  852                             "Failed to allocate queue RX int vector %d, err: %d\n", i, err);
  853                         vsi->num_rx_queues = i + 1;
  854                         goto fail;
  855                 }
  856                 rx_que->msix = vector;
  857         }
  858 
  859         bzero(buf, sizeof(buf));
  860 
  861         for (i = 0; i < vsi->shared->isc_ntxqsets; i++, tx_que++) {
  862                 snprintf(buf, sizeof(buf), "txq%d", i);
  863                 iflib_softirq_alloc_generic(ctx,
  864                     &vsi->rx_queues[i % vsi->shared->isc_nrxqsets].que_irq,
  865                     IFLIB_INTR_TX, tx_que, tx_que->txr.me, buf);
  866 
  867                 tx_que->msix = (i % vsi->shared->isc_nrxqsets) + 1;
  868         }
  869 
  870         return (0);
  871 fail:
  872         iflib_irq_free(ctx, &vsi->irq);
  873         rx_que = vsi->rx_queues;
  874         for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++)
  875                 iflib_irq_free(ctx, &rx_que->que_irq);
  876         return (err);
  877 }
  878 
  879 /**
  880  * iavf_if_enable_intr - Enable all interrupts for a device
  881  * @ctx: the iflib context pointer
  882  *
  883  * Called by iflib to request enabling all interrupts.
  884  */
  885 static void
  886 iavf_if_enable_intr(if_ctx_t ctx)
  887 {
  888         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  889         struct iavf_vsi *vsi = &sc->vsi;
  890 
  891         iavf_enable_intr(vsi);
  892 }
  893 
  894 /**
  895  * iavf_if_disable_intr - Disable all interrupts for a device
  896  * @ctx: the iflib context pointer
  897  *
  898  * Called by iflib to request disabling all interrupts.
  899  */
  900 static void
  901 iavf_if_disable_intr(if_ctx_t ctx)
  902 {
  903         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  904         struct iavf_vsi *vsi = &sc->vsi;
  905 
  906         iavf_disable_intr(vsi);
  907 }
  908 
  909 /**
  910  * iavf_if_rx_queue_intr_enable - Enable one Rx queue interrupt
  911  * @ctx: the iflib context pointer
  912  * @rxqid: Rx queue index
  913  *
  914  * Enables the interrupt associated with a specified Rx queue.
  915  *
  916  * @returns zero
  917  */
  918 static int
  919 iavf_if_rx_queue_intr_enable(if_ctx_t ctx, uint16_t rxqid)
  920 {
  921         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  922         struct iavf_vsi *vsi = &sc->vsi;
  923         struct iavf_hw *hw = vsi->hw;
  924         struct iavf_rx_queue *rx_que = &vsi->rx_queues[rxqid];
  925 
  926         iavf_enable_queue_irq(hw, rx_que->msix - 1);
  927         return (0);
  928 }
  929 
  930 /**
  931  * iavf_if_tx_queue_intr_enable - Enable one Tx queue interrupt
  932  * @ctx: the iflib context pointer
  933  * @txqid: Tx queue index
  934  *
  935  * Enables the interrupt associated with a specified Tx queue.
  936  *
  937  * @returns zero
  938  */
  939 static int
  940 iavf_if_tx_queue_intr_enable(if_ctx_t ctx, uint16_t txqid)
  941 {
  942         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  943         struct iavf_vsi *vsi = &sc->vsi;
  944         struct iavf_hw *hw = vsi->hw;
  945         struct iavf_tx_queue *tx_que = &vsi->tx_queues[txqid];
  946 
  947         iavf_enable_queue_irq(hw, tx_que->msix - 1);
  948         return (0);
  949 }
  950 
  951 /**
  952  * iavf_if_tx_queues_alloc - Allocate Tx queue memory
  953  * @ctx: the iflib context pointer
  954  * @vaddrs: Array of virtual addresses
  955  * @paddrs: Array of physical addresses
  956  * @ntxqs: the number of Tx queues per group (should always be 1)
  957  * @ntxqsets: the number of Tx queues
  958  *
  959  * Allocates memory for the specified number of Tx queues. This includes
  960  * memory for the queue structures and the report status array for the queues.
  961  * The virtual and physical addresses are saved for later use during
  962  * initialization.
  963  *
  964  * @returns zero or a non-zero error code on failure
  965  */
  966 static int
  967 iavf_if_tx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int ntxqs, int ntxqsets)
  968 {
  969         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
  970         struct iavf_vsi *vsi = &sc->vsi;
  971         if_softc_ctx_t scctx = vsi->shared;
  972         struct iavf_tx_queue *que;
  973         int i, j, error = 0;
  974 
  975         MPASS(scctx->isc_ntxqsets > 0);
  976         MPASS(ntxqs == 1);
  977         MPASS(scctx->isc_ntxqsets == ntxqsets);
  978 
  979         /* Allocate queue structure memory */
  980         if (!(vsi->tx_queues =
  981             (struct iavf_tx_queue *)malloc(sizeof(struct iavf_tx_queue) *ntxqsets, M_IAVF, M_NOWAIT | M_ZERO))) {
  982                 device_printf(iflib_get_dev(ctx), "Unable to allocate TX ring memory\n");
  983                 return (ENOMEM);
  984         }
  985 
  986         for (i = 0, que = vsi->tx_queues; i < ntxqsets; i++, que++) {
  987                 struct tx_ring *txr = &que->txr;
  988 
  989                 txr->me = i;
  990                 que->vsi = vsi;
  991 
  992                 if (!vsi->enable_head_writeback) {
  993                         /* Allocate report status array */
  994                         if (!(txr->tx_rsq = (qidx_t *)malloc(sizeof(qidx_t) * scctx->isc_ntxd[0], M_IAVF, M_NOWAIT))) {
  995                                 device_printf(iflib_get_dev(ctx), "failed to allocate tx_rsq memory\n");
  996                                 error = ENOMEM;
  997                                 goto fail;
  998                         }
  999                         /* Init report status array */
 1000                         for (j = 0; j < scctx->isc_ntxd[0]; j++)
 1001                                 txr->tx_rsq[j] = QIDX_INVALID;
 1002                 }
 1003                 /* get the virtual and physical address of the hardware queues */
 1004                 txr->tail = IAVF_QTX_TAIL1(txr->me);
 1005                 txr->tx_base = (struct iavf_tx_desc *)vaddrs[i * ntxqs];
 1006                 txr->tx_paddr = paddrs[i * ntxqs];
 1007                 txr->que = que;
 1008         }
 1009 
 1010         return (0);
 1011 fail:
 1012         iavf_if_queues_free(ctx);
 1013         return (error);
 1014 }
 1015 
 1016 /**
 1017  * iavf_if_rx_queues_alloc - Allocate Rx queue memory
 1018  * @ctx: the iflib context pointer
 1019  * @vaddrs: Array of virtual addresses
 1020  * @paddrs: Array of physical addresses
 1021  * @nrxqs: number of Rx queues per group (should always be 1)
 1022  * @nrxqsets: the number of Rx queues to allocate
 1023  *
 1024  * Called by iflib to allocate driver memory for a number of Rx queues.
 1025  * Allocates memory for the drivers private Rx queue data structure, and saves
 1026  * the physical and virtual addresses for later use.
 1027  *
 1028  * @returns zero or a non-zero error code on failure
 1029  */
 1030 static int
 1031 iavf_if_rx_queues_alloc(if_ctx_t ctx, caddr_t *vaddrs, uint64_t *paddrs, int nrxqs, int nrxqsets)
 1032 {
 1033         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1034         struct iavf_vsi *vsi = &sc->vsi;
 1035         struct iavf_rx_queue *que;
 1036         int i, error = 0;
 1037 
 1038 #ifdef INVARIANTS
 1039         if_softc_ctx_t scctx = vsi->shared;
 1040         MPASS(scctx->isc_nrxqsets > 0);
 1041         MPASS(nrxqs == 1);
 1042         MPASS(scctx->isc_nrxqsets == nrxqsets);
 1043 #endif
 1044 
 1045         /* Allocate queue structure memory */
 1046         if (!(vsi->rx_queues =
 1047             (struct iavf_rx_queue *) malloc(sizeof(struct iavf_rx_queue) *
 1048             nrxqsets, M_IAVF, M_NOWAIT | M_ZERO))) {
 1049                 device_printf(iflib_get_dev(ctx), "Unable to allocate RX ring memory\n");
 1050                 error = ENOMEM;
 1051                 goto fail;
 1052         }
 1053 
 1054         for (i = 0, que = vsi->rx_queues; i < nrxqsets; i++, que++) {
 1055                 struct rx_ring *rxr = &que->rxr;
 1056 
 1057                 rxr->me = i;
 1058                 que->vsi = vsi;
 1059 
 1060                 /* get the virtual and physical address of the hardware queues */
 1061                 rxr->tail = IAVF_QRX_TAIL1(rxr->me);
 1062                 rxr->rx_base = (union iavf_rx_desc *)vaddrs[i * nrxqs];
 1063                 rxr->rx_paddr = paddrs[i * nrxqs];
 1064                 rxr->que = que;
 1065         }
 1066 
 1067         return (0);
 1068 fail:
 1069         iavf_if_queues_free(ctx);
 1070         return (error);
 1071 }
 1072 
 1073 /**
 1074  * iavf_if_queues_free - Free driver queue memory
 1075  * @ctx: the iflib context pointer
 1076  *
 1077  * Called by iflib to release memory allocated by the driver when setting up
 1078  * Tx and Rx queues.
 1079  *
 1080  * @remark The ordering of this function and iavf_if_detach is not guaranteed.
 1081  * It is possible for this function to be called either before or after the
 1082  * iavf_if_detach. Thus, care must be taken to ensure that either ordering of
 1083  * iavf_if_detach and iavf_if_queues_free is safe.
 1084  */
 1085 static void
 1086 iavf_if_queues_free(if_ctx_t ctx)
 1087 {
 1088         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1089         struct iavf_vsi *vsi = &sc->vsi;
 1090 
 1091         if (!vsi->enable_head_writeback) {
 1092                 struct iavf_tx_queue *que;
 1093                 int i = 0;
 1094 
 1095                 for (i = 0, que = vsi->tx_queues; i < vsi->shared->isc_ntxqsets; i++, que++) {
 1096                         struct tx_ring *txr = &que->txr;
 1097                         if (txr->tx_rsq != NULL) {
 1098                                 free(txr->tx_rsq, M_IAVF);
 1099                                 txr->tx_rsq = NULL;
 1100                         }
 1101                 }
 1102         }
 1103 
 1104         if (vsi->tx_queues != NULL) {
 1105                 free(vsi->tx_queues, M_IAVF);
 1106                 vsi->tx_queues = NULL;
 1107         }
 1108         if (vsi->rx_queues != NULL) {
 1109                 free(vsi->rx_queues, M_IAVF);
 1110                 vsi->rx_queues = NULL;
 1111         }
 1112 }
 1113 
 1114 /**
 1115  * iavf_check_aq_errors - Check for AdminQ errors
 1116  * @sc: device softc
 1117  *
 1118  * Check the AdminQ registers for errors, and determine whether or not a reset
 1119  * may be required to resolve them.
 1120  *
 1121  * @post if there are errors, the VF device will be stopped and a reset will
 1122  * be requested.
 1123  *
 1124  * @returns zero if there are no issues, EBUSY if the device is resetting,
 1125  * or EIO if there are any AQ errors.
 1126  */
 1127 static int
 1128 iavf_check_aq_errors(struct iavf_sc *sc)
 1129 {
 1130         struct iavf_hw *hw = &sc->hw;
 1131         device_t dev = sc->dev;
 1132         u32 reg, oldreg;
 1133         u8 aq_error = false;
 1134 
 1135         oldreg = reg = rd32(hw, hw->aq.arq.len);
 1136 
 1137         /* Check if device is in reset */
 1138         if (reg == 0xdeadbeef || reg == 0xffffffff) {
 1139                 device_printf(dev, "VF in reset\n");
 1140                 return (EBUSY);
 1141         }
 1142 
 1143         /* Check for Admin queue errors */
 1144         if (reg & IAVF_VF_ARQLEN1_ARQVFE_MASK) {
 1145                 device_printf(dev, "ARQ VF Error detected\n");
 1146                 reg &= ~IAVF_VF_ARQLEN1_ARQVFE_MASK;
 1147                 aq_error = true;
 1148         }
 1149         if (reg & IAVF_VF_ARQLEN1_ARQOVFL_MASK) {
 1150                 device_printf(dev, "ARQ Overflow Error detected\n");
 1151                 reg &= ~IAVF_VF_ARQLEN1_ARQOVFL_MASK;
 1152                 aq_error = true;
 1153         }
 1154         if (reg & IAVF_VF_ARQLEN1_ARQCRIT_MASK) {
 1155                 device_printf(dev, "ARQ Critical Error detected\n");
 1156                 reg &= ~IAVF_VF_ARQLEN1_ARQCRIT_MASK;
 1157                 aq_error = true;
 1158         }
 1159         if (oldreg != reg)
 1160                 wr32(hw, hw->aq.arq.len, reg);
 1161 
 1162         oldreg = reg = rd32(hw, hw->aq.asq.len);
 1163         if (reg & IAVF_VF_ATQLEN1_ATQVFE_MASK) {
 1164                 device_printf(dev, "ASQ VF Error detected\n");
 1165                 reg &= ~IAVF_VF_ATQLEN1_ATQVFE_MASK;
 1166                 aq_error = true;
 1167         }
 1168         if (reg & IAVF_VF_ATQLEN1_ATQOVFL_MASK) {
 1169                 device_printf(dev, "ASQ Overflow Error detected\n");
 1170                 reg &= ~IAVF_VF_ATQLEN1_ATQOVFL_MASK;
 1171                 aq_error = true;
 1172         }
 1173         if (reg & IAVF_VF_ATQLEN1_ATQCRIT_MASK) {
 1174                 device_printf(dev, "ASQ Critical Error detected\n");
 1175                 reg &= ~IAVF_VF_ATQLEN1_ATQCRIT_MASK;
 1176                 aq_error = true;
 1177         }
 1178         if (oldreg != reg)
 1179                 wr32(hw, hw->aq.asq.len, reg);
 1180 
 1181         return (aq_error ? EIO : 0);
 1182 }
 1183 
 1184 /**
 1185  * iavf_process_adminq - Process adminq responses from the PF
 1186  * @sc: device softc
 1187  * @pending: output parameter indicating how many messages remain
 1188  *
 1189  * Process the adminq to handle replies from the PF over the virtchnl
 1190  * connection.
 1191  *
 1192  * @returns zero or an iavf_status code on failure
 1193  */
 1194 static enum iavf_status
 1195 iavf_process_adminq(struct iavf_sc *sc, u16 *pending)
 1196 {
 1197         enum iavf_status status = IAVF_SUCCESS;
 1198         struct iavf_arq_event_info event;
 1199         struct iavf_hw *hw = &sc->hw;
 1200         struct virtchnl_msg *v_msg;
 1201         int error = 0, loop = 0;
 1202         u32 reg;
 1203 
 1204         if (iavf_test_state(&sc->state, IAVF_STATE_RESET_PENDING)) {
 1205                 status = IAVF_ERR_ADMIN_QUEUE_ERROR;
 1206                 goto reenable_interrupt;
 1207         }
 1208 
 1209         error = iavf_check_aq_errors(sc);
 1210         if (error) {
 1211                 status = IAVF_ERR_ADMIN_QUEUE_CRITICAL_ERROR;
 1212                 goto reenable_interrupt;
 1213         }
 1214 
 1215         event.buf_len = IAVF_AQ_BUF_SZ;
 1216         event.msg_buf = sc->aq_buffer;
 1217         bzero(event.msg_buf, IAVF_AQ_BUF_SZ);
 1218         v_msg = (struct virtchnl_msg *)&event.desc;
 1219 
 1220         IAVF_VC_LOCK(sc);
 1221         /* clean and process any events */
 1222         do {
 1223                 status = iavf_clean_arq_element(hw, &event, pending);
 1224                 /*
 1225                  * Also covers normal case when iavf_clean_arq_element()
 1226                  * returns "IAVF_ERR_ADMIN_QUEUE_NO_WORK"
 1227                  */
 1228                 if (status)
 1229                         break;
 1230                 iavf_vc_completion(sc, v_msg->v_opcode,
 1231                     v_msg->v_retval, event.msg_buf, event.msg_len);
 1232                 bzero(event.msg_buf, IAVF_AQ_BUF_SZ);
 1233         } while (*pending && (loop++ < IAVF_ADM_LIMIT));
 1234         IAVF_VC_UNLOCK(sc);
 1235 
 1236 reenable_interrupt:
 1237         /* Re-enable admin queue interrupt cause */
 1238         reg = rd32(hw, IAVF_VFINT_ICR0_ENA1);
 1239         reg |= IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK;
 1240         wr32(hw, IAVF_VFINT_ICR0_ENA1, reg);
 1241 
 1242         return (status);
 1243 }
 1244 
 1245 /**
 1246  * iavf_if_update_admin_status - Administrative status task
 1247  * @ctx: iflib context
 1248  *
 1249  * Called by iflib to handle administrative status events. The iavf driver
 1250  * uses this to process the adminq virtchnl messages outside of interrupt
 1251  * context.
 1252  */
 1253 static void
 1254 iavf_if_update_admin_status(if_ctx_t ctx)
 1255 {
 1256         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1257         struct iavf_hw *hw = &sc->hw;
 1258         u16 pending = 0;
 1259 
 1260         iavf_process_adminq(sc, &pending);
 1261         iavf_update_link_status(sc);
 1262 
 1263         /*
 1264          * If there are still messages to process, reschedule.
 1265          * Otherwise, re-enable the Admin Queue interrupt.
 1266          */
 1267         if (pending > 0)
 1268                 iflib_admin_intr_deferred(ctx);
 1269         else
 1270                 iavf_enable_adminq_irq(hw);
 1271 }
 1272 
 1273 /**
 1274  * iavf_if_multi_set - Set multicast address filters
 1275  * @ctx: iflib context
 1276  *
 1277  * Called by iflib to update the current list of multicast filters for the
 1278  * device.
 1279  */
 1280 static void
 1281 iavf_if_multi_set(if_ctx_t ctx)
 1282 {
 1283         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1284 
 1285         iavf_multi_set(sc);
 1286 }
 1287 
 1288 /**
 1289  * iavf_if_mtu_set - Set the device MTU
 1290  * @ctx: iflib context
 1291  * @mtu: MTU value to set
 1292  *
 1293  * Called by iflib to set the device MTU.
 1294  *
 1295  * @returns zero on success, or EINVAL if the MTU is invalid.
 1296  */
 1297 static int
 1298 iavf_if_mtu_set(if_ctx_t ctx, uint32_t mtu)
 1299 {
 1300         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1301         struct iavf_vsi *vsi = &sc->vsi;
 1302 
 1303         IOCTL_DEBUGOUT("ioctl: SiOCSIFMTU (Set Interface MTU)");
 1304         if (mtu < IAVF_MIN_MTU || mtu > IAVF_MAX_MTU) {
 1305                 device_printf(sc->dev, "mtu %d is not in valid range [%d-%d]\n",
 1306                     mtu, IAVF_MIN_MTU, IAVF_MAX_MTU);
 1307                 return (EINVAL);
 1308         }
 1309 
 1310         vsi->shared->isc_max_frame_size = mtu + ETHER_HDR_LEN + ETHER_CRC_LEN +
 1311                 ETHER_VLAN_ENCAP_LEN;
 1312 
 1313         return (0);
 1314 }
 1315 
 1316 /**
 1317  * iavf_if_media_status - Report current media status
 1318  * @ctx: iflib context
 1319  * @ifmr: ifmedia request structure
 1320  *
 1321  * Called by iflib to report the current media status in the ifmr.
 1322  */
 1323 static void
 1324 iavf_if_media_status(if_ctx_t ctx, struct ifmediareq *ifmr)
 1325 {
 1326         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1327 
 1328         iavf_media_status_common(sc, ifmr);
 1329 }
 1330 
 1331 /**
 1332  * iavf_if_media_change - Change the current media settings
 1333  * @ctx: iflib context
 1334  *
 1335  * Called by iflib to change the current media settings.
 1336  *
 1337  * @returns zero on success, or an error code on failure.
 1338  */
 1339 static int
 1340 iavf_if_media_change(if_ctx_t ctx)
 1341 {
 1342         return iavf_media_change_common(iflib_get_ifp(ctx));
 1343 }
 1344 
 1345 /**
 1346  * iavf_if_promisc_set - Set device promiscuous mode
 1347  * @ctx: iflib context
 1348  * @flags: promiscuous configuration
 1349  *
 1350  * Called by iflib to request that the device enter promiscuous mode.
 1351  *
 1352  * @returns zero on success, or an error code on failure.
 1353  */
 1354 static int
 1355 iavf_if_promisc_set(if_ctx_t ctx, int flags)
 1356 {
 1357         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1358 
 1359         return iavf_config_promisc(sc, flags);
 1360 }
 1361 
 1362 /**
 1363  * iavf_if_timer - Periodic timer called by iflib
 1364  * @ctx: iflib context
 1365  * @qid: The queue being triggered
 1366  *
 1367  * Called by iflib periodically as a timer task, so that the driver can handle
 1368  * periodic work.
 1369  *
 1370  * @remark this timer is only called while the interface is up, even if
 1371  * IFLIB_ADMIN_ALWAYS_RUN is set.
 1372  */
 1373 static void
 1374 iavf_if_timer(if_ctx_t ctx, uint16_t qid)
 1375 {
 1376         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1377         struct iavf_hw *hw = &sc->hw;
 1378         u32 val;
 1379 
 1380         if (qid != 0)
 1381                 return;
 1382 
 1383         /* Check for when PF triggers a VF reset */
 1384         val = rd32(hw, IAVF_VFGEN_RSTAT) &
 1385             IAVF_VFGEN_RSTAT_VFR_STATE_MASK;
 1386         if (val != VIRTCHNL_VFR_VFACTIVE
 1387             && val != VIRTCHNL_VFR_COMPLETED) {
 1388                 iavf_dbg_info(sc, "reset in progress! (%d)\n", val);
 1389                 return;
 1390         }
 1391 
 1392         /* Fire off the adminq task */
 1393         iflib_admin_intr_deferred(ctx);
 1394 
 1395         /* Update stats */
 1396         iavf_request_stats(sc);
 1397 }
 1398 
 1399 /**
 1400  * iavf_if_vlan_register - Register a VLAN
 1401  * @ctx: iflib context
 1402  * @vtag: the VLAN to register
 1403  *
 1404  * Register a VLAN filter for a given vtag.
 1405  */
 1406 static void
 1407 iavf_if_vlan_register(if_ctx_t ctx, u16 vtag)
 1408 {
 1409         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1410         struct iavf_vsi *vsi = &sc->vsi;
 1411 
 1412         if ((vtag == 0) || (vtag > 4095))       /* Invalid */
 1413                 return;
 1414 
 1415         /* Add VLAN 0 to list, for untagged traffic */
 1416         if (vsi->num_vlans == 0)
 1417                 iavf_add_vlan_filter(sc, 0);
 1418 
 1419         iavf_add_vlan_filter(sc, vtag);
 1420 
 1421         ++vsi->num_vlans;
 1422 
 1423         iavf_send_vc_msg(sc, IAVF_FLAG_AQ_ADD_VLAN_FILTER);
 1424 }
 1425 
 1426 /**
 1427  * iavf_if_vlan_unregister - Unregister a VLAN
 1428  * @ctx: iflib context
 1429  * @vtag: the VLAN to remove
 1430  *
 1431  * Unregister (remove) a VLAN filter for the given vtag.
 1432  */
 1433 static void
 1434 iavf_if_vlan_unregister(if_ctx_t ctx, u16 vtag)
 1435 {
 1436         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1437         struct iavf_vsi *vsi = &sc->vsi;
 1438         int i = 0;
 1439 
 1440         if ((vtag == 0) || (vtag > 4095) || (vsi->num_vlans == 0))      /* Invalid */
 1441                 return;
 1442 
 1443         i = iavf_mark_del_vlan_filter(sc, vtag);
 1444         vsi->num_vlans -= i;
 1445 
 1446         /* Remove VLAN filter 0 if the last VLAN is being removed */
 1447         if (vsi->num_vlans == 0)
 1448                 i += iavf_mark_del_vlan_filter(sc, 0);
 1449 
 1450         if (i > 0)
 1451                 iavf_send_vc_msg(sc, IAVF_FLAG_AQ_DEL_VLAN_FILTER);
 1452 }
 1453 
 1454 /**
 1455  * iavf_if_get_counter - Get network statistic counters
 1456  * @ctx: iflib context
 1457  * @cnt: The counter to obtain
 1458  *
 1459  * Called by iflib to obtain the value of the specified counter.
 1460  *
 1461  * @returns the uint64_t counter value.
 1462  */
 1463 static uint64_t
 1464 iavf_if_get_counter(if_ctx_t ctx, ift_counter cnt)
 1465 {
 1466         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1467         struct iavf_vsi *vsi = &sc->vsi;
 1468         if_t ifp = iflib_get_ifp(ctx);
 1469 
 1470         switch (cnt) {
 1471         case IFCOUNTER_IPACKETS:
 1472                 return (vsi->ipackets);
 1473         case IFCOUNTER_IERRORS:
 1474                 return (vsi->ierrors);
 1475         case IFCOUNTER_OPACKETS:
 1476                 return (vsi->opackets);
 1477         case IFCOUNTER_OERRORS:
 1478                 return (vsi->oerrors);
 1479         case IFCOUNTER_COLLISIONS:
 1480                 /* Collisions are by standard impossible in 40G/10G Ethernet */
 1481                 return (0);
 1482         case IFCOUNTER_IBYTES:
 1483                 return (vsi->ibytes);
 1484         case IFCOUNTER_OBYTES:
 1485                 return (vsi->obytes);
 1486         case IFCOUNTER_IMCASTS:
 1487                 return (vsi->imcasts);
 1488         case IFCOUNTER_OMCASTS:
 1489                 return (vsi->omcasts);
 1490         case IFCOUNTER_IQDROPS:
 1491                 return (vsi->iqdrops);
 1492         case IFCOUNTER_OQDROPS:
 1493                 return (vsi->oqdrops);
 1494         case IFCOUNTER_NOPROTO:
 1495                 return (vsi->noproto);
 1496         default:
 1497                 return (if_get_counter_default(ifp, cnt));
 1498         }
 1499 }
 1500 
 1501 /**
 1502  * iavf_free_pci_resources - Free PCI resources
 1503  * @sc: device softc
 1504  *
 1505  * Called to release the PCI resources allocated during attach. May be called
 1506  * in the error flow of attach_pre, or during detach as part of cleanup.
 1507  */
 1508 static void
 1509 iavf_free_pci_resources(struct iavf_sc *sc)
 1510 {
 1511         struct iavf_vsi         *vsi = &sc->vsi;
 1512         struct iavf_rx_queue    *rx_que = vsi->rx_queues;
 1513         device_t                dev = sc->dev;
 1514 
 1515         /* We may get here before stations are set up */
 1516         if (rx_que == NULL)
 1517                 goto early;
 1518 
 1519         /* Release all interrupts */
 1520         iflib_irq_free(vsi->ctx, &vsi->irq);
 1521 
 1522         for (int i = 0; i < vsi->num_rx_queues; i++, rx_que++)
 1523                 iflib_irq_free(vsi->ctx, &rx_que->que_irq);
 1524 
 1525 early:
 1526         if (sc->pci_mem != NULL)
 1527                 bus_release_resource(dev, SYS_RES_MEMORY,
 1528                     rman_get_rid(sc->pci_mem), sc->pci_mem);
 1529 }
 1530 
 1531 /**
 1532  * iavf_setup_interface - Setup the device interface
 1533  * @sc: device softc
 1534  *
 1535  * Called to setup some device interface settings, such as the ifmedia
 1536  * structure.
 1537  */
 1538 static void
 1539 iavf_setup_interface(struct iavf_sc *sc)
 1540 {
 1541         struct iavf_vsi *vsi = &sc->vsi;
 1542         if_ctx_t ctx = vsi->ctx;
 1543         if_t ifp = iflib_get_ifp(ctx);
 1544 
 1545         iavf_dbg_init(sc, "begin\n");
 1546 
 1547         vsi->shared->isc_max_frame_size =
 1548             if_getmtu(ifp) + ETHER_HDR_LEN + ETHER_CRC_LEN
 1549             + ETHER_VLAN_ENCAP_LEN;
 1550 
 1551         iavf_set_initial_baudrate(ifp);
 1552 
 1553         ifmedia_add(sc->media, IFM_ETHER | IFM_AUTO, 0, NULL);
 1554         ifmedia_set(sc->media, IFM_ETHER | IFM_AUTO);
 1555 }
 1556 
 1557 /**
 1558  * iavf_msix_adminq - Admin Queue interrupt handler
 1559  * @arg: void pointer to the device softc
 1560  *
 1561  * Interrupt handler for the non-queue interrupt causes. Primarily this will
 1562  * be the adminq interrupt, but also includes other miscellaneous causes.
 1563  *
 1564  * @returns FILTER_SCHEDULE_THREAD if the admin task needs to be run, otherwise
 1565  * returns FITLER_HANDLED.
 1566  */
 1567 static int
 1568 iavf_msix_adminq(void *arg)
 1569 {
 1570         struct iavf_sc  *sc = (struct iavf_sc *)arg;
 1571         struct iavf_hw  *hw = &sc->hw;
 1572         u32             reg, mask;
 1573 
 1574         ++sc->admin_irq;
 1575 
 1576         if (!iavf_test_state(&sc->state, IAVF_STATE_INITIALIZED))
 1577                 return (FILTER_HANDLED);
 1578 
 1579         reg = rd32(hw, IAVF_VFINT_ICR01);
 1580         /*
 1581          * For masking off interrupt causes that need to be handled before
 1582          * they can be re-enabled
 1583          */
 1584         mask = rd32(hw, IAVF_VFINT_ICR0_ENA1);
 1585 
 1586         /* Check on the cause */
 1587         if (reg & IAVF_VFINT_ICR01_ADMINQ_MASK) {
 1588                 mask &= ~IAVF_VFINT_ICR0_ENA1_ADMINQ_MASK;
 1589 
 1590                 /* Process messages outside of the iflib context lock */
 1591                 taskqueue_enqueue(sc->vc_tq, &sc->vc_task);
 1592         }
 1593 
 1594         wr32(hw, IAVF_VFINT_ICR0_ENA1, mask);
 1595         iavf_enable_adminq_irq(hw);
 1596 
 1597         return (FILTER_HANDLED);
 1598 }
 1599 
 1600 /**
 1601  * iavf_enable_intr - Enable device interrupts
 1602  * @vsi: the main VSI
 1603  *
 1604  * Called to enable all queue interrupts.
 1605  */
 1606 void
 1607 iavf_enable_intr(struct iavf_vsi *vsi)
 1608 {
 1609         struct iavf_hw *hw = vsi->hw;
 1610         struct iavf_rx_queue *que = vsi->rx_queues;
 1611 
 1612         iavf_enable_adminq_irq(hw);
 1613         for (int i = 0; i < vsi->num_rx_queues; i++, que++)
 1614                 iavf_enable_queue_irq(hw, que->rxr.me);
 1615 }
 1616 
 1617 /**
 1618  * iavf_disable_intr - Disable device interrupts
 1619  * @vsi: the main VSI
 1620  *
 1621  * Called to disable all interrupts
 1622  *
 1623  * @remark we never disable the admin status interrupt.
 1624  */
 1625 void
 1626 iavf_disable_intr(struct iavf_vsi *vsi)
 1627 {
 1628         struct iavf_hw *hw = vsi->hw;
 1629         struct iavf_rx_queue *que = vsi->rx_queues;
 1630 
 1631         for (int i = 0; i < vsi->num_rx_queues; i++, que++)
 1632                 iavf_disable_queue_irq(hw, que->rxr.me);
 1633 }
 1634 
 1635 /**
 1636  * iavf_enable_queue_irq - Enable IRQ register for a queue interrupt
 1637  * @hw: hardware structure
 1638  * @id: IRQ vector to enable
 1639  *
 1640  * Writes the IAVF_VFINT_DYN_CTLN1 register to enable a given IRQ interrupt.
 1641  */
 1642 static void
 1643 iavf_enable_queue_irq(struct iavf_hw *hw, int id)
 1644 {
 1645         u32             reg;
 1646 
 1647         reg = IAVF_VFINT_DYN_CTLN1_INTENA_MASK |
 1648             IAVF_VFINT_DYN_CTLN1_CLEARPBA_MASK |
 1649             IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK;
 1650         wr32(hw, IAVF_VFINT_DYN_CTLN1(id), reg);
 1651 }
 1652 
 1653 /**
 1654  * iavf_disable_queue_irq - Disable IRQ register for a queue interrupt
 1655  * @hw: hardware structure
 1656  * @id: IRQ vector to disable
 1657  *
 1658  * Writes the IAVF_VFINT_DYN_CTLN1 register to disable a given IRQ interrupt.
 1659  */
 1660 static void
 1661 iavf_disable_queue_irq(struct iavf_hw *hw, int id)
 1662 {
 1663         wr32(hw, IAVF_VFINT_DYN_CTLN1(id),
 1664             IAVF_VFINT_DYN_CTLN1_ITR_INDX_MASK);
 1665         rd32(hw, IAVF_VFGEN_RSTAT);
 1666 }
 1667 
 1668 /**
 1669  * iavf_configure_itr - Get initial ITR values from tunable values.
 1670  * @sc: device softc
 1671  *
 1672  * Load the initial tunable values for the ITR configuration.
 1673  */
 1674 static void
 1675 iavf_configure_itr(struct iavf_sc *sc)
 1676 {
 1677         iavf_configure_tx_itr(sc);
 1678         iavf_configure_rx_itr(sc);
 1679 }
 1680 
 1681 /**
 1682  * iavf_set_queue_rx_itr - Update Rx ITR value
 1683  * @que: Rx queue to update
 1684  *
 1685  * Provide a update to the queue RX interrupt moderation value.
 1686  */
 1687 static void
 1688 iavf_set_queue_rx_itr(struct iavf_rx_queue *que)
 1689 {
 1690         struct iavf_vsi *vsi = que->vsi;
 1691         struct iavf_hw  *hw = vsi->hw;
 1692         struct rx_ring  *rxr = &que->rxr;
 1693 
 1694         /* Idle, do nothing */
 1695         if (rxr->bytes == 0)
 1696                 return;
 1697 
 1698         /* Update the hardware if needed */
 1699         if (rxr->itr != vsi->rx_itr_setting) {
 1700                 rxr->itr = vsi->rx_itr_setting;
 1701                 wr32(hw, IAVF_VFINT_ITRN1(IAVF_RX_ITR,
 1702                     que->rxr.me), rxr->itr);
 1703         }
 1704 }
 1705 
 1706 /**
 1707  * iavf_msix_que - Main Rx queue interrupt handler
 1708  * @arg: void pointer to the Rx queue
 1709  *
 1710  * Main MSI-X interrupt handler for Rx queue interrupts
 1711  *
 1712  * @returns FILTER_SCHEDULE_THREAD if the main thread for Rx needs to run,
 1713  * otherwise returns FILTER_HANDLED.
 1714  */
 1715 static int
 1716 iavf_msix_que(void *arg)
 1717 {
 1718         struct iavf_rx_queue *rx_que = (struct iavf_rx_queue *)arg;
 1719         struct iavf_sc *sc = rx_que->vsi->back;
 1720 
 1721         ++rx_que->irqs;
 1722 
 1723         if (!iavf_test_state(&sc->state, IAVF_STATE_RUNNING))
 1724                 return (FILTER_HANDLED);
 1725 
 1726         iavf_set_queue_rx_itr(rx_que);
 1727 
 1728         return (FILTER_SCHEDULE_THREAD);
 1729 }
 1730 
 1731 /**
 1732  * iavf_update_link_status - Update iflib Link status
 1733  * @sc: device softc
 1734  *
 1735  * Notify the iflib stack of changes in link status. Called after the device
 1736  * receives a virtchnl message indicating a change in link status.
 1737  */
 1738 void
 1739 iavf_update_link_status(struct iavf_sc *sc)
 1740 {
 1741         struct iavf_vsi *vsi = &sc->vsi;
 1742         u64 baudrate;
 1743 
 1744         if (sc->link_up){
 1745                 if (vsi->link_active == FALSE) {
 1746                         vsi->link_active = TRUE;
 1747                         baudrate = iavf_baudrate_from_link_speed(sc);
 1748                         iavf_dbg_info(sc, "baudrate: %llu\n", (unsigned long long)baudrate);
 1749                         iflib_link_state_change(vsi->ctx, LINK_STATE_UP, baudrate);
 1750                 }
 1751         } else { /* Link down */
 1752                 if (vsi->link_active == TRUE) {
 1753                         vsi->link_active = FALSE;
 1754                         iflib_link_state_change(vsi->ctx, LINK_STATE_DOWN, 0);
 1755                 }
 1756         }
 1757 }
 1758 
 1759 /**
 1760  * iavf_stop - Stop the interface
 1761  * @sc: device softc
 1762  *
 1763  * This routine disables all traffic on the adapter by disabling interrupts
 1764  * and sending a message to the PF to tell it to stop the hardware
 1765  * Tx/Rx LAN queues.
 1766  */
 1767 static void
 1768 iavf_stop(struct iavf_sc *sc)
 1769 {
 1770         iavf_clear_state(&sc->state, IAVF_STATE_RUNNING);
 1771 
 1772         iavf_disable_intr(&sc->vsi);
 1773 
 1774         iavf_disable_queues_with_retries(sc);
 1775 }
 1776 
 1777 /**
 1778  * iavf_if_stop - iflib stop handler
 1779  * @ctx: iflib context
 1780  *
 1781  * Call iavf_stop to stop the interface.
 1782  */
 1783 static void
 1784 iavf_if_stop(if_ctx_t ctx)
 1785 {
 1786         struct iavf_sc *sc = iavf_sc_from_ctx(ctx);
 1787 
 1788         iavf_stop(sc);
 1789 }
 1790 
 1791 /**
 1792  * iavf_del_mac_filter - Delete a MAC filter
 1793  * @sc: device softc
 1794  * @macaddr: MAC address to remove
 1795  *
 1796  * Marks a MAC filter for deletion.
 1797  *
 1798  * @returns zero if the filter existed, or ENOENT if it did not.
 1799  */
 1800 static int
 1801 iavf_del_mac_filter(struct iavf_sc *sc, u8 *macaddr)
 1802 {
 1803         struct iavf_mac_filter  *f;
 1804 
 1805         f = iavf_find_mac_filter(sc, macaddr);
 1806         if (f == NULL)
 1807                 return (ENOENT);
 1808 
 1809         f->flags |= IAVF_FILTER_DEL;
 1810         return (0);
 1811 }
 1812 
 1813 /**
 1814  * iavf_init_tx_rsqs - Initialize Report Status array
 1815  * @vsi: the main VSI
 1816  *
 1817  * Set the Report Status queue fields to zero in order to initialize the
 1818  * queues for transmit.
 1819  */
 1820 void
 1821 iavf_init_tx_rsqs(struct iavf_vsi *vsi)
 1822 {
 1823         if_softc_ctx_t scctx = vsi->shared;
 1824         struct iavf_tx_queue *tx_que;
 1825         int i, j;
 1826 
 1827         for (i = 0, tx_que = vsi->tx_queues; i < vsi->num_tx_queues; i++, tx_que++) {
 1828                 struct tx_ring *txr = &tx_que->txr;
 1829 
 1830                 txr->tx_rs_cidx = txr->tx_rs_pidx;
 1831 
 1832                 /* Initialize the last processed descriptor to be the end of
 1833                  * the ring, rather than the start, so that we avoid an
 1834                  * off-by-one error when calculating how many descriptors are
 1835                  * done in the credits_update function.
 1836                  */
 1837                 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1;
 1838 
 1839                 for (j = 0; j < scctx->isc_ntxd[0]; j++)
 1840                         txr->tx_rsq[j] = QIDX_INVALID;
 1841         }
 1842 }
 1843 
 1844 /**
 1845  * iavf_init_tx_cidx - Initialize Tx cidx values
 1846  * @vsi: the main VSI
 1847  *
 1848  * Initialize the tx_cidx_processed values for Tx queues in order to
 1849  * initialize the Tx queues for transmit.
 1850  */
 1851 void
 1852 iavf_init_tx_cidx(struct iavf_vsi *vsi)
 1853 {
 1854         if_softc_ctx_t scctx = vsi->shared;
 1855         struct iavf_tx_queue *tx_que;
 1856         int i;
 1857 
 1858         for (i = 0, tx_que = vsi->tx_queues; i < vsi->num_tx_queues; i++, tx_que++) {
 1859                 struct tx_ring *txr = &tx_que->txr;
 1860 
 1861                 txr->tx_cidx_processed = scctx->isc_ntxd[0] - 1;
 1862         }
 1863 }
 1864 
 1865 /**
 1866  * iavf_add_device_sysctls - Add device sysctls for configuration
 1867  * @sc: device softc
 1868  *
 1869  * Add the main sysctl nodes and sysctls for device configuration.
 1870  */
 1871 static void
 1872 iavf_add_device_sysctls(struct iavf_sc *sc)
 1873 {
 1874         struct iavf_vsi *vsi = &sc->vsi;
 1875         device_t dev = sc->dev;
 1876         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
 1877         struct sysctl_oid_list *debug_list;
 1878 
 1879         iavf_add_device_sysctls_common(sc);
 1880 
 1881         debug_list = iavf_create_debug_sysctl_tree(sc);
 1882 
 1883         iavf_add_debug_sysctls_common(sc, debug_list);
 1884 
 1885         SYSCTL_ADD_PROC(ctx, debug_list,
 1886             OID_AUTO, "queue_interrupt_table", CTLTYPE_STRING | CTLFLAG_RD,
 1887             sc, 0, iavf_sysctl_queue_interrupt_table, "A", "View MSI-X indices for TX/RX queues");
 1888 
 1889 #ifdef IAVF_DEBUG
 1890         SYSCTL_ADD_PROC(ctx, debug_list,
 1891             OID_AUTO, "do_vf_reset", CTLTYPE_INT | CTLFLAG_WR,
 1892             sc, 0, iavf_sysctl_vf_reset, "A", "Request a VF reset from PF");
 1893 
 1894         SYSCTL_ADD_PROC(ctx, debug_list,
 1895             OID_AUTO, "do_vflr_reset", CTLTYPE_INT | CTLFLAG_WR,
 1896             sc, 0, iavf_sysctl_vflr_reset, "A", "Request a VFLR reset from HW");
 1897 #endif
 1898 
 1899         /* Add stats sysctls */
 1900         iavf_add_vsi_sysctls(dev, vsi, ctx, "vsi");
 1901 
 1902         iavf_add_queues_sysctls(dev, vsi);
 1903 }
 1904 
 1905 /**
 1906  * iavf_add_queues_sysctls - Add per-queue sysctls
 1907  * @dev: device pointer
 1908  * @vsi: the main VSI
 1909  *
 1910  * Add sysctls for each Tx and Rx queue.
 1911  */
 1912 void
 1913 iavf_add_queues_sysctls(device_t dev, struct iavf_vsi *vsi)
 1914 {
 1915         struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(dev);
 1916         struct sysctl_oid_list *vsi_list, *queue_list;
 1917         struct sysctl_oid *queue_node;
 1918         char queue_namebuf[32];
 1919 
 1920         struct iavf_rx_queue *rx_que;
 1921         struct iavf_tx_queue *tx_que;
 1922         struct tx_ring *txr;
 1923         struct rx_ring *rxr;
 1924 
 1925         vsi_list = SYSCTL_CHILDREN(vsi->vsi_node);
 1926 
 1927         /* Queue statistics */
 1928         for (int q = 0; q < vsi->num_rx_queues; q++) {
 1929                 bzero(queue_namebuf, sizeof(queue_namebuf));
 1930                 snprintf(queue_namebuf, IAVF_QUEUE_NAME_LEN, "rxq%02d", q);
 1931                 queue_node = SYSCTL_ADD_NODE(ctx, vsi_list,
 1932                     OID_AUTO, queue_namebuf, CTLFLAG_RD, NULL, "RX Queue #");
 1933                 queue_list = SYSCTL_CHILDREN(queue_node);
 1934 
 1935                 rx_que = &(vsi->rx_queues[q]);
 1936                 rxr = &(rx_que->rxr);
 1937 
 1938                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "irqs",
 1939                                 CTLFLAG_RD, &(rx_que->irqs),
 1940                                 "irqs on this queue (both Tx and Rx)");
 1941 
 1942                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "packets",
 1943                                 CTLFLAG_RD, &(rxr->rx_packets),
 1944                                 "Queue Packets Received");
 1945                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "bytes",
 1946                                 CTLFLAG_RD, &(rxr->rx_bytes),
 1947                                 "Queue Bytes Received");
 1948                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "desc_err",
 1949                                 CTLFLAG_RD, &(rxr->desc_errs),
 1950                                 "Queue Rx Descriptor Errors");
 1951                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "itr",
 1952                                 CTLFLAG_RD, &(rxr->itr), 0,
 1953                                 "Queue Rx ITR Interval");
 1954         }
 1955         for (int q = 0; q < vsi->num_tx_queues; q++) {
 1956                 bzero(queue_namebuf, sizeof(queue_namebuf));
 1957                 snprintf(queue_namebuf, IAVF_QUEUE_NAME_LEN, "txq%02d", q);
 1958                 queue_node = SYSCTL_ADD_NODE(ctx, vsi_list,
 1959                     OID_AUTO, queue_namebuf, CTLFLAG_RD, NULL, "TX Queue #");
 1960                 queue_list = SYSCTL_CHILDREN(queue_node);
 1961 
 1962                 tx_que = &(vsi->tx_queues[q]);
 1963                 txr = &(tx_que->txr);
 1964 
 1965                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "tso",
 1966                                 CTLFLAG_RD, &(tx_que->tso),
 1967                                 "TSO");
 1968                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "mss_too_small",
 1969                                 CTLFLAG_RD, &(txr->mss_too_small),
 1970                                 "TSO sends with an MSS less than 64");
 1971                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "packets",
 1972                                 CTLFLAG_RD, &(txr->tx_packets),
 1973                                 "Queue Packets Transmitted");
 1974                 SYSCTL_ADD_UQUAD(ctx, queue_list, OID_AUTO, "bytes",
 1975                                 CTLFLAG_RD, &(txr->tx_bytes),
 1976                                 "Queue Bytes Transmitted");
 1977                 SYSCTL_ADD_UINT(ctx, queue_list, OID_AUTO, "itr",
 1978                                 CTLFLAG_RD, &(txr->itr), 0,
 1979                                 "Queue Tx ITR Interval");
 1980         }
 1981 }
 1982 
 1983 /**
 1984  * iavf_driver_is_detaching - Check if the driver is detaching/unloading
 1985  * @sc: device private softc
 1986  *
 1987  * @returns true if the driver is detaching, false otherwise.
 1988  *
 1989  * @remark on newer kernels, take advantage of iflib_in_detach in order to
 1990  * report detachment correctly as early as possible.
 1991  *
 1992  * @remark this function is used by various code paths that want to avoid
 1993  * running if the driver is about to be removed. This includes sysctls and
 1994  * other driver access points. Note that it does not fully resolve
 1995  * detach-based race conditions as it is possible for a thread to race with
 1996  * iflib_in_detach.
 1997  */
 1998 bool
 1999 iavf_driver_is_detaching(struct iavf_sc *sc)
 2000 {
 2001         return (!iavf_test_state(&sc->state, IAVF_STATE_INITIALIZED) ||
 2002                 iflib_in_detach(sc->vsi.ctx));
 2003 }
 2004 
 2005 /**
 2006  * iavf_sysctl_queue_interrupt_table - Sysctl for displaying Tx queue mapping
 2007  * @oidp: sysctl oid structure
 2008  * @arg1: void pointer to device softc
 2009  * @arg2: unused
 2010  * @req: sysctl request pointer
 2011  *
 2012  * Print out mapping of TX queue indexes and Rx queue indexes to MSI-X vectors.
 2013  *
 2014  * @returns zero on success, or an error code on failure.
 2015  */
 2016 static int
 2017 iavf_sysctl_queue_interrupt_table(SYSCTL_HANDLER_ARGS)
 2018 {
 2019         struct iavf_sc *sc = (struct iavf_sc *)arg1;
 2020         struct iavf_vsi *vsi = &sc->vsi;
 2021         device_t dev = sc->dev;
 2022         struct sbuf *buf;
 2023         int error = 0;
 2024 
 2025         struct iavf_rx_queue *rx_que;
 2026         struct iavf_tx_queue *tx_que;
 2027 
 2028         UNREFERENCED_2PARAMETER(arg2, oidp);
 2029 
 2030         if (iavf_driver_is_detaching(sc))
 2031                 return (ESHUTDOWN);
 2032 
 2033         buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
 2034         if (!buf) {
 2035                 device_printf(dev, "Could not allocate sbuf for output.\n");
 2036                 return (ENOMEM);
 2037         }
 2038 
 2039         sbuf_cat(buf, "\n");
 2040         for (int i = 0; i < vsi->num_rx_queues; i++) {
 2041                 rx_que = &vsi->rx_queues[i];
 2042                 sbuf_printf(buf, "(rxq %3d): %d\n", i, rx_que->msix);
 2043         }
 2044         for (int i = 0; i < vsi->num_tx_queues; i++) {
 2045                 tx_que = &vsi->tx_queues[i];
 2046                 sbuf_printf(buf, "(txq %3d): %d\n", i, tx_que->msix);
 2047         }
 2048 
 2049         error = sbuf_finish(buf);
 2050         if (error)
 2051                 device_printf(dev, "Error finishing sbuf: %d\n", error);
 2052         sbuf_delete(buf);
 2053 
 2054         return (error);
 2055 }
 2056 
 2057 #ifdef IAVF_DEBUG
 2058 #define CTX_ACTIVE(ctx) ((if_getdrvflags(iflib_get_ifp(ctx)) & IFF_DRV_RUNNING))
 2059 
 2060 /**
 2061  * iavf_sysctl_vf_reset - Request a VF reset
 2062  * @oidp: sysctl oid pointer
 2063  * @arg1: void pointer to device softc
 2064  * @arg2: unused
 2065  * @req: sysctl request pointer
 2066  *
 2067  * Request a VF reset for the device.
 2068  *
 2069  * @returns zero on success, or an error code on failure.
 2070  */
 2071 static int
 2072 iavf_sysctl_vf_reset(SYSCTL_HANDLER_ARGS)
 2073 {
 2074         struct iavf_sc *sc = (struct iavf_sc *)arg1;
 2075         int do_reset = 0, error = 0;
 2076 
 2077         UNREFERENCED_PARAMETER(arg2);
 2078 
 2079         if (iavf_driver_is_detaching(sc))
 2080                 return (ESHUTDOWN);
 2081 
 2082         error = sysctl_handle_int(oidp, &do_reset, 0, req);
 2083         if ((error) || (req->newptr == NULL))
 2084                 return (error);
 2085 
 2086         if (do_reset == 1) {
 2087                 iavf_reset(sc);
 2088                 if (CTX_ACTIVE(sc->vsi.ctx))
 2089                         iflib_request_reset(sc->vsi.ctx);
 2090         }
 2091 
 2092         return (error);
 2093 }
 2094 
 2095 /**
 2096  * iavf_sysctl_vflr_reset - Trigger a PCIe FLR for the device
 2097  * @oidp: sysctl oid pointer
 2098  * @arg1: void pointer to device softc
 2099  * @arg2: unused
 2100  * @req: sysctl request pointer
 2101  *
 2102  * Sysctl callback to trigger a PCIe FLR.
 2103  *
 2104  * @returns zero on success, or an error code on failure.
 2105  */
 2106 static int
 2107 iavf_sysctl_vflr_reset(SYSCTL_HANDLER_ARGS)
 2108 {
 2109         struct iavf_sc *sc = (struct iavf_sc *)arg1;
 2110         device_t dev = sc->dev;
 2111         int do_reset = 0, error = 0;
 2112 
 2113         UNREFERENCED_PARAMETER(arg2);
 2114 
 2115         if (iavf_driver_is_detaching(sc))
 2116                 return (ESHUTDOWN);
 2117 
 2118         error = sysctl_handle_int(oidp, &do_reset, 0, req);
 2119         if ((error) || (req->newptr == NULL))
 2120                 return (error);
 2121 
 2122         if (do_reset == 1) {
 2123                 if (!pcie_flr(dev, max(pcie_get_max_completion_timeout(dev) / 1000, 10), true)) {
 2124                         device_printf(dev, "PCIE FLR failed\n");
 2125                         error = EIO;
 2126                 }
 2127                 else if (CTX_ACTIVE(sc->vsi.ctx))
 2128                         iflib_request_reset(sc->vsi.ctx);
 2129         }
 2130 
 2131         return (error);
 2132 }
 2133 #undef CTX_ACTIVE
 2134 #endif

Cache object: 4b596aa4c80a08defadded9ba3561f2d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.