Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe.c revision 1.88.2.50
      1 /* $NetBSD: ixgbe.c,v 1.88.2.50 2022/05/30 17:05:51 martin Exp $ */
      2 
      3 /******************************************************************************
      4 
      5   Copyright (c) 2001-2017, Intel Corporation
      6   All rights reserved.
      7 
      8   Redistribution and use in source and binary forms, with or without
      9   modification, are permitted provided that the following conditions are met:
     10 
     11    1. Redistributions of source code must retain the above copyright notice,
     12       this list of conditions and the following disclaimer.
     13 
     14    2. Redistributions in binary form must reproduce the above copyright
     15       notice, this list of conditions and the following disclaimer in the
     16       documentation and/or other materials provided with the distribution.
     17 
     18    3. Neither the name of the Intel Corporation nor the names of its
     19       contributors may be used to endorse or promote products derived from
     20       this software without specific prior written permission.
     21 
     22   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     23   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     26   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     27   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     28   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     29   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     30   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     31   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     32   POSSIBILITY OF SUCH DAMAGE.
     33 
     34 ******************************************************************************/
     35 /*$FreeBSD: head/sys/dev/ixgbe/if_ix.c 331224 2018-03-19 20:55:05Z erj $*/
     36 
     37 /*
     38  * Copyright (c) 2011 The NetBSD Foundation, Inc.
     39  * All rights reserved.
     40  *
     41  * This code is derived from software contributed to The NetBSD Foundation
     42  * by Coyote Point Systems, Inc.
     43  *
     44  * Redistribution and use in source and binary forms, with or without
     45  * modification, are permitted provided that the following conditions
     46  * are met:
     47  * 1. Redistributions of source code must retain the above copyright
     48  *    notice, this list of conditions and the following disclaimer.
     49  * 2. Redistributions in binary form must reproduce the above copyright
     50  *    notice, this list of conditions and the following disclaimer in the
     51  *    documentation and/or other materials provided with the distribution.
     52  *
     53  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     54  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     55  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     56  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     57  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     58  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     59  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     60  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     61  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     62  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     63  * POSSIBILITY OF SUCH DAMAGE.
     64  */
     65 
     66 #include <sys/cdefs.h>
     67 __KERNEL_RCSID(0, "$NetBSD: ixgbe.c,v 1.88.2.50 2022/05/30 17:05:51 martin Exp $");
     68 
     69 #ifdef _KERNEL_OPT
     70 #include "opt_inet.h"
     71 #include "opt_inet6.h"
     72 #include "opt_net_mpsafe.h"
     73 #endif
     74 
     75 #include "ixgbe.h"
     76 #include "ixgbe_sriov.h"
     77 #include "vlan.h"
     78 
     79 #include <sys/cprng.h>
     80 #include <dev/mii/mii.h>
     81 #include <dev/mii/miivar.h>
     82 
     83 /************************************************************************
     84  * Driver version
     85  ************************************************************************/
     86 static const char ixgbe_driver_version[] = "4.0.1-k";
     87 /* XXX NetBSD: + 3.3.24 */
     88 
     89 /************************************************************************
     90  * PCI Device ID Table
     91  *
     92  *   Used by probe to select devices to load on
     93  *   Last field stores an index into ixgbe_strings
     94  *   Last entry must be all 0s
     95  *
     96  *   { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
     97  ************************************************************************/
     98 static const ixgbe_vendor_info_t ixgbe_vendor_info_array[] =
     99 {
    100 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0},
    101 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0},
    102 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0},
    103 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0},
    104 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0},
    105 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0},
    106 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_BX, 0, 0, 0},
    107 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0},
    108 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0},
    109 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0},
    110 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0},
    111 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0},
    112 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KR, 0, 0, 0},
    113 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0},
    114 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0},
    115 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0},
    116 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_EM, 0, 0, 0},
    117 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0},
    118 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0},
    119 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0},
    120 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0},
    121 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0},
    122 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF2, 0, 0, 0},
    123 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0},
    124 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599EN_SFP, 0, 0, 0},
    125 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_SF_QP, 0, 0, 0},
    126 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_QSFP_SF_QP, 0, 0, 0},
    127 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T, 0, 0, 0},
    128 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540T1, 0, 0, 0},
    129 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T, 0, 0, 0},
    130 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550T1, 0, 0, 0},
    131 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KR, 0, 0, 0},
    132 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_KX4, 0, 0, 0},
    133 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_10G_T, 0, 0, 0},
    134 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_1G_T, 0, 0, 0},
    135 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_SFP, 0, 0, 0},
    136 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_XFI, 0, 0, 0},
    137 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR, 0, 0, 0},
    138 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_KR_L, 0, 0, 0},
    139 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP, 0, 0, 0},
    140 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_QSFP_N, 0, 0, 0},
    141 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP, 0, 0, 0},
    142 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SFP_N, 0, 0, 0},
    143 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII, 0, 0, 0},
    144 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_SGMII_L, 0, 0, 0},
    145 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_10G_T, 0, 0, 0},
    146 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T, 0, 0, 0},
    147 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_1G_T_L, 0, 0, 0},
    148 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_BYPASS, 0, 0, 0},
    149 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BYPASS, 0, 0, 0},
    150 	/* required last entry */
    151 	{0, 0, 0, 0, 0}
    152 };
    153 
    154 /************************************************************************
    155  * Table of branding strings
    156  ************************************************************************/
    157 static const char    *ixgbe_strings[] = {
    158 	"Intel(R) PRO/10GbE PCI-Express Network Driver"
    159 };
    160 
    161 /************************************************************************
    162  * Function prototypes
    163  ************************************************************************/
    164 static int	ixgbe_probe(device_t, cfdata_t, void *);
    165 static void	ixgbe_attach(device_t, device_t, void *);
    166 static int	ixgbe_detach(device_t, int);
    167 #if 0
    168 static int	ixgbe_shutdown(device_t);
    169 #endif
    170 static bool	ixgbe_suspend(device_t, const pmf_qual_t *);
    171 static bool	ixgbe_resume(device_t, const pmf_qual_t *);
    172 static int	ixgbe_ifflags_cb(struct ethercom *);
    173 static int	ixgbe_ioctl(struct ifnet *, u_long, void *);
    174 static int	ixgbe_init(struct ifnet *);
    175 static void	ixgbe_init_locked(struct adapter *);
    176 static void	ixgbe_ifstop(struct ifnet *, int);
    177 static void	ixgbe_stop_locked(void *);
    178 static void	ixgbe_init_device_features(struct adapter *);
    179 static void	ixgbe_check_fan_failure(struct adapter *, u32, bool);
    180 static void	ixgbe_add_media_types(struct adapter *);
    181 static void	ixgbe_media_status(struct ifnet *, struct ifmediareq *);
    182 static int	ixgbe_media_change(struct ifnet *);
    183 static int	ixgbe_allocate_pci_resources(struct adapter *,
    184 		    const struct pci_attach_args *);
    185 static void	ixgbe_free_softint(struct adapter *);
    186 static void	ixgbe_get_slot_info(struct adapter *);
    187 static int	ixgbe_allocate_msix(struct adapter *,
    188 		    const struct pci_attach_args *);
    189 static int	ixgbe_allocate_legacy(struct adapter *,
    190 		    const struct pci_attach_args *);
    191 static int	ixgbe_configure_interrupts(struct adapter *);
    192 static void	ixgbe_free_pciintr_resources(struct adapter *);
    193 static void	ixgbe_free_pci_resources(struct adapter *);
    194 static void	ixgbe_local_timer(void *);
    195 static void	ixgbe_local_timer1(void *);
    196 static void	ixgbe_recovery_mode_timer(void *);
    197 static int	ixgbe_setup_interface(device_t, struct adapter *);
    198 static void	ixgbe_config_gpie(struct adapter *);
    199 static void	ixgbe_config_dmac(struct adapter *);
    200 static void	ixgbe_config_delay_values(struct adapter *);
    201 static void	ixgbe_config_link(struct adapter *);
    202 static void	ixgbe_check_wol_support(struct adapter *);
    203 static int	ixgbe_setup_low_power_mode(struct adapter *);
    204 static void	ixgbe_rearm_queues(struct adapter *, u64);
    205 
    206 static void	ixgbe_initialize_transmit_units(struct adapter *);
    207 static void	ixgbe_initialize_receive_units(struct adapter *);
    208 static void	ixgbe_enable_rx_drop(struct adapter *);
    209 static void	ixgbe_disable_rx_drop(struct adapter *);
    210 static void	ixgbe_initialize_rss_mapping(struct adapter *);
    211 
    212 static void	ixgbe_enable_intr(struct adapter *);
    213 static void	ixgbe_disable_intr(struct adapter *);
    214 static void	ixgbe_update_stats_counters(struct adapter *);
    215 static void	ixgbe_set_rxfilter(struct adapter *);
    216 static void	ixgbe_update_link_status(struct adapter *);
    217 static void	ixgbe_set_ivar(struct adapter *, u8, u8, s8);
    218 static void	ixgbe_configure_ivars(struct adapter *);
    219 static u8 *	ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
    220 static void	ixgbe_eitr_write(struct adapter *, uint32_t, uint32_t);
    221 
    222 static void	ixgbe_setup_vlan_hw_support(struct adapter *);
    223 #if 0
    224 static void	ixgbe_register_vlan(void *, struct ifnet *, u16);
    225 static void	ixgbe_unregister_vlan(void *, struct ifnet *, u16);
    226 #endif
    227 
    228 static void	ixgbe_add_device_sysctls(struct adapter *);
    229 static void	ixgbe_add_hw_stats(struct adapter *);
    230 static void	ixgbe_clear_evcnt(struct adapter *);
    231 static int	ixgbe_set_flowcntl(struct adapter *, int);
    232 static int	ixgbe_set_advertise(struct adapter *, int);
    233 static int	ixgbe_get_default_advertise(struct adapter *);
    234 
    235 /* Sysctl handlers */
    236 static int	ixgbe_sysctl_flowcntl(SYSCTLFN_PROTO);
    237 static int	ixgbe_sysctl_advertise(SYSCTLFN_PROTO);
    238 static int	ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
    239 static int	ixgbe_sysctl_dmac(SYSCTLFN_PROTO);
    240 static int	ixgbe_sysctl_phy_temp(SYSCTLFN_PROTO);
    241 static int	ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_PROTO);
    242 #ifdef IXGBE_DEBUG
    243 static int	ixgbe_sysctl_power_state(SYSCTLFN_PROTO);
    244 static int	ixgbe_sysctl_print_rss_config(SYSCTLFN_PROTO);
    245 #endif
    246 static int	ixgbe_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
    247 static int	ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_PROTO);
    248 static int	ixgbe_sysctl_rdh_handler(SYSCTLFN_PROTO);
    249 static int	ixgbe_sysctl_rdt_handler(SYSCTLFN_PROTO);
    250 static int	ixgbe_sysctl_tdt_handler(SYSCTLFN_PROTO);
    251 static int	ixgbe_sysctl_tdh_handler(SYSCTLFN_PROTO);
    252 static int	ixgbe_sysctl_eee_state(SYSCTLFN_PROTO);
    253 static int	ixgbe_sysctl_debug(SYSCTLFN_PROTO);
    254 static int	ixgbe_sysctl_rx_copy_len(SYSCTLFN_PROTO);
    255 static int	ixgbe_sysctl_tx_process_limit(SYSCTLFN_PROTO);
    256 static int	ixgbe_sysctl_rx_process_limit(SYSCTLFN_PROTO);
    257 static int	ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
    258 static int	ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
    259 
    260 /* Support for pluggable optic modules */
    261 static bool	ixgbe_sfp_probe(struct adapter *);
    262 
    263 /* Legacy (single vector) interrupt handler */
    264 static int	ixgbe_legacy_irq(void *);
    265 
    266 /* The MSI/MSI-X Interrupt handlers */
    267 static int	ixgbe_msix_que(void *);
    268 static int	ixgbe_msix_link(void *);
    269 
    270 /* Software interrupts for deferred work */
    271 static void	ixgbe_handle_que(void *);
    272 static void	ixgbe_handle_link(void *);
    273 static void	ixgbe_handle_msf(void *);
    274 static void	ixgbe_handle_mod(void *);
    275 static void	ixgbe_handle_phy(void *);
    276 
    277 /* Workqueue handler for deferred work */
    278 static void	ixgbe_handle_que_work(struct work *, void *);
    279 
    280 static const ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
    281 
    282 /************************************************************************
    283  *  NetBSD Device Interface Entry Points
    284  ************************************************************************/
    285 CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
    286     ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
    287     DVF_DETACH_SHUTDOWN);
    288 
    289 #if 0
    290 devclass_t ix_devclass;
    291 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
    292 
    293 MODULE_DEPEND(ix, pci, 1, 1, 1);
    294 MODULE_DEPEND(ix, ether, 1, 1, 1);
    295 #ifdef DEV_NETMAP
    296 MODULE_DEPEND(ix, netmap, 1, 1, 1);
    297 #endif
    298 #endif
    299 
    300 /*
    301  * TUNEABLE PARAMETERS:
    302  */
    303 
    304 /*
    305  * AIM: Adaptive Interrupt Moderation
    306  * which means that the interrupt rate
    307  * is varied over time based on the
    308  * traffic for that interrupt vector
    309  */
    310 static bool ixgbe_enable_aim = true;
    311 #define SYSCTL_INT(_a1, _a2, _a3, _a4, _a5, _a6, _a7)
    312 SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RDTUN, &ixgbe_enable_aim, 0,
    313     "Enable adaptive interrupt moderation");
    314 
    315 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
    316 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
    317     &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
    318 
    319 /* How many packets rxeof tries to clean at a time */
    320 static int ixgbe_rx_process_limit = 256;
    321 SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
    322     &ixgbe_rx_process_limit, 0, "Maximum number of received packets to process at a time, -1 means unlimited");
    323 
    324 /* How many packets txeof tries to clean at a time */
    325 static int ixgbe_tx_process_limit = 256;
    326 SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
    327     &ixgbe_tx_process_limit, 0,
    328     "Maximum number of sent packets to process at a time, -1 means unlimited");
    329 
    330 /* Flow control setting, default to full */
    331 static int ixgbe_flow_control = ixgbe_fc_full;
    332 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
    333     &ixgbe_flow_control, 0, "Default flow control used for all adapters");
    334 
    335 /* Which packet processing uses workqueue or softint */
    336 static bool ixgbe_txrx_workqueue = false;
    337 
    338 /*
    339  * Smart speed setting, default to on
    340  * this only works as a compile option
    341  * right now as its during attach, set
    342  * this to 'ixgbe_smart_speed_off' to
    343  * disable.
    344  */
    345 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
    346 
    347 /*
    348  * MSI-X should be the default for best performance,
    349  * but this allows it to be forced off for testing.
    350  */
    351 static int ixgbe_enable_msix = 1;
    352 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
    353     "Enable MSI-X interrupts");
    354 
    355 /*
    356  * Number of Queues, can be set to 0,
    357  * it then autoconfigures based on the
    358  * number of cpus with a max of 8. This
    359  * can be overridden manually here.
    360  */
    361 static int ixgbe_num_queues = 0;
    362 SYSCTL_INT(_hw_ix, OID_AUTO, num_queues, CTLFLAG_RDTUN, &ixgbe_num_queues, 0,
    363     "Number of queues to configure, 0 indicates autoconfigure");
    364 
    365 /*
    366  * Number of TX descriptors per ring,
    367  * setting higher than RX as this seems
    368  * the better performing choice.
    369  */
    370 static int ixgbe_txd = PERFORM_TXD;
    371 SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
    372     "Number of transmit descriptors per queue");
    373 
    374 /* Number of RX descriptors per ring */
    375 static int ixgbe_rxd = PERFORM_RXD;
    376 SYSCTL_INT(_hw_ix, OID_AUTO, rxd, CTLFLAG_RDTUN, &ixgbe_rxd, 0,
    377     "Number of receive descriptors per queue");
    378 
    379 /*
    380  * Defining this on will allow the use
    381  * of unsupported SFP+ modules, note that
    382  * doing so you are on your own :)
    383  */
    384 static int allow_unsupported_sfp = false;
    385 #define TUNABLE_INT(__x, __y)
    386 TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
    387 
    388 /*
    389  * Not sure if Flow Director is fully baked,
    390  * so we'll default to turning it off.
    391  */
    392 static int ixgbe_enable_fdir = 0;
    393 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
    394     "Enable Flow Director");
    395 
    396 /* Legacy Transmit (single queue) */
    397 static int ixgbe_enable_legacy_tx = 0;
    398 SYSCTL_INT(_hw_ix, OID_AUTO, enable_legacy_tx, CTLFLAG_RDTUN,
    399     &ixgbe_enable_legacy_tx, 0, "Enable Legacy TX flow");
    400 
    401 /* Receive-Side Scaling */
    402 static int ixgbe_enable_rss = 1;
    403 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
    404     "Enable Receive-Side Scaling (RSS)");
    405 
    406 #if 0
    407 static int (*ixgbe_start_locked)(struct ifnet *, struct tx_ring *);
    408 static int (*ixgbe_ring_empty)(struct ifnet *, pcq_t *);
    409 #endif
    410 
    411 #ifdef NET_MPSAFE
    412 #define IXGBE_MPSAFE		1
    413 #define IXGBE_CALLOUT_FLAGS	CALLOUT_MPSAFE
    414 #define IXGBE_SOFTINT_FLAGS	SOFTINT_MPSAFE
    415 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU | WQ_MPSAFE
    416 #else
    417 #define IXGBE_CALLOUT_FLAGS	0
    418 #define IXGBE_SOFTINT_FLAGS	0
    419 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU
    420 #endif
    421 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
    422 
    423 /************************************************************************
    424  * ixgbe_initialize_rss_mapping
    425  ************************************************************************/
    426 static void
    427 ixgbe_initialize_rss_mapping(struct adapter *adapter)
    428 {
    429 	struct ixgbe_hw	*hw = &adapter->hw;
    430 	u32		reta = 0, mrqc, rss_key[10];
    431 	int		queue_id, table_size, index_mult;
    432 	int		i, j;
    433 	u32		rss_hash_config;
    434 
    435 	/* force use default RSS key. */
    436 #ifdef __NetBSD__
    437 	rss_getkey((uint8_t *) &rss_key);
    438 #else
    439 	if (adapter->feat_en & IXGBE_FEATURE_RSS) {
    440 		/* Fetch the configured RSS key */
    441 		rss_getkey((uint8_t *) &rss_key);
    442 	} else {
    443 		/* set up random bits */
    444 		cprng_fast(&rss_key, sizeof(rss_key));
    445 	}
    446 #endif
    447 
    448 	/* Set multiplier for RETA setup and table size based on MAC */
    449 	index_mult = 0x1;
    450 	table_size = 128;
    451 	switch (adapter->hw.mac.type) {
    452 	case ixgbe_mac_82598EB:
    453 		index_mult = 0x11;
    454 		break;
    455 	case ixgbe_mac_X550:
    456 	case ixgbe_mac_X550EM_x:
    457 	case ixgbe_mac_X550EM_a:
    458 		table_size = 512;
    459 		break;
    460 	default:
    461 		break;
    462 	}
    463 
    464 	/* Set up the redirection table */
    465 	for (i = 0, j = 0; i < table_size; i++, j++) {
    466 		if (j == adapter->num_queues)
    467 			j = 0;
    468 
    469 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
    470 			/*
    471 			 * Fetch the RSS bucket id for the given indirection
    472 			 * entry. Cap it at the number of configured buckets
    473 			 * (which is num_queues.)
    474 			 */
    475 			queue_id = rss_get_indirection_to_bucket(i);
    476 			queue_id = queue_id % adapter->num_queues;
    477 		} else
    478 			queue_id = (j * index_mult);
    479 
    480 		/*
    481 		 * The low 8 bits are for hash value (n+0);
    482 		 * The next 8 bits are for hash value (n+1), etc.
    483 		 */
    484 		reta = reta >> 8;
    485 		reta = reta | (((uint32_t) queue_id) << 24);
    486 		if ((i & 3) == 3) {
    487 			if (i < 128)
    488 				IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
    489 			else
    490 				IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
    491 				    reta);
    492 			reta = 0;
    493 		}
    494 	}
    495 
    496 	/* Now fill our hash function seeds */
    497 	for (i = 0; i < 10; i++)
    498 		IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
    499 
    500 	/* Perform hash on these packet types */
    501 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
    502 		rss_hash_config = rss_gethashconfig();
    503 	else {
    504 		/*
    505 		 * Disable UDP - IP fragments aren't currently being handled
    506 		 * and so we end up with a mix of 2-tuple and 4-tuple
    507 		 * traffic.
    508 		 */
    509 		rss_hash_config = RSS_HASHTYPE_RSS_IPV4
    510 				| RSS_HASHTYPE_RSS_TCP_IPV4
    511 				| RSS_HASHTYPE_RSS_IPV6
    512 				| RSS_HASHTYPE_RSS_TCP_IPV6
    513 				| RSS_HASHTYPE_RSS_IPV6_EX
    514 				| RSS_HASHTYPE_RSS_TCP_IPV6_EX;
    515 	}
    516 
    517 	mrqc = IXGBE_MRQC_RSSEN;
    518 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
    519 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
    520 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
    521 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
    522 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
    523 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
    524 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
    525 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
    526 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
    527 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
    528 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
    529 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
    530 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
    531 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
    532 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
    533 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
    534 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
    535 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
    536 	mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
    537 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
    538 } /* ixgbe_initialize_rss_mapping */
    539 
    540 /************************************************************************
    541  * ixgbe_initialize_receive_units - Setup receive registers and features.
    542  ************************************************************************/
    543 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
    544 
    545 static void
    546 ixgbe_initialize_receive_units(struct adapter *adapter)
    547 {
    548 	struct	rx_ring	*rxr = adapter->rx_rings;
    549 	struct ixgbe_hw	*hw = &adapter->hw;
    550 	struct ifnet	*ifp = adapter->ifp;
    551 	int		i, j;
    552 	u32		bufsz, fctrl, srrctl, rxcsum;
    553 	u32		hlreg;
    554 
    555 	/*
    556 	 * Make sure receives are disabled while
    557 	 * setting up the descriptor ring
    558 	 */
    559 	ixgbe_disable_rx(hw);
    560 
    561 	/* Enable broadcasts */
    562 	fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
    563 	fctrl |= IXGBE_FCTRL_BAM;
    564 	if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
    565 		fctrl |= IXGBE_FCTRL_DPF;
    566 		fctrl |= IXGBE_FCTRL_PMCF;
    567 	}
    568 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
    569 
    570 	/* Set for Jumbo Frames? */
    571 	hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
    572 	if (ifp->if_mtu > ETHERMTU)
    573 		hlreg |= IXGBE_HLREG0_JUMBOEN;
    574 	else
    575 		hlreg &= ~IXGBE_HLREG0_JUMBOEN;
    576 
    577 #ifdef DEV_NETMAP
    578 	/* CRC stripping is conditional in Netmap */
    579 	if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
    580 	    (ifp->if_capenable & IFCAP_NETMAP) &&
    581 	    !ix_crcstrip)
    582 		hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
    583 	else
    584 #endif /* DEV_NETMAP */
    585 		hlreg |= IXGBE_HLREG0_RXCRCSTRP;
    586 
    587 	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
    588 
    589 	bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
    590 	    IXGBE_SRRCTL_BSIZEPKT_SHIFT;
    591 
    592 	for (i = 0; i < adapter->num_queues; i++, rxr++) {
    593 		u64 rdba = rxr->rxdma.dma_paddr;
    594 		u32 reg;
    595 		int regnum = i / 4;	/* 1 register per 4 queues */
    596 		int regshift = i % 4;	/* 4 bits per 1 queue */
    597 		j = rxr->me;
    598 
    599 		/* Setup the Base and Length of the Rx Descriptor Ring */
    600 		IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
    601 		    (rdba & 0x00000000ffffffffULL));
    602 		IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
    603 		IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
    604 		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
    605 
    606 		/* Set up the SRRCTL register */
    607 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
    608 		srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
    609 		srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
    610 		srrctl |= bufsz;
    611 		srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
    612 
    613 		/* Set RQSMR (Receive Queue Statistic Mapping) register */
    614 		reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(regnum));
    615 		reg &= ~(0x000000ffUL << (regshift * 8));
    616 		reg |= i << (regshift * 8);
    617 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(regnum), reg);
    618 
    619 		/*
    620 		 * Set DROP_EN iff we have no flow control and >1 queue.
    621 		 * Note that srrctl was cleared shortly before during reset,
    622 		 * so we do not need to clear the bit, but do it just in case
    623 		 * this code is moved elsewhere.
    624 		 */
    625 		if (adapter->num_queues > 1 &&
    626 		    adapter->hw.fc.requested_mode == ixgbe_fc_none) {
    627 			srrctl |= IXGBE_SRRCTL_DROP_EN;
    628 		} else {
    629 			srrctl &= ~IXGBE_SRRCTL_DROP_EN;
    630 		}
    631 
    632 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
    633 
    634 		/* Setup the HW Rx Head and Tail Descriptor Pointers */
    635 		IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
    636 		IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
    637 
    638 		/* Set the driver rx tail address */
    639 		rxr->tail =  IXGBE_RDT(rxr->me);
    640 	}
    641 
    642 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
    643 		u32 psrtype = IXGBE_PSRTYPE_TCPHDR
    644 			    | IXGBE_PSRTYPE_UDPHDR
    645 			    | IXGBE_PSRTYPE_IPV4HDR
    646 			    | IXGBE_PSRTYPE_IPV6HDR;
    647 		IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
    648 	}
    649 
    650 	rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
    651 
    652 	ixgbe_initialize_rss_mapping(adapter);
    653 
    654 	if (adapter->num_queues > 1) {
    655 		/* RSS and RX IPP Checksum are mutually exclusive */
    656 		rxcsum |= IXGBE_RXCSUM_PCSD;
    657 	}
    658 
    659 	if (ifp->if_capenable & IFCAP_RXCSUM)
    660 		rxcsum |= IXGBE_RXCSUM_PCSD;
    661 
    662 	/* This is useful for calculating UDP/IP fragment checksums */
    663 	if (!(rxcsum & IXGBE_RXCSUM_PCSD))
    664 		rxcsum |= IXGBE_RXCSUM_IPPCSE;
    665 
    666 	IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
    667 
    668 } /* ixgbe_initialize_receive_units */
    669 
    670 /************************************************************************
    671  * ixgbe_initialize_transmit_units - Enable transmit units.
    672  ************************************************************************/
    673 static void
    674 ixgbe_initialize_transmit_units(struct adapter *adapter)
    675 {
    676 	struct tx_ring	*txr = adapter->tx_rings;
    677 	struct ixgbe_hw	*hw = &adapter->hw;
    678 	int i;
    679 
    680 	INIT_DEBUGOUT("ixgbe_initialize_transmit_units");
    681 
    682 	/* Setup the Base and Length of the Tx Descriptor Ring */
    683 	for (i = 0; i < adapter->num_queues; i++, txr++) {
    684 		u64 tdba = txr->txdma.dma_paddr;
    685 		u32 txctrl = 0;
    686 		u32 tqsmreg, reg;
    687 		int regnum = i / 4;	/* 1 register per 4 queues */
    688 		int regshift = i % 4;	/* 4 bits per 1 queue */
    689 		int j = txr->me;
    690 
    691 		IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
    692 		    (tdba & 0x00000000ffffffffULL));
    693 		IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
    694 		IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
    695 		    adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
    696 
    697 		/*
    698 		 * Set TQSMR (Transmit Queue Statistic Mapping) register.
    699 		 * Register location is different between 82598 and others.
    700 		 */
    701 		if (adapter->hw.mac.type == ixgbe_mac_82598EB)
    702 			tqsmreg = IXGBE_TQSMR(regnum);
    703 		else
    704 			tqsmreg = IXGBE_TQSM(regnum);
    705 		reg = IXGBE_READ_REG(hw, tqsmreg);
    706 		reg &= ~(0x000000ffUL << (regshift * 8));
    707 		reg |= i << (regshift * 8);
    708 		IXGBE_WRITE_REG(hw, tqsmreg, reg);
    709 
    710 		/* Setup the HW Tx Head and Tail descriptor pointers */
    711 		IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
    712 		IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
    713 
    714 		/* Cache the tail address */
    715 		txr->tail = IXGBE_TDT(j);
    716 
    717 		txr->txr_no_space = false;
    718 
    719 		/* Disable Head Writeback */
    720 		/*
    721 		 * Note: for X550 series devices, these registers are actually
    722 		 * prefixed with TPH_ instead of DCA_, but the addresses and
    723 		 * fields remain the same.
    724 		 */
    725 		switch (hw->mac.type) {
    726 		case ixgbe_mac_82598EB:
    727 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
    728 			break;
    729 		default:
    730 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
    731 			break;
    732 		}
    733 		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
    734 		switch (hw->mac.type) {
    735 		case ixgbe_mac_82598EB:
    736 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
    737 			break;
    738 		default:
    739 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
    740 			break;
    741 		}
    742 
    743 	}
    744 
    745 	if (hw->mac.type != ixgbe_mac_82598EB) {
    746 		u32 dmatxctl, rttdcs;
    747 
    748 		dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
    749 		dmatxctl |= IXGBE_DMATXCTL_TE;
    750 		IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
    751 		/* Disable arbiter to set MTQC */
    752 		rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
    753 		rttdcs |= IXGBE_RTTDCS_ARBDIS;
    754 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
    755 		IXGBE_WRITE_REG(hw, IXGBE_MTQC,
    756 		    ixgbe_get_mtqc(adapter->iov_mode));
    757 		rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
    758 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
    759 	}
    760 
    761 	return;
    762 } /* ixgbe_initialize_transmit_units */
    763 
    764 /************************************************************************
    765  * ixgbe_attach - Device initialization routine
    766  *
    767  *   Called when the driver is being loaded.
    768  *   Identifies the type of hardware, allocates all resources
    769  *   and initializes the hardware.
    770  *
    771  *   return 0 on success, positive on failure
    772  ************************************************************************/
    773 static void
    774 ixgbe_attach(device_t parent, device_t dev, void *aux)
    775 {
    776 	struct adapter	*adapter;
    777 	struct ixgbe_hw *hw;
    778 	int		error = -1;
    779 	u32		ctrl_ext;
    780 	u16		high, low, nvmreg;
    781 	pcireg_t	id, subid;
    782 	const ixgbe_vendor_info_t *ent;
    783 	struct pci_attach_args *pa = aux;
    784 	bool unsupported_sfp = false;
    785 	const char *str;
    786 	char buf[256];
    787 
    788 	INIT_DEBUGOUT("ixgbe_attach: begin");
    789 
    790 	/* Allocate, clear, and link in our adapter structure */
    791 	adapter = device_private(dev);
    792 	adapter->hw.back = adapter;
    793 	adapter->dev = dev;
    794 	hw = &adapter->hw;
    795 	adapter->osdep.pc = pa->pa_pc;
    796 	adapter->osdep.tag = pa->pa_tag;
    797 	if (pci_dma64_available(pa))
    798 		adapter->osdep.dmat = pa->pa_dmat64;
    799 	else
    800 		adapter->osdep.dmat = pa->pa_dmat;
    801 	adapter->osdep.attached = false;
    802 
    803 	ent = ixgbe_lookup(pa);
    804 
    805 	KASSERT(ent != NULL);
    806 
    807 	aprint_normal(": %s, Version - %s\n",
    808 	    ixgbe_strings[ent->index], ixgbe_driver_version);
    809 
    810 	/* Core Lock Init */
    811 	IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
    812 
    813 	/* Set up the timer callout */
    814 	callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
    815 
    816 	/* Determine hardware revision */
    817 	id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
    818 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
    819 
    820 	hw->vendor_id = PCI_VENDOR(id);
    821 	hw->device_id = PCI_PRODUCT(id);
    822 	hw->revision_id =
    823 	    PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
    824 	hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
    825 	hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
    826 
    827 	/*
    828 	 * Make sure BUSMASTER is set
    829 	 */
    830 	ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
    831 
    832 	/* Do base PCI setup - map BAR0 */
    833 	if (ixgbe_allocate_pci_resources(adapter, pa)) {
    834 		aprint_error_dev(dev, "Allocation of PCI resources failed\n");
    835 		error = ENXIO;
    836 		goto err_out;
    837 	}
    838 
    839 	/* let hardware know driver is loaded */
    840 	ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
    841 	ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
    842 	IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
    843 
    844 	/*
    845 	 * Initialize the shared code
    846 	 */
    847 	if (ixgbe_init_shared_code(hw) != 0) {
    848 		aprint_error_dev(dev, "Unable to initialize the shared code\n");
    849 		error = ENXIO;
    850 		goto err_out;
    851 	}
    852 
    853 	switch (hw->mac.type) {
    854 	case ixgbe_mac_82598EB:
    855 		str = "82598EB";
    856 		break;
    857 	case ixgbe_mac_82599EB:
    858 		str = "82599EB";
    859 		break;
    860 	case ixgbe_mac_X540:
    861 		str = "X540";
    862 		break;
    863 	case ixgbe_mac_X550:
    864 		str = "X550";
    865 		break;
    866 	case ixgbe_mac_X550EM_x:
    867 		str = "X550EM X";
    868 		break;
    869 	case ixgbe_mac_X550EM_a:
    870 		str = "X550EM A";
    871 		break;
    872 	default:
    873 		str = "Unknown";
    874 		break;
    875 	}
    876 	aprint_normal_dev(dev, "device %s\n", str);
    877 
    878 	hw->allow_unsupported_sfp = allow_unsupported_sfp;
    879 
    880 	/* Pick up the 82599 settings */
    881 	if (hw->mac.type != ixgbe_mac_82598EB)
    882 		hw->phy.smart_speed = ixgbe_smart_speed;
    883 
    884 	/* Set the right number of segments */
    885 	KASSERT(IXGBE_82599_SCATTER_MAX >= IXGBE_SCATTER_DEFAULT);
    886 	adapter->num_segs = IXGBE_SCATTER_DEFAULT;
    887 
    888 	/* Ensure SW/FW semaphore is free */
    889 	ixgbe_init_swfw_semaphore(hw);
    890 
    891 	hw->mac.ops.set_lan_id(hw);
    892 	ixgbe_init_device_features(adapter);
    893 
    894 	if (ixgbe_configure_interrupts(adapter)) {
    895 		error = ENXIO;
    896 		goto err_out;
    897 	}
    898 
    899 	/* Allocate multicast array memory. */
    900 	adapter->mta = malloc(sizeof(*adapter->mta) *
    901 	    MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT);
    902 	if (adapter->mta == NULL) {
    903 		aprint_error_dev(dev, "Cannot allocate multicast setup array\n");
    904 		error = ENOMEM;
    905 		goto err_out;
    906 	}
    907 
    908 	/* Enable WoL (if supported) */
    909 	ixgbe_check_wol_support(adapter);
    910 
    911 	/* Verify adapter fan is still functional (if applicable) */
    912 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
    913 		u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    914 		ixgbe_check_fan_failure(adapter, esdp, FALSE);
    915 	}
    916 
    917 	/* Set an initial default flow control value */
    918 	hw->fc.requested_mode = ixgbe_flow_control;
    919 
    920 	/* Do descriptor calc and sanity checks */
    921 	if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
    922 	    ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
    923 		aprint_error_dev(dev, "TXD config issue, using default!\n");
    924 		adapter->num_tx_desc = DEFAULT_TXD;
    925 	} else
    926 		adapter->num_tx_desc = ixgbe_txd;
    927 
    928 	if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
    929 	    ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
    930 		aprint_error_dev(dev, "RXD config issue, using default!\n");
    931 		adapter->num_rx_desc = DEFAULT_RXD;
    932 	} else
    933 		adapter->num_rx_desc = ixgbe_rxd;
    934 
    935 	/* Sysctls for limiting the amount of work done in the taskqueues */
    936 	adapter->rx_process_limit
    937 	    = (ixgbe_rx_process_limit <= adapter->num_rx_desc)
    938 	    ? ixgbe_rx_process_limit : adapter->num_rx_desc;
    939 	adapter->tx_process_limit
    940 	    = (ixgbe_tx_process_limit <= adapter->num_tx_desc)
    941 	    ? ixgbe_tx_process_limit : adapter->num_tx_desc;
    942 
    943 	/* Set default high limit of copying mbuf in rxeof */
    944 	adapter->rx_copy_len = IXGBE_RX_COPY_LEN_MAX;
    945 
    946 	/* Allocate our TX/RX Queues */
    947 	if (ixgbe_allocate_queues(adapter)) {
    948 		error = ENOMEM;
    949 		goto err_out;
    950 	}
    951 
    952 	hw->phy.reset_if_overtemp = TRUE;
    953 	error = ixgbe_reset_hw(hw);
    954 	hw->phy.reset_if_overtemp = FALSE;
    955 	if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
    956 		/*
    957 		 * No optics in this port, set up
    958 		 * so the timer routine will probe
    959 		 * for later insertion.
    960 		 */
    961 		adapter->sfp_probe = TRUE;
    962 		error = IXGBE_SUCCESS;
    963 	} else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
    964 		aprint_error_dev(dev, "Unsupported SFP+ module detected!\n");
    965 		unsupported_sfp = true;
    966 		error = IXGBE_SUCCESS;
    967 	} else if (error) {
    968 		aprint_error_dev(dev,
    969 		    "Hardware initialization failed(error = %d)\n", error);
    970 		error = EIO;
    971 		goto err_late;
    972 	}
    973 
    974 	/* Make sure we have a good EEPROM before we read from it */
    975 	if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
    976 		aprint_error_dev(dev, "The EEPROM Checksum Is Not Valid\n");
    977 		error = EIO;
    978 		goto err_late;
    979 	}
    980 
    981 	aprint_normal("%s:", device_xname(dev));
    982 	/* NVM Image Version */
    983 	high = low = 0;
    984 	switch (hw->mac.type) {
    985 	case ixgbe_mac_82598EB:
    986 		/*
    987 		 * Print version from the dev starter version (0x29). The
    988 		 * location is the same as newer device's IXGBE_NVM_MAP_VER.
    989 		 */
    990 		hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
    991 		if (nvmreg == 0xffff)
    992 			break;
    993 		high = (nvmreg >> 12) & 0x0f;
    994 		low = (nvmreg >> 4) & 0xff;
    995 		id = nvmreg & 0x0f;
    996 		/*
    997 		 * The following output might not be correct. Some 82598 cards
    998 		 * have 0x1070 or 0x2090. 82598 spec update notes about 2.9.0.
    999 		 */
   1000 		aprint_normal(" NVM Image Version %u.%u.%u,", high, low, id);
   1001 		break;
   1002 	case ixgbe_mac_X540:
   1003 	case ixgbe_mac_X550EM_a:
   1004 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
   1005 		if (nvmreg == 0xffff)
   1006 			break;
   1007 		high = (nvmreg >> 12) & 0x0f;
   1008 		low = (nvmreg >> 4) & 0xff;
   1009 		id = nvmreg & 0x0f;
   1010 		aprint_normal(" NVM Image Version %u.", high);
   1011 		if (hw->mac.type == ixgbe_mac_X540)
   1012 			str = "%x";
   1013 		else
   1014 			str = "%02x";
   1015 		aprint_normal(str, low);
   1016 		aprint_normal(" ID 0x%x,", id);
   1017 		break;
   1018 	case ixgbe_mac_X550EM_x:
   1019 	case ixgbe_mac_X550:
   1020 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
   1021 		if (nvmreg == 0xffff)
   1022 			break;
   1023 		high = (nvmreg >> 12) & 0x0f;
   1024 		low = nvmreg & 0xff;
   1025 		aprint_normal(" NVM Image Version %u.%02x,", high, low);
   1026 		break;
   1027 	default:
   1028 		break;
   1029 	}
   1030 	hw->eeprom.nvm_image_ver_high = high;
   1031 	hw->eeprom.nvm_image_ver_low = low;
   1032 
   1033 	/* PHY firmware revision */
   1034 	switch (hw->mac.type) {
   1035 	case ixgbe_mac_X540:
   1036 	case ixgbe_mac_X550:
   1037 		hw->eeprom.ops.read(hw, IXGBE_PHYFW_REV, &nvmreg);
   1038 		if (nvmreg == 0xffff)
   1039 			break;
   1040 		high = (nvmreg >> 12) & 0x0f;
   1041 		low = (nvmreg >> 4) & 0xff;
   1042 		id = nvmreg & 0x000f;
   1043 		aprint_normal(" PHY FW Revision %u.", high);
   1044 		if (hw->mac.type == ixgbe_mac_X540)
   1045 			str = "%x";
   1046 		else
   1047 			str = "%02x";
   1048 		aprint_normal(str, low);
   1049 		aprint_normal(" ID 0x%x,", id);
   1050 		break;
   1051 	default:
   1052 		break;
   1053 	}
   1054 
   1055 	/* NVM Map version & OEM NVM Image version */
   1056 	switch (hw->mac.type) {
   1057 	case ixgbe_mac_X550:
   1058 	case ixgbe_mac_X550EM_x:
   1059 	case ixgbe_mac_X550EM_a:
   1060 		hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
   1061 		if (nvmreg != 0xffff) {
   1062 			high = (nvmreg >> 12) & 0x0f;
   1063 			low = nvmreg & 0x00ff;
   1064 			aprint_normal(" NVM Map version %u.%02x,", high, low);
   1065 		}
   1066 		hw->eeprom.ops.read(hw, IXGBE_OEM_NVM_IMAGE_VER, &nvmreg);
   1067 		if (nvmreg != 0xffff) {
   1068 			high = (nvmreg >> 12) & 0x0f;
   1069 			low = nvmreg & 0x00ff;
   1070 			aprint_verbose(" OEM NVM Image version %u.%02x,", high,
   1071 			    low);
   1072 		}
   1073 		break;
   1074 	default:
   1075 		break;
   1076 	}
   1077 
   1078 	/* Print the ETrackID */
   1079 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_H, &high);
   1080 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_L, &low);
   1081 	aprint_normal(" ETrackID %08x\n", ((uint32_t)high << 16) | low);
   1082 
   1083 	/* Printed Board Assembly number */
   1084 	error = ixgbe_read_pba_string(hw, buf, IXGBE_PBANUM_LENGTH);
   1085 	aprint_normal_dev(dev, "PBA number %s\n", error ? "unknown" : buf);
   1086 
   1087 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   1088 		error = ixgbe_allocate_msix(adapter, pa);
   1089 		if (error) {
   1090 			/* Free allocated queue structures first */
   1091 			ixgbe_free_queues(adapter);
   1092 
   1093 			/* Fallback to legacy interrupt */
   1094 			adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
   1095 			if (adapter->feat_cap & IXGBE_FEATURE_MSI)
   1096 				adapter->feat_en |= IXGBE_FEATURE_MSI;
   1097 			adapter->num_queues = 1;
   1098 
   1099 			/* Allocate our TX/RX Queues again */
   1100 			if (ixgbe_allocate_queues(adapter)) {
   1101 				error = ENOMEM;
   1102 				goto err_out;
   1103 			}
   1104 		}
   1105 	}
   1106 
   1107 	/* Recovery mode */
   1108 	switch (adapter->hw.mac.type) {
   1109 	case ixgbe_mac_X550:
   1110 	case ixgbe_mac_X550EM_x:
   1111 	case ixgbe_mac_X550EM_a:
   1112 		/* >= 2.00 */
   1113 		if (hw->eeprom.nvm_image_ver_high >= 2) {
   1114 			adapter->feat_cap |= IXGBE_FEATURE_RECOVERY_MODE;
   1115 			adapter->feat_en |= IXGBE_FEATURE_RECOVERY_MODE;
   1116 		}
   1117 		break;
   1118 	default:
   1119 		break;
   1120 	}
   1121 
   1122 	if ((adapter->feat_en & IXGBE_FEATURE_MSIX) == 0)
   1123 		error = ixgbe_allocate_legacy(adapter, pa);
   1124 	if (error)
   1125 		goto err_late;
   1126 
   1127 	/* Tasklets for Link, SFP, Multispeed Fiber and Flow Director */
   1128 	adapter->link_si = softint_establish(SOFTINT_NET |IXGBE_SOFTINT_FLAGS,
   1129 	    ixgbe_handle_link, adapter);
   1130 	adapter->mod_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1131 	    ixgbe_handle_mod, adapter);
   1132 	adapter->msf_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1133 	    ixgbe_handle_msf, adapter);
   1134 	adapter->phy_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1135 	    ixgbe_handle_phy, adapter);
   1136 	if (adapter->feat_en & IXGBE_FEATURE_FDIR)
   1137 		adapter->fdir_si =
   1138 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1139 			ixgbe_reinit_fdir, adapter);
   1140 	if ((adapter->link_si == NULL) || (adapter->mod_si == NULL)
   1141 	    || (adapter->msf_si == NULL) || (adapter->phy_si == NULL)
   1142 	    || ((adapter->feat_en & IXGBE_FEATURE_FDIR)
   1143 		&& (adapter->fdir_si == NULL))) {
   1144 		aprint_error_dev(dev,
   1145 		    "could not establish software interrupts ()\n");
   1146 		goto err_out;
   1147 	}
   1148 
   1149 	error = ixgbe_start_hw(hw);
   1150 	switch (error) {
   1151 	case IXGBE_ERR_EEPROM_VERSION:
   1152 		aprint_error_dev(dev, "This device is a pre-production adapter/"
   1153 		    "LOM.  Please be aware there may be issues associated "
   1154 		    "with your hardware.\nIf you are experiencing problems "
   1155 		    "please contact your Intel or hardware representative "
   1156 		    "who provided you with this hardware.\n");
   1157 		break;
   1158 	default:
   1159 		break;
   1160 	}
   1161 
   1162 	/* Setup OS specific network interface */
   1163 	if (ixgbe_setup_interface(dev, adapter) != 0)
   1164 		goto err_late;
   1165 
   1166 	/*
   1167 	 *  Print PHY ID only for copper PHY. On device which has SFP(+) cage
   1168 	 * and a module is inserted, phy.id is not MII PHY id but SFF 8024 ID.
   1169 	 */
   1170 	if (hw->phy.media_type == ixgbe_media_type_copper) {
   1171 		uint16_t id1, id2;
   1172 		int oui, model, rev;
   1173 		const char *descr;
   1174 
   1175 		id1 = hw->phy.id >> 16;
   1176 		id2 = hw->phy.id & 0xffff;
   1177 		oui = MII_OUI(id1, id2);
   1178 		model = MII_MODEL(id2);
   1179 		rev = MII_REV(id2);
   1180 		if ((descr = mii_get_descr(oui, model)) != NULL)
   1181 			aprint_normal_dev(dev,
   1182 			    "PHY: %s (OUI 0x%06x, model 0x%04x), rev. %d\n",
   1183 			    descr, oui, model, rev);
   1184 		else
   1185 			aprint_normal_dev(dev,
   1186 			    "PHY OUI 0x%06x, model 0x%04x, rev. %d\n",
   1187 			    oui, model, rev);
   1188 	}
   1189 
   1190 	/* Enable EEE power saving */
   1191 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   1192 		hw->mac.ops.setup_eee(hw,
   1193 		    adapter->feat_en & IXGBE_FEATURE_EEE);
   1194 
   1195 	/* Enable power to the phy. */
   1196 	if (!unsupported_sfp) {
   1197 		/* Enable the optics for 82599 SFP+ fiber */
   1198 		ixgbe_enable_tx_laser(hw);
   1199 
   1200 		/*
   1201 		 * XXX Currently, ixgbe_set_phy_power() supports only copper
   1202 		 * PHY, so it's not required to test with !unsupported_sfp.
   1203 		 */
   1204 		ixgbe_set_phy_power(hw, TRUE);
   1205 	}
   1206 
   1207 	/* Initialize statistics */
   1208 	ixgbe_update_stats_counters(adapter);
   1209 
   1210 	/* Check PCIE slot type/speed/width */
   1211 	ixgbe_get_slot_info(adapter);
   1212 
   1213 	/*
   1214 	 * Do time init and sysctl init here, but
   1215 	 * only on the first port of a bypass adapter.
   1216 	 */
   1217 	ixgbe_bypass_init(adapter);
   1218 
   1219 	/* Set an initial dmac value */
   1220 	adapter->dmac = 0;
   1221 	/* Set initial advertised speeds (if applicable) */
   1222 	adapter->advertise = ixgbe_get_default_advertise(adapter);
   1223 
   1224 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
   1225 		ixgbe_define_iov_schemas(dev, &error);
   1226 
   1227 	/* Add sysctls */
   1228 	ixgbe_add_device_sysctls(adapter);
   1229 	ixgbe_add_hw_stats(adapter);
   1230 
   1231 	/* For Netmap */
   1232 	adapter->init_locked = ixgbe_init_locked;
   1233 	adapter->stop_locked = ixgbe_stop_locked;
   1234 
   1235 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
   1236 		ixgbe_netmap_attach(adapter);
   1237 
   1238 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
   1239 	aprint_verbose_dev(dev, "feature cap %s\n", buf);
   1240 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
   1241 	aprint_verbose_dev(dev, "feature ena %s\n", buf);
   1242 
   1243 	if (pmf_device_register(dev, ixgbe_suspend, ixgbe_resume))
   1244 		pmf_class_network_register(dev, adapter->ifp);
   1245 	else
   1246 		aprint_error_dev(dev, "couldn't establish power handler\n");
   1247 
   1248 	/* Init recovery mode timer and state variable */
   1249 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE) {
   1250 		adapter->recovery_mode = 0;
   1251 
   1252 		/* Set up the timer callout */
   1253 		callout_init(&adapter->recovery_mode_timer,
   1254 		    IXGBE_CALLOUT_FLAGS);
   1255 
   1256 		/* Start the task */
   1257 		callout_reset(&adapter->recovery_mode_timer, hz,
   1258 		    ixgbe_recovery_mode_timer, adapter);
   1259 	}
   1260 
   1261 	INIT_DEBUGOUT("ixgbe_attach: end");
   1262 	adapter->osdep.attached = true;
   1263 
   1264 	return;
   1265 
   1266 err_late:
   1267 	ixgbe_free_queues(adapter);
   1268 err_out:
   1269 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
   1270 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
   1271 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
   1272 	ixgbe_free_softint(adapter);
   1273 	ixgbe_free_pci_resources(adapter);
   1274 	if (adapter->mta != NULL)
   1275 		free(adapter->mta, M_DEVBUF);
   1276 	IXGBE_CORE_LOCK_DESTROY(adapter);
   1277 
   1278 	return;
   1279 } /* ixgbe_attach */
   1280 
   1281 /************************************************************************
   1282  * ixgbe_check_wol_support
   1283  *
   1284  *   Checks whether the adapter's ports are capable of
   1285  *   Wake On LAN by reading the adapter's NVM.
   1286  *
   1287  *   Sets each port's hw->wol_enabled value depending
   1288  *   on the value read here.
   1289  ************************************************************************/
   1290 static void
   1291 ixgbe_check_wol_support(struct adapter *adapter)
   1292 {
   1293 	struct ixgbe_hw *hw = &adapter->hw;
   1294 	u16		dev_caps = 0;
   1295 
   1296 	/* Find out WoL support for port */
   1297 	adapter->wol_support = hw->wol_enabled = 0;
   1298 	ixgbe_get_device_caps(hw, &dev_caps);
   1299 	if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
   1300 	    ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
   1301 	     hw->bus.func == 0))
   1302 		adapter->wol_support = hw->wol_enabled = 1;
   1303 
   1304 	/* Save initial wake up filter configuration */
   1305 	adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
   1306 
   1307 	return;
   1308 } /* ixgbe_check_wol_support */
   1309 
   1310 /************************************************************************
   1311  * ixgbe_setup_interface
   1312  *
   1313  *   Setup networking device structure and register an interface.
   1314  ************************************************************************/
   1315 static int
   1316 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
   1317 {
   1318 	struct ethercom *ec = &adapter->osdep.ec;
   1319 	struct ifnet   *ifp;
   1320 	int rv;
   1321 
   1322 	INIT_DEBUGOUT("ixgbe_setup_interface: begin");
   1323 
   1324 	ifp = adapter->ifp = &ec->ec_if;
   1325 	strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
   1326 	ifp->if_baudrate = IF_Gbps(10);
   1327 	ifp->if_init = ixgbe_init;
   1328 	ifp->if_stop = ixgbe_ifstop;
   1329 	ifp->if_softc = adapter;
   1330 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
   1331 #ifdef IXGBE_MPSAFE
   1332 	ifp->if_extflags = IFEF_MPSAFE;
   1333 #endif
   1334 	ifp->if_ioctl = ixgbe_ioctl;
   1335 #if __FreeBSD_version >= 1100045
   1336 	/* TSO parameters */
   1337 	ifp->if_hw_tsomax = 65518;
   1338 	ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
   1339 	ifp->if_hw_tsomaxsegsize = 2048;
   1340 #endif
   1341 	if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
   1342 #if 0
   1343 		ixgbe_start_locked = ixgbe_legacy_start_locked;
   1344 #endif
   1345 	} else {
   1346 		ifp->if_transmit = ixgbe_mq_start;
   1347 #if 0
   1348 		ixgbe_start_locked = ixgbe_mq_start_locked;
   1349 #endif
   1350 	}
   1351 	ifp->if_start = ixgbe_legacy_start;
   1352 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
   1353 	IFQ_SET_READY(&ifp->if_snd);
   1354 
   1355 	rv = if_initialize(ifp);
   1356 	if (rv != 0) {
   1357 		aprint_error_dev(dev, "if_initialize failed(%d)\n", rv);
   1358 		return rv;
   1359 	}
   1360 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
   1361 	ether_ifattach(ifp, adapter->hw.mac.addr);
   1362 	aprint_normal_dev(dev, "Ethernet address %s\n",
   1363 	    ether_sprintf(adapter->hw.mac.addr));
   1364 	/*
   1365 	 * We use per TX queue softint, so if_deferred_start_init() isn't
   1366 	 * used.
   1367 	 */
   1368 	ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
   1369 
   1370 	adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
   1371 
   1372 	/*
   1373 	 * Tell the upper layer(s) we support long frames.
   1374 	 */
   1375 	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
   1376 
   1377 	/* Set capability flags */
   1378 	ifp->if_capabilities |= IFCAP_RXCSUM
   1379 			     |	IFCAP_TXCSUM
   1380 			     |	IFCAP_TSOv4
   1381 			     |	IFCAP_TSOv6;
   1382 	ifp->if_capenable = 0;
   1383 
   1384 	ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
   1385 			    |  ETHERCAP_VLAN_HWCSUM
   1386 			    |  ETHERCAP_JUMBO_MTU
   1387 			    |  ETHERCAP_VLAN_MTU;
   1388 
   1389 	/* Enable the above capabilities by default */
   1390 	ec->ec_capenable = ec->ec_capabilities;
   1391 
   1392 	/*
   1393 	 * Don't turn this on by default, if vlans are
   1394 	 * created on another pseudo device (eg. lagg)
   1395 	 * then vlan events are not passed thru, breaking
   1396 	 * operation, but with HW FILTER off it works. If
   1397 	 * using vlans directly on the ixgbe driver you can
   1398 	 * enable this and get full hardware tag filtering.
   1399 	 */
   1400 	ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
   1401 
   1402 	/*
   1403 	 * Specify the media types supported by this adapter and register
   1404 	 * callbacks to update media and link information
   1405 	 */
   1406 	ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change,
   1407 	    ixgbe_media_status);
   1408 
   1409 	adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
   1410 	ixgbe_add_media_types(adapter);
   1411 
   1412 	/* Set autoselect media by default */
   1413 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
   1414 
   1415 	if_register(ifp);
   1416 
   1417 	return (0);
   1418 } /* ixgbe_setup_interface */
   1419 
   1420 /************************************************************************
   1421  * ixgbe_add_media_types
   1422  ************************************************************************/
   1423 static void
   1424 ixgbe_add_media_types(struct adapter *adapter)
   1425 {
   1426 	struct ixgbe_hw *hw = &adapter->hw;
   1427 	device_t	dev = adapter->dev;
   1428 	u64		layer;
   1429 
   1430 	layer = adapter->phy_layer;
   1431 
   1432 #define	ADD(mm, dd)							\
   1433 	ifmedia_add(&adapter->media, IFM_ETHER | (mm), (dd), NULL);
   1434 
   1435 	ADD(IFM_NONE, 0);
   1436 
   1437 	/* Media types with matching NetBSD media defines */
   1438 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T) {
   1439 		ADD(IFM_10G_T | IFM_FDX, 0);
   1440 	}
   1441 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T) {
   1442 		ADD(IFM_1000_T | IFM_FDX, 0);
   1443 	}
   1444 	if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX) {
   1445 		ADD(IFM_100_TX | IFM_FDX, 0);
   1446 	}
   1447 	if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T) {
   1448 		ADD(IFM_10_T | IFM_FDX, 0);
   1449 	}
   1450 
   1451 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
   1452 	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) {
   1453 		ADD(IFM_10G_TWINAX | IFM_FDX, 0);
   1454 	}
   1455 
   1456 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
   1457 		ADD(IFM_10G_LR | IFM_FDX, 0);
   1458 		if (hw->phy.multispeed_fiber) {
   1459 			ADD(IFM_1000_LX | IFM_FDX, 0);
   1460 		}
   1461 	}
   1462 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
   1463 		ADD(IFM_10G_SR | IFM_FDX, 0);
   1464 		if (hw->phy.multispeed_fiber) {
   1465 			ADD(IFM_1000_SX | IFM_FDX, 0);
   1466 		}
   1467 	} else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX) {
   1468 		ADD(IFM_1000_SX | IFM_FDX, 0);
   1469 	}
   1470 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4) {
   1471 		ADD(IFM_10G_CX4 | IFM_FDX, 0);
   1472 	}
   1473 
   1474 #ifdef IFM_ETH_XTYPE
   1475 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
   1476 		ADD(IFM_10G_KR | IFM_FDX, 0);
   1477 	}
   1478 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
   1479 		ADD(IFM_10G_KX4 | IFM_FDX, 0);
   1480 	}
   1481 #else
   1482 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
   1483 		device_printf(dev, "Media supported: 10GbaseKR\n");
   1484 		device_printf(dev, "10GbaseKR mapped to 10GbaseSR\n");
   1485 		ADD(IFM_10G_SR | IFM_FDX, 0);
   1486 	}
   1487 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
   1488 		device_printf(dev, "Media supported: 10GbaseKX4\n");
   1489 		device_printf(dev, "10GbaseKX4 mapped to 10GbaseCX4\n");
   1490 		ADD(IFM_10G_CX4 | IFM_FDX, 0);
   1491 	}
   1492 #endif
   1493 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
   1494 		ADD(IFM_1000_KX | IFM_FDX, 0);
   1495 	}
   1496 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX) {
   1497 		ADD(IFM_2500_KX | IFM_FDX, 0);
   1498 	}
   1499 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_T) {
   1500 		ADD(IFM_2500_T | IFM_FDX, 0);
   1501 	}
   1502 	if (layer & IXGBE_PHYSICAL_LAYER_5GBASE_T) {
   1503 		ADD(IFM_5000_T | IFM_FDX, 0);
   1504 	}
   1505 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
   1506 		ADD(IFM_1000_LX | IFM_FDX, 0); /* IFM_1000_BX */
   1507 	/* XXX no ifmedia_set? */
   1508 
   1509 	ADD(IFM_AUTO, 0);
   1510 
   1511 #undef ADD
   1512 } /* ixgbe_add_media_types */
   1513 
   1514 /************************************************************************
   1515  * ixgbe_is_sfp
   1516  ************************************************************************/
   1517 static inline bool
   1518 ixgbe_is_sfp(struct ixgbe_hw *hw)
   1519 {
   1520 	switch (hw->mac.type) {
   1521 	case ixgbe_mac_82598EB:
   1522 		if (hw->phy.type == ixgbe_phy_nl)
   1523 			return (TRUE);
   1524 		return (FALSE);
   1525 	case ixgbe_mac_82599EB:
   1526 	case ixgbe_mac_X550EM_x:
   1527 	case ixgbe_mac_X550EM_a:
   1528 		switch (hw->mac.ops.get_media_type(hw)) {
   1529 		case ixgbe_media_type_fiber:
   1530 		case ixgbe_media_type_fiber_qsfp:
   1531 			return (TRUE);
   1532 		default:
   1533 			return (FALSE);
   1534 		}
   1535 	default:
   1536 		return (FALSE);
   1537 	}
   1538 } /* ixgbe_is_sfp */
   1539 
   1540 /************************************************************************
   1541  * ixgbe_config_link
   1542  ************************************************************************/
   1543 static void
   1544 ixgbe_config_link(struct adapter *adapter)
   1545 {
   1546 	struct ixgbe_hw *hw = &adapter->hw;
   1547 	u32		autoneg, err = 0;
   1548 	bool		sfp, negotiate = false;
   1549 
   1550 	sfp = ixgbe_is_sfp(hw);
   1551 
   1552 	if (sfp) {
   1553 		if (hw->phy.multispeed_fiber) {
   1554 			ixgbe_enable_tx_laser(hw);
   1555 			kpreempt_disable();
   1556 			softint_schedule(adapter->msf_si);
   1557 			kpreempt_enable();
   1558 		}
   1559 		kpreempt_disable();
   1560 		softint_schedule(adapter->mod_si);
   1561 		kpreempt_enable();
   1562 	} else {
   1563 		struct ifmedia	*ifm = &adapter->media;
   1564 
   1565 		if (hw->mac.ops.check_link)
   1566 			err = ixgbe_check_link(hw, &adapter->link_speed,
   1567 			    &adapter->link_up, FALSE);
   1568 		if (err)
   1569 			return;
   1570 
   1571 		/*
   1572 		 * Check if it's the first call. If it's the first call,
   1573 		 * get value for auto negotiation.
   1574 		 */
   1575 		autoneg = hw->phy.autoneg_advertised;
   1576 		if ((IFM_SUBTYPE(ifm->ifm_cur->ifm_media) != IFM_NONE)
   1577 		    && ((!autoneg) && (hw->mac.ops.get_link_capabilities)))
   1578 			err = hw->mac.ops.get_link_capabilities(hw, &autoneg,
   1579 			    &negotiate);
   1580 		if (err)
   1581 			return;
   1582 		if (hw->mac.ops.setup_link)
   1583 			err = hw->mac.ops.setup_link(hw, autoneg,
   1584 			    adapter->link_up);
   1585 	}
   1586 
   1587 } /* ixgbe_config_link */
   1588 
   1589 /************************************************************************
   1590  * ixgbe_update_stats_counters - Update board statistics counters.
   1591  ************************************************************************/
   1592 static void
   1593 ixgbe_update_stats_counters(struct adapter *adapter)
   1594 {
   1595 	struct ifnet	      *ifp = adapter->ifp;
   1596 	struct ixgbe_hw	      *hw = &adapter->hw;
   1597 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
   1598 	u32		      missed_rx = 0, bprc, lxon, lxoff;
   1599 	u64		      total, total_missed_rx = 0;
   1600 	uint64_t	      crcerrs, illerrc, rlec, ruc, rfc, roc, rjc;
   1601 	unsigned int	      queue_counters;
   1602 	int		      i;
   1603 
   1604 #define READ_COPY_SET(hw, stats, regname, evname)		\
   1605 	do {							\
   1606 		(evname) = IXGBE_READ_REG((hw), regname);	\
   1607 		(stats)->evname.ev_count += (evname);		\
   1608 	} while (/*CONSTCOND*/0)
   1609 
   1610 	READ_COPY_SET(hw, stats, IXGBE_CRCERRS, crcerrs);
   1611 	READ_COPY_SET(hw, stats, IXGBE_ILLERRC, illerrc);
   1612 
   1613 	stats->errbc.ev_count += IXGBE_READ_REG(hw, IXGBE_ERRBC);
   1614 	stats->mspdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MSPDC);
   1615 	if (hw->mac.type >= ixgbe_mac_X550)
   1616 		stats->mbsdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MBSDC);
   1617 
   1618 	/* 16 registers exist */
   1619 	queue_counters = min(__arraycount(stats->qprc), adapter->num_queues);
   1620 	for (i = 0; i < queue_counters; i++) {
   1621 		stats->qprc[i].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRC(i));
   1622 		stats->qptc[i].ev_count += IXGBE_READ_REG(hw, IXGBE_QPTC(i));
   1623 		if (hw->mac.type >= ixgbe_mac_82599EB) {
   1624 			stats->qprdc[i].ev_count
   1625 			    += IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
   1626 		}
   1627 	}
   1628 
   1629 	/* 8 registers exist */
   1630 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
   1631 		uint32_t mp;
   1632 
   1633 		/* MPC */
   1634 		mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
   1635 		/* global total per queue */
   1636 		stats->mpc[i].ev_count += mp;
   1637 		/* running comprehensive total for stats display */
   1638 		total_missed_rx += mp;
   1639 
   1640 		if (hw->mac.type == ixgbe_mac_82598EB)
   1641 			stats->rnbc[i].ev_count
   1642 			    += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
   1643 
   1644 		stats->pxontxc[i].ev_count
   1645 		    += IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
   1646 		stats->pxofftxc[i].ev_count
   1647 		    += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
   1648 		if (hw->mac.type >= ixgbe_mac_82599EB) {
   1649 			stats->pxonrxc[i].ev_count
   1650 			    += IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
   1651 			stats->pxoffrxc[i].ev_count
   1652 			    += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
   1653 			stats->pxon2offc[i].ev_count
   1654 			    += IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
   1655 		} else {
   1656 			stats->pxonrxc[i].ev_count
   1657 			    += IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
   1658 			stats->pxoffrxc[i].ev_count
   1659 			    += IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
   1660 		}
   1661 	}
   1662 	stats->mpctotal.ev_count += total_missed_rx;
   1663 
   1664 	/* Document says M[LR]FC are valid when link is up and 10Gbps */
   1665 	if ((adapter->link_active == LINK_STATE_UP)
   1666 	    && (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL)) {
   1667 		stats->mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC);
   1668 		stats->mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC);
   1669 	}
   1670 	READ_COPY_SET(hw, stats, IXGBE_RLEC, rlec);
   1671 
   1672 	/* Hardware workaround, gprc counts missed packets */
   1673 	stats->gprc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx;
   1674 
   1675 	lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
   1676 	stats->lxontxc.ev_count += lxon;
   1677 	lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
   1678 	stats->lxofftxc.ev_count += lxoff;
   1679 	total = lxon + lxoff;
   1680 
   1681 	if (hw->mac.type != ixgbe_mac_82598EB) {
   1682 		stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) +
   1683 		    ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32);
   1684 		stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) +
   1685 		    ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32)
   1686 		    - total * ETHER_MIN_LEN;
   1687 		stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) +
   1688 		    ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32);
   1689 		stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
   1690 		stats->lxoffrxc.ev_count
   1691 		    += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
   1692 	} else {
   1693 		stats->lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
   1694 		stats->lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
   1695 		/* 82598 only has a counter in the high register */
   1696 		stats->gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH);
   1697 		stats->gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH)
   1698 		    - total * ETHER_MIN_LEN;
   1699 		stats->tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH);
   1700 	}
   1701 
   1702 	/*
   1703 	 * Workaround: mprc hardware is incorrectly counting
   1704 	 * broadcasts, so for now we subtract those.
   1705 	 */
   1706 	bprc = IXGBE_READ_REG(hw, IXGBE_BPRC);
   1707 	stats->bprc.ev_count += bprc;
   1708 	stats->mprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPRC)
   1709 	    - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0);
   1710 
   1711 	stats->prc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC64);
   1712 	stats->prc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC127);
   1713 	stats->prc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC255);
   1714 	stats->prc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC511);
   1715 	stats->prc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1023);
   1716 	stats->prc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1522);
   1717 
   1718 	stats->gptc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPTC) - total;
   1719 	stats->mptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPTC) - total;
   1720 	stats->ptc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC64) - total;
   1721 
   1722 	READ_COPY_SET(hw, stats, IXGBE_RUC, ruc);
   1723 	READ_COPY_SET(hw, stats, IXGBE_RFC, rfc);
   1724 	READ_COPY_SET(hw, stats, IXGBE_ROC, roc);
   1725 	READ_COPY_SET(hw, stats, IXGBE_RJC, rjc);
   1726 
   1727 #undef READ_COPY_SET
   1728 
   1729 	stats->mngprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPRC);
   1730 	stats->mngpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPDC);
   1731 	stats->mngptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPTC);
   1732 	stats->tpr.ev_count += IXGBE_READ_REG(hw, IXGBE_TPR);
   1733 	stats->tpt.ev_count += IXGBE_READ_REG(hw, IXGBE_TPT);
   1734 	stats->ptc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC127);
   1735 	stats->ptc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC255);
   1736 	stats->ptc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC511);
   1737 	stats->ptc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1023);
   1738 	stats->ptc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1522);
   1739 	stats->bptc.ev_count += IXGBE_READ_REG(hw, IXGBE_BPTC);
   1740 	stats->xec.ev_count += IXGBE_READ_REG(hw, IXGBE_XEC);
   1741 	stats->fccrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCCRC);
   1742 	stats->fclast.ev_count += IXGBE_READ_REG(hw, IXGBE_FCLAST);
   1743 	/* Only read FCOE on 82599 */
   1744 	if (hw->mac.type != ixgbe_mac_82598EB) {
   1745 		stats->fcoerpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOERPDC);
   1746 		stats->fcoeprc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEPRC);
   1747 		stats->fcoeptc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEPTC);
   1748 		stats->fcoedwrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEDWRC);
   1749 		stats->fcoedwtc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCOEDWTC);
   1750 	}
   1751 
   1752 	/* Fill out the OS statistics structure */
   1753 	/*
   1754 	 * NetBSD: Don't override if_{i|o}{packets|bytes|mcasts} with
   1755 	 * adapter->stats counters. It's required to make ifconfig -z
   1756 	 * (SOICZIFDATA) work.
   1757 	 */
   1758 	ifp->if_collisions = 0;
   1759 
   1760 	/* Rx Errors */
   1761 	ifp->if_iqdrops += total_missed_rx;
   1762 
   1763 	/*
   1764 	 * Aggregate following types of errors as RX errors:
   1765 	 * - CRC error count,
   1766 	 * - illegal byte error count,
   1767 	 * - length error count,
   1768 	 * - undersized packets count,
   1769 	 * - fragmented packets count,
   1770 	 * - oversized packets count,
   1771 	 * - jabber count.
   1772 	 */
   1773 	ifp->if_ierrors +=
   1774 	    crcerrs + illerrc + rlec + ruc + rfc + roc + rjc;
   1775 } /* ixgbe_update_stats_counters */
   1776 
   1777 /************************************************************************
   1778  * ixgbe_add_hw_stats
   1779  *
   1780  *   Add sysctl variables, one per statistic, to the system.
   1781  ************************************************************************/
   1782 static void
   1783 ixgbe_add_hw_stats(struct adapter *adapter)
   1784 {
   1785 	device_t dev = adapter->dev;
   1786 	const struct sysctlnode *rnode, *cnode;
   1787 	struct sysctllog **log = &adapter->sysctllog;
   1788 	struct tx_ring *txr = adapter->tx_rings;
   1789 	struct rx_ring *rxr = adapter->rx_rings;
   1790 	struct ixgbe_hw *hw = &adapter->hw;
   1791 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
   1792 	const char *xname = device_xname(dev);
   1793 	int i;
   1794 
   1795 	/* Driver Statistics */
   1796 	evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
   1797 	    NULL, xname, "Driver tx dma soft fail EFBIG");
   1798 	evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
   1799 	    NULL, xname, "m_defrag() failed");
   1800 	evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
   1801 	    NULL, xname, "Driver tx dma hard fail EFBIG");
   1802 	evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
   1803 	    NULL, xname, "Driver tx dma hard fail EINVAL");
   1804 	evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
   1805 	    NULL, xname, "Driver tx dma hard fail other");
   1806 	evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
   1807 	    NULL, xname, "Driver tx dma soft fail EAGAIN");
   1808 	evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
   1809 	    NULL, xname, "Driver tx dma soft fail ENOMEM");
   1810 	evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
   1811 	    NULL, xname, "Watchdog timeouts");
   1812 	evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
   1813 	    NULL, xname, "TSO errors");
   1814 	evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_INTR,
   1815 	    NULL, xname, "Link MSI-X IRQ Handled");
   1816 	evcnt_attach_dynamic(&adapter->link_sicount, EVCNT_TYPE_INTR,
   1817 	    NULL, xname, "Link softint");
   1818 	evcnt_attach_dynamic(&adapter->mod_sicount, EVCNT_TYPE_INTR,
   1819 	    NULL, xname, "module softint");
   1820 	evcnt_attach_dynamic(&adapter->msf_sicount, EVCNT_TYPE_INTR,
   1821 	    NULL, xname, "multimode softint");
   1822 	evcnt_attach_dynamic(&adapter->phy_sicount, EVCNT_TYPE_INTR,
   1823 	    NULL, xname, "external PHY softint");
   1824 
   1825 	/* Max number of traffic class is 8 */
   1826 	KASSERT(IXGBE_DCB_MAX_TRAFFIC_CLASS == 8);
   1827 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
   1828 		snprintf(adapter->tcs[i].evnamebuf,
   1829 		    sizeof(adapter->tcs[i].evnamebuf), "%s tc%d",
   1830 		    xname, i);
   1831 		if (i < __arraycount(stats->mpc)) {
   1832 			evcnt_attach_dynamic(&stats->mpc[i],
   1833 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
   1834 			    "RX Missed Packet Count");
   1835 			if (hw->mac.type == ixgbe_mac_82598EB)
   1836 				evcnt_attach_dynamic(&stats->rnbc[i],
   1837 				    EVCNT_TYPE_MISC, NULL,
   1838 				    adapter->tcs[i].evnamebuf,
   1839 				    "Receive No Buffers");
   1840 		}
   1841 		if (i < __arraycount(stats->pxontxc)) {
   1842 			evcnt_attach_dynamic(&stats->pxontxc[i],
   1843 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
   1844 			    "pxontxc");
   1845 			evcnt_attach_dynamic(&stats->pxonrxc[i],
   1846 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
   1847 			    "pxonrxc");
   1848 			evcnt_attach_dynamic(&stats->pxofftxc[i],
   1849 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
   1850 			    "pxofftxc");
   1851 			evcnt_attach_dynamic(&stats->pxoffrxc[i],
   1852 			    EVCNT_TYPE_MISC, NULL, adapter->tcs[i].evnamebuf,
   1853 			    "pxoffrxc");
   1854 			if (hw->mac.type >= ixgbe_mac_82599EB)
   1855 				evcnt_attach_dynamic(&stats->pxon2offc[i],
   1856 				    EVCNT_TYPE_MISC, NULL,
   1857 				    adapter->tcs[i].evnamebuf,
   1858 			    "pxon2offc");
   1859 		}
   1860 	}
   1861 
   1862 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   1863 #ifdef LRO
   1864 		struct lro_ctrl *lro = &rxr->lro;
   1865 #endif /* LRO */
   1866 
   1867 		snprintf(adapter->queues[i].evnamebuf,
   1868 		    sizeof(adapter->queues[i].evnamebuf), "%s q%d",
   1869 		    xname, i);
   1870 		snprintf(adapter->queues[i].namebuf,
   1871 		    sizeof(adapter->queues[i].namebuf), "q%d", i);
   1872 
   1873 		if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
   1874 			aprint_error_dev(dev, "could not create sysctl root\n");
   1875 			break;
   1876 		}
   1877 
   1878 		if (sysctl_createv(log, 0, &rnode, &rnode,
   1879 		    0, CTLTYPE_NODE,
   1880 		    adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
   1881 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
   1882 			break;
   1883 
   1884 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1885 		    CTLFLAG_READWRITE, CTLTYPE_INT,
   1886 		    "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
   1887 		    ixgbe_sysctl_interrupt_rate_handler, 0,
   1888 		    (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
   1889 			break;
   1890 
   1891 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1892 		    CTLFLAG_READONLY, CTLTYPE_INT,
   1893 		    "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
   1894 		    ixgbe_sysctl_tdh_handler, 0, (void *)txr,
   1895 		    0, CTL_CREATE, CTL_EOL) != 0)
   1896 			break;
   1897 
   1898 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1899 		    CTLFLAG_READONLY, CTLTYPE_INT,
   1900 		    "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
   1901 		    ixgbe_sysctl_tdt_handler, 0, (void *)txr,
   1902 		    0, CTL_CREATE, CTL_EOL) != 0)
   1903 			break;
   1904 
   1905 		evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
   1906 		    NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
   1907 		evcnt_attach_dynamic(&adapter->queues[i].handleq,
   1908 		    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
   1909 		    "Handled queue in softint");
   1910 		evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
   1911 		    NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
   1912 		evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
   1913 		    NULL, adapter->queues[i].evnamebuf, "TSO");
   1914 		evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
   1915 		    NULL, adapter->queues[i].evnamebuf,
   1916 		    "TX Queue No Descriptor Available");
   1917 		evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
   1918 		    NULL, adapter->queues[i].evnamebuf,
   1919 		    "Queue Packets Transmitted");
   1920 #ifndef IXGBE_LEGACY_TX
   1921 		evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
   1922 		    NULL, adapter->queues[i].evnamebuf,
   1923 		    "Packets dropped in pcq");
   1924 #endif
   1925 
   1926 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1927 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxck",
   1928 		    SYSCTL_DESCR("Receive Descriptor next to check"),
   1929 		    ixgbe_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
   1930 		    CTL_CREATE, CTL_EOL) != 0)
   1931 			break;
   1932 
   1933 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1934 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_nxrf",
   1935 		    SYSCTL_DESCR("Receive Descriptor next to refresh"),
   1936 		    ixgbe_sysctl_next_to_refresh_handler, 0, (void *)rxr, 0,
   1937 		    CTL_CREATE, CTL_EOL) != 0)
   1938 			break;
   1939 
   1940 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1941 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_head",
   1942 		    SYSCTL_DESCR("Receive Descriptor Head"),
   1943 		    ixgbe_sysctl_rdh_handler, 0, (void *)rxr, 0,
   1944 		    CTL_CREATE, CTL_EOL) != 0)
   1945 			break;
   1946 
   1947 		if (sysctl_createv(log, 0, &rnode, &cnode,
   1948 		    CTLFLAG_READONLY, CTLTYPE_INT, "rxd_tail",
   1949 		    SYSCTL_DESCR("Receive Descriptor Tail"),
   1950 		    ixgbe_sysctl_rdt_handler, 0, (void *)rxr, 0,
   1951 		    CTL_CREATE, CTL_EOL) != 0)
   1952 			break;
   1953 
   1954 		if (i < __arraycount(stats->qprc)) {
   1955 			evcnt_attach_dynamic(&stats->qprc[i], EVCNT_TYPE_MISC,
   1956 			    NULL, adapter->queues[i].evnamebuf, "qprc");
   1957 			evcnt_attach_dynamic(&stats->qptc[i], EVCNT_TYPE_MISC,
   1958 			    NULL, adapter->queues[i].evnamebuf, "qptc");
   1959 			evcnt_attach_dynamic(&stats->qbrc[i], EVCNT_TYPE_MISC,
   1960 			    NULL, adapter->queues[i].evnamebuf, "qbrc");
   1961 			evcnt_attach_dynamic(&stats->qbtc[i], EVCNT_TYPE_MISC,
   1962 			    NULL, adapter->queues[i].evnamebuf, "qbtc");
   1963 			if (hw->mac.type >= ixgbe_mac_82599EB)
   1964 				evcnt_attach_dynamic(&stats->qprdc[i],
   1965 				    EVCNT_TYPE_MISC, NULL,
   1966 				    adapter->queues[i].evnamebuf, "qprdc");
   1967 		}
   1968 
   1969 		evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
   1970 		    NULL, adapter->queues[i].evnamebuf,
   1971 		    "Queue Packets Received");
   1972 		evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
   1973 		    NULL, adapter->queues[i].evnamebuf,
   1974 		    "Queue Bytes Received");
   1975 		evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
   1976 		    NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
   1977 		evcnt_attach_dynamic(&rxr->no_mbuf, EVCNT_TYPE_MISC,
   1978 		    NULL, adapter->queues[i].evnamebuf, "Rx no mbuf");
   1979 		evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
   1980 		    NULL, adapter->queues[i].evnamebuf, "Rx discarded");
   1981 #ifdef LRO
   1982 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
   1983 				CTLFLAG_RD, &lro->lro_queued, 0,
   1984 				"LRO Queued");
   1985 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
   1986 				CTLFLAG_RD, &lro->lro_flushed, 0,
   1987 				"LRO Flushed");
   1988 #endif /* LRO */
   1989 	}
   1990 
   1991 	/* MAC stats get their own sub node */
   1992 
   1993 	snprintf(stats->namebuf,
   1994 	    sizeof(stats->namebuf), "%s MAC Statistics", xname);
   1995 
   1996 	evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
   1997 	    stats->namebuf, "rx csum offload - IP");
   1998 	evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
   1999 	    stats->namebuf, "rx csum offload - L4");
   2000 	evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
   2001 	    stats->namebuf, "rx csum offload - IP bad");
   2002 	evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
   2003 	    stats->namebuf, "rx csum offload - L4 bad");
   2004 	evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL,
   2005 	    stats->namebuf, "Interrupt conditions zero");
   2006 	evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL,
   2007 	    stats->namebuf, "Legacy interrupts");
   2008 
   2009 	evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL,
   2010 	    stats->namebuf, "CRC Errors");
   2011 	evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL,
   2012 	    stats->namebuf, "Illegal Byte Errors");
   2013 	evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL,
   2014 	    stats->namebuf, "Byte Errors");
   2015 	evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL,
   2016 	    stats->namebuf, "MAC Short Packets Discarded");
   2017 	if (hw->mac.type >= ixgbe_mac_X550)
   2018 		evcnt_attach_dynamic(&stats->mbsdc, EVCNT_TYPE_MISC, NULL,
   2019 		    stats->namebuf, "Bad SFD");
   2020 	evcnt_attach_dynamic(&stats->mpctotal, EVCNT_TYPE_MISC, NULL,
   2021 	    stats->namebuf, "Total Packets Missed");
   2022 	evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL,
   2023 	    stats->namebuf, "MAC Local Faults");
   2024 	evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL,
   2025 	    stats->namebuf, "MAC Remote Faults");
   2026 	evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL,
   2027 	    stats->namebuf, "Receive Length Errors");
   2028 	evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL,
   2029 	    stats->namebuf, "Link XON Transmitted");
   2030 	evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL,
   2031 	    stats->namebuf, "Link XON Received");
   2032 	evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL,
   2033 	    stats->namebuf, "Link XOFF Transmitted");
   2034 	evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL,
   2035 	    stats->namebuf, "Link XOFF Received");
   2036 
   2037 	/* Packet Reception Stats */
   2038 	evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL,
   2039 	    stats->namebuf, "Total Octets Received");
   2040 	evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL,
   2041 	    stats->namebuf, "Good Octets Received");
   2042 	evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL,
   2043 	    stats->namebuf, "Total Packets Received");
   2044 	evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL,
   2045 	    stats->namebuf, "Good Packets Received");
   2046 	evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL,
   2047 	    stats->namebuf, "Multicast Packets Received");
   2048 	evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL,
   2049 	    stats->namebuf, "Broadcast Packets Received");
   2050 	evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL,
   2051 	    stats->namebuf, "64 byte frames received ");
   2052 	evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL,
   2053 	    stats->namebuf, "65-127 byte frames received");
   2054 	evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL,
   2055 	    stats->namebuf, "128-255 byte frames received");
   2056 	evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL,
   2057 	    stats->namebuf, "256-511 byte frames received");
   2058 	evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL,
   2059 	    stats->namebuf, "512-1023 byte frames received");
   2060 	evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL,
   2061 	    stats->namebuf, "1023-1522 byte frames received");
   2062 	evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL,
   2063 	    stats->namebuf, "Receive Undersized");
   2064 	evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL,
   2065 	    stats->namebuf, "Fragmented Packets Received ");
   2066 	evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL,
   2067 	    stats->namebuf, "Oversized Packets Received");
   2068 	evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL,
   2069 	    stats->namebuf, "Received Jabber");
   2070 	evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL,
   2071 	    stats->namebuf, "Management Packets Received");
   2072 	evcnt_attach_dynamic(&stats->mngpdc, EVCNT_TYPE_MISC, NULL,
   2073 	    stats->namebuf, "Management Packets Dropped");
   2074 	evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL,
   2075 	    stats->namebuf, "Checksum Errors");
   2076 
   2077 	/* Packet Transmission Stats */
   2078 	evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL,
   2079 	    stats->namebuf, "Good Octets Transmitted");
   2080 	evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL,
   2081 	    stats->namebuf, "Total Packets Transmitted");
   2082 	evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL,
   2083 	    stats->namebuf, "Good Packets Transmitted");
   2084 	evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL,
   2085 	    stats->namebuf, "Broadcast Packets Transmitted");
   2086 	evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL,
   2087 	    stats->namebuf, "Multicast Packets Transmitted");
   2088 	evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL,
   2089 	    stats->namebuf, "Management Packets Transmitted");
   2090 	evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL,
   2091 	    stats->namebuf, "64 byte frames transmitted ");
   2092 	evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL,
   2093 	    stats->namebuf, "65-127 byte frames transmitted");
   2094 	evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL,
   2095 	    stats->namebuf, "128-255 byte frames transmitted");
   2096 	evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL,
   2097 	    stats->namebuf, "256-511 byte frames transmitted");
   2098 	evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL,
   2099 	    stats->namebuf, "512-1023 byte frames transmitted");
   2100 	evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL,
   2101 	    stats->namebuf, "1024-1522 byte frames transmitted");
   2102 } /* ixgbe_add_hw_stats */
   2103 
   2104 static void
   2105 ixgbe_clear_evcnt(struct adapter *adapter)
   2106 {
   2107 	struct tx_ring *txr = adapter->tx_rings;
   2108 	struct rx_ring *rxr = adapter->rx_rings;
   2109 	struct ixgbe_hw *hw = &adapter->hw;
   2110 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
   2111 	int i;
   2112 
   2113 	adapter->efbig_tx_dma_setup.ev_count = 0;
   2114 	adapter->mbuf_defrag_failed.ev_count = 0;
   2115 	adapter->efbig2_tx_dma_setup.ev_count = 0;
   2116 	adapter->einval_tx_dma_setup.ev_count = 0;
   2117 	adapter->other_tx_dma_setup.ev_count = 0;
   2118 	adapter->eagain_tx_dma_setup.ev_count = 0;
   2119 	adapter->enomem_tx_dma_setup.ev_count = 0;
   2120 	adapter->tso_err.ev_count = 0;
   2121 	adapter->watchdog_events.ev_count = 0;
   2122 	adapter->link_irq.ev_count = 0;
   2123 	adapter->link_sicount.ev_count = 0;
   2124 	adapter->mod_sicount.ev_count = 0;
   2125 	adapter->msf_sicount.ev_count = 0;
   2126 	adapter->phy_sicount.ev_count = 0;
   2127 
   2128 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
   2129 		if (i < __arraycount(stats->mpc)) {
   2130 			stats->mpc[i].ev_count = 0;
   2131 			if (hw->mac.type == ixgbe_mac_82598EB)
   2132 				stats->rnbc[i].ev_count = 0;
   2133 		}
   2134 		if (i < __arraycount(stats->pxontxc)) {
   2135 			stats->pxontxc[i].ev_count = 0;
   2136 			stats->pxonrxc[i].ev_count = 0;
   2137 			stats->pxofftxc[i].ev_count = 0;
   2138 			stats->pxoffrxc[i].ev_count = 0;
   2139 			if (hw->mac.type >= ixgbe_mac_82599EB)
   2140 				stats->pxon2offc[i].ev_count = 0;
   2141 		}
   2142 	}
   2143 
   2144 	txr = adapter->tx_rings;
   2145 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   2146 		adapter->queues[i].irqs.ev_count = 0;
   2147 		adapter->queues[i].handleq.ev_count = 0;
   2148 		adapter->queues[i].req.ev_count = 0;
   2149 		txr->no_desc_avail.ev_count = 0;
   2150 		txr->total_packets.ev_count = 0;
   2151 		txr->tso_tx.ev_count = 0;
   2152 #ifndef IXGBE_LEGACY_TX
   2153 		txr->pcq_drops.ev_count = 0;
   2154 #endif
   2155 		txr->q_efbig_tx_dma_setup = 0;
   2156 		txr->q_mbuf_defrag_failed = 0;
   2157 		txr->q_efbig2_tx_dma_setup = 0;
   2158 		txr->q_einval_tx_dma_setup = 0;
   2159 		txr->q_other_tx_dma_setup = 0;
   2160 		txr->q_eagain_tx_dma_setup = 0;
   2161 		txr->q_enomem_tx_dma_setup = 0;
   2162 		txr->q_tso_err = 0;
   2163 
   2164 		if (i < __arraycount(stats->qprc)) {
   2165 			stats->qprc[i].ev_count = 0;
   2166 			stats->qptc[i].ev_count = 0;
   2167 			stats->qbrc[i].ev_count = 0;
   2168 			stats->qbtc[i].ev_count = 0;
   2169 			if (hw->mac.type >= ixgbe_mac_82599EB)
   2170 				stats->qprdc[i].ev_count = 0;
   2171 		}
   2172 
   2173 		rxr->rx_packets.ev_count = 0;
   2174 		rxr->rx_bytes.ev_count = 0;
   2175 		rxr->rx_copies.ev_count = 0;
   2176 		rxr->no_mbuf.ev_count = 0;
   2177 		rxr->rx_discarded.ev_count = 0;
   2178 	}
   2179 	stats->ipcs.ev_count = 0;
   2180 	stats->l4cs.ev_count = 0;
   2181 	stats->ipcs_bad.ev_count = 0;
   2182 	stats->l4cs_bad.ev_count = 0;
   2183 	stats->intzero.ev_count = 0;
   2184 	stats->legint.ev_count = 0;
   2185 	stats->crcerrs.ev_count = 0;
   2186 	stats->illerrc.ev_count = 0;
   2187 	stats->errbc.ev_count = 0;
   2188 	stats->mspdc.ev_count = 0;
   2189 	if (hw->mac.type >= ixgbe_mac_X550)
   2190 		stats->mbsdc.ev_count = 0;
   2191 	stats->mpctotal.ev_count = 0;
   2192 	stats->mlfc.ev_count = 0;
   2193 	stats->mrfc.ev_count = 0;
   2194 	stats->rlec.ev_count = 0;
   2195 	stats->lxontxc.ev_count = 0;
   2196 	stats->lxonrxc.ev_count = 0;
   2197 	stats->lxofftxc.ev_count = 0;
   2198 	stats->lxoffrxc.ev_count = 0;
   2199 
   2200 	/* Packet Reception Stats */
   2201 	stats->tor.ev_count = 0;
   2202 	stats->gorc.ev_count = 0;
   2203 	stats->tpr.ev_count = 0;
   2204 	stats->gprc.ev_count = 0;
   2205 	stats->mprc.ev_count = 0;
   2206 	stats->bprc.ev_count = 0;
   2207 	stats->prc64.ev_count = 0;
   2208 	stats->prc127.ev_count = 0;
   2209 	stats->prc255.ev_count = 0;
   2210 	stats->prc511.ev_count = 0;
   2211 	stats->prc1023.ev_count = 0;
   2212 	stats->prc1522.ev_count = 0;
   2213 	stats->ruc.ev_count = 0;
   2214 	stats->rfc.ev_count = 0;
   2215 	stats->roc.ev_count = 0;
   2216 	stats->rjc.ev_count = 0;
   2217 	stats->mngprc.ev_count = 0;
   2218 	stats->mngpdc.ev_count = 0;
   2219 	stats->xec.ev_count = 0;
   2220 
   2221 	/* Packet Transmission Stats */
   2222 	stats->gotc.ev_count = 0;
   2223 	stats->tpt.ev_count = 0;
   2224 	stats->gptc.ev_count = 0;
   2225 	stats->bptc.ev_count = 0;
   2226 	stats->mptc.ev_count = 0;
   2227 	stats->mngptc.ev_count = 0;
   2228 	stats->ptc64.ev_count = 0;
   2229 	stats->ptc127.ev_count = 0;
   2230 	stats->ptc255.ev_count = 0;
   2231 	stats->ptc511.ev_count = 0;
   2232 	stats->ptc1023.ev_count = 0;
   2233 	stats->ptc1522.ev_count = 0;
   2234 }
   2235 
   2236 /************************************************************************
   2237  * ixgbe_sysctl_tdh_handler - Transmit Descriptor Head handler function
   2238  *
   2239  *   Retrieves the TDH value from the hardware
   2240  ************************************************************************/
   2241 static int
   2242 ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS)
   2243 {
   2244 	struct sysctlnode node = *rnode;
   2245 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
   2246 	struct adapter *adapter;
   2247 	uint32_t val;
   2248 
   2249 	if (!txr)
   2250 		return (0);
   2251 
   2252 	adapter = txr->adapter;
   2253 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2254 		return (EPERM);
   2255 
   2256 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me));
   2257 	node.sysctl_data = &val;
   2258 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2259 } /* ixgbe_sysctl_tdh_handler */
   2260 
   2261 /************************************************************************
   2262  * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
   2263  *
   2264  *   Retrieves the TDT value from the hardware
   2265  ************************************************************************/
   2266 static int
   2267 ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS)
   2268 {
   2269 	struct sysctlnode node = *rnode;
   2270 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
   2271 	struct adapter *adapter;
   2272 	uint32_t val;
   2273 
   2274 	if (!txr)
   2275 		return (0);
   2276 
   2277 	adapter = txr->adapter;
   2278 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2279 		return (EPERM);
   2280 
   2281 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me));
   2282 	node.sysctl_data = &val;
   2283 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2284 } /* ixgbe_sysctl_tdt_handler */
   2285 
   2286 /************************************************************************
   2287  * ixgbe_sysctl_next_to_check_handler - Receive Descriptor next to check
   2288  * handler function
   2289  *
   2290  *   Retrieves the next_to_check value
   2291  ************************************************************************/
   2292 static int
   2293 ixgbe_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
   2294 {
   2295 	struct sysctlnode node = *rnode;
   2296 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   2297 	struct adapter *adapter;
   2298 	uint32_t val;
   2299 
   2300 	if (!rxr)
   2301 		return (0);
   2302 
   2303 	adapter = rxr->adapter;
   2304 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2305 		return (EPERM);
   2306 
   2307 	val = rxr->next_to_check;
   2308 	node.sysctl_data = &val;
   2309 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2310 } /* ixgbe_sysctl_next_to_check_handler */
   2311 
   2312 /************************************************************************
   2313  * ixgbe_sysctl_next_to_refresh_handler - Receive Descriptor next to check
   2314  * handler function
   2315  *
   2316  *   Retrieves the next_to_refresh value
   2317  ************************************************************************/
   2318 static int
   2319 ixgbe_sysctl_next_to_refresh_handler(SYSCTLFN_ARGS)
   2320 {
   2321 	struct sysctlnode node = *rnode;
   2322 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   2323 	struct adapter *adapter;
   2324 	uint32_t val;
   2325 
   2326 	if (!rxr)
   2327 		return (0);
   2328 
   2329 	adapter = rxr->adapter;
   2330 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2331 		return (EPERM);
   2332 
   2333 	val = rxr->next_to_refresh;
   2334 	node.sysctl_data = &val;
   2335 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2336 } /* ixgbe_sysctl_next_to_refresh_handler */
   2337 
   2338 /************************************************************************
   2339  * ixgbe_sysctl_rdh_handler - Receive Descriptor Head handler function
   2340  *
   2341  *   Retrieves the RDH value from the hardware
   2342  ************************************************************************/
   2343 static int
   2344 ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS)
   2345 {
   2346 	struct sysctlnode node = *rnode;
   2347 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   2348 	struct adapter *adapter;
   2349 	uint32_t val;
   2350 
   2351 	if (!rxr)
   2352 		return (0);
   2353 
   2354 	adapter = rxr->adapter;
   2355 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2356 		return (EPERM);
   2357 
   2358 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDH(rxr->me));
   2359 	node.sysctl_data = &val;
   2360 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2361 } /* ixgbe_sysctl_rdh_handler */
   2362 
   2363 /************************************************************************
   2364  * ixgbe_sysctl_rdt_handler - Receive Descriptor Tail handler function
   2365  *
   2366  *   Retrieves the RDT value from the hardware
   2367  ************************************************************************/
   2368 static int
   2369 ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS)
   2370 {
   2371 	struct sysctlnode node = *rnode;
   2372 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   2373 	struct adapter *adapter;
   2374 	uint32_t val;
   2375 
   2376 	if (!rxr)
   2377 		return (0);
   2378 
   2379 	adapter = rxr->adapter;
   2380 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   2381 		return (EPERM);
   2382 
   2383 	val = IXGBE_READ_REG(&adapter->hw, IXGBE_RDT(rxr->me));
   2384 	node.sysctl_data = &val;
   2385 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2386 } /* ixgbe_sysctl_rdt_handler */
   2387 
   2388 #if 0	/* XXX Badly need to overhaul vlan(4) on NetBSD. */
   2389 /************************************************************************
   2390  * ixgbe_register_vlan
   2391  *
   2392  *   Run via vlan config EVENT, it enables us to use the
   2393  *   HW Filter table since we can get the vlan id. This
   2394  *   just creates the entry in the soft version of the
   2395  *   VFTA, init will repopulate the real table.
   2396  ************************************************************************/
   2397 static void
   2398 ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag)
   2399 {
   2400 	struct adapter	*adapter = ifp->if_softc;
   2401 	u16		index, bit;
   2402 
   2403 	if (ifp->if_softc != arg)   /* Not our event */
   2404 		return;
   2405 
   2406 	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
   2407 		return;
   2408 
   2409 	IXGBE_CORE_LOCK(adapter);
   2410 	index = (vtag >> 5) & 0x7F;
   2411 	bit = vtag & 0x1F;
   2412 	adapter->shadow_vfta[index] |= ((u32)1 << bit);
   2413 	ixgbe_setup_vlan_hw_support(adapter);
   2414 	IXGBE_CORE_UNLOCK(adapter);
   2415 } /* ixgbe_register_vlan */
   2416 
   2417 /************************************************************************
   2418  * ixgbe_unregister_vlan
   2419  *
   2420  *   Run via vlan unconfig EVENT, remove our entry in the soft vfta.
   2421  ************************************************************************/
   2422 static void
   2423 ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag)
   2424 {
   2425 	struct adapter	*adapter = ifp->if_softc;
   2426 	u16		index, bit;
   2427 
   2428 	if (ifp->if_softc != arg)
   2429 		return;
   2430 
   2431 	if ((vtag == 0) || (vtag > 4095))	/* Invalid */
   2432 		return;
   2433 
   2434 	IXGBE_CORE_LOCK(adapter);
   2435 	index = (vtag >> 5) & 0x7F;
   2436 	bit = vtag & 0x1F;
   2437 	adapter->shadow_vfta[index] &= ~((u32)1 << bit);
   2438 	/* Re-init to load the changes */
   2439 	ixgbe_setup_vlan_hw_support(adapter);
   2440 	IXGBE_CORE_UNLOCK(adapter);
   2441 } /* ixgbe_unregister_vlan */
   2442 #endif
   2443 
   2444 static void
   2445 ixgbe_setup_vlan_hw_support(struct adapter *adapter)
   2446 {
   2447 	struct ethercom *ec = &adapter->osdep.ec;
   2448 	struct ixgbe_hw *hw = &adapter->hw;
   2449 	struct rx_ring	*rxr;
   2450 	int		i;
   2451 	u32		ctrl;
   2452 	bool		hwtagging;
   2453 
   2454 	/*
   2455 	 *  This function is called from both if_init and ifflags_cb()
   2456 	 * on NetBSD.
   2457 	 */
   2458 
   2459 	/* Enable HW tagging only if any vlan is attached */
   2460 	hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
   2461 	    && VLAN_ATTACHED(ec);
   2462 
   2463 	/* Setup the queues for vlans */
   2464 	for (i = 0; i < adapter->num_queues; i++) {
   2465 		rxr = &adapter->rx_rings[i];
   2466 		/*
   2467 		 * On 82599 and later, the VLAN enable is per/queue in RXDCTL.
   2468 		 */
   2469 		if (hw->mac.type != ixgbe_mac_82598EB) {
   2470 			ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
   2471 			if (hwtagging)
   2472 				ctrl |= IXGBE_RXDCTL_VME;
   2473 			else
   2474 				ctrl &= ~IXGBE_RXDCTL_VME;
   2475 			IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), ctrl);
   2476 		}
   2477 		rxr->vtag_strip = hwtagging ? TRUE : FALSE;
   2478 	}
   2479 
   2480 	/*
   2481 	 * A soft reset zero's out the VFTA, so
   2482 	 * we need to repopulate it now.
   2483 	 */
   2484 	for (i = 0; i < IXGBE_VFTA_SIZE; i++)
   2485 		if (adapter->shadow_vfta[i] != 0)
   2486 			IXGBE_WRITE_REG(hw, IXGBE_VFTA(i),
   2487 			    adapter->shadow_vfta[i]);
   2488 
   2489 	ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL);
   2490 	/* Enable the Filter Table if enabled */
   2491 	if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER)
   2492 		ctrl |= IXGBE_VLNCTRL_VFE;
   2493 	else
   2494 		ctrl &= ~IXGBE_VLNCTRL_VFE;
   2495 	/* VLAN hw tagging for 82598 */
   2496 	if (hw->mac.type == ixgbe_mac_82598EB) {
   2497 		if (hwtagging)
   2498 			ctrl |= IXGBE_VLNCTRL_VME;
   2499 		else
   2500 			ctrl &= ~IXGBE_VLNCTRL_VME;
   2501 	}
   2502 	IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl);
   2503 } /* ixgbe_setup_vlan_hw_support */
   2504 
   2505 /************************************************************************
   2506  * ixgbe_get_slot_info
   2507  *
   2508  *   Get the width and transaction speed of
   2509  *   the slot this adapter is plugged into.
   2510  ************************************************************************/
   2511 static void
   2512 ixgbe_get_slot_info(struct adapter *adapter)
   2513 {
   2514 	device_t		dev = adapter->dev;
   2515 	struct ixgbe_hw		*hw = &adapter->hw;
   2516 	u32		      offset;
   2517 	u16			link;
   2518 	int		      bus_info_valid = TRUE;
   2519 
   2520 	/* Some devices are behind an internal bridge */
   2521 	switch (hw->device_id) {
   2522 	case IXGBE_DEV_ID_82599_SFP_SF_QP:
   2523 	case IXGBE_DEV_ID_82599_QSFP_SF_QP:
   2524 		goto get_parent_info;
   2525 	default:
   2526 		break;
   2527 	}
   2528 
   2529 	ixgbe_get_bus_info(hw);
   2530 
   2531 	/*
   2532 	 * Some devices don't use PCI-E, but there is no need
   2533 	 * to display "Unknown" for bus speed and width.
   2534 	 */
   2535 	switch (hw->mac.type) {
   2536 	case ixgbe_mac_X550EM_x:
   2537 	case ixgbe_mac_X550EM_a:
   2538 		return;
   2539 	default:
   2540 		goto display;
   2541 	}
   2542 
   2543 get_parent_info:
   2544 	/*
   2545 	 * For the Quad port adapter we need to parse back
   2546 	 * up the PCI tree to find the speed of the expansion
   2547 	 * slot into which this adapter is plugged. A bit more work.
   2548 	 */
   2549 	dev = device_parent(device_parent(dev));
   2550 #if 0
   2551 #ifdef IXGBE_DEBUG
   2552 	device_printf(dev, "parent pcib = %x,%x,%x\n", pci_get_bus(dev),
   2553 	    pci_get_slot(dev), pci_get_function(dev));
   2554 #endif
   2555 	dev = device_parent(device_parent(dev));
   2556 #ifdef IXGBE_DEBUG
   2557 	device_printf(dev, "slot pcib = %x,%x,%x\n", pci_get_bus(dev),
   2558 	    pci_get_slot(dev), pci_get_function(dev));
   2559 #endif
   2560 #endif
   2561 	/* Now get the PCI Express Capabilities offset */
   2562 	if (pci_get_capability(adapter->osdep.pc, adapter->osdep.tag,
   2563 	    PCI_CAP_PCIEXPRESS, &offset, NULL)) {
   2564 		/*
   2565 		 * Hmm...can't get PCI-Express capabilities.
   2566 		 * Falling back to default method.
   2567 		 */
   2568 		bus_info_valid = FALSE;
   2569 		ixgbe_get_bus_info(hw);
   2570 		goto display;
   2571 	}
   2572 	/* ...and read the Link Status Register */
   2573 	link = pci_conf_read(adapter->osdep.pc, adapter->osdep.tag,
   2574 	    offset + PCIE_LCSR) >> 16;
   2575 	ixgbe_set_pci_config_data_generic(hw, link);
   2576 
   2577 display:
   2578 	device_printf(dev, "PCI Express Bus: Speed %s Width %s\n",
   2579 	    ((hw->bus.speed == ixgbe_bus_speed_8000)	? "8.0GT/s" :
   2580 	     (hw->bus.speed == ixgbe_bus_speed_5000)	? "5.0GT/s" :
   2581 	     (hw->bus.speed == ixgbe_bus_speed_2500)	? "2.5GT/s" :
   2582 	     "Unknown"),
   2583 	    ((hw->bus.width == ixgbe_bus_width_pcie_x8) ? "x8" :
   2584 	     (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "x4" :
   2585 	     (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "x1" :
   2586 	     "Unknown"));
   2587 
   2588 	if (bus_info_valid) {
   2589 		if ((hw->device_id != IXGBE_DEV_ID_82599_SFP_SF_QP) &&
   2590 		    ((hw->bus.width <= ixgbe_bus_width_pcie_x4) &&
   2591 			(hw->bus.speed == ixgbe_bus_speed_2500))) {
   2592 			device_printf(dev, "PCI-Express bandwidth available"
   2593 			    " for this card\n     is not sufficient for"
   2594 			    " optimal performance.\n");
   2595 			device_printf(dev, "For optimal performance a x8 "
   2596 			    "PCIE, or x4 PCIE Gen2 slot is required.\n");
   2597 		}
   2598 		if ((hw->device_id == IXGBE_DEV_ID_82599_SFP_SF_QP) &&
   2599 		    ((hw->bus.width <= ixgbe_bus_width_pcie_x8) &&
   2600 			(hw->bus.speed < ixgbe_bus_speed_8000))) {
   2601 			device_printf(dev, "PCI-Express bandwidth available"
   2602 			    " for this card\n     is not sufficient for"
   2603 			    " optimal performance.\n");
   2604 			device_printf(dev, "For optimal performance a x8 "
   2605 			    "PCIE Gen3 slot is required.\n");
   2606 		}
   2607 	} else
   2608 		device_printf(dev, "Unable to determine slot speed/width. The speed/width reported are that of the internal switch.\n");
   2609 
   2610 	return;
   2611 } /* ixgbe_get_slot_info */
   2612 
   2613 /************************************************************************
   2614  * ixgbe_enable_queue - MSI-X Interrupt Handlers and Tasklets
   2615  ************************************************************************/
   2616 static inline void
   2617 ixgbe_enable_queue(struct adapter *adapter, u32 vector)
   2618 {
   2619 	struct ixgbe_hw *hw = &adapter->hw;
   2620 	struct ix_queue *que = &adapter->queues[vector];
   2621 	u64		queue = 1ULL << vector;
   2622 	u32		mask;
   2623 
   2624 	mutex_enter(&que->dc_mtx);
   2625 	if (que->disabled_count > 0 && --que->disabled_count > 0)
   2626 		goto out;
   2627 
   2628 	if (hw->mac.type == ixgbe_mac_82598EB) {
   2629 		mask = (IXGBE_EIMS_RTX_QUEUE & queue);
   2630 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
   2631 	} else {
   2632 		mask = (queue & 0xFFFFFFFF);
   2633 		if (mask)
   2634 			IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask);
   2635 		mask = (queue >> 32);
   2636 		if (mask)
   2637 			IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask);
   2638 	}
   2639 out:
   2640 	mutex_exit(&que->dc_mtx);
   2641 } /* ixgbe_enable_queue */
   2642 
   2643 /************************************************************************
   2644  * ixgbe_disable_queue_internal
   2645  ************************************************************************/
   2646 static inline void
   2647 ixgbe_disable_queue_internal(struct adapter *adapter, u32 vector, bool nestok)
   2648 {
   2649 	struct ixgbe_hw *hw = &adapter->hw;
   2650 	struct ix_queue *que = &adapter->queues[vector];
   2651 	u64		queue = 1ULL << vector;
   2652 	u32		mask;
   2653 
   2654 	mutex_enter(&que->dc_mtx);
   2655 
   2656 	if (que->disabled_count > 0) {
   2657 		if (nestok)
   2658 			que->disabled_count++;
   2659 		goto out;
   2660 	}
   2661 	que->disabled_count++;
   2662 
   2663 	if (hw->mac.type == ixgbe_mac_82598EB) {
   2664 		mask = (IXGBE_EIMS_RTX_QUEUE & queue);
   2665 		IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask);
   2666 	} else {
   2667 		mask = (queue & 0xFFFFFFFF);
   2668 		if (mask)
   2669 			IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask);
   2670 		mask = (queue >> 32);
   2671 		if (mask)
   2672 			IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask);
   2673 	}
   2674 out:
   2675 	mutex_exit(&que->dc_mtx);
   2676 } /* ixgbe_disable_queue_internal */
   2677 
   2678 /************************************************************************
   2679  * ixgbe_disable_queue
   2680  ************************************************************************/
   2681 static inline void
   2682 ixgbe_disable_queue(struct adapter *adapter, u32 vector)
   2683 {
   2684 
   2685 	ixgbe_disable_queue_internal(adapter, vector, true);
   2686 } /* ixgbe_disable_queue */
   2687 
   2688 /************************************************************************
   2689  * ixgbe_sched_handle_que - schedule deferred packet processing
   2690  ************************************************************************/
   2691 static inline void
   2692 ixgbe_sched_handle_que(struct adapter *adapter, struct ix_queue *que)
   2693 {
   2694 
   2695 	if (que->txrx_use_workqueue) {
   2696 		/*
   2697 		 * adapter->que_wq is bound to each CPU instead of
   2698 		 * each NIC queue to reduce workqueue kthread. As we
   2699 		 * should consider about interrupt affinity in this
   2700 		 * function, the workqueue kthread must be WQ_PERCPU.
   2701 		 * If create WQ_PERCPU workqueue kthread for each NIC
   2702 		 * queue, that number of created workqueue kthread is
   2703 		 * (number of used NIC queue) * (number of CPUs) =
   2704 		 * (number of CPUs) ^ 2 most often.
   2705 		 *
   2706 		 * The same NIC queue's interrupts are avoided by
   2707 		 * masking the queue's interrupt. And different
   2708 		 * NIC queue's interrupts use different struct work
   2709 		 * (que->wq_cookie). So, "enqueued flag" to avoid
   2710 		 * twice workqueue_enqueue() is not required .
   2711 		 */
   2712 		workqueue_enqueue(adapter->que_wq, &que->wq_cookie, curcpu());
   2713 	} else {
   2714 		softint_schedule(que->que_si);
   2715 	}
   2716 }
   2717 
   2718 /************************************************************************
   2719  * ixgbe_msix_que - MSI-X Queue Interrupt Service routine
   2720  ************************************************************************/
   2721 static int
   2722 ixgbe_msix_que(void *arg)
   2723 {
   2724 	struct ix_queue	*que = arg;
   2725 	struct adapter	*adapter = que->adapter;
   2726 	struct ifnet	*ifp = adapter->ifp;
   2727 	struct tx_ring	*txr = que->txr;
   2728 	struct rx_ring	*rxr = que->rxr;
   2729 	bool		more;
   2730 	u32		newitr = 0;
   2731 
   2732 	/* Protect against spurious interrupts */
   2733 	if ((ifp->if_flags & IFF_RUNNING) == 0)
   2734 		return 0;
   2735 
   2736 	ixgbe_disable_queue(adapter, que->msix);
   2737 	++que->irqs.ev_count;
   2738 
   2739 	/*
   2740 	 * Don't change "que->txrx_use_workqueue" from this point to avoid
   2741 	 * flip-flopping softint/workqueue mode in one deferred processing.
   2742 	 */
   2743 	que->txrx_use_workqueue = adapter->txrx_use_workqueue;
   2744 
   2745 #ifdef __NetBSD__
   2746 	/* Don't run ixgbe_rxeof in interrupt context */
   2747 	more = true;
   2748 #else
   2749 	more = ixgbe_rxeof(que);
   2750 #endif
   2751 
   2752 	IXGBE_TX_LOCK(txr);
   2753 	ixgbe_txeof(txr);
   2754 	IXGBE_TX_UNLOCK(txr);
   2755 
   2756 	/* Do AIM now? */
   2757 
   2758 	if (adapter->enable_aim == false)
   2759 		goto no_calc;
   2760 	/*
   2761 	 * Do Adaptive Interrupt Moderation:
   2762 	 *  - Write out last calculated setting
   2763 	 *  - Calculate based on average size over
   2764 	 *    the last interval.
   2765 	 */
   2766 	if (que->eitr_setting)
   2767 		ixgbe_eitr_write(adapter, que->msix, que->eitr_setting);
   2768 
   2769 	que->eitr_setting = 0;
   2770 
   2771 	/* Idle, do nothing */
   2772 	if ((txr->bytes == 0) && (rxr->bytes == 0))
   2773 		goto no_calc;
   2774 
   2775 	if ((txr->bytes) && (txr->packets))
   2776 		newitr = txr->bytes/txr->packets;
   2777 	if ((rxr->bytes) && (rxr->packets))
   2778 		newitr = max(newitr, (rxr->bytes / rxr->packets));
   2779 	newitr += 24; /* account for hardware frame, crc */
   2780 
   2781 	/* set an upper boundary */
   2782 	newitr = min(newitr, 3000);
   2783 
   2784 	/* Be nice to the mid range */
   2785 	if ((newitr > 300) && (newitr < 1200))
   2786 		newitr = (newitr / 3);
   2787 	else
   2788 		newitr = (newitr / 2);
   2789 
   2790 	/*
   2791 	 * When RSC is used, ITR interval must be larger than RSC_DELAY.
   2792 	 * Currently, we use 2us for RSC_DELAY. The minimum value is always
   2793 	 * greater than 2us on 100M (and 10M?(not documented)), but it's not
   2794 	 * on 1G and higher.
   2795 	 */
   2796 	if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
   2797 	    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
   2798 		if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
   2799 			newitr = IXGBE_MIN_RSC_EITR_10G1G;
   2800 	}
   2801 
   2802 	/* save for next interrupt */
   2803 	que->eitr_setting = newitr;
   2804 
   2805 	/* Reset state */
   2806 	txr->bytes = 0;
   2807 	txr->packets = 0;
   2808 	rxr->bytes = 0;
   2809 	rxr->packets = 0;
   2810 
   2811 no_calc:
   2812 	if (more)
   2813 		ixgbe_sched_handle_que(adapter, que);
   2814 	else
   2815 		ixgbe_enable_queue(adapter, que->msix);
   2816 
   2817 	return 1;
   2818 } /* ixgbe_msix_que */
   2819 
   2820 /************************************************************************
   2821  * ixgbe_media_status - Media Ioctl callback
   2822  *
   2823  *   Called whenever the user queries the status of
   2824  *   the interface using ifconfig.
   2825  ************************************************************************/
   2826 static void
   2827 ixgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
   2828 {
   2829 	struct adapter *adapter = ifp->if_softc;
   2830 	struct ixgbe_hw *hw = &adapter->hw;
   2831 	int layer;
   2832 
   2833 	INIT_DEBUGOUT("ixgbe_media_status: begin");
   2834 	IXGBE_CORE_LOCK(adapter);
   2835 	ixgbe_update_link_status(adapter);
   2836 
   2837 	ifmr->ifm_status = IFM_AVALID;
   2838 	ifmr->ifm_active = IFM_ETHER;
   2839 
   2840 	if (adapter->link_active != LINK_STATE_UP) {
   2841 		ifmr->ifm_active |= IFM_NONE;
   2842 		IXGBE_CORE_UNLOCK(adapter);
   2843 		return;
   2844 	}
   2845 
   2846 	ifmr->ifm_status |= IFM_ACTIVE;
   2847 	layer = adapter->phy_layer;
   2848 
   2849 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T ||
   2850 	    layer & IXGBE_PHYSICAL_LAYER_5GBASE_T ||
   2851 	    layer & IXGBE_PHYSICAL_LAYER_2500BASE_T ||
   2852 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_T ||
   2853 	    layer & IXGBE_PHYSICAL_LAYER_100BASE_TX ||
   2854 	    layer & IXGBE_PHYSICAL_LAYER_10BASE_T)
   2855 		switch (adapter->link_speed) {
   2856 		case IXGBE_LINK_SPEED_10GB_FULL:
   2857 			ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
   2858 			break;
   2859 		case IXGBE_LINK_SPEED_5GB_FULL:
   2860 			ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
   2861 			break;
   2862 		case IXGBE_LINK_SPEED_2_5GB_FULL:
   2863 			ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
   2864 			break;
   2865 		case IXGBE_LINK_SPEED_1GB_FULL:
   2866 			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
   2867 			break;
   2868 		case IXGBE_LINK_SPEED_100_FULL:
   2869 			ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
   2870 			break;
   2871 		case IXGBE_LINK_SPEED_10_FULL:
   2872 			ifmr->ifm_active |= IFM_10_T | IFM_FDX;
   2873 			break;
   2874 		}
   2875 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
   2876 	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA)
   2877 		switch (adapter->link_speed) {
   2878 		case IXGBE_LINK_SPEED_10GB_FULL:
   2879 			ifmr->ifm_active |= IFM_10G_TWINAX | IFM_FDX;
   2880 			break;
   2881 		}
   2882 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR)
   2883 		switch (adapter->link_speed) {
   2884 		case IXGBE_LINK_SPEED_10GB_FULL:
   2885 			ifmr->ifm_active |= IFM_10G_LR | IFM_FDX;
   2886 			break;
   2887 		case IXGBE_LINK_SPEED_1GB_FULL:
   2888 			ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
   2889 			break;
   2890 		}
   2891 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LRM)
   2892 		switch (adapter->link_speed) {
   2893 		case IXGBE_LINK_SPEED_10GB_FULL:
   2894 			ifmr->ifm_active |= IFM_10G_LRM | IFM_FDX;
   2895 			break;
   2896 		case IXGBE_LINK_SPEED_1GB_FULL:
   2897 			ifmr->ifm_active |= IFM_1000_LX | IFM_FDX;
   2898 			break;
   2899 		}
   2900 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR ||
   2901 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX)
   2902 		switch (adapter->link_speed) {
   2903 		case IXGBE_LINK_SPEED_10GB_FULL:
   2904 			ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
   2905 			break;
   2906 		case IXGBE_LINK_SPEED_1GB_FULL:
   2907 			ifmr->ifm_active |= IFM_1000_SX | IFM_FDX;
   2908 			break;
   2909 		}
   2910 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4)
   2911 		switch (adapter->link_speed) {
   2912 		case IXGBE_LINK_SPEED_10GB_FULL:
   2913 			ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
   2914 			break;
   2915 		}
   2916 	/*
   2917 	 * XXX: These need to use the proper media types once
   2918 	 * they're added.
   2919 	 */
   2920 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR)
   2921 		switch (adapter->link_speed) {
   2922 		case IXGBE_LINK_SPEED_10GB_FULL:
   2923 #ifndef IFM_ETH_XTYPE
   2924 			ifmr->ifm_active |= IFM_10G_SR | IFM_FDX;
   2925 #else
   2926 			ifmr->ifm_active |= IFM_10G_KR | IFM_FDX;
   2927 #endif
   2928 			break;
   2929 		case IXGBE_LINK_SPEED_2_5GB_FULL:
   2930 			ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
   2931 			break;
   2932 		case IXGBE_LINK_SPEED_1GB_FULL:
   2933 			ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
   2934 			break;
   2935 		}
   2936 	else if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4 ||
   2937 	    layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX ||
   2938 	    layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX)
   2939 		switch (adapter->link_speed) {
   2940 		case IXGBE_LINK_SPEED_10GB_FULL:
   2941 #ifndef IFM_ETH_XTYPE
   2942 			ifmr->ifm_active |= IFM_10G_CX4 | IFM_FDX;
   2943 #else
   2944 			ifmr->ifm_active |= IFM_10G_KX4 | IFM_FDX;
   2945 #endif
   2946 			break;
   2947 		case IXGBE_LINK_SPEED_2_5GB_FULL:
   2948 			ifmr->ifm_active |= IFM_2500_KX | IFM_FDX;
   2949 			break;
   2950 		case IXGBE_LINK_SPEED_1GB_FULL:
   2951 			ifmr->ifm_active |= IFM_1000_KX | IFM_FDX;
   2952 			break;
   2953 		}
   2954 
   2955 	/* If nothing is recognized... */
   2956 #if 0
   2957 	if (IFM_SUBTYPE(ifmr->ifm_active) == 0)
   2958 		ifmr->ifm_active |= IFM_UNKNOWN;
   2959 #endif
   2960 
   2961 	ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
   2962 
   2963 	/* Display current flow control setting used on link */
   2964 	if (hw->fc.current_mode == ixgbe_fc_rx_pause ||
   2965 	    hw->fc.current_mode == ixgbe_fc_full)
   2966 		ifmr->ifm_active |= IFM_ETH_RXPAUSE;
   2967 	if (hw->fc.current_mode == ixgbe_fc_tx_pause ||
   2968 	    hw->fc.current_mode == ixgbe_fc_full)
   2969 		ifmr->ifm_active |= IFM_ETH_TXPAUSE;
   2970 
   2971 	IXGBE_CORE_UNLOCK(adapter);
   2972 
   2973 	return;
   2974 } /* ixgbe_media_status */
   2975 
   2976 /************************************************************************
   2977  * ixgbe_media_change - Media Ioctl callback
   2978  *
   2979  *   Called when the user changes speed/duplex using
   2980  *   media/mediopt option with ifconfig.
   2981  ************************************************************************/
   2982 static int
   2983 ixgbe_media_change(struct ifnet *ifp)
   2984 {
   2985 	struct adapter	 *adapter = ifp->if_softc;
   2986 	struct ifmedia	 *ifm = &adapter->media;
   2987 	struct ixgbe_hw	 *hw = &adapter->hw;
   2988 	ixgbe_link_speed speed = 0;
   2989 	ixgbe_link_speed link_caps = 0;
   2990 	bool negotiate = false;
   2991 	s32 err = IXGBE_NOT_IMPLEMENTED;
   2992 
   2993 	INIT_DEBUGOUT("ixgbe_media_change: begin");
   2994 
   2995 	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
   2996 		return (EINVAL);
   2997 
   2998 	if (hw->phy.media_type == ixgbe_media_type_backplane)
   2999 		return (EPERM);
   3000 
   3001 	IXGBE_CORE_LOCK(adapter);
   3002 	/*
   3003 	 * We don't actually need to check against the supported
   3004 	 * media types of the adapter; ifmedia will take care of
   3005 	 * that for us.
   3006 	 */
   3007 	switch (IFM_SUBTYPE(ifm->ifm_media)) {
   3008 	case IFM_AUTO:
   3009 		err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
   3010 		    &negotiate);
   3011 		if (err != IXGBE_SUCCESS) {
   3012 			device_printf(adapter->dev, "Unable to determine "
   3013 			    "supported advertise speeds\n");
   3014 			IXGBE_CORE_UNLOCK(adapter);
   3015 			return (ENODEV);
   3016 		}
   3017 		speed |= link_caps;
   3018 		break;
   3019 	case IFM_10G_T:
   3020 	case IFM_10G_LRM:
   3021 	case IFM_10G_LR:
   3022 	case IFM_10G_TWINAX:
   3023 	case IFM_10G_SR:
   3024 	case IFM_10G_CX4:
   3025 #ifdef IFM_ETH_XTYPE
   3026 	case IFM_10G_KR:
   3027 	case IFM_10G_KX4:
   3028 #endif
   3029 		speed |= IXGBE_LINK_SPEED_10GB_FULL;
   3030 		break;
   3031 	case IFM_5000_T:
   3032 		speed |= IXGBE_LINK_SPEED_5GB_FULL;
   3033 		break;
   3034 	case IFM_2500_T:
   3035 	case IFM_2500_KX:
   3036 		speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
   3037 		break;
   3038 	case IFM_1000_T:
   3039 	case IFM_1000_LX:
   3040 	case IFM_1000_SX:
   3041 	case IFM_1000_KX:
   3042 		speed |= IXGBE_LINK_SPEED_1GB_FULL;
   3043 		break;
   3044 	case IFM_100_TX:
   3045 		speed |= IXGBE_LINK_SPEED_100_FULL;
   3046 		break;
   3047 	case IFM_10_T:
   3048 		speed |= IXGBE_LINK_SPEED_10_FULL;
   3049 		break;
   3050 	case IFM_NONE:
   3051 		break;
   3052 	default:
   3053 		goto invalid;
   3054 	}
   3055 
   3056 	hw->mac.autotry_restart = TRUE;
   3057 	hw->mac.ops.setup_link(hw, speed, TRUE);
   3058 	adapter->advertise = 0;
   3059 	if (IFM_SUBTYPE(ifm->ifm_media) != IFM_AUTO) {
   3060 		if ((speed & IXGBE_LINK_SPEED_10GB_FULL) != 0)
   3061 			adapter->advertise |= 1 << 2;
   3062 		if ((speed & IXGBE_LINK_SPEED_1GB_FULL) != 0)
   3063 			adapter->advertise |= 1 << 1;
   3064 		if ((speed & IXGBE_LINK_SPEED_100_FULL) != 0)
   3065 			adapter->advertise |= 1 << 0;
   3066 		if ((speed & IXGBE_LINK_SPEED_10_FULL) != 0)
   3067 			adapter->advertise |= 1 << 3;
   3068 		if ((speed & IXGBE_LINK_SPEED_2_5GB_FULL) != 0)
   3069 			adapter->advertise |= 1 << 4;
   3070 		if ((speed & IXGBE_LINK_SPEED_5GB_FULL) != 0)
   3071 			adapter->advertise |= 1 << 5;
   3072 	}
   3073 
   3074 	IXGBE_CORE_UNLOCK(adapter);
   3075 	return (0);
   3076 
   3077 invalid:
   3078 	device_printf(adapter->dev, "Invalid media type!\n");
   3079 	IXGBE_CORE_UNLOCK(adapter);
   3080 
   3081 	return (EINVAL);
   3082 } /* ixgbe_media_change */
   3083 
   3084 /************************************************************************
   3085  * ixgbe_msix_link - Link status change ISR (MSI/MSI-X)
   3086  ************************************************************************/
   3087 static int
   3088 ixgbe_msix_link(void *arg)
   3089 {
   3090 	struct adapter	*adapter = arg;
   3091 	struct ixgbe_hw *hw = &adapter->hw;
   3092 	u32		eicr;
   3093 	s32		retval;
   3094 
   3095 	++adapter->link_irq.ev_count;
   3096 
   3097 	/* Pause other interrupts */
   3098 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
   3099 
   3100 	/* First get the cause */
   3101 	/*
   3102 	 * The specifications of 82598, 82599, X540 and X550 say EICS register
   3103 	 * is write only. However, Linux says it is a workaround for silicon
   3104 	 * errata to read EICS instead of EICR to get interrupt cause. It seems
   3105 	 * there is a problem about read clear mechanism for EICR register.
   3106 	 */
   3107 	eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
   3108 	/* Be sure the queue bits are not cleared */
   3109 	eicr &= ~IXGBE_EICR_RTX_QUEUE;
   3110 	/* Clear interrupt with write */
   3111 	IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
   3112 
   3113 	if (ixgbe_is_sfp(hw)) {
   3114 		u32 eicr_mask;
   3115 
   3116 		/* Pluggable optics-related interrupt */
   3117 		if (hw->mac.type >= ixgbe_mac_X540)
   3118 			eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
   3119 		else
   3120 			eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
   3121 
   3122 		/*
   3123 		 *  An interrupt might not arrive when a module is inserted.
   3124 		 * When an link status change interrupt occurred and the driver
   3125 		 * still regard SFP as unplugged, issue the module softint
   3126 		 * and then issue LSC interrupt.
   3127 		 */
   3128 		if ((eicr & eicr_mask)
   3129 		    || ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   3130 			&& (eicr & IXGBE_EICR_LSC))) {
   3131 			IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
   3132 			softint_schedule(adapter->mod_si);
   3133 		}
   3134 
   3135 		if ((hw->mac.type == ixgbe_mac_82599EB) &&
   3136 		    (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
   3137 			IXGBE_WRITE_REG(hw, IXGBE_EICR,
   3138 			    IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   3139 			softint_schedule(adapter->msf_si);
   3140 		}
   3141 	}
   3142 
   3143 	/* Link status change */
   3144 	if (eicr & IXGBE_EICR_LSC) {
   3145 		IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
   3146 		softint_schedule(adapter->link_si);
   3147 	}
   3148 
   3149 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
   3150 #ifdef IXGBE_FDIR
   3151 		if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
   3152 		    (eicr & IXGBE_EICR_FLOW_DIR)) {
   3153 			/* This is probably overkill :) */
   3154 			if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1))
   3155 				return 1;
   3156 			/* Disable the interrupt */
   3157 			IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR);
   3158 			softint_schedule(adapter->fdir_si);
   3159 		}
   3160 #endif
   3161 
   3162 		if (eicr & IXGBE_EICR_ECC) {
   3163 			device_printf(adapter->dev,
   3164 			    "CRITICAL: ECC ERROR!! Please Reboot!!\n");
   3165 			IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
   3166 		}
   3167 
   3168 		/* Check for over temp condition */
   3169 		if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
   3170 			switch (adapter->hw.mac.type) {
   3171 			case ixgbe_mac_X550EM_a:
   3172 				if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
   3173 					break;
   3174 				IXGBE_WRITE_REG(hw, IXGBE_EIMC,
   3175 				    IXGBE_EICR_GPI_SDP0_X550EM_a);
   3176 				IXGBE_WRITE_REG(hw, IXGBE_EICR,
   3177 				    IXGBE_EICR_GPI_SDP0_X550EM_a);
   3178 				retval = hw->phy.ops.check_overtemp(hw);
   3179 				if (retval != IXGBE_ERR_OVERTEMP)
   3180 					break;
   3181 				device_printf(adapter->dev,
   3182 				    "CRITICAL: OVER TEMP!! "
   3183 				    "PHY IS SHUT DOWN!!\n");
   3184 				device_printf(adapter->dev,
   3185 				    "System shutdown required!\n");
   3186 				break;
   3187 			default:
   3188 				if (!(eicr & IXGBE_EICR_TS))
   3189 					break;
   3190 				retval = hw->phy.ops.check_overtemp(hw);
   3191 				if (retval != IXGBE_ERR_OVERTEMP)
   3192 					break;
   3193 				device_printf(adapter->dev,
   3194 				    "CRITICAL: OVER TEMP!! "
   3195 				    "PHY IS SHUT DOWN!!\n");
   3196 				device_printf(adapter->dev,
   3197 				    "System shutdown required!\n");
   3198 				IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
   3199 				break;
   3200 			}
   3201 		}
   3202 
   3203 		/* Check for VF message */
   3204 		if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
   3205 		    (eicr & IXGBE_EICR_MAILBOX))
   3206 			softint_schedule(adapter->mbx_si);
   3207 	}
   3208 
   3209 	/* Check for fan failure */
   3210 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
   3211 		ixgbe_check_fan_failure(adapter, eicr, TRUE);
   3212 		IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   3213 	}
   3214 
   3215 	/* External PHY interrupt */
   3216 	if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
   3217 	    (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
   3218 		IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
   3219 		softint_schedule(adapter->phy_si);
   3220 	}
   3221 
   3222 	/* Re-enable other interrupts */
   3223 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
   3224 	return 1;
   3225 } /* ixgbe_msix_link */
   3226 
   3227 static void
   3228 ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
   3229 {
   3230 
   3231 	if (adapter->hw.mac.type == ixgbe_mac_82598EB)
   3232 		itr |= itr << 16;
   3233 	else
   3234 		itr |= IXGBE_EITR_CNT_WDIS;
   3235 
   3236 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(index), itr);
   3237 }
   3238 
   3239 
   3240 /************************************************************************
   3241  * ixgbe_sysctl_interrupt_rate_handler
   3242  ************************************************************************/
   3243 static int
   3244 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
   3245 {
   3246 	struct sysctlnode node = *rnode;
   3247 	struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
   3248 	struct adapter	*adapter;
   3249 	uint32_t reg, usec, rate;
   3250 	int error;
   3251 
   3252 	if (que == NULL)
   3253 		return 0;
   3254 
   3255 	adapter = que->adapter;
   3256 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   3257 		return (EPERM);
   3258 
   3259 	reg = IXGBE_READ_REG(&adapter->hw, IXGBE_EITR(que->msix));
   3260 	usec = ((reg & 0x0FF8) >> 3);
   3261 	if (usec > 0)
   3262 		rate = 500000 / usec;
   3263 	else
   3264 		rate = 0;
   3265 	node.sysctl_data = &rate;
   3266 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   3267 	if (error || newp == NULL)
   3268 		return error;
   3269 	reg &= ~0xfff; /* default, no limitation */
   3270 	if (rate > 0 && rate < 500000) {
   3271 		if (rate < 1000)
   3272 			rate = 1000;
   3273 		reg |= ((4000000 / rate) & 0xff8);
   3274 		/*
   3275 		 * When RSC is used, ITR interval must be larger than
   3276 		 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
   3277 		 * The minimum value is always greater than 2us on 100M
   3278 		 * (and 10M?(not documented)), but it's not on 1G and higher.
   3279 		 */
   3280 		if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
   3281 		    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
   3282 			if ((adapter->num_queues > 1)
   3283 			    && (reg < IXGBE_MIN_RSC_EITR_10G1G))
   3284 				return EINVAL;
   3285 		}
   3286 		ixgbe_max_interrupt_rate = rate;
   3287 	} else
   3288 		ixgbe_max_interrupt_rate = 0;
   3289 	ixgbe_eitr_write(adapter, que->msix, reg);
   3290 
   3291 	return (0);
   3292 } /* ixgbe_sysctl_interrupt_rate_handler */
   3293 
   3294 const struct sysctlnode *
   3295 ixgbe_sysctl_instance(struct adapter *adapter)
   3296 {
   3297 	const char *dvname;
   3298 	struct sysctllog **log;
   3299 	int rc;
   3300 	const struct sysctlnode *rnode;
   3301 
   3302 	if (adapter->sysctltop != NULL)
   3303 		return adapter->sysctltop;
   3304 
   3305 	log = &adapter->sysctllog;
   3306 	dvname = device_xname(adapter->dev);
   3307 
   3308 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
   3309 	    0, CTLTYPE_NODE, dvname,
   3310 	    SYSCTL_DESCR("ixgbe information and settings"),
   3311 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
   3312 		goto err;
   3313 
   3314 	return rnode;
   3315 err:
   3316 	device_printf(adapter->dev,
   3317 	    "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
   3318 	return NULL;
   3319 }
   3320 
   3321 /************************************************************************
   3322  * ixgbe_add_device_sysctls
   3323  ************************************************************************/
   3324 static void
   3325 ixgbe_add_device_sysctls(struct adapter *adapter)
   3326 {
   3327 	device_t	       dev = adapter->dev;
   3328 	struct ixgbe_hw	       *hw = &adapter->hw;
   3329 	struct sysctllog **log;
   3330 	const struct sysctlnode *rnode, *cnode;
   3331 
   3332 	log = &adapter->sysctllog;
   3333 
   3334 	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
   3335 		aprint_error_dev(dev, "could not create sysctl root\n");
   3336 		return;
   3337 	}
   3338 
   3339 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3340 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   3341 	    "debug", SYSCTL_DESCR("Debug Info"),
   3342 	    ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL)
   3343 	    != 0)
   3344 		aprint_error_dev(dev, "could not create sysctl\n");
   3345 
   3346 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3347 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   3348 	    "rx_copy_len", SYSCTL_DESCR("RX Copy Length"),
   3349 	    ixgbe_sysctl_rx_copy_len, 0,
   3350 	    (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
   3351 		aprint_error_dev(dev, "could not create sysctl\n");
   3352 
   3353 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3354 	    CTLFLAG_READONLY, CTLTYPE_INT,
   3355 	    "num_tx_desc", SYSCTL_DESCR("Number of TX descriptors"),
   3356 	    NULL, 0, &adapter->num_tx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
   3357 		aprint_error_dev(dev, "could not create sysctl\n");
   3358 
   3359 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3360 	    CTLFLAG_READONLY, CTLTYPE_INT,
   3361 	    "num_rx_desc", SYSCTL_DESCR("Number of RX descriptors"),
   3362 	    NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
   3363 		aprint_error_dev(dev, "could not create sysctl\n");
   3364 
   3365 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3366 	    CTLFLAG_READWRITE, CTLTYPE_INT, "rx_process_limit",
   3367 	    SYSCTL_DESCR("max number of RX packets to process"),
   3368 	    ixgbe_sysctl_rx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
   3369 	    CTL_EOL) != 0)
   3370 		aprint_error_dev(dev, "could not create sysctl\n");
   3371 
   3372 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3373 	    CTLFLAG_READWRITE, CTLTYPE_INT, "tx_process_limit",
   3374 	    SYSCTL_DESCR("max number of TX packets to process"),
   3375 	    ixgbe_sysctl_tx_process_limit, 0, (void *)adapter, 0, CTL_CREATE,
   3376 	    CTL_EOL) != 0)
   3377 		aprint_error_dev(dev, "could not create sysctl\n");
   3378 
   3379 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3380 	    CTLFLAG_READONLY, CTLTYPE_INT,
   3381 	    "num_queues", SYSCTL_DESCR("Number of queues"),
   3382 	    NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
   3383 		aprint_error_dev(dev, "could not create sysctl\n");
   3384 
   3385 	/* Sysctls for all devices */
   3386 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3387 	    CTLTYPE_INT, "fc", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_SET_FC),
   3388 	    ixgbe_sysctl_flowcntl, 0, (void *)adapter, 0, CTL_CREATE,
   3389 	    CTL_EOL) != 0)
   3390 		aprint_error_dev(dev, "could not create sysctl\n");
   3391 
   3392 	adapter->enable_aim = ixgbe_enable_aim;
   3393 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3394 	    CTLTYPE_BOOL, "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
   3395 	    NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
   3396 		aprint_error_dev(dev, "could not create sysctl\n");
   3397 
   3398 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3399 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   3400 	    "advertise_speed", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_ADV_SPEED),
   3401 	    ixgbe_sysctl_advertise, 0, (void *)adapter, 0, CTL_CREATE,
   3402 	    CTL_EOL) != 0)
   3403 		aprint_error_dev(dev, "could not create sysctl\n");
   3404 
   3405 	/*
   3406 	 * If each "que->txrx_use_workqueue" is changed in sysctl handler,
   3407 	 * it causesflip-flopping softint/workqueue mode in one deferred
   3408 	 * processing. Therefore, preempt_disable()/preempt_enable() are
   3409 	 * required in ixgbe_sched_handle_que() to avoid
   3410 	 * KASSERT(ixgbe_sched_handle_que()) in softint_schedule().
   3411 	 * I think changing "que->txrx_use_workqueue" in interrupt handler
   3412 	 * is lighter than doing preempt_disable()/preempt_enable() in every
   3413 	 * ixgbe_sched_handle_que().
   3414 	 */
   3415 	adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
   3416 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3417 	    CTLTYPE_BOOL, "txrx_workqueue",
   3418 	    SYSCTL_DESCR("Use workqueue for packet processing"),
   3419 	    NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE,
   3420 	    CTL_EOL) != 0)
   3421 		aprint_error_dev(dev, "could not create sysctl\n");
   3422 
   3423 #ifdef IXGBE_DEBUG
   3424 	/* testing sysctls (for all devices) */
   3425 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3426 	    CTLTYPE_INT, "power_state", SYSCTL_DESCR("PCI Power State"),
   3427 	    ixgbe_sysctl_power_state, 0, (void *)adapter, 0, CTL_CREATE,
   3428 	    CTL_EOL) != 0)
   3429 		aprint_error_dev(dev, "could not create sysctl\n");
   3430 
   3431 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READONLY,
   3432 	    CTLTYPE_STRING, "print_rss_config",
   3433 	    SYSCTL_DESCR("Prints RSS Configuration"),
   3434 	    ixgbe_sysctl_print_rss_config, 0, (void *)adapter, 0, CTL_CREATE,
   3435 	    CTL_EOL) != 0)
   3436 		aprint_error_dev(dev, "could not create sysctl\n");
   3437 #endif
   3438 	/* for X550 series devices */
   3439 	if (hw->mac.type >= ixgbe_mac_X550)
   3440 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3441 		    CTLTYPE_INT, "dmac", SYSCTL_DESCR("DMA Coalesce"),
   3442 		    ixgbe_sysctl_dmac, 0, (void *)adapter, 0, CTL_CREATE,
   3443 		    CTL_EOL) != 0)
   3444 			aprint_error_dev(dev, "could not create sysctl\n");
   3445 
   3446 	/* for WoL-capable devices */
   3447 	if (adapter->wol_support) {
   3448 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3449 		    CTLTYPE_BOOL, "wol_enable",
   3450 		    SYSCTL_DESCR("Enable/Disable Wake on LAN"),
   3451 		    ixgbe_sysctl_wol_enable, 0, (void *)adapter, 0, CTL_CREATE,
   3452 		    CTL_EOL) != 0)
   3453 			aprint_error_dev(dev, "could not create sysctl\n");
   3454 
   3455 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3456 		    CTLTYPE_INT, "wufc",
   3457 		    SYSCTL_DESCR("Enable/Disable Wake Up Filters"),
   3458 		    ixgbe_sysctl_wufc, 0, (void *)adapter, 0, CTL_CREATE,
   3459 		    CTL_EOL) != 0)
   3460 			aprint_error_dev(dev, "could not create sysctl\n");
   3461 	}
   3462 
   3463 	/* for X552/X557-AT devices */
   3464 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
   3465 		const struct sysctlnode *phy_node;
   3466 
   3467 		if (sysctl_createv(log, 0, &rnode, &phy_node, 0, CTLTYPE_NODE,
   3468 		    "phy", SYSCTL_DESCR("External PHY sysctls"),
   3469 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) {
   3470 			aprint_error_dev(dev, "could not create sysctl\n");
   3471 			return;
   3472 		}
   3473 
   3474 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
   3475 		    CTLTYPE_INT, "temp",
   3476 		    SYSCTL_DESCR("Current External PHY Temperature (Celsius)"),
   3477 		    ixgbe_sysctl_phy_temp, 0, (void *)adapter, 0, CTL_CREATE,
   3478 		    CTL_EOL) != 0)
   3479 			aprint_error_dev(dev, "could not create sysctl\n");
   3480 
   3481 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
   3482 		    CTLTYPE_INT, "overtemp_occurred",
   3483 		    SYSCTL_DESCR(
   3484 			    "External PHY High Temperature Event Occurred"),
   3485 		    ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
   3486 		    CTL_CREATE, CTL_EOL) != 0)
   3487 			aprint_error_dev(dev, "could not create sysctl\n");
   3488 	}
   3489 
   3490 	if ((hw->mac.type == ixgbe_mac_X550EM_a)
   3491 	    && (hw->phy.type == ixgbe_phy_fw))
   3492 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3493 		    CTLTYPE_BOOL, "force_10_100_autonego",
   3494 		    SYSCTL_DESCR("Force autonego on 10M and 100M"),
   3495 		    NULL, 0, &hw->phy.force_10_100_autonego, 0,
   3496 		    CTL_CREATE, CTL_EOL) != 0)
   3497 			aprint_error_dev(dev, "could not create sysctl\n");
   3498 
   3499 	if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
   3500 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3501 		    CTLTYPE_INT, "eee_state",
   3502 		    SYSCTL_DESCR("EEE Power Save State"),
   3503 		    ixgbe_sysctl_eee_state, 0, (void *)adapter, 0, CTL_CREATE,
   3504 		    CTL_EOL) != 0)
   3505 			aprint_error_dev(dev, "could not create sysctl\n");
   3506 	}
   3507 } /* ixgbe_add_device_sysctls */
   3508 
   3509 /************************************************************************
   3510  * ixgbe_allocate_pci_resources
   3511  ************************************************************************/
   3512 static int
   3513 ixgbe_allocate_pci_resources(struct adapter *adapter,
   3514     const struct pci_attach_args *pa)
   3515 {
   3516 	pcireg_t	memtype, csr;
   3517 	device_t dev = adapter->dev;
   3518 	bus_addr_t addr;
   3519 	int flags;
   3520 
   3521 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
   3522 	switch (memtype) {
   3523 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
   3524 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
   3525 		adapter->osdep.mem_bus_space_tag = pa->pa_memt;
   3526 		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
   3527 		      memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
   3528 			goto map_err;
   3529 		if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
   3530 			aprint_normal_dev(dev, "clearing prefetchable bit\n");
   3531 			flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
   3532 		}
   3533 		if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
   3534 		     adapter->osdep.mem_size, flags,
   3535 		     &adapter->osdep.mem_bus_space_handle) != 0) {
   3536 map_err:
   3537 			adapter->osdep.mem_size = 0;
   3538 			aprint_error_dev(dev, "unable to map BAR0\n");
   3539 			return ENXIO;
   3540 		}
   3541 		/*
   3542 		 * Enable address decoding for memory range in case BIOS or
   3543 		 * UEFI don't set it.
   3544 		 */
   3545 		csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
   3546 		    PCI_COMMAND_STATUS_REG);
   3547 		csr |= PCI_COMMAND_MEM_ENABLE;
   3548 		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
   3549 		    csr);
   3550 		break;
   3551 	default:
   3552 		aprint_error_dev(dev, "unexpected type on BAR0\n");
   3553 		return ENXIO;
   3554 	}
   3555 
   3556 	return (0);
   3557 } /* ixgbe_allocate_pci_resources */
   3558 
   3559 static void
   3560 ixgbe_free_softint(struct adapter *adapter)
   3561 {
   3562 	struct ix_queue *que = adapter->queues;
   3563 	struct tx_ring *txr = adapter->tx_rings;
   3564 	int i;
   3565 
   3566 	for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
   3567 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   3568 			if (txr->txr_si != NULL)
   3569 				softint_disestablish(txr->txr_si);
   3570 		}
   3571 		if (que->que_si != NULL)
   3572 			softint_disestablish(que->que_si);
   3573 	}
   3574 	if (adapter->txr_wq != NULL)
   3575 		workqueue_destroy(adapter->txr_wq);
   3576 	if (adapter->txr_wq_enqueued != NULL)
   3577 		percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
   3578 	if (adapter->que_wq != NULL)
   3579 		workqueue_destroy(adapter->que_wq);
   3580 
   3581 	/* Drain the Link queue */
   3582 	if (adapter->link_si != NULL) {
   3583 		softint_disestablish(adapter->link_si);
   3584 		adapter->link_si = NULL;
   3585 	}
   3586 	if (adapter->mod_si != NULL) {
   3587 		softint_disestablish(adapter->mod_si);
   3588 		adapter->mod_si = NULL;
   3589 	}
   3590 	if (adapter->msf_si != NULL) {
   3591 		softint_disestablish(adapter->msf_si);
   3592 		adapter->msf_si = NULL;
   3593 	}
   3594 	if (adapter->phy_si != NULL) {
   3595 		softint_disestablish(adapter->phy_si);
   3596 		adapter->phy_si = NULL;
   3597 	}
   3598 	if (adapter->feat_en & IXGBE_FEATURE_FDIR) {
   3599 		if (adapter->fdir_si != NULL) {
   3600 			softint_disestablish(adapter->fdir_si);
   3601 			adapter->fdir_si = NULL;
   3602 		}
   3603 	}
   3604 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
   3605 		if (adapter->mbx_si != NULL) {
   3606 			softint_disestablish(adapter->mbx_si);
   3607 			adapter->mbx_si = NULL;
   3608 		}
   3609 	}
   3610 } /* ixgbe_free_softint */
   3611 
   3612 /************************************************************************
   3613  * ixgbe_detach - Device removal routine
   3614  *
   3615  *   Called when the driver is being removed.
   3616  *   Stops the adapter and deallocates all the resources
   3617  *   that were allocated for driver operation.
   3618  *
   3619  *   return 0 on success, positive on failure
   3620  ************************************************************************/
   3621 static int
   3622 ixgbe_detach(device_t dev, int flags)
   3623 {
   3624 	struct adapter *adapter = device_private(dev);
   3625 	struct rx_ring *rxr = adapter->rx_rings;
   3626 	struct tx_ring *txr = adapter->tx_rings;
   3627 	struct ixgbe_hw *hw = &adapter->hw;
   3628 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
   3629 	u32	ctrl_ext;
   3630 	int i;
   3631 
   3632 	INIT_DEBUGOUT("ixgbe_detach: begin");
   3633 	if (adapter->osdep.attached == false)
   3634 		return 0;
   3635 
   3636 	if (ixgbe_pci_iov_detach(dev) != 0) {
   3637 		device_printf(dev, "SR-IOV in use; detach first.\n");
   3638 		return (EBUSY);
   3639 	}
   3640 
   3641 	/*
   3642 	 * Stop the interface. ixgbe_setup_low_power_mode() calls
   3643 	 * ixgbe_stop_locked(), so it's not required to call ixgbe_stop_locked()
   3644 	 * directly.
   3645 	 */
   3646 	IXGBE_CORE_LOCK(adapter);
   3647 	ixgbe_setup_low_power_mode(adapter);
   3648 	IXGBE_CORE_UNLOCK(adapter);
   3649 #if NVLAN > 0
   3650 	/* Make sure VLANs are not using driver */
   3651 	if (!VLAN_ATTACHED(&adapter->osdep.ec))
   3652 		;	/* nothing to do: no VLANs */
   3653 	else if ((flags & (DETACH_SHUTDOWN | DETACH_FORCE)) != 0)
   3654 		vlan_ifdetach(adapter->ifp);
   3655 	else {
   3656 		aprint_error_dev(dev, "VLANs in use, detach first\n");
   3657 		return (EBUSY);
   3658 	}
   3659 #endif
   3660 
   3661 	pmf_device_deregister(dev);
   3662 
   3663 	ether_ifdetach(adapter->ifp);
   3664 
   3665 	ixgbe_free_softint(adapter);
   3666 
   3667 	/* let hardware know driver is unloading */
   3668 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
   3669 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
   3670 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
   3671 
   3672 	callout_halt(&adapter->timer, NULL);
   3673 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
   3674 		callout_halt(&adapter->recovery_mode_timer, NULL);
   3675 
   3676 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
   3677 		netmap_detach(adapter->ifp);
   3678 
   3679 	ixgbe_free_pci_resources(adapter);
   3680 #if 0	/* XXX the NetBSD port is probably missing something here */
   3681 	bus_generic_detach(dev);
   3682 #endif
   3683 	if_detach(adapter->ifp);
   3684 	if_percpuq_destroy(adapter->ipq);
   3685 
   3686 	sysctl_teardown(&adapter->sysctllog);
   3687 	evcnt_detach(&adapter->efbig_tx_dma_setup);
   3688 	evcnt_detach(&adapter->mbuf_defrag_failed);
   3689 	evcnt_detach(&adapter->efbig2_tx_dma_setup);
   3690 	evcnt_detach(&adapter->einval_tx_dma_setup);
   3691 	evcnt_detach(&adapter->other_tx_dma_setup);
   3692 	evcnt_detach(&adapter->eagain_tx_dma_setup);
   3693 	evcnt_detach(&adapter->enomem_tx_dma_setup);
   3694 	evcnt_detach(&adapter->watchdog_events);
   3695 	evcnt_detach(&adapter->tso_err);
   3696 	evcnt_detach(&adapter->link_irq);
   3697 	evcnt_detach(&adapter->link_sicount);
   3698 	evcnt_detach(&adapter->mod_sicount);
   3699 	evcnt_detach(&adapter->msf_sicount);
   3700 	evcnt_detach(&adapter->phy_sicount);
   3701 
   3702 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
   3703 		if (i < __arraycount(stats->mpc)) {
   3704 			evcnt_detach(&stats->mpc[i]);
   3705 			if (hw->mac.type == ixgbe_mac_82598EB)
   3706 				evcnt_detach(&stats->rnbc[i]);
   3707 		}
   3708 		if (i < __arraycount(stats->pxontxc)) {
   3709 			evcnt_detach(&stats->pxontxc[i]);
   3710 			evcnt_detach(&stats->pxonrxc[i]);
   3711 			evcnt_detach(&stats->pxofftxc[i]);
   3712 			evcnt_detach(&stats->pxoffrxc[i]);
   3713 			if (hw->mac.type >= ixgbe_mac_82599EB)
   3714 				evcnt_detach(&stats->pxon2offc[i]);
   3715 		}
   3716 	}
   3717 
   3718 	txr = adapter->tx_rings;
   3719 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   3720 		evcnt_detach(&adapter->queues[i].irqs);
   3721 		evcnt_detach(&adapter->queues[i].handleq);
   3722 		evcnt_detach(&adapter->queues[i].req);
   3723 		evcnt_detach(&txr->no_desc_avail);
   3724 		evcnt_detach(&txr->total_packets);
   3725 		evcnt_detach(&txr->tso_tx);
   3726 #ifndef IXGBE_LEGACY_TX
   3727 		evcnt_detach(&txr->pcq_drops);
   3728 #endif
   3729 
   3730 		if (i < __arraycount(stats->qprc)) {
   3731 			evcnt_detach(&stats->qprc[i]);
   3732 			evcnt_detach(&stats->qptc[i]);
   3733 			evcnt_detach(&stats->qbrc[i]);
   3734 			evcnt_detach(&stats->qbtc[i]);
   3735 			if (hw->mac.type >= ixgbe_mac_82599EB)
   3736 				evcnt_detach(&stats->qprdc[i]);
   3737 		}
   3738 
   3739 		evcnt_detach(&rxr->rx_packets);
   3740 		evcnt_detach(&rxr->rx_bytes);
   3741 		evcnt_detach(&rxr->rx_copies);
   3742 		evcnt_detach(&rxr->no_mbuf);
   3743 		evcnt_detach(&rxr->rx_discarded);
   3744 	}
   3745 	evcnt_detach(&stats->ipcs);
   3746 	evcnt_detach(&stats->l4cs);
   3747 	evcnt_detach(&stats->ipcs_bad);
   3748 	evcnt_detach(&stats->l4cs_bad);
   3749 	evcnt_detach(&stats->intzero);
   3750 	evcnt_detach(&stats->legint);
   3751 	evcnt_detach(&stats->crcerrs);
   3752 	evcnt_detach(&stats->illerrc);
   3753 	evcnt_detach(&stats->errbc);
   3754 	evcnt_detach(&stats->mspdc);
   3755 	if (hw->mac.type >= ixgbe_mac_X550)
   3756 		evcnt_detach(&stats->mbsdc);
   3757 	evcnt_detach(&stats->mpctotal);
   3758 	evcnt_detach(&stats->mlfc);
   3759 	evcnt_detach(&stats->mrfc);
   3760 	evcnt_detach(&stats->rlec);
   3761 	evcnt_detach(&stats->lxontxc);
   3762 	evcnt_detach(&stats->lxonrxc);
   3763 	evcnt_detach(&stats->lxofftxc);
   3764 	evcnt_detach(&stats->lxoffrxc);
   3765 
   3766 	/* Packet Reception Stats */
   3767 	evcnt_detach(&stats->tor);
   3768 	evcnt_detach(&stats->gorc);
   3769 	evcnt_detach(&stats->tpr);
   3770 	evcnt_detach(&stats->gprc);
   3771 	evcnt_detach(&stats->mprc);
   3772 	evcnt_detach(&stats->bprc);
   3773 	evcnt_detach(&stats->prc64);
   3774 	evcnt_detach(&stats->prc127);
   3775 	evcnt_detach(&stats->prc255);
   3776 	evcnt_detach(&stats->prc511);
   3777 	evcnt_detach(&stats->prc1023);
   3778 	evcnt_detach(&stats->prc1522);
   3779 	evcnt_detach(&stats->ruc);
   3780 	evcnt_detach(&stats->rfc);
   3781 	evcnt_detach(&stats->roc);
   3782 	evcnt_detach(&stats->rjc);
   3783 	evcnt_detach(&stats->mngprc);
   3784 	evcnt_detach(&stats->mngpdc);
   3785 	evcnt_detach(&stats->xec);
   3786 
   3787 	/* Packet Transmission Stats */
   3788 	evcnt_detach(&stats->gotc);
   3789 	evcnt_detach(&stats->tpt);
   3790 	evcnt_detach(&stats->gptc);
   3791 	evcnt_detach(&stats->bptc);
   3792 	evcnt_detach(&stats->mptc);
   3793 	evcnt_detach(&stats->mngptc);
   3794 	evcnt_detach(&stats->ptc64);
   3795 	evcnt_detach(&stats->ptc127);
   3796 	evcnt_detach(&stats->ptc255);
   3797 	evcnt_detach(&stats->ptc511);
   3798 	evcnt_detach(&stats->ptc1023);
   3799 	evcnt_detach(&stats->ptc1522);
   3800 
   3801 	ixgbe_free_queues(adapter);
   3802 	free(adapter->mta, M_DEVBUF);
   3803 
   3804 	IXGBE_CORE_LOCK_DESTROY(adapter);
   3805 
   3806 	return (0);
   3807 } /* ixgbe_detach */
   3808 
   3809 /************************************************************************
   3810  * ixgbe_setup_low_power_mode - LPLU/WoL preparation
   3811  *
   3812  *   Prepare the adapter/port for LPLU and/or WoL
   3813  ************************************************************************/
   3814 static int
   3815 ixgbe_setup_low_power_mode(struct adapter *adapter)
   3816 {
   3817 	struct ixgbe_hw *hw = &adapter->hw;
   3818 	device_t	dev = adapter->dev;
   3819 	s32		error = 0;
   3820 
   3821 	KASSERT(mutex_owned(&adapter->core_mtx));
   3822 
   3823 	/* Limit power management flow to X550EM baseT */
   3824 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
   3825 	    hw->phy.ops.enter_lplu) {
   3826 		/* X550EM baseT adapters need a special LPLU flow */
   3827 		hw->phy.reset_disable = true;
   3828 		ixgbe_stop_locked(adapter);
   3829 		error = hw->phy.ops.enter_lplu(hw);
   3830 		if (error)
   3831 			device_printf(dev,
   3832 			    "Error entering LPLU: %d\n", error);
   3833 		hw->phy.reset_disable = false;
   3834 	} else {
   3835 		/* Just stop for other adapters */
   3836 		ixgbe_stop_locked(adapter);
   3837 	}
   3838 
   3839 	if (!hw->wol_enabled) {
   3840 		ixgbe_set_phy_power(hw, FALSE);
   3841 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
   3842 		IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
   3843 	} else {
   3844 		/* Turn off support for APM wakeup. (Using ACPI instead) */
   3845 		IXGBE_WRITE_REG(hw, IXGBE_GRC_BY_MAC(hw),
   3846 		    IXGBE_READ_REG(hw, IXGBE_GRC_BY_MAC(hw)) & ~(u32)2);
   3847 
   3848 		/*
   3849 		 * Clear Wake Up Status register to prevent any previous wakeup
   3850 		 * events from waking us up immediately after we suspend.
   3851 		 */
   3852 		IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
   3853 
   3854 		/*
   3855 		 * Program the Wakeup Filter Control register with user filter
   3856 		 * settings
   3857 		 */
   3858 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
   3859 
   3860 		/* Enable wakeups and power management in Wakeup Control */
   3861 		IXGBE_WRITE_REG(hw, IXGBE_WUC,
   3862 		    IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
   3863 
   3864 	}
   3865 
   3866 	return error;
   3867 } /* ixgbe_setup_low_power_mode */
   3868 
   3869 /************************************************************************
   3870  * ixgbe_shutdown - Shutdown entry point
   3871  ************************************************************************/
   3872 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
   3873 static int
   3874 ixgbe_shutdown(device_t dev)
   3875 {
   3876 	struct adapter *adapter = device_private(dev);
   3877 	int error = 0;
   3878 
   3879 	INIT_DEBUGOUT("ixgbe_shutdown: begin");
   3880 
   3881 	IXGBE_CORE_LOCK(adapter);
   3882 	error = ixgbe_setup_low_power_mode(adapter);
   3883 	IXGBE_CORE_UNLOCK(adapter);
   3884 
   3885 	return (error);
   3886 } /* ixgbe_shutdown */
   3887 #endif
   3888 
   3889 /************************************************************************
   3890  * ixgbe_suspend
   3891  *
   3892  *   From D0 to D3
   3893  ************************************************************************/
   3894 static bool
   3895 ixgbe_suspend(device_t dev, const pmf_qual_t *qual)
   3896 {
   3897 	struct adapter *adapter = device_private(dev);
   3898 	int	       error = 0;
   3899 
   3900 	INIT_DEBUGOUT("ixgbe_suspend: begin");
   3901 
   3902 	IXGBE_CORE_LOCK(adapter);
   3903 
   3904 	error = ixgbe_setup_low_power_mode(adapter);
   3905 
   3906 	IXGBE_CORE_UNLOCK(adapter);
   3907 
   3908 	return (error);
   3909 } /* ixgbe_suspend */
   3910 
   3911 /************************************************************************
   3912  * ixgbe_resume
   3913  *
   3914  *   From D3 to D0
   3915  ************************************************************************/
   3916 static bool
   3917 ixgbe_resume(device_t dev, const pmf_qual_t *qual)
   3918 {
   3919 	struct adapter	*adapter = device_private(dev);
   3920 	struct ifnet	*ifp = adapter->ifp;
   3921 	struct ixgbe_hw *hw = &adapter->hw;
   3922 	u32		wus;
   3923 
   3924 	INIT_DEBUGOUT("ixgbe_resume: begin");
   3925 
   3926 	IXGBE_CORE_LOCK(adapter);
   3927 
   3928 	/* Read & clear WUS register */
   3929 	wus = IXGBE_READ_REG(hw, IXGBE_WUS);
   3930 	if (wus)
   3931 		device_printf(dev, "Woken up by (WUS): %#010x\n",
   3932 		    IXGBE_READ_REG(hw, IXGBE_WUS));
   3933 	IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
   3934 	/* And clear WUFC until next low-power transition */
   3935 	IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
   3936 
   3937 	/*
   3938 	 * Required after D3->D0 transition;
   3939 	 * will re-advertise all previous advertised speeds
   3940 	 */
   3941 	if (ifp->if_flags & IFF_UP)
   3942 		ixgbe_init_locked(adapter);
   3943 
   3944 	IXGBE_CORE_UNLOCK(adapter);
   3945 
   3946 	return true;
   3947 } /* ixgbe_resume */
   3948 
   3949 /*
   3950  * Set the various hardware offload abilities.
   3951  *
   3952  * This takes the ifnet's if_capenable flags (e.g. set by the user using
   3953  * ifconfig) and indicates to the OS via the ifnet's if_hwassist field what
   3954  * mbuf offload flags the driver will understand.
   3955  */
   3956 static void
   3957 ixgbe_set_if_hwassist(struct adapter *adapter)
   3958 {
   3959 	/* XXX */
   3960 }
   3961 
   3962 /************************************************************************
   3963  * ixgbe_init_locked - Init entry point
   3964  *
   3965  *   Used in two ways: It is used by the stack as an init
   3966  *   entry point in network interface structure. It is also
   3967  *   used by the driver as a hw/sw initialization routine to
   3968  *   get to a consistent state.
   3969  *
   3970  *   return 0 on success, positive on failure
   3971  ************************************************************************/
   3972 static void
   3973 ixgbe_init_locked(struct adapter *adapter)
   3974 {
   3975 	struct ifnet   *ifp = adapter->ifp;
   3976 	device_t	dev = adapter->dev;
   3977 	struct ixgbe_hw *hw = &adapter->hw;
   3978 	struct ix_queue *que;
   3979 	struct tx_ring	*txr;
   3980 	struct rx_ring	*rxr;
   3981 	u32		txdctl, mhadd;
   3982 	u32		rxdctl, rxctrl;
   3983 	u32		ctrl_ext;
   3984 	bool		unsupported_sfp = false;
   3985 	int		i, j, error;
   3986 
   3987 	/* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
   3988 
   3989 	KASSERT(mutex_owned(&adapter->core_mtx));
   3990 	INIT_DEBUGOUT("ixgbe_init_locked: begin");
   3991 
   3992 	hw->need_unsupported_sfp_recovery = false;
   3993 	hw->adapter_stopped = FALSE;
   3994 	ixgbe_stop_adapter(hw);
   3995 	callout_stop(&adapter->timer);
   3996 	for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
   3997 		que->disabled_count = 0;
   3998 
   3999 	/* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
   4000 	adapter->max_frame_size =
   4001 		ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
   4002 
   4003 	/* Queue indices may change with IOV mode */
   4004 	ixgbe_align_all_queue_indices(adapter);
   4005 
   4006 	/* reprogram the RAR[0] in case user changed it. */
   4007 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
   4008 
   4009 	/* Get the latest mac address, User can use a LAA */
   4010 	memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
   4011 	    IXGBE_ETH_LENGTH_OF_ADDRESS);
   4012 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
   4013 	hw->addr_ctrl.rar_used_count = 1;
   4014 
   4015 	/* Set hardware offload abilities from ifnet flags */
   4016 	ixgbe_set_if_hwassist(adapter);
   4017 
   4018 	/* Prepare transmit descriptors and buffers */
   4019 	if (ixgbe_setup_transmit_structures(adapter)) {
   4020 		device_printf(dev, "Could not setup transmit structures\n");
   4021 		ixgbe_stop_locked(adapter);
   4022 		return;
   4023 	}
   4024 
   4025 	ixgbe_init_hw(hw);
   4026 
   4027 	ixgbe_initialize_iov(adapter);
   4028 
   4029 	ixgbe_initialize_transmit_units(adapter);
   4030 
   4031 	/* Setup Multicast table */
   4032 	ixgbe_set_rxfilter(adapter);
   4033 
   4034 	/* Use fixed buffer size, even for jumbo frames */
   4035 	adapter->rx_mbuf_sz = MCLBYTES;
   4036 
   4037 	/* Prepare receive descriptors and buffers */
   4038 	error = ixgbe_setup_receive_structures(adapter);
   4039 	if (error) {
   4040 		device_printf(dev,
   4041 		    "Could not setup receive structures (err = %d)\n", error);
   4042 		ixgbe_stop_locked(adapter);
   4043 		return;
   4044 	}
   4045 
   4046 	/* Configure RX settings */
   4047 	ixgbe_initialize_receive_units(adapter);
   4048 
   4049 	/* Enable SDP & MSI-X interrupts based on adapter */
   4050 	ixgbe_config_gpie(adapter);
   4051 
   4052 	/* Set MTU size */
   4053 	if (ifp->if_mtu > ETHERMTU) {
   4054 		/* aka IXGBE_MAXFRS on 82599 and newer */
   4055 		mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
   4056 		mhadd &= ~IXGBE_MHADD_MFS_MASK;
   4057 		mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
   4058 		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
   4059 	}
   4060 
   4061 	/* Now enable all the queues */
   4062 	for (i = 0; i < adapter->num_queues; i++) {
   4063 		txr = &adapter->tx_rings[i];
   4064 		txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
   4065 		txdctl |= IXGBE_TXDCTL_ENABLE;
   4066 		/* Set WTHRESH to 8, burst writeback */
   4067 		txdctl |= IXGBE_TX_WTHRESH << IXGBE_TXDCTL_WTHRESH_SHIFT;
   4068 		/*
   4069 		 * When the internal queue falls below PTHRESH (32),
   4070 		 * start prefetching as long as there are at least
   4071 		 * HTHRESH (1) buffers ready. The values are taken
   4072 		 * from the Intel linux driver 3.8.21.
   4073 		 * Prefetching enables tx line rate even with 1 queue.
   4074 		 */
   4075 		txdctl |= (32 << 0) | (1 << 8);
   4076 		IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
   4077 	}
   4078 
   4079 	for (i = 0; i < adapter->num_queues; i++) {
   4080 		rxr = &adapter->rx_rings[i];
   4081 		rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
   4082 		if (hw->mac.type == ixgbe_mac_82598EB) {
   4083 			/*
   4084 			 * PTHRESH = 21
   4085 			 * HTHRESH = 4
   4086 			 * WTHRESH = 8
   4087 			 */
   4088 			rxdctl &= ~0x3FFFFF;
   4089 			rxdctl |= 0x080420;
   4090 		}
   4091 		rxdctl |= IXGBE_RXDCTL_ENABLE;
   4092 		IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
   4093 		for (j = 0; j < 10; j++) {
   4094 			if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
   4095 			    IXGBE_RXDCTL_ENABLE)
   4096 				break;
   4097 			else
   4098 				msec_delay(1);
   4099 		}
   4100 		wmb();
   4101 
   4102 		/*
   4103 		 * In netmap mode, we must preserve the buffers made
   4104 		 * available to userspace before the if_init()
   4105 		 * (this is true by default on the TX side, because
   4106 		 * init makes all buffers available to userspace).
   4107 		 *
   4108 		 * netmap_reset() and the device specific routines
   4109 		 * (e.g. ixgbe_setup_receive_rings()) map these
   4110 		 * buffers at the end of the NIC ring, so here we
   4111 		 * must set the RDT (tail) register to make sure
   4112 		 * they are not overwritten.
   4113 		 *
   4114 		 * In this driver the NIC ring starts at RDH = 0,
   4115 		 * RDT points to the last slot available for reception (?),
   4116 		 * so RDT = num_rx_desc - 1 means the whole ring is available.
   4117 		 */
   4118 #ifdef DEV_NETMAP
   4119 		if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
   4120 		    (ifp->if_capenable & IFCAP_NETMAP)) {
   4121 			struct netmap_adapter *na = NA(adapter->ifp);
   4122 			struct netmap_kring *kring = na->rx_rings[i];
   4123 			int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
   4124 
   4125 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
   4126 		} else
   4127 #endif /* DEV_NETMAP */
   4128 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me),
   4129 			    adapter->num_rx_desc - 1);
   4130 	}
   4131 
   4132 	/* Enable Receive engine */
   4133 	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
   4134 	if (hw->mac.type == ixgbe_mac_82598EB)
   4135 		rxctrl |= IXGBE_RXCTRL_DMBYPS;
   4136 	rxctrl |= IXGBE_RXCTRL_RXEN;
   4137 	ixgbe_enable_rx_dma(hw, rxctrl);
   4138 
   4139 	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
   4140 
   4141 	/* Set up MSI/MSI-X routing */
   4142 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   4143 		ixgbe_configure_ivars(adapter);
   4144 		/* Set up auto-mask */
   4145 		if (hw->mac.type == ixgbe_mac_82598EB)
   4146 			IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
   4147 		else {
   4148 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
   4149 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
   4150 		}
   4151 	} else {  /* Simple settings for Legacy/MSI */
   4152 		ixgbe_set_ivar(adapter, 0, 0, 0);
   4153 		ixgbe_set_ivar(adapter, 0, 0, 1);
   4154 		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
   4155 	}
   4156 
   4157 	ixgbe_init_fdir(adapter);
   4158 
   4159 	/*
   4160 	 * Check on any SFP devices that
   4161 	 * need to be kick-started
   4162 	 */
   4163 	if (hw->phy.type == ixgbe_phy_none) {
   4164 		error = hw->phy.ops.identify(hw);
   4165 		if (error == IXGBE_ERR_SFP_NOT_SUPPORTED)
   4166 			unsupported_sfp = true;
   4167 	} else if (hw->phy.type == ixgbe_phy_sfp_unsupported)
   4168 		unsupported_sfp = true;
   4169 
   4170 	if (unsupported_sfp)
   4171 		device_printf(dev,
   4172 		    "Unsupported SFP+ module type was detected.\n");
   4173 
   4174 	/* Set moderation on the Link interrupt */
   4175 	ixgbe_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
   4176 
   4177 	/* Enable EEE power saving */
   4178 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   4179 		hw->mac.ops.setup_eee(hw,
   4180 		    adapter->feat_en & IXGBE_FEATURE_EEE);
   4181 
   4182 	/* Enable power to the phy. */
   4183 	if (!unsupported_sfp) {
   4184 		ixgbe_set_phy_power(hw, TRUE);
   4185 
   4186 		/* Config/Enable Link */
   4187 		ixgbe_config_link(adapter);
   4188 	}
   4189 
   4190 	/* Hardware Packet Buffer & Flow Control setup */
   4191 	ixgbe_config_delay_values(adapter);
   4192 
   4193 	/* Initialize the FC settings */
   4194 	ixgbe_start_hw(hw);
   4195 
   4196 	/* Set up VLAN support and filter */
   4197 	ixgbe_setup_vlan_hw_support(adapter);
   4198 
   4199 	/* Setup DMA Coalescing */
   4200 	ixgbe_config_dmac(adapter);
   4201 
   4202 	/* And now turn on interrupts */
   4203 	ixgbe_enable_intr(adapter);
   4204 
   4205 	/* Enable the use of the MBX by the VF's */
   4206 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
   4207 		ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
   4208 		ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
   4209 		IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
   4210 	}
   4211 
   4212 	/* Update saved flags. See ixgbe_ifflags_cb() */
   4213 	adapter->if_flags = ifp->if_flags;
   4214 
   4215 	/* Now inform the stack we're ready */
   4216 	ifp->if_flags |= IFF_RUNNING;
   4217 
   4218 	return;
   4219 } /* ixgbe_init_locked */
   4220 
   4221 /************************************************************************
   4222  * ixgbe_init
   4223  ************************************************************************/
   4224 static int
   4225 ixgbe_init(struct ifnet *ifp)
   4226 {
   4227 	struct adapter *adapter = ifp->if_softc;
   4228 
   4229 	IXGBE_CORE_LOCK(adapter);
   4230 	ixgbe_init_locked(adapter);
   4231 	IXGBE_CORE_UNLOCK(adapter);
   4232 
   4233 	return 0;	/* XXX ixgbe_init_locked cannot fail?  really? */
   4234 } /* ixgbe_init */
   4235 
   4236 /************************************************************************
   4237  * ixgbe_set_ivar
   4238  *
   4239  *   Setup the correct IVAR register for a particular MSI-X interrupt
   4240  *     (yes this is all very magic and confusing :)
   4241  *    - entry is the register array entry
   4242  *    - vector is the MSI-X vector for this queue
   4243  *    - type is RX/TX/MISC
   4244  ************************************************************************/
   4245 static void
   4246 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
   4247 {
   4248 	struct ixgbe_hw *hw = &adapter->hw;
   4249 	u32 ivar, index;
   4250 
   4251 	vector |= IXGBE_IVAR_ALLOC_VAL;
   4252 
   4253 	switch (hw->mac.type) {
   4254 	case ixgbe_mac_82598EB:
   4255 		if (type == -1)
   4256 			entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
   4257 		else
   4258 			entry += (type * 64);
   4259 		index = (entry >> 2) & 0x1F;
   4260 		ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
   4261 		ivar &= ~(0xffUL << (8 * (entry & 0x3)));
   4262 		ivar |= ((u32)vector << (8 * (entry & 0x3)));
   4263 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
   4264 		break;
   4265 	case ixgbe_mac_82599EB:
   4266 	case ixgbe_mac_X540:
   4267 	case ixgbe_mac_X550:
   4268 	case ixgbe_mac_X550EM_x:
   4269 	case ixgbe_mac_X550EM_a:
   4270 		if (type == -1) { /* MISC IVAR */
   4271 			index = (entry & 1) * 8;
   4272 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
   4273 			ivar &= ~(0xffUL << index);
   4274 			ivar |= ((u32)vector << index);
   4275 			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
   4276 		} else {	/* RX/TX IVARS */
   4277 			index = (16 * (entry & 1)) + (8 * type);
   4278 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
   4279 			ivar &= ~(0xffUL << index);
   4280 			ivar |= ((u32)vector << index);
   4281 			IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
   4282 		}
   4283 		break;
   4284 	default:
   4285 		break;
   4286 	}
   4287 } /* ixgbe_set_ivar */
   4288 
   4289 /************************************************************************
   4290  * ixgbe_configure_ivars
   4291  ************************************************************************/
   4292 static void
   4293 ixgbe_configure_ivars(struct adapter *adapter)
   4294 {
   4295 	struct ix_queue *que = adapter->queues;
   4296 	u32		newitr;
   4297 
   4298 	if (ixgbe_max_interrupt_rate > 0)
   4299 		newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
   4300 	else {
   4301 		/*
   4302 		 * Disable DMA coalescing if interrupt moderation is
   4303 		 * disabled.
   4304 		 */
   4305 		adapter->dmac = 0;
   4306 		newitr = 0;
   4307 	}
   4308 
   4309 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   4310 		struct rx_ring *rxr = &adapter->rx_rings[i];
   4311 		struct tx_ring *txr = &adapter->tx_rings[i];
   4312 		/* First the RX queue entry */
   4313 		ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
   4314 		/* ... and the TX */
   4315 		ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
   4316 		/* Set an Initial EITR value */
   4317 		ixgbe_eitr_write(adapter, que->msix, newitr);
   4318 		/*
   4319 		 * To eliminate influence of the previous state.
   4320 		 * At this point, Tx/Rx interrupt handler
   4321 		 * (ixgbe_msix_que()) cannot be called, so  both
   4322 		 * IXGBE_TX_LOCK and IXGBE_RX_LOCK are not required.
   4323 		 */
   4324 		que->eitr_setting = 0;
   4325 	}
   4326 
   4327 	/* For the Link interrupt */
   4328 	ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
   4329 } /* ixgbe_configure_ivars */
   4330 
   4331 /************************************************************************
   4332  * ixgbe_config_gpie
   4333  ************************************************************************/
   4334 static void
   4335 ixgbe_config_gpie(struct adapter *adapter)
   4336 {
   4337 	struct ixgbe_hw *hw = &adapter->hw;
   4338 	u32		gpie;
   4339 
   4340 	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
   4341 
   4342 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   4343 		/* Enable Enhanced MSI-X mode */
   4344 		gpie |= IXGBE_GPIE_MSIX_MODE
   4345 		     |	IXGBE_GPIE_EIAME
   4346 		     |	IXGBE_GPIE_PBA_SUPPORT
   4347 		     |	IXGBE_GPIE_OCD;
   4348 	}
   4349 
   4350 	/* Fan Failure Interrupt */
   4351 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
   4352 		gpie |= IXGBE_SDP1_GPIEN;
   4353 
   4354 	/* Thermal Sensor Interrupt */
   4355 	if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
   4356 		gpie |= IXGBE_SDP0_GPIEN_X540;
   4357 
   4358 	/* Link detection */
   4359 	switch (hw->mac.type) {
   4360 	case ixgbe_mac_82599EB:
   4361 		gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
   4362 		break;
   4363 	case ixgbe_mac_X550EM_x:
   4364 	case ixgbe_mac_X550EM_a:
   4365 		gpie |= IXGBE_SDP0_GPIEN_X540;
   4366 		break;
   4367 	default:
   4368 		break;
   4369 	}
   4370 
   4371 	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
   4372 
   4373 } /* ixgbe_config_gpie */
   4374 
   4375 /************************************************************************
   4376  * ixgbe_config_delay_values
   4377  *
   4378  *   Requires adapter->max_frame_size to be set.
   4379  ************************************************************************/
   4380 static void
   4381 ixgbe_config_delay_values(struct adapter *adapter)
   4382 {
   4383 	struct ixgbe_hw *hw = &adapter->hw;
   4384 	u32		rxpb, frame, size, tmp;
   4385 
   4386 	frame = adapter->max_frame_size;
   4387 
   4388 	/* Calculate High Water */
   4389 	switch (hw->mac.type) {
   4390 	case ixgbe_mac_X540:
   4391 	case ixgbe_mac_X550:
   4392 	case ixgbe_mac_X550EM_x:
   4393 	case ixgbe_mac_X550EM_a:
   4394 		tmp = IXGBE_DV_X540(frame, frame);
   4395 		break;
   4396 	default:
   4397 		tmp = IXGBE_DV(frame, frame);
   4398 		break;
   4399 	}
   4400 	size = IXGBE_BT2KB(tmp);
   4401 	rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
   4402 	hw->fc.high_water[0] = rxpb - size;
   4403 
   4404 	/* Now calculate Low Water */
   4405 	switch (hw->mac.type) {
   4406 	case ixgbe_mac_X540:
   4407 	case ixgbe_mac_X550:
   4408 	case ixgbe_mac_X550EM_x:
   4409 	case ixgbe_mac_X550EM_a:
   4410 		tmp = IXGBE_LOW_DV_X540(frame);
   4411 		break;
   4412 	default:
   4413 		tmp = IXGBE_LOW_DV(frame);
   4414 		break;
   4415 	}
   4416 	hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
   4417 
   4418 	hw->fc.pause_time = IXGBE_FC_PAUSE;
   4419 	hw->fc.send_xon = TRUE;
   4420 } /* ixgbe_config_delay_values */
   4421 
   4422 /************************************************************************
   4423  * ixgbe_set_rxfilter - Multicast Update
   4424  *
   4425  *   Called whenever multicast address list is updated.
   4426  ************************************************************************/
   4427 static void
   4428 ixgbe_set_rxfilter(struct adapter *adapter)
   4429 {
   4430 	struct ixgbe_mc_addr	*mta;
   4431 	struct ifnet		*ifp = adapter->ifp;
   4432 	u8			*update_ptr;
   4433 	int			mcnt = 0;
   4434 	u32			fctrl;
   4435 	struct ethercom		*ec = &adapter->osdep.ec;
   4436 	struct ether_multi	*enm;
   4437 	struct ether_multistep	step;
   4438 
   4439 	KASSERT(mutex_owned(&adapter->core_mtx));
   4440 	IOCTL_DEBUGOUT("ixgbe_set_rxfilter: begin");
   4441 
   4442 	mta = adapter->mta;
   4443 	bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
   4444 
   4445 	ifp->if_flags &= ~IFF_ALLMULTI;
   4446 	ETHER_LOCK(ec);
   4447 	ETHER_FIRST_MULTI(step, ec, enm);
   4448 	while (enm != NULL) {
   4449 		if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
   4450 		    (memcmp(enm->enm_addrlo, enm->enm_addrhi,
   4451 			ETHER_ADDR_LEN) != 0)) {
   4452 			ifp->if_flags |= IFF_ALLMULTI;
   4453 			break;
   4454 		}
   4455 		bcopy(enm->enm_addrlo,
   4456 		    mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
   4457 		mta[mcnt].vmdq = adapter->pool;
   4458 		mcnt++;
   4459 		ETHER_NEXT_MULTI(step, enm);
   4460 	}
   4461 	ETHER_UNLOCK(ec);
   4462 
   4463 	fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
   4464 	if (ifp->if_flags & IFF_PROMISC)
   4465 		fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
   4466 	else if (ifp->if_flags & IFF_ALLMULTI) {
   4467 		fctrl |= IXGBE_FCTRL_MPE;
   4468 		fctrl &= ~IXGBE_FCTRL_UPE;
   4469 	} else
   4470 		fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
   4471 
   4472 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
   4473 
   4474 	if (mcnt <= MAX_NUM_MULTICAST_ADDRESSES) {
   4475 		update_ptr = (u8 *)mta;
   4476 		ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
   4477 		    ixgbe_mc_array_itr, TRUE);
   4478 	}
   4479 } /* ixgbe_set_filter */
   4480 
   4481 /************************************************************************
   4482  * ixgbe_mc_array_itr
   4483  *
   4484  *   An iterator function needed by the multicast shared code.
   4485  *   It feeds the shared code routine the addresses in the
   4486  *   array of ixgbe_set_rxfilter() one by one.
   4487  ************************************************************************/
   4488 static u8 *
   4489 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
   4490 {
   4491 	struct ixgbe_mc_addr *mta;
   4492 
   4493 	mta = (struct ixgbe_mc_addr *)*update_ptr;
   4494 	*vmdq = mta->vmdq;
   4495 
   4496 	*update_ptr = (u8*)(mta + 1);
   4497 
   4498 	return (mta->addr);
   4499 } /* ixgbe_mc_array_itr */
   4500 
   4501 /************************************************************************
   4502  * ixgbe_local_timer - Timer routine
   4503  *
   4504  *   Checks for link status, updates statistics,
   4505  *   and runs the watchdog check.
   4506  ************************************************************************/
   4507 static void
   4508 ixgbe_local_timer(void *arg)
   4509 {
   4510 	struct adapter *adapter = arg;
   4511 
   4512 	IXGBE_CORE_LOCK(adapter);
   4513 	ixgbe_local_timer1(adapter);
   4514 	IXGBE_CORE_UNLOCK(adapter);
   4515 }
   4516 
   4517 static void
   4518 ixgbe_local_timer1(void *arg)
   4519 {
   4520 	struct adapter	*adapter = arg;
   4521 	device_t	dev = adapter->dev;
   4522 	struct ix_queue	*que = adapter->queues;
   4523 	u64		queues = 0;
   4524 	u64		v0, v1, v2, v3, v4, v5, v6, v7;
   4525 	int		hung = 0;
   4526 	int		i;
   4527 
   4528 	KASSERT(mutex_owned(&adapter->core_mtx));
   4529 
   4530 	/* Check for pluggable optics */
   4531 	if (adapter->sfp_probe)
   4532 		if (!ixgbe_sfp_probe(adapter))
   4533 			goto out; /* Nothing to do */
   4534 
   4535 	ixgbe_update_link_status(adapter);
   4536 	ixgbe_update_stats_counters(adapter);
   4537 
   4538 	/* Update some event counters */
   4539 	v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
   4540 	que = adapter->queues;
   4541 	for (i = 0; i < adapter->num_queues; i++, que++) {
   4542 		struct tx_ring	*txr = que->txr;
   4543 
   4544 		v0 += txr->q_efbig_tx_dma_setup;
   4545 		v1 += txr->q_mbuf_defrag_failed;
   4546 		v2 += txr->q_efbig2_tx_dma_setup;
   4547 		v3 += txr->q_einval_tx_dma_setup;
   4548 		v4 += txr->q_other_tx_dma_setup;
   4549 		v5 += txr->q_eagain_tx_dma_setup;
   4550 		v6 += txr->q_enomem_tx_dma_setup;
   4551 		v7 += txr->q_tso_err;
   4552 	}
   4553 	adapter->efbig_tx_dma_setup.ev_count = v0;
   4554 	adapter->mbuf_defrag_failed.ev_count = v1;
   4555 	adapter->efbig2_tx_dma_setup.ev_count = v2;
   4556 	adapter->einval_tx_dma_setup.ev_count = v3;
   4557 	adapter->other_tx_dma_setup.ev_count = v4;
   4558 	adapter->eagain_tx_dma_setup.ev_count = v5;
   4559 	adapter->enomem_tx_dma_setup.ev_count = v6;
   4560 	adapter->tso_err.ev_count = v7;
   4561 
   4562 	/*
   4563 	 * Check the TX queues status
   4564 	 *	- mark hung queues so we don't schedule on them
   4565 	 *	- watchdog only if all queues show hung
   4566 	 */
   4567 	que = adapter->queues;
   4568 	for (i = 0; i < adapter->num_queues; i++, que++) {
   4569 		/* Keep track of queues with work for soft irq */
   4570 		if (que->txr->busy)
   4571 			queues |= 1ULL << que->me;
   4572 		/*
   4573 		 * Each time txeof runs without cleaning, but there
   4574 		 * are uncleaned descriptors it increments busy. If
   4575 		 * we get to the MAX we declare it hung.
   4576 		 */
   4577 		if (que->busy == IXGBE_QUEUE_HUNG) {
   4578 			++hung;
   4579 			/* Mark the queue as inactive */
   4580 			adapter->active_queues &= ~(1ULL << que->me);
   4581 			continue;
   4582 		} else {
   4583 			/* Check if we've come back from hung */
   4584 			if ((adapter->active_queues & (1ULL << que->me)) == 0)
   4585 				adapter->active_queues |= 1ULL << que->me;
   4586 		}
   4587 		if (que->busy >= IXGBE_MAX_TX_BUSY) {
   4588 			device_printf(dev,
   4589 			    "Warning queue %d appears to be hung!\n", i);
   4590 			que->txr->busy = IXGBE_QUEUE_HUNG;
   4591 			++hung;
   4592 		}
   4593 	}
   4594 
   4595 	/* Only truly watchdog if all queues show hung */
   4596 	if (hung == adapter->num_queues)
   4597 		goto watchdog;
   4598 #if 0 /* XXX Avoid unexpectedly disabling interrupt forever (PR#53294) */
   4599 	else if (queues != 0) { /* Force an IRQ on queues with work */
   4600 		que = adapter->queues;
   4601 		for (i = 0; i < adapter->num_queues; i++, que++) {
   4602 			mutex_enter(&que->dc_mtx);
   4603 			if (que->disabled_count == 0)
   4604 				ixgbe_rearm_queues(adapter,
   4605 				    queues & ((u64)1 << i));
   4606 			mutex_exit(&que->dc_mtx);
   4607 		}
   4608 	}
   4609 #endif
   4610 
   4611 out:
   4612 	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
   4613 	return;
   4614 
   4615 watchdog:
   4616 	device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
   4617 	adapter->ifp->if_flags &= ~IFF_RUNNING;
   4618 	adapter->watchdog_events.ev_count++;
   4619 	ixgbe_init_locked(adapter);
   4620 } /* ixgbe_local_timer */
   4621 
   4622 /************************************************************************
   4623  * ixgbe_recovery_mode_timer - Recovery mode timer routine
   4624  ************************************************************************/
   4625 static void
   4626 ixgbe_recovery_mode_timer(void *arg)
   4627 {
   4628 	struct adapter *adapter = arg;
   4629 	struct ixgbe_hw *hw = &adapter->hw;
   4630 
   4631 	IXGBE_CORE_LOCK(adapter);
   4632 	if (ixgbe_fw_recovery_mode(hw)) {
   4633 		if (atomic_cas_uint(&adapter->recovery_mode, 0, 1)) {
   4634 			/* Firmware error detected, entering recovery mode */
   4635 			device_printf(adapter->dev, "Firmware recovery mode detected. Limiting functionality. Refer to the Intel(R) Ethernet Adapters and Devices User Guide for details on firmware recovery mode.\n");
   4636 
   4637 			if (hw->adapter_stopped == FALSE)
   4638 				ixgbe_stop_locked(adapter);
   4639 		}
   4640 	} else
   4641 		atomic_cas_uint(&adapter->recovery_mode, 1, 0);
   4642 
   4643 	callout_reset(&adapter->recovery_mode_timer, hz,
   4644 	    ixgbe_recovery_mode_timer, adapter);
   4645 	IXGBE_CORE_UNLOCK(adapter);
   4646 } /* ixgbe_recovery_mode_timer */
   4647 
   4648 /************************************************************************
   4649  * ixgbe_sfp_probe
   4650  *
   4651  *   Determine if a port had optics inserted.
   4652  ************************************************************************/
   4653 static bool
   4654 ixgbe_sfp_probe(struct adapter *adapter)
   4655 {
   4656 	struct ixgbe_hw	*hw = &adapter->hw;
   4657 	device_t	dev = adapter->dev;
   4658 	bool		result = FALSE;
   4659 
   4660 	if ((hw->phy.type == ixgbe_phy_nl) &&
   4661 	    (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
   4662 		s32 ret = hw->phy.ops.identify_sfp(hw);
   4663 		if (ret)
   4664 			goto out;
   4665 		ret = hw->phy.ops.reset(hw);
   4666 		adapter->sfp_probe = FALSE;
   4667 		if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4668 			device_printf(dev,"Unsupported SFP+ module detected!");
   4669 			device_printf(dev,
   4670 			    "Reload driver with supported module.\n");
   4671 			goto out;
   4672 		} else
   4673 			device_printf(dev, "SFP+ module detected!\n");
   4674 		/* We now have supported optics */
   4675 		result = TRUE;
   4676 	}
   4677 out:
   4678 
   4679 	return (result);
   4680 } /* ixgbe_sfp_probe */
   4681 
   4682 /************************************************************************
   4683  * ixgbe_handle_mod - Tasklet for SFP module interrupts
   4684  ************************************************************************/
   4685 static void
   4686 ixgbe_handle_mod(void *context)
   4687 {
   4688 	struct adapter	*adapter = context;
   4689 	struct ixgbe_hw *hw = &adapter->hw;
   4690 	device_t	dev = adapter->dev;
   4691 	u32		err, cage_full = 0;
   4692 
   4693 	IXGBE_CORE_LOCK(adapter);
   4694 	++adapter->mod_sicount.ev_count;
   4695 	if (adapter->hw.need_crosstalk_fix) {
   4696 		switch (hw->mac.type) {
   4697 		case ixgbe_mac_82599EB:
   4698 			cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
   4699 			    IXGBE_ESDP_SDP2;
   4700 			break;
   4701 		case ixgbe_mac_X550EM_x:
   4702 		case ixgbe_mac_X550EM_a:
   4703 			cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
   4704 			    IXGBE_ESDP_SDP0;
   4705 			break;
   4706 		default:
   4707 			break;
   4708 		}
   4709 
   4710 		if (!cage_full)
   4711 			goto out;
   4712 	}
   4713 
   4714 	err = hw->phy.ops.identify_sfp(hw);
   4715 	if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4716 		device_printf(dev,
   4717 		    "Unsupported SFP+ module type was detected.\n");
   4718 		goto out;
   4719 	}
   4720 
   4721 	if (hw->need_unsupported_sfp_recovery) {
   4722 		device_printf(dev, "Recovering from unsupported SFP\n");
   4723 		/*
   4724 		 *  We could recover the status by calling setup_sfp(),
   4725 		 * setup_link() and some others. It's complex and might not
   4726 		 * work correctly on some unknown cases. To avoid such type of
   4727 		 * problem, call ixgbe_init_locked(). It's simple and safe
   4728 		 * approach.
   4729 		 */
   4730 		ixgbe_init_locked(adapter);
   4731 	} else {
   4732 		if (hw->mac.type == ixgbe_mac_82598EB)
   4733 			err = hw->phy.ops.reset(hw);
   4734 		else {
   4735 			err = hw->mac.ops.setup_sfp(hw);
   4736 			hw->phy.sfp_setup_needed = FALSE;
   4737 		}
   4738 		if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4739 			device_printf(dev,
   4740 			    "Setup failure - unsupported SFP+ module type.\n");
   4741 			goto out;
   4742 		}
   4743 	}
   4744 	softint_schedule(adapter->msf_si);
   4745 out:
   4746 	IXGBE_CORE_UNLOCK(adapter);
   4747 } /* ixgbe_handle_mod */
   4748 
   4749 
   4750 /************************************************************************
   4751  * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
   4752  ************************************************************************/
   4753 static void
   4754 ixgbe_handle_msf(void *context)
   4755 {
   4756 	struct adapter	*adapter = context;
   4757 	struct ixgbe_hw *hw = &adapter->hw;
   4758 	u32		autoneg;
   4759 	bool		negotiate;
   4760 
   4761 	IXGBE_CORE_LOCK(adapter);
   4762 	++adapter->msf_sicount.ev_count;
   4763 	/* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
   4764 	adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
   4765 
   4766 	autoneg = hw->phy.autoneg_advertised;
   4767 	if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
   4768 		hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
   4769 	else
   4770 		negotiate = 0;
   4771 	if (hw->mac.ops.setup_link)
   4772 		hw->mac.ops.setup_link(hw, autoneg, TRUE);
   4773 
   4774 	/* Adjust media types shown in ifconfig */
   4775 	ifmedia_removeall(&adapter->media);
   4776 	ixgbe_add_media_types(adapter);
   4777 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
   4778 	IXGBE_CORE_UNLOCK(adapter);
   4779 } /* ixgbe_handle_msf */
   4780 
   4781 /************************************************************************
   4782  * ixgbe_handle_phy - Tasklet for external PHY interrupts
   4783  ************************************************************************/
   4784 static void
   4785 ixgbe_handle_phy(void *context)
   4786 {
   4787 	struct adapter	*adapter = context;
   4788 	struct ixgbe_hw *hw = &adapter->hw;
   4789 	int error;
   4790 
   4791 	++adapter->phy_sicount.ev_count;
   4792 	error = hw->phy.ops.handle_lasi(hw);
   4793 	if (error == IXGBE_ERR_OVERTEMP)
   4794 		device_printf(adapter->dev,
   4795 		    "CRITICAL: EXTERNAL PHY OVER TEMP!! "
   4796 		    " PHY will downshift to lower power state!\n");
   4797 	else if (error)
   4798 		device_printf(adapter->dev,
   4799 		    "Error handling LASI interrupt: %d\n", error);
   4800 } /* ixgbe_handle_phy */
   4801 
   4802 static void
   4803 ixgbe_ifstop(struct ifnet *ifp, int disable)
   4804 {
   4805 	struct adapter *adapter = ifp->if_softc;
   4806 
   4807 	IXGBE_CORE_LOCK(adapter);
   4808 	ixgbe_stop_locked(adapter);
   4809 	IXGBE_CORE_UNLOCK(adapter);
   4810 }
   4811 
   4812 /************************************************************************
   4813  * ixgbe_stop_locked - Stop the hardware
   4814  *
   4815  *   Disables all traffic on the adapter by issuing a
   4816  *   global reset on the MAC and deallocates TX/RX buffers.
   4817  ************************************************************************/
   4818 static void
   4819 ixgbe_stop_locked(void *arg)
   4820 {
   4821 	struct ifnet	*ifp;
   4822 	struct adapter	*adapter = arg;
   4823 	struct ixgbe_hw *hw = &adapter->hw;
   4824 
   4825 	ifp = adapter->ifp;
   4826 
   4827 	KASSERT(mutex_owned(&adapter->core_mtx));
   4828 
   4829 	INIT_DEBUGOUT("ixgbe_stop_locked: begin\n");
   4830 	ixgbe_disable_intr(adapter);
   4831 	callout_stop(&adapter->timer);
   4832 
   4833 	/* Let the stack know...*/
   4834 	ifp->if_flags &= ~IFF_RUNNING;
   4835 
   4836 	ixgbe_reset_hw(hw);
   4837 	hw->adapter_stopped = FALSE;
   4838 	ixgbe_stop_adapter(hw);
   4839 	if (hw->mac.type == ixgbe_mac_82599EB)
   4840 		ixgbe_stop_mac_link_on_d3_82599(hw);
   4841 	/* Turn off the laser - noop with no optics */
   4842 	ixgbe_disable_tx_laser(hw);
   4843 
   4844 	/* Update the stack */
   4845 	adapter->link_up = FALSE;
   4846 	ixgbe_update_link_status(adapter);
   4847 
   4848 	/* reprogram the RAR[0] in case user changed it. */
   4849 	ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
   4850 
   4851 	return;
   4852 } /* ixgbe_stop_locked */
   4853 
   4854 /************************************************************************
   4855  * ixgbe_update_link_status - Update OS on link state
   4856  *
   4857  * Note: Only updates the OS on the cached link state.
   4858  *	 The real check of the hardware only happens with
   4859  *	 a link interrupt.
   4860  ************************************************************************/
   4861 static void
   4862 ixgbe_update_link_status(struct adapter *adapter)
   4863 {
   4864 	struct ifnet	*ifp = adapter->ifp;
   4865 	device_t	dev = adapter->dev;
   4866 	struct ixgbe_hw *hw = &adapter->hw;
   4867 
   4868 	KASSERT(mutex_owned(&adapter->core_mtx));
   4869 
   4870 	if (adapter->link_up) {
   4871 		if (adapter->link_active != LINK_STATE_UP) {
   4872 			/*
   4873 			 * To eliminate influence of the previous state
   4874 			 * in the same way as ixgbe_init_locked().
   4875 			 */
   4876 			struct ix_queue	*que = adapter->queues;
   4877 			for (int i = 0; i < adapter->num_queues; i++, que++)
   4878 				que->eitr_setting = 0;
   4879 
   4880 			if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL){
   4881 				/*
   4882 				 *  Discard count for both MAC Local Fault and
   4883 				 * Remote Fault because those registers are
   4884 				 * valid only when the link speed is up and
   4885 				 * 10Gbps.
   4886 				 */
   4887 				IXGBE_READ_REG(hw, IXGBE_MLFC);
   4888 				IXGBE_READ_REG(hw, IXGBE_MRFC);
   4889 			}
   4890 
   4891 			if (bootverbose) {
   4892 				const char *bpsmsg;
   4893 
   4894 				switch (adapter->link_speed) {
   4895 				case IXGBE_LINK_SPEED_10GB_FULL:
   4896 					bpsmsg = "10 Gbps";
   4897 					break;
   4898 				case IXGBE_LINK_SPEED_5GB_FULL:
   4899 					bpsmsg = "5 Gbps";
   4900 					break;
   4901 				case IXGBE_LINK_SPEED_2_5GB_FULL:
   4902 					bpsmsg = "2.5 Gbps";
   4903 					break;
   4904 				case IXGBE_LINK_SPEED_1GB_FULL:
   4905 					bpsmsg = "1 Gbps";
   4906 					break;
   4907 				case IXGBE_LINK_SPEED_100_FULL:
   4908 					bpsmsg = "100 Mbps";
   4909 					break;
   4910 				case IXGBE_LINK_SPEED_10_FULL:
   4911 					bpsmsg = "10 Mbps";
   4912 					break;
   4913 				default:
   4914 					bpsmsg = "unknown speed";
   4915 					break;
   4916 				}
   4917 				device_printf(dev, "Link is up %s %s \n",
   4918 				    bpsmsg, "Full Duplex");
   4919 			}
   4920 			adapter->link_active = LINK_STATE_UP;
   4921 			/* Update any Flow Control changes */
   4922 			ixgbe_fc_enable(&adapter->hw);
   4923 			/* Update DMA coalescing config */
   4924 			ixgbe_config_dmac(adapter);
   4925 			if_link_state_change(ifp, LINK_STATE_UP);
   4926 
   4927 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   4928 				ixgbe_ping_all_vfs(adapter);
   4929 		}
   4930 	} else {
   4931 		/*
   4932 		 * Do it when link active changes to DOWN. i.e.
   4933 		 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
   4934 		 * b) LINK_STATE_UP	 -> LINK_STATE_DOWN
   4935 		 */
   4936 		if (adapter->link_active != LINK_STATE_DOWN) {
   4937 			if (bootverbose)
   4938 				device_printf(dev, "Link is Down\n");
   4939 			if_link_state_change(ifp, LINK_STATE_DOWN);
   4940 			adapter->link_active = LINK_STATE_DOWN;
   4941 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   4942 				ixgbe_ping_all_vfs(adapter);
   4943 			ixgbe_drain_all(adapter);
   4944 		}
   4945 	}
   4946 } /* ixgbe_update_link_status */
   4947 
   4948 /************************************************************************
   4949  * ixgbe_config_dmac - Configure DMA Coalescing
   4950  ************************************************************************/
   4951 static void
   4952 ixgbe_config_dmac(struct adapter *adapter)
   4953 {
   4954 	struct ixgbe_hw *hw = &adapter->hw;
   4955 	struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
   4956 
   4957 	if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
   4958 		return;
   4959 
   4960 	if (dcfg->watchdog_timer ^ adapter->dmac ||
   4961 	    dcfg->link_speed ^ adapter->link_speed) {
   4962 		dcfg->watchdog_timer = adapter->dmac;
   4963 		dcfg->fcoe_en = false;
   4964 		dcfg->link_speed = adapter->link_speed;
   4965 		dcfg->num_tcs = 1;
   4966 
   4967 		INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
   4968 		    dcfg->watchdog_timer, dcfg->link_speed);
   4969 
   4970 		hw->mac.ops.dmac_config(hw);
   4971 	}
   4972 } /* ixgbe_config_dmac */
   4973 
   4974 /************************************************************************
   4975  * ixgbe_enable_intr
   4976  ************************************************************************/
   4977 static void
   4978 ixgbe_enable_intr(struct adapter *adapter)
   4979 {
   4980 	struct ixgbe_hw	*hw = &adapter->hw;
   4981 	struct ix_queue	*que = adapter->queues;
   4982 	u32		mask, fwsm;
   4983 
   4984 	mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
   4985 
   4986 	switch (adapter->hw.mac.type) {
   4987 	case ixgbe_mac_82599EB:
   4988 		mask |= IXGBE_EIMS_ECC;
   4989 		/* Temperature sensor on some adapters */
   4990 		mask |= IXGBE_EIMS_GPI_SDP0;
   4991 		/* SFP+ (RX_LOS_N & MOD_ABS_N) */
   4992 		mask |= IXGBE_EIMS_GPI_SDP1;
   4993 		mask |= IXGBE_EIMS_GPI_SDP2;
   4994 		break;
   4995 	case ixgbe_mac_X540:
   4996 		/* Detect if Thermal Sensor is enabled */
   4997 		fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
   4998 		if (fwsm & IXGBE_FWSM_TS_ENABLED)
   4999 			mask |= IXGBE_EIMS_TS;
   5000 		mask |= IXGBE_EIMS_ECC;
   5001 		break;
   5002 	case ixgbe_mac_X550:
   5003 		/* MAC thermal sensor is automatically enabled */
   5004 		mask |= IXGBE_EIMS_TS;
   5005 		mask |= IXGBE_EIMS_ECC;
   5006 		break;
   5007 	case ixgbe_mac_X550EM_x:
   5008 	case ixgbe_mac_X550EM_a:
   5009 		/* Some devices use SDP0 for important information */
   5010 		if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
   5011 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
   5012 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
   5013 		    hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
   5014 			mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
   5015 		if (hw->phy.type == ixgbe_phy_x550em_ext_t)
   5016 			mask |= IXGBE_EICR_GPI_SDP0_X540;
   5017 		mask |= IXGBE_EIMS_ECC;
   5018 		break;
   5019 	default:
   5020 		break;
   5021 	}
   5022 
   5023 	/* Enable Fan Failure detection */
   5024 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
   5025 		mask |= IXGBE_EIMS_GPI_SDP1;
   5026 	/* Enable SR-IOV */
   5027 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   5028 		mask |= IXGBE_EIMS_MAILBOX;
   5029 	/* Enable Flow Director */
   5030 	if (adapter->feat_en & IXGBE_FEATURE_FDIR)
   5031 		mask |= IXGBE_EIMS_FLOW_DIR;
   5032 
   5033 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
   5034 
   5035 	/* With MSI-X we use auto clear */
   5036 	if (adapter->msix_mem) {
   5037 		/*
   5038 		 * We use auto clear for RTX_QUEUE only. Don't use other
   5039 		 * interrupts (e.g. link interrupt). BTW, we don't use
   5040 		 *  TCP_TIMER interrupt itself.
   5041 		 */
   5042 		IXGBE_WRITE_REG(hw, IXGBE_EIAC, IXGBE_EIMS_RTX_QUEUE);
   5043 	}
   5044 
   5045 	/*
   5046 	 * Now enable all queues, this is done separately to
   5047 	 * allow for handling the extended (beyond 32) MSI-X
   5048 	 * vectors that can be used by 82599
   5049 	 */
   5050 	for (int i = 0; i < adapter->num_queues; i++, que++)
   5051 		ixgbe_enable_queue(adapter, que->msix);
   5052 
   5053 	IXGBE_WRITE_FLUSH(hw);
   5054 
   5055 } /* ixgbe_enable_intr */
   5056 
   5057 /************************************************************************
   5058  * ixgbe_disable_intr_internal
   5059  ************************************************************************/
   5060 static void
   5061 ixgbe_disable_intr_internal(struct adapter *adapter, bool nestok)
   5062 {
   5063 	struct ix_queue	*que = adapter->queues;
   5064 
   5065 	/* disable interrupts other than queues */
   5066 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~IXGBE_EIMC_RTX_QUEUE);
   5067 
   5068 	if (adapter->msix_mem)
   5069 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
   5070 
   5071 	for (int i = 0; i < adapter->num_queues; i++, que++)
   5072 		ixgbe_disable_queue_internal(adapter, que->msix, nestok);
   5073 
   5074 	IXGBE_WRITE_FLUSH(&adapter->hw);
   5075 
   5076 } /* ixgbe_do_disable_intr_internal */
   5077 
   5078 /************************************************************************
   5079  * ixgbe_disable_intr
   5080  ************************************************************************/
   5081 static void
   5082 ixgbe_disable_intr(struct adapter *adapter)
   5083 {
   5084 
   5085 	ixgbe_disable_intr_internal(adapter, true);
   5086 } /* ixgbe_disable_intr */
   5087 
   5088 /************************************************************************
   5089  * ixgbe_ensure_disabled_intr
   5090  ************************************************************************/
   5091 void
   5092 ixgbe_ensure_disabled_intr(struct adapter *adapter)
   5093 {
   5094 
   5095 	ixgbe_disable_intr_internal(adapter, false);
   5096 } /* ixgbe_ensure_disabled_intr */
   5097 
   5098 /************************************************************************
   5099  * ixgbe_legacy_irq - Legacy Interrupt Service routine
   5100  ************************************************************************/
   5101 static int
   5102 ixgbe_legacy_irq(void *arg)
   5103 {
   5104 	struct ix_queue *que = arg;
   5105 	struct adapter	*adapter = que->adapter;
   5106 	struct ixgbe_hw	*hw = &adapter->hw;
   5107 	struct ifnet	*ifp = adapter->ifp;
   5108 	struct		tx_ring *txr = adapter->tx_rings;
   5109 	bool		more = false;
   5110 	u32		eicr;
   5111 	u32		eims_orig;
   5112 
   5113 	eims_orig = IXGBE_READ_REG(hw, IXGBE_EIMS);
   5114 	/*
   5115 	 * Silicon errata #26 on 82598. Disable all interrupts before reading
   5116 	 * EICR.
   5117 	 */
   5118 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
   5119 
   5120 	eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
   5121 
   5122 	if (eicr == 0) {
   5123 		adapter->stats.pf.intzero.ev_count++;
   5124 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, eims_orig);
   5125 		return 0;
   5126 	}
   5127 	adapter->stats.pf.legint.ev_count++;
   5128 
   5129 	/* Queue (0) intr */
   5130 	if (((ifp->if_flags & IFF_RUNNING) != 0) &&
   5131 	    (eicr & IXGBE_EIMC_RTX_QUEUE) != 0) {
   5132 		++que->irqs.ev_count;
   5133 
   5134 		/*
   5135 		 * The same as ixgbe_msix_que() about
   5136 		 * "que->txrx_use_workqueue".
   5137 		 */
   5138 		que->txrx_use_workqueue = adapter->txrx_use_workqueue;
   5139 
   5140 #ifdef __NetBSD__
   5141 		/* Don't run ixgbe_rxeof in interrupt context */
   5142 		more = true;
   5143 #else
   5144 		more = ixgbe_rxeof(que);
   5145 #endif
   5146 
   5147 		IXGBE_TX_LOCK(txr);
   5148 		ixgbe_txeof(txr);
   5149 #ifdef notyet
   5150 		if (!ixgbe_ring_empty(ifp, txr->br))
   5151 			ixgbe_start_locked(ifp, txr);
   5152 #endif
   5153 		IXGBE_TX_UNLOCK(txr);
   5154 	}
   5155 
   5156 	/* Check for fan failure */
   5157 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
   5158 		ixgbe_check_fan_failure(adapter, eicr, true);
   5159 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   5160 	}
   5161 
   5162 	/* Link status change */
   5163 	if (eicr & IXGBE_EICR_LSC)
   5164 		softint_schedule(adapter->link_si);
   5165 
   5166 	if (ixgbe_is_sfp(hw)) {
   5167 		u32 eicr_mask;
   5168 
   5169 		/* Pluggable optics-related interrupt */
   5170 		if (hw->mac.type >= ixgbe_mac_X540)
   5171 			eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
   5172 		else
   5173 			eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
   5174 
   5175 		if (eicr & eicr_mask) {
   5176 			IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
   5177 			softint_schedule(adapter->mod_si);
   5178 		}
   5179 
   5180 		if ((hw->mac.type == ixgbe_mac_82599EB) &&
   5181 		    (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
   5182 			IXGBE_WRITE_REG(hw, IXGBE_EICR,
   5183 			    IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   5184 			softint_schedule(adapter->msf_si);
   5185 		}
   5186 	}
   5187 
   5188 	/* External PHY interrupt */
   5189 	if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
   5190 	    (eicr & IXGBE_EICR_GPI_SDP0_X540))
   5191 		softint_schedule(adapter->phy_si);
   5192 
   5193 	if (more) {
   5194 		que->req.ev_count++;
   5195 		ixgbe_sched_handle_que(adapter, que);
   5196 	} else
   5197 		ixgbe_enable_intr(adapter);
   5198 
   5199 	return 1;
   5200 } /* ixgbe_legacy_irq */
   5201 
   5202 /************************************************************************
   5203  * ixgbe_free_pciintr_resources
   5204  ************************************************************************/
   5205 static void
   5206 ixgbe_free_pciintr_resources(struct adapter *adapter)
   5207 {
   5208 	struct ix_queue *que = adapter->queues;
   5209 	int		rid;
   5210 
   5211 	/*
   5212 	 * Release all msix queue resources:
   5213 	 */
   5214 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   5215 		if (que->res != NULL) {
   5216 			pci_intr_disestablish(adapter->osdep.pc,
   5217 			    adapter->osdep.ihs[i]);
   5218 			adapter->osdep.ihs[i] = NULL;
   5219 		}
   5220 	}
   5221 
   5222 	/* Clean the Legacy or Link interrupt last */
   5223 	if (adapter->vector) /* we are doing MSIX */
   5224 		rid = adapter->vector;
   5225 	else
   5226 		rid = 0;
   5227 
   5228 	if (adapter->osdep.ihs[rid] != NULL) {
   5229 		pci_intr_disestablish(adapter->osdep.pc,
   5230 		    adapter->osdep.ihs[rid]);
   5231 		adapter->osdep.ihs[rid] = NULL;
   5232 	}
   5233 
   5234 	if (adapter->osdep.intrs != NULL) {
   5235 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
   5236 		    adapter->osdep.nintrs);
   5237 		adapter->osdep.intrs = NULL;
   5238 	}
   5239 } /* ixgbe_free_pciintr_resources */
   5240 
   5241 /************************************************************************
   5242  * ixgbe_free_pci_resources
   5243  ************************************************************************/
   5244 static void
   5245 ixgbe_free_pci_resources(struct adapter *adapter)
   5246 {
   5247 
   5248 	ixgbe_free_pciintr_resources(adapter);
   5249 
   5250 	if (adapter->osdep.mem_size != 0) {
   5251 		bus_space_unmap(adapter->osdep.mem_bus_space_tag,
   5252 		    adapter->osdep.mem_bus_space_handle,
   5253 		    adapter->osdep.mem_size);
   5254 	}
   5255 
   5256 } /* ixgbe_free_pci_resources */
   5257 
   5258 /************************************************************************
   5259  * ixgbe_sysctl_flowcntl
   5260  *
   5261  *   SYSCTL wrapper around setting Flow Control
   5262  ************************************************************************/
   5263 static int
   5264 ixgbe_sysctl_flowcntl(SYSCTLFN_ARGS)
   5265 {
   5266 	struct sysctlnode node = *rnode;
   5267 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5268 	int error, fc;
   5269 
   5270 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5271 		return (EPERM);
   5272 
   5273 	fc = adapter->hw.fc.current_mode;
   5274 	node.sysctl_data = &fc;
   5275 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5276 	if (error != 0 || newp == NULL)
   5277 		return error;
   5278 
   5279 	/* Don't bother if it's not changed */
   5280 	if (fc == adapter->hw.fc.current_mode)
   5281 		return (0);
   5282 
   5283 	return ixgbe_set_flowcntl(adapter, fc);
   5284 } /* ixgbe_sysctl_flowcntl */
   5285 
   5286 /************************************************************************
   5287  * ixgbe_set_flowcntl - Set flow control
   5288  *
   5289  *   Flow control values:
   5290  *     0 - off
   5291  *     1 - rx pause
   5292  *     2 - tx pause
   5293  *     3 - full
   5294  ************************************************************************/
   5295 static int
   5296 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
   5297 {
   5298 	switch (fc) {
   5299 		case ixgbe_fc_rx_pause:
   5300 		case ixgbe_fc_tx_pause:
   5301 		case ixgbe_fc_full:
   5302 			adapter->hw.fc.requested_mode = fc;
   5303 			if (adapter->num_queues > 1)
   5304 				ixgbe_disable_rx_drop(adapter);
   5305 			break;
   5306 		case ixgbe_fc_none:
   5307 			adapter->hw.fc.requested_mode = ixgbe_fc_none;
   5308 			if (adapter->num_queues > 1)
   5309 				ixgbe_enable_rx_drop(adapter);
   5310 			break;
   5311 		default:
   5312 			return (EINVAL);
   5313 	}
   5314 
   5315 #if 0 /* XXX NetBSD */
   5316 	/* Don't autoneg if forcing a value */
   5317 	adapter->hw.fc.disable_fc_autoneg = TRUE;
   5318 #endif
   5319 	ixgbe_fc_enable(&adapter->hw);
   5320 
   5321 	return (0);
   5322 } /* ixgbe_set_flowcntl */
   5323 
   5324 /************************************************************************
   5325  * ixgbe_enable_rx_drop
   5326  *
   5327  *   Enable the hardware to drop packets when the buffer is
   5328  *   full. This is useful with multiqueue, so that no single
   5329  *   queue being full stalls the entire RX engine. We only
   5330  *   enable this when Multiqueue is enabled AND Flow Control
   5331  *   is disabled.
   5332  ************************************************************************/
   5333 static void
   5334 ixgbe_enable_rx_drop(struct adapter *adapter)
   5335 {
   5336 	struct ixgbe_hw *hw = &adapter->hw;
   5337 	struct rx_ring	*rxr;
   5338 	u32		srrctl;
   5339 
   5340 	for (int i = 0; i < adapter->num_queues; i++) {
   5341 		rxr = &adapter->rx_rings[i];
   5342 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
   5343 		srrctl |= IXGBE_SRRCTL_DROP_EN;
   5344 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
   5345 	}
   5346 
   5347 	/* enable drop for each vf */
   5348 	for (int i = 0; i < adapter->num_vfs; i++) {
   5349 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
   5350 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
   5351 		    IXGBE_QDE_ENABLE));
   5352 	}
   5353 } /* ixgbe_enable_rx_drop */
   5354 
   5355 /************************************************************************
   5356  * ixgbe_disable_rx_drop
   5357  ************************************************************************/
   5358 static void
   5359 ixgbe_disable_rx_drop(struct adapter *adapter)
   5360 {
   5361 	struct ixgbe_hw *hw = &adapter->hw;
   5362 	struct rx_ring	*rxr;
   5363 	u32		srrctl;
   5364 
   5365 	for (int i = 0; i < adapter->num_queues; i++) {
   5366 		rxr = &adapter->rx_rings[i];
   5367 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
   5368 		srrctl &= ~IXGBE_SRRCTL_DROP_EN;
   5369 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
   5370 	}
   5371 
   5372 	/* disable drop for each vf */
   5373 	for (int i = 0; i < adapter->num_vfs; i++) {
   5374 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
   5375 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
   5376 	}
   5377 } /* ixgbe_disable_rx_drop */
   5378 
   5379 /************************************************************************
   5380  * ixgbe_sysctl_advertise
   5381  *
   5382  *   SYSCTL wrapper around setting advertised speed
   5383  ************************************************************************/
   5384 static int
   5385 ixgbe_sysctl_advertise(SYSCTLFN_ARGS)
   5386 {
   5387 	struct sysctlnode node = *rnode;
   5388 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5389 	int	       error = 0, advertise;
   5390 
   5391 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5392 		return (EPERM);
   5393 
   5394 	advertise = adapter->advertise;
   5395 	node.sysctl_data = &advertise;
   5396 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5397 	if (error != 0 || newp == NULL)
   5398 		return error;
   5399 
   5400 	return ixgbe_set_advertise(adapter, advertise);
   5401 } /* ixgbe_sysctl_advertise */
   5402 
   5403 /************************************************************************
   5404  * ixgbe_set_advertise - Control advertised link speed
   5405  *
   5406  *   Flags:
   5407  *     0x00 - Default (all capable link speed)
   5408  *     0x1  - advertise 100 Mb
   5409  *     0x2  - advertise 1G
   5410  *     0x4  - advertise 10G
   5411  *     0x8  - advertise 10 Mb (yes, Mb)
   5412  *     0x10 - advertise 2.5G
   5413  *     0x20 - advertise 5G
   5414  ************************************************************************/
   5415 static int
   5416 ixgbe_set_advertise(struct adapter *adapter, int advertise)
   5417 {
   5418 	device_t	 dev;
   5419 	struct ixgbe_hw	 *hw;
   5420 	ixgbe_link_speed speed = 0;
   5421 	ixgbe_link_speed link_caps = 0;
   5422 	s32		 err = IXGBE_NOT_IMPLEMENTED;
   5423 	bool		 negotiate = FALSE;
   5424 
   5425 	/* Checks to validate new value */
   5426 	if (adapter->advertise == advertise) /* no change */
   5427 		return (0);
   5428 
   5429 	dev = adapter->dev;
   5430 	hw = &adapter->hw;
   5431 
   5432 	/* No speed changes for backplane media */
   5433 	if (hw->phy.media_type == ixgbe_media_type_backplane)
   5434 		return (ENODEV);
   5435 
   5436 	if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
   5437 	    (hw->phy.multispeed_fiber))) {
   5438 		device_printf(dev,
   5439 		    "Advertised speed can only be set on copper or "
   5440 		    "multispeed fiber media types.\n");
   5441 		return (EINVAL);
   5442 	}
   5443 
   5444 	if (advertise < 0x0 || advertise > 0x3f) {
   5445 		device_printf(dev, "Invalid advertised speed; valid modes are 0x0 through 0x3f\n");
   5446 		return (EINVAL);
   5447 	}
   5448 
   5449 	if (hw->mac.ops.get_link_capabilities) {
   5450 		err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
   5451 		    &negotiate);
   5452 		if (err != IXGBE_SUCCESS) {
   5453 			device_printf(dev, "Unable to determine supported advertise speeds\n");
   5454 			return (ENODEV);
   5455 		}
   5456 	}
   5457 
   5458 	/* Set new value and report new advertised mode */
   5459 	if (advertise & 0x1) {
   5460 		if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
   5461 			device_printf(dev, "Interface does not support 100Mb advertised speed\n");
   5462 			return (EINVAL);
   5463 		}
   5464 		speed |= IXGBE_LINK_SPEED_100_FULL;
   5465 	}
   5466 	if (advertise & 0x2) {
   5467 		if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
   5468 			device_printf(dev, "Interface does not support 1Gb advertised speed\n");
   5469 			return (EINVAL);
   5470 		}
   5471 		speed |= IXGBE_LINK_SPEED_1GB_FULL;
   5472 	}
   5473 	if (advertise & 0x4) {
   5474 		if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
   5475 			device_printf(dev, "Interface does not support 10Gb advertised speed\n");
   5476 			return (EINVAL);
   5477 		}
   5478 		speed |= IXGBE_LINK_SPEED_10GB_FULL;
   5479 	}
   5480 	if (advertise & 0x8) {
   5481 		if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
   5482 			device_printf(dev, "Interface does not support 10Mb advertised speed\n");
   5483 			return (EINVAL);
   5484 		}
   5485 		speed |= IXGBE_LINK_SPEED_10_FULL;
   5486 	}
   5487 	if (advertise & 0x10) {
   5488 		if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
   5489 			device_printf(dev, "Interface does not support 2.5Gb advertised speed\n");
   5490 			return (EINVAL);
   5491 		}
   5492 		speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
   5493 	}
   5494 	if (advertise & 0x20) {
   5495 		if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
   5496 			device_printf(dev, "Interface does not support 5Gb advertised speed\n");
   5497 			return (EINVAL);
   5498 		}
   5499 		speed |= IXGBE_LINK_SPEED_5GB_FULL;
   5500 	}
   5501 	if (advertise == 0)
   5502 		speed = link_caps; /* All capable link speed */
   5503 
   5504 	hw->mac.autotry_restart = TRUE;
   5505 	hw->mac.ops.setup_link(hw, speed, TRUE);
   5506 	adapter->advertise = advertise;
   5507 
   5508 	return (0);
   5509 } /* ixgbe_set_advertise */
   5510 
   5511 /************************************************************************
   5512  * ixgbe_get_default_advertise - Get default advertised speed settings
   5513  *
   5514  *   Formatted for sysctl usage.
   5515  *   Flags:
   5516  *     0x1  - advertise 100 Mb
   5517  *     0x2  - advertise 1G
   5518  *     0x4  - advertise 10G
   5519  *     0x8  - advertise 10 Mb (yes, Mb)
   5520  *     0x10 - advertise 2.5G
   5521  *     0x20 - advertise 5G
   5522  ************************************************************************/
   5523 static int
   5524 ixgbe_get_default_advertise(struct adapter *adapter)
   5525 {
   5526 	struct ixgbe_hw	 *hw = &adapter->hw;
   5527 	int		 speed;
   5528 	ixgbe_link_speed link_caps = 0;
   5529 	s32		 err;
   5530 	bool		 negotiate = FALSE;
   5531 
   5532 	/*
   5533 	 * Advertised speed means nothing unless it's copper or
   5534 	 * multi-speed fiber
   5535 	 */
   5536 	if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
   5537 	    !(hw->phy.multispeed_fiber))
   5538 		return (0);
   5539 
   5540 	err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
   5541 	if (err != IXGBE_SUCCESS)
   5542 		return (0);
   5543 
   5544 	speed =
   5545 	    ((link_caps & IXGBE_LINK_SPEED_10GB_FULL)  ? 0x4  : 0) |
   5546 	    ((link_caps & IXGBE_LINK_SPEED_5GB_FULL)   ? 0x20 : 0) |
   5547 	    ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
   5548 	    ((link_caps & IXGBE_LINK_SPEED_1GB_FULL)   ? 0x2  : 0) |
   5549 	    ((link_caps & IXGBE_LINK_SPEED_100_FULL)   ? 0x1  : 0) |
   5550 	    ((link_caps & IXGBE_LINK_SPEED_10_FULL)    ? 0x8  : 0);
   5551 
   5552 	return speed;
   5553 } /* ixgbe_get_default_advertise */
   5554 
   5555 /************************************************************************
   5556  * ixgbe_sysctl_dmac - Manage DMA Coalescing
   5557  *
   5558  *   Control values:
   5559  *     0/1 - off / on (use default value of 1000)
   5560  *
   5561  *     Legal timer values are:
   5562  *     50,100,250,500,1000,2000,5000,10000
   5563  *
   5564  *     Turning off interrupt moderation will also turn this off.
   5565  ************************************************************************/
   5566 static int
   5567 ixgbe_sysctl_dmac(SYSCTLFN_ARGS)
   5568 {
   5569 	struct sysctlnode node = *rnode;
   5570 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5571 	struct ifnet   *ifp = adapter->ifp;
   5572 	int	       error;
   5573 	int	       newval;
   5574 
   5575 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5576 		return (EPERM);
   5577 
   5578 	newval = adapter->dmac;
   5579 	node.sysctl_data = &newval;
   5580 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5581 	if ((error) || (newp == NULL))
   5582 		return (error);
   5583 
   5584 	switch (newval) {
   5585 	case 0:
   5586 		/* Disabled */
   5587 		adapter->dmac = 0;
   5588 		break;
   5589 	case 1:
   5590 		/* Enable and use default */
   5591 		adapter->dmac = 1000;
   5592 		break;
   5593 	case 50:
   5594 	case 100:
   5595 	case 250:
   5596 	case 500:
   5597 	case 1000:
   5598 	case 2000:
   5599 	case 5000:
   5600 	case 10000:
   5601 		/* Legal values - allow */
   5602 		adapter->dmac = newval;
   5603 		break;
   5604 	default:
   5605 		/* Do nothing, illegal value */
   5606 		return (EINVAL);
   5607 	}
   5608 
   5609 	/* Re-initialize hardware if it's already running */
   5610 	if (ifp->if_flags & IFF_RUNNING)
   5611 		ifp->if_init(ifp);
   5612 
   5613 	return (0);
   5614 }
   5615 
   5616 #ifdef IXGBE_DEBUG
   5617 /************************************************************************
   5618  * ixgbe_sysctl_power_state
   5619  *
   5620  *   Sysctl to test power states
   5621  *   Values:
   5622  *     0      - set device to D0
   5623  *     3      - set device to D3
   5624  *     (none) - get current device power state
   5625  ************************************************************************/
   5626 static int
   5627 ixgbe_sysctl_power_state(SYSCTLFN_ARGS)
   5628 {
   5629 #ifdef notyet
   5630 	struct sysctlnode node = *rnode;
   5631 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5632 	device_t       dev =  adapter->dev;
   5633 	int	       curr_ps, new_ps, error = 0;
   5634 
   5635 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5636 		return (EPERM);
   5637 
   5638 	curr_ps = new_ps = pci_get_powerstate(dev);
   5639 
   5640 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5641 	if ((error) || (req->newp == NULL))
   5642 		return (error);
   5643 
   5644 	if (new_ps == curr_ps)
   5645 		return (0);
   5646 
   5647 	if (new_ps == 3 && curr_ps == 0)
   5648 		error = DEVICE_SUSPEND(dev);
   5649 	else if (new_ps == 0 && curr_ps == 3)
   5650 		error = DEVICE_RESUME(dev);
   5651 	else
   5652 		return (EINVAL);
   5653 
   5654 	device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
   5655 
   5656 	return (error);
   5657 #else
   5658 	return 0;
   5659 #endif
   5660 } /* ixgbe_sysctl_power_state */
   5661 #endif
   5662 
   5663 /************************************************************************
   5664  * ixgbe_sysctl_wol_enable
   5665  *
   5666  *   Sysctl to enable/disable the WoL capability,
   5667  *   if supported by the adapter.
   5668  *
   5669  *   Values:
   5670  *     0 - disabled
   5671  *     1 - enabled
   5672  ************************************************************************/
   5673 static int
   5674 ixgbe_sysctl_wol_enable(SYSCTLFN_ARGS)
   5675 {
   5676 	struct sysctlnode node = *rnode;
   5677 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5678 	struct ixgbe_hw *hw = &adapter->hw;
   5679 	bool		new_wol_enabled;
   5680 	int		error = 0;
   5681 
   5682 	/*
   5683 	 * It's not required to check recovery mode because this function never
   5684 	 * touches hardware.
   5685 	 */
   5686 	new_wol_enabled = hw->wol_enabled;
   5687 	node.sysctl_data = &new_wol_enabled;
   5688 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5689 	if ((error) || (newp == NULL))
   5690 		return (error);
   5691 	if (new_wol_enabled == hw->wol_enabled)
   5692 		return (0);
   5693 
   5694 	if (new_wol_enabled && !adapter->wol_support)
   5695 		return (ENODEV);
   5696 	else
   5697 		hw->wol_enabled = new_wol_enabled;
   5698 
   5699 	return (0);
   5700 } /* ixgbe_sysctl_wol_enable */
   5701 
   5702 /************************************************************************
   5703  * ixgbe_sysctl_wufc - Wake Up Filter Control
   5704  *
   5705  *   Sysctl to enable/disable the types of packets that the
   5706  *   adapter will wake up on upon receipt.
   5707  *   Flags:
   5708  *     0x1  - Link Status Change
   5709  *     0x2  - Magic Packet
   5710  *     0x4  - Direct Exact
   5711  *     0x8  - Directed Multicast
   5712  *     0x10 - Broadcast
   5713  *     0x20 - ARP/IPv4 Request Packet
   5714  *     0x40 - Direct IPv4 Packet
   5715  *     0x80 - Direct IPv6 Packet
   5716  *
   5717  *   Settings not listed above will cause the sysctl to return an error.
   5718  ************************************************************************/
   5719 static int
   5720 ixgbe_sysctl_wufc(SYSCTLFN_ARGS)
   5721 {
   5722 	struct sysctlnode node = *rnode;
   5723 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5724 	int error = 0;
   5725 	u32 new_wufc;
   5726 
   5727 	/*
   5728 	 * It's not required to check recovery mode because this function never
   5729 	 * touches hardware.
   5730 	 */
   5731 	new_wufc = adapter->wufc;
   5732 	node.sysctl_data = &new_wufc;
   5733 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5734 	if ((error) || (newp == NULL))
   5735 		return (error);
   5736 	if (new_wufc == adapter->wufc)
   5737 		return (0);
   5738 
   5739 	if (new_wufc & 0xffffff00)
   5740 		return (EINVAL);
   5741 
   5742 	new_wufc &= 0xff;
   5743 	new_wufc |= (0xffffff & adapter->wufc);
   5744 	adapter->wufc = new_wufc;
   5745 
   5746 	return (0);
   5747 } /* ixgbe_sysctl_wufc */
   5748 
   5749 #ifdef IXGBE_DEBUG
   5750 /************************************************************************
   5751  * ixgbe_sysctl_print_rss_config
   5752  ************************************************************************/
   5753 static int
   5754 ixgbe_sysctl_print_rss_config(SYSCTLFN_ARGS)
   5755 {
   5756 #ifdef notyet
   5757 	struct sysctlnode node = *rnode;
   5758 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5759 	struct ixgbe_hw *hw = &adapter->hw;
   5760 	device_t	dev = adapter->dev;
   5761 	struct sbuf	*buf;
   5762 	int		error = 0, reta_size;
   5763 	u32		reg;
   5764 
   5765 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5766 		return (EPERM);
   5767 
   5768 	buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
   5769 	if (!buf) {
   5770 		device_printf(dev, "Could not allocate sbuf for output.\n");
   5771 		return (ENOMEM);
   5772 	}
   5773 
   5774 	// TODO: use sbufs to make a string to print out
   5775 	/* Set multiplier for RETA setup and table size based on MAC */
   5776 	switch (adapter->hw.mac.type) {
   5777 	case ixgbe_mac_X550:
   5778 	case ixgbe_mac_X550EM_x:
   5779 	case ixgbe_mac_X550EM_a:
   5780 		reta_size = 128;
   5781 		break;
   5782 	default:
   5783 		reta_size = 32;
   5784 		break;
   5785 	}
   5786 
   5787 	/* Print out the redirection table */
   5788 	sbuf_cat(buf, "\n");
   5789 	for (int i = 0; i < reta_size; i++) {
   5790 		if (i < 32) {
   5791 			reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
   5792 			sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
   5793 		} else {
   5794 			reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
   5795 			sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
   5796 		}
   5797 	}
   5798 
   5799 	// TODO: print more config
   5800 
   5801 	error = sbuf_finish(buf);
   5802 	if (error)
   5803 		device_printf(dev, "Error finishing sbuf: %d\n", error);
   5804 
   5805 	sbuf_delete(buf);
   5806 #endif
   5807 	return (0);
   5808 } /* ixgbe_sysctl_print_rss_config */
   5809 #endif /* IXGBE_DEBUG */
   5810 
   5811 /************************************************************************
   5812  * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
   5813  *
   5814  *   For X552/X557-AT devices using an external PHY
   5815  ************************************************************************/
   5816 static int
   5817 ixgbe_sysctl_phy_temp(SYSCTLFN_ARGS)
   5818 {
   5819 	struct sysctlnode node = *rnode;
   5820 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5821 	struct ixgbe_hw *hw = &adapter->hw;
   5822 	int val;
   5823 	u16 reg;
   5824 	int		error;
   5825 
   5826 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5827 		return (EPERM);
   5828 
   5829 	if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
   5830 		device_printf(adapter->dev,
   5831 		    "Device has no supported external thermal sensor.\n");
   5832 		return (ENODEV);
   5833 	}
   5834 
   5835 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
   5836 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
   5837 		device_printf(adapter->dev,
   5838 		    "Error reading from PHY's current temperature register\n");
   5839 		return (EAGAIN);
   5840 	}
   5841 
   5842 	node.sysctl_data = &val;
   5843 
   5844 	/* Shift temp for output */
   5845 	val = reg >> 8;
   5846 
   5847 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5848 	if ((error) || (newp == NULL))
   5849 		return (error);
   5850 
   5851 	return (0);
   5852 } /* ixgbe_sysctl_phy_temp */
   5853 
   5854 /************************************************************************
   5855  * ixgbe_sysctl_phy_overtemp_occurred
   5856  *
   5857  *   Reports (directly from the PHY) whether the current PHY
   5858  *   temperature is over the overtemp threshold.
   5859  ************************************************************************/
   5860 static int
   5861 ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_ARGS)
   5862 {
   5863 	struct sysctlnode node = *rnode;
   5864 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5865 	struct ixgbe_hw *hw = &adapter->hw;
   5866 	int val, error;
   5867 	u16 reg;
   5868 
   5869 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5870 		return (EPERM);
   5871 
   5872 	if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
   5873 		device_printf(adapter->dev,
   5874 		    "Device has no supported external thermal sensor.\n");
   5875 		return (ENODEV);
   5876 	}
   5877 
   5878 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
   5879 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
   5880 		device_printf(adapter->dev,
   5881 		    "Error reading from PHY's temperature status register\n");
   5882 		return (EAGAIN);
   5883 	}
   5884 
   5885 	node.sysctl_data = &val;
   5886 
   5887 	/* Get occurrence bit */
   5888 	val = !!(reg & 0x4000);
   5889 
   5890 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5891 	if ((error) || (newp == NULL))
   5892 		return (error);
   5893 
   5894 	return (0);
   5895 } /* ixgbe_sysctl_phy_overtemp_occurred */
   5896 
   5897 /************************************************************************
   5898  * ixgbe_sysctl_eee_state
   5899  *
   5900  *   Sysctl to set EEE power saving feature
   5901  *   Values:
   5902  *     0      - disable EEE
   5903  *     1      - enable EEE
   5904  *     (none) - get current device EEE state
   5905  ************************************************************************/
   5906 static int
   5907 ixgbe_sysctl_eee_state(SYSCTLFN_ARGS)
   5908 {
   5909 	struct sysctlnode node = *rnode;
   5910 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5911 	struct ifnet   *ifp = adapter->ifp;
   5912 	device_t       dev = adapter->dev;
   5913 	int	       curr_eee, new_eee, error = 0;
   5914 	s32	       retval;
   5915 
   5916 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5917 		return (EPERM);
   5918 
   5919 	curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
   5920 	node.sysctl_data = &new_eee;
   5921 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5922 	if ((error) || (newp == NULL))
   5923 		return (error);
   5924 
   5925 	/* Nothing to do */
   5926 	if (new_eee == curr_eee)
   5927 		return (0);
   5928 
   5929 	/* Not supported */
   5930 	if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
   5931 		return (EINVAL);
   5932 
   5933 	/* Bounds checking */
   5934 	if ((new_eee < 0) || (new_eee > 1))
   5935 		return (EINVAL);
   5936 
   5937 	retval = ixgbe_setup_eee(&adapter->hw, new_eee);
   5938 	if (retval) {
   5939 		device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
   5940 		return (EINVAL);
   5941 	}
   5942 
   5943 	/* Restart auto-neg */
   5944 	ifp->if_init(ifp);
   5945 
   5946 	device_printf(dev, "New EEE state: %d\n", new_eee);
   5947 
   5948 	/* Cache new value */
   5949 	if (new_eee)
   5950 		adapter->feat_en |= IXGBE_FEATURE_EEE;
   5951 	else
   5952 		adapter->feat_en &= ~IXGBE_FEATURE_EEE;
   5953 
   5954 	return (error);
   5955 } /* ixgbe_sysctl_eee_state */
   5956 
   5957 #define PRINTQS(adapter, regname)					\
   5958 	do {								\
   5959 		struct ixgbe_hw	*_hw = &(adapter)->hw;			\
   5960 		int _i;							\
   5961 									\
   5962 		printf("%s: %s", device_xname((adapter)->dev), #regname); \
   5963 		for (_i = 0; _i < (adapter)->num_queues; _i++) {	\
   5964 			printf((_i == 0) ? "\t" : " ");			\
   5965 			printf("%08x", IXGBE_READ_REG(_hw,		\
   5966 				IXGBE_##regname(_i)));			\
   5967 		}							\
   5968 		printf("\n");						\
   5969 	} while (0)
   5970 
   5971 /************************************************************************
   5972  * ixgbe_print_debug_info
   5973  *
   5974  *   Called only when em_display_debug_stats is enabled.
   5975  *   Provides a way to take a look at important statistics
   5976  *   maintained by the driver and hardware.
   5977  ************************************************************************/
   5978 static void
   5979 ixgbe_print_debug_info(struct adapter *adapter)
   5980 {
   5981 	device_t	dev = adapter->dev;
   5982 	struct ixgbe_hw *hw = &adapter->hw;
   5983 	int table_size;
   5984 	int i;
   5985 
   5986 	switch (adapter->hw.mac.type) {
   5987 	case ixgbe_mac_X550:
   5988 	case ixgbe_mac_X550EM_x:
   5989 	case ixgbe_mac_X550EM_a:
   5990 		table_size = 128;
   5991 		break;
   5992 	default:
   5993 		table_size = 32;
   5994 		break;
   5995 	}
   5996 
   5997 	device_printf(dev, "[E]RETA:\n");
   5998 	for (i = 0; i < table_size; i++) {
   5999 		if (i < 32)
   6000 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
   6001 				IXGBE_RETA(i)));
   6002 		else
   6003 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
   6004 				IXGBE_ERETA(i - 32)));
   6005 	}
   6006 
   6007 	device_printf(dev, "queue:");
   6008 	for (i = 0; i < adapter->num_queues; i++) {
   6009 		printf((i == 0) ? "\t" : " ");
   6010 		printf("%8d", i);
   6011 	}
   6012 	printf("\n");
   6013 	PRINTQS(adapter, RDBAL);
   6014 	PRINTQS(adapter, RDBAH);
   6015 	PRINTQS(adapter, RDLEN);
   6016 	PRINTQS(adapter, SRRCTL);
   6017 	PRINTQS(adapter, RDH);
   6018 	PRINTQS(adapter, RDT);
   6019 	PRINTQS(adapter, RXDCTL);
   6020 
   6021 	device_printf(dev, "RQSMR:");
   6022 	for (i = 0; i < adapter->num_queues / 4; i++) {
   6023 		printf((i == 0) ? "\t" : " ");
   6024 		printf("%08x", IXGBE_READ_REG(hw, IXGBE_RQSMR(i)));
   6025 	}
   6026 	printf("\n");
   6027 
   6028 	device_printf(dev, "disabled_count:");
   6029 	for (i = 0; i < adapter->num_queues; i++) {
   6030 		printf((i == 0) ? "\t" : " ");
   6031 		printf("%8d", adapter->queues[i].disabled_count);
   6032 	}
   6033 	printf("\n");
   6034 
   6035 	device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
   6036 	if (hw->mac.type != ixgbe_mac_82598EB) {
   6037 		device_printf(dev, "EIMS_EX(0):\t%08x\n",
   6038 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0)));
   6039 		device_printf(dev, "EIMS_EX(1):\t%08x\n",
   6040 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1)));
   6041 	}
   6042 } /* ixgbe_print_debug_info */
   6043 
   6044 /************************************************************************
   6045  * ixgbe_sysctl_debug
   6046  ************************************************************************/
   6047 static int
   6048 ixgbe_sysctl_debug(SYSCTLFN_ARGS)
   6049 {
   6050 	struct sysctlnode node = *rnode;
   6051 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   6052 	int	       error, result = 0;
   6053 
   6054 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   6055 		return (EPERM);
   6056 
   6057 	node.sysctl_data = &result;
   6058 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   6059 
   6060 	if (error || newp == NULL)
   6061 		return error;
   6062 
   6063 	if (result == 1)
   6064 		ixgbe_print_debug_info(adapter);
   6065 
   6066 	return 0;
   6067 } /* ixgbe_sysctl_debug */
   6068 
   6069 /************************************************************************
   6070  * ixgbe_sysctl_rx_copy_len
   6071  ************************************************************************/
   6072 static int
   6073 ixgbe_sysctl_rx_copy_len(SYSCTLFN_ARGS)
   6074 {
   6075 	struct sysctlnode node = *rnode;
   6076 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   6077 	int error;
   6078 	int result = adapter->rx_copy_len;
   6079 
   6080 	node.sysctl_data = &result;
   6081 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   6082 
   6083 	if (error || newp == NULL)
   6084 		return error;
   6085 
   6086 	if ((result < 0) || (result > IXGBE_RX_COPY_LEN_MAX))
   6087 		return EINVAL;
   6088 
   6089 	adapter->rx_copy_len = result;
   6090 
   6091 	return 0;
   6092 } /* ixgbe_sysctl_rx_copy_len */
   6093 
   6094 /************************************************************************
   6095  * ixgbe_sysctl_tx_process_limit
   6096  ************************************************************************/
   6097 static int
   6098 ixgbe_sysctl_tx_process_limit(SYSCTLFN_ARGS)
   6099 {
   6100 	struct sysctlnode node = *rnode;
   6101 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   6102 	int error;
   6103 	int result = adapter->tx_process_limit;
   6104 
   6105 	node.sysctl_data = &result;
   6106 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   6107 
   6108 	if (error || newp == NULL)
   6109 		return error;
   6110 
   6111 	if ((result <= 0) || (result > adapter->num_tx_desc))
   6112 		return EINVAL;
   6113 
   6114 	adapter->tx_process_limit = result;
   6115 
   6116 	return 0;
   6117 } /* ixgbe_sysctl_tx_process_limit */
   6118 
   6119 /************************************************************************
   6120  * ixgbe_sysctl_rx_process_limit
   6121  ************************************************************************/
   6122 static int
   6123 ixgbe_sysctl_rx_process_limit(SYSCTLFN_ARGS)
   6124 {
   6125 	struct sysctlnode node = *rnode;
   6126 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   6127 	int error;
   6128 	int result = adapter->rx_process_limit;
   6129 
   6130 	node.sysctl_data = &result;
   6131 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   6132 
   6133 	if (error || newp == NULL)
   6134 		return error;
   6135 
   6136 	if ((result <= 0) || (result > adapter->num_rx_desc))
   6137 		return EINVAL;
   6138 
   6139 	adapter->rx_process_limit = result;
   6140 
   6141 	return 0;
   6142 } /* ixgbe_sysctl_rx_process_limit */
   6143 
   6144 /************************************************************************
   6145  * ixgbe_init_device_features
   6146  ************************************************************************/
   6147 static void
   6148 ixgbe_init_device_features(struct adapter *adapter)
   6149 {
   6150 	adapter->feat_cap = IXGBE_FEATURE_NETMAP
   6151 			  | IXGBE_FEATURE_RSS
   6152 			  | IXGBE_FEATURE_MSI
   6153 			  | IXGBE_FEATURE_MSIX
   6154 			  | IXGBE_FEATURE_LEGACY_IRQ
   6155 			  | IXGBE_FEATURE_LEGACY_TX;
   6156 
   6157 	/* Set capabilities first... */
   6158 	switch (adapter->hw.mac.type) {
   6159 	case ixgbe_mac_82598EB:
   6160 		if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
   6161 			adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
   6162 		break;
   6163 	case ixgbe_mac_X540:
   6164 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6165 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6166 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
   6167 		    (adapter->hw.bus.func == 0))
   6168 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
   6169 		break;
   6170 	case ixgbe_mac_X550:
   6171 		/*
   6172 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6173 		 * NVM Image version.
   6174 		 */
   6175 		adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
   6176 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6177 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6178 		break;
   6179 	case ixgbe_mac_X550EM_x:
   6180 		/*
   6181 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6182 		 * NVM Image version.
   6183 		 */
   6184 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6185 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6186 		break;
   6187 	case ixgbe_mac_X550EM_a:
   6188 		/*
   6189 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6190 		 * NVM Image version.
   6191 		 */
   6192 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6193 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6194 		adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
   6195 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
   6196 		    (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
   6197 			adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
   6198 			adapter->feat_cap |= IXGBE_FEATURE_EEE;
   6199 		}
   6200 		break;
   6201 	case ixgbe_mac_82599EB:
   6202 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6203 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6204 		if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
   6205 		    (adapter->hw.bus.func == 0))
   6206 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
   6207 		if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
   6208 			adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
   6209 		break;
   6210 	default:
   6211 		break;
   6212 	}
   6213 
   6214 	/* Enabled by default... */
   6215 	/* Fan failure detection */
   6216 	if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
   6217 		adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
   6218 	/* Netmap */
   6219 	if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
   6220 		adapter->feat_en |= IXGBE_FEATURE_NETMAP;
   6221 	/* EEE */
   6222 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   6223 		adapter->feat_en |= IXGBE_FEATURE_EEE;
   6224 	/* Thermal Sensor */
   6225 	if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
   6226 		adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
   6227 	/*
   6228 	 * Recovery mode:
   6229 	 * NetBSD: IXGBE_FEATURE_RECOVERY_MODE will be controlled after reading
   6230 	 * NVM Image version.
   6231 	 */
   6232 
   6233 	/* Enabled via global sysctl... */
   6234 	/* Flow Director */
   6235 	if (ixgbe_enable_fdir) {
   6236 		if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
   6237 			adapter->feat_en |= IXGBE_FEATURE_FDIR;
   6238 		else
   6239 			device_printf(adapter->dev, "Device does not support Flow Director. Leaving disabled.");
   6240 	}
   6241 	/* Legacy (single queue) transmit */
   6242 	if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
   6243 	    ixgbe_enable_legacy_tx)
   6244 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
   6245 	/*
   6246 	 * Message Signal Interrupts - Extended (MSI-X)
   6247 	 * Normal MSI is only enabled if MSI-X calls fail.
   6248 	 */
   6249 	if (!ixgbe_enable_msix)
   6250 		adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
   6251 	/* Receive-Side Scaling (RSS) */
   6252 	if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
   6253 		adapter->feat_en |= IXGBE_FEATURE_RSS;
   6254 
   6255 	/* Disable features with unmet dependencies... */
   6256 	/* No MSI-X */
   6257 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
   6258 		adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
   6259 		adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
   6260 		adapter->feat_en &= ~IXGBE_FEATURE_RSS;
   6261 		adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
   6262 	}
   6263 } /* ixgbe_init_device_features */
   6264 
   6265 /************************************************************************
   6266  * ixgbe_probe - Device identification routine
   6267  *
   6268  *   Determines if the driver should be loaded on
   6269  *   adapter based on its PCI vendor/device ID.
   6270  *
   6271  *   return BUS_PROBE_DEFAULT on success, positive on failure
   6272  ************************************************************************/
   6273 static int
   6274 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
   6275 {
   6276 	const struct pci_attach_args *pa = aux;
   6277 
   6278 	return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
   6279 }
   6280 
   6281 static const ixgbe_vendor_info_t *
   6282 ixgbe_lookup(const struct pci_attach_args *pa)
   6283 {
   6284 	const ixgbe_vendor_info_t *ent;
   6285 	pcireg_t subid;
   6286 
   6287 	INIT_DEBUGOUT("ixgbe_lookup: begin");
   6288 
   6289 	if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
   6290 		return NULL;
   6291 
   6292 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
   6293 
   6294 	for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
   6295 		if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
   6296 		    (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
   6297 		    ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
   6298 			(ent->subvendor_id == 0)) &&
   6299 		    ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
   6300 			(ent->subdevice_id == 0))) {
   6301 			return ent;
   6302 		}
   6303 	}
   6304 	return NULL;
   6305 }
   6306 
   6307 static int
   6308 ixgbe_ifflags_cb(struct ethercom *ec)
   6309 {
   6310 	struct ifnet *ifp = &ec->ec_if;
   6311 	struct adapter *adapter = ifp->if_softc;
   6312 	u_short change;
   6313 	int rv = 0;
   6314 
   6315 	IXGBE_CORE_LOCK(adapter);
   6316 
   6317 	change = ifp->if_flags ^ adapter->if_flags;
   6318 	if (change != 0)
   6319 		adapter->if_flags = ifp->if_flags;
   6320 
   6321 	if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
   6322 		rv = ENETRESET;
   6323 		goto out;
   6324 	} else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0)
   6325 		ixgbe_set_rxfilter(adapter);
   6326 
   6327 	/* Set up VLAN support and filter */
   6328 	ixgbe_setup_vlan_hw_support(adapter);
   6329 
   6330 out:
   6331 	IXGBE_CORE_UNLOCK(adapter);
   6332 
   6333 	return rv;
   6334 }
   6335 
   6336 /************************************************************************
   6337  * ixgbe_ioctl - Ioctl entry point
   6338  *
   6339  *   Called when the user wants to configure the interface.
   6340  *
   6341  *   return 0 on success, positive on failure
   6342  ************************************************************************/
   6343 static int
   6344 ixgbe_ioctl(struct ifnet *ifp, u_long command, void *data)
   6345 {
   6346 	struct adapter	*adapter = ifp->if_softc;
   6347 	struct ixgbe_hw *hw = &adapter->hw;
   6348 	struct ifcapreq *ifcr = data;
   6349 	struct ifreq	*ifr = data;
   6350 	int		error = 0;
   6351 	int l4csum_en;
   6352 	const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
   6353 	     IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
   6354 
   6355 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   6356 		return (EPERM);
   6357 
   6358 	switch (command) {
   6359 	case SIOCSIFFLAGS:
   6360 		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
   6361 		break;
   6362 	case SIOCADDMULTI:
   6363 	case SIOCDELMULTI:
   6364 		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
   6365 		break;
   6366 	case SIOCSIFMEDIA:
   6367 	case SIOCGIFMEDIA:
   6368 		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
   6369 		break;
   6370 	case SIOCSIFCAP:
   6371 		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
   6372 		break;
   6373 	case SIOCSIFMTU:
   6374 		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
   6375 		break;
   6376 #ifdef __NetBSD__
   6377 	case SIOCINITIFADDR:
   6378 		IOCTL_DEBUGOUT("ioctl: SIOCINITIFADDR");
   6379 		break;
   6380 	case SIOCGIFFLAGS:
   6381 		IOCTL_DEBUGOUT("ioctl: SIOCGIFFLAGS");
   6382 		break;
   6383 	case SIOCGIFAFLAG_IN:
   6384 		IOCTL_DEBUGOUT("ioctl: SIOCGIFAFLAG_IN");
   6385 		break;
   6386 	case SIOCGIFADDR:
   6387 		IOCTL_DEBUGOUT("ioctl: SIOCGIFADDR");
   6388 		break;
   6389 	case SIOCGIFMTU:
   6390 		IOCTL_DEBUGOUT("ioctl: SIOCGIFMTU (Get Interface MTU)");
   6391 		break;
   6392 	case SIOCGIFCAP:
   6393 		IOCTL_DEBUGOUT("ioctl: SIOCGIFCAP (Get IF cap)");
   6394 		break;
   6395 	case SIOCGETHERCAP:
   6396 		IOCTL_DEBUGOUT("ioctl: SIOCGETHERCAP (Get ethercap)");
   6397 		break;
   6398 	case SIOCGLIFADDR:
   6399 		IOCTL_DEBUGOUT("ioctl: SIOCGLIFADDR (Get Interface addr)");
   6400 		break;
   6401 	case SIOCZIFDATA:
   6402 		IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
   6403 		hw->mac.ops.clear_hw_cntrs(hw);
   6404 		ixgbe_clear_evcnt(adapter);
   6405 		break;
   6406 	case SIOCAIFADDR:
   6407 		IOCTL_DEBUGOUT("ioctl: SIOCAIFADDR (add/chg IF alias)");
   6408 		break;
   6409 #endif
   6410 	default:
   6411 		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
   6412 		break;
   6413 	}
   6414 
   6415 	switch (command) {
   6416 	case SIOCSIFMEDIA:
   6417 	case SIOCGIFMEDIA:
   6418 		return ifmedia_ioctl(ifp, ifr, &adapter->media, command);
   6419 	case SIOCGI2C:
   6420 	{
   6421 		struct ixgbe_i2c_req	i2c;
   6422 
   6423 		IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
   6424 		error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
   6425 		if (error != 0)
   6426 			break;
   6427 		if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
   6428 			error = EINVAL;
   6429 			break;
   6430 		}
   6431 		if (i2c.len > sizeof(i2c.data)) {
   6432 			error = EINVAL;
   6433 			break;
   6434 		}
   6435 
   6436 		hw->phy.ops.read_i2c_byte(hw, i2c.offset,
   6437 		    i2c.dev_addr, i2c.data);
   6438 		error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
   6439 		break;
   6440 	}
   6441 	case SIOCSIFCAP:
   6442 		/* Layer-4 Rx checksum offload has to be turned on and
   6443 		 * off as a unit.
   6444 		 */
   6445 		l4csum_en = ifcr->ifcr_capenable & l4csum;
   6446 		if (l4csum_en != l4csum && l4csum_en != 0)
   6447 			return EINVAL;
   6448 		/*FALLTHROUGH*/
   6449 	case SIOCADDMULTI:
   6450 	case SIOCDELMULTI:
   6451 	case SIOCSIFFLAGS:
   6452 	case SIOCSIFMTU:
   6453 	default:
   6454 		if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
   6455 			return error;
   6456 		if ((ifp->if_flags & IFF_RUNNING) == 0)
   6457 			;
   6458 		else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
   6459 			IXGBE_CORE_LOCK(adapter);
   6460 			if ((ifp->if_flags & IFF_RUNNING) != 0)
   6461 				ixgbe_init_locked(adapter);
   6462 			ixgbe_recalculate_max_frame(adapter);
   6463 			IXGBE_CORE_UNLOCK(adapter);
   6464 		} else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
   6465 			/*
   6466 			 * Multicast list has changed; set the hardware filter
   6467 			 * accordingly.
   6468 			 */
   6469 			IXGBE_CORE_LOCK(adapter);
   6470 			ixgbe_disable_intr(adapter);
   6471 			ixgbe_set_rxfilter(adapter);
   6472 			ixgbe_enable_intr(adapter);
   6473 			IXGBE_CORE_UNLOCK(adapter);
   6474 		}
   6475 		return 0;
   6476 	}
   6477 
   6478 	return error;
   6479 } /* ixgbe_ioctl */
   6480 
   6481 /************************************************************************
   6482  * ixgbe_check_fan_failure
   6483  ************************************************************************/
   6484 static void
   6485 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
   6486 {
   6487 	u32 mask;
   6488 
   6489 	mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
   6490 	    IXGBE_ESDP_SDP1;
   6491 
   6492 	if (reg & mask)
   6493 		device_printf(adapter->dev,
   6494 		    "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
   6495 } /* ixgbe_check_fan_failure */
   6496 
   6497 /************************************************************************
   6498  * ixgbe_handle_que
   6499  ************************************************************************/
   6500 static void
   6501 ixgbe_handle_que(void *context)
   6502 {
   6503 	struct ix_queue *que = context;
   6504 	struct adapter	*adapter = que->adapter;
   6505 	struct tx_ring	*txr = que->txr;
   6506 	struct ifnet	*ifp = adapter->ifp;
   6507 	bool		more = false;
   6508 
   6509 	que->handleq.ev_count++;
   6510 
   6511 	if (ifp->if_flags & IFF_RUNNING) {
   6512 		more = ixgbe_rxeof(que);
   6513 		IXGBE_TX_LOCK(txr);
   6514 		more |= ixgbe_txeof(txr);
   6515 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
   6516 			if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
   6517 				ixgbe_mq_start_locked(ifp, txr);
   6518 		/* Only for queue 0 */
   6519 		/* NetBSD still needs this for CBQ */
   6520 		if ((&adapter->queues[0] == que)
   6521 		    && (!ixgbe_legacy_ring_empty(ifp, NULL)))
   6522 			ixgbe_legacy_start_locked(ifp, txr);
   6523 		IXGBE_TX_UNLOCK(txr);
   6524 	}
   6525 
   6526 	if (more) {
   6527 		que->req.ev_count++;
   6528 		ixgbe_sched_handle_que(adapter, que);
   6529 	} else if (que->res != NULL) {
   6530 		/* Re-enable this interrupt */
   6531 		ixgbe_enable_queue(adapter, que->msix);
   6532 	} else
   6533 		ixgbe_enable_intr(adapter);
   6534 
   6535 	return;
   6536 } /* ixgbe_handle_que */
   6537 
   6538 /************************************************************************
   6539  * ixgbe_handle_que_work
   6540  ************************************************************************/
   6541 static void
   6542 ixgbe_handle_que_work(struct work *wk, void *context)
   6543 {
   6544 	struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
   6545 
   6546 	/*
   6547 	 * "enqueued flag" is not required here.
   6548 	 * See ixgbe_msix_que().
   6549 	 */
   6550 	ixgbe_handle_que(que);
   6551 }
   6552 
   6553 /************************************************************************
   6554  * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
   6555  ************************************************************************/
   6556 static int
   6557 ixgbe_allocate_legacy(struct adapter *adapter,
   6558     const struct pci_attach_args *pa)
   6559 {
   6560 	device_t	dev = adapter->dev;
   6561 	struct ix_queue *que = adapter->queues;
   6562 	struct tx_ring	*txr = adapter->tx_rings;
   6563 	int		counts[PCI_INTR_TYPE_SIZE];
   6564 	pci_intr_type_t intr_type, max_type;
   6565 	char		intrbuf[PCI_INTRSTR_LEN];
   6566 	char		wqname[MAXCOMLEN];
   6567 	const char	*intrstr = NULL;
   6568 	int defertx_error = 0, error;
   6569 
   6570 	/* We allocate a single interrupt resource */
   6571 	max_type = PCI_INTR_TYPE_MSI;
   6572 	counts[PCI_INTR_TYPE_MSIX] = 0;
   6573 	counts[PCI_INTR_TYPE_MSI] =
   6574 	    (adapter->feat_en & IXGBE_FEATURE_MSI) ? 1 : 0;
   6575 	/* Check not feat_en but feat_cap to fallback to INTx */
   6576 	counts[PCI_INTR_TYPE_INTX] =
   6577 	    (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) ? 1 : 0;
   6578 
   6579 alloc_retry:
   6580 	if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
   6581 		aprint_error_dev(dev, "couldn't alloc interrupt\n");
   6582 		return ENXIO;
   6583 	}
   6584 	adapter->osdep.nintrs = 1;
   6585 	intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
   6586 	    intrbuf, sizeof(intrbuf));
   6587 	adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
   6588 	    adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
   6589 	    device_xname(dev));
   6590 	intr_type = pci_intr_type(adapter->osdep.pc, adapter->osdep.intrs[0]);
   6591 	if (adapter->osdep.ihs[0] == NULL) {
   6592 		aprint_error_dev(dev,"unable to establish %s\n",
   6593 		    (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
   6594 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
   6595 		adapter->osdep.intrs = NULL;
   6596 		switch (intr_type) {
   6597 		case PCI_INTR_TYPE_MSI:
   6598 			/* The next try is for INTx: Disable MSI */
   6599 			max_type = PCI_INTR_TYPE_INTX;
   6600 			counts[PCI_INTR_TYPE_INTX] = 1;
   6601 			adapter->feat_en &= ~IXGBE_FEATURE_MSI;
   6602 			if (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) {
   6603 				adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6604 				goto alloc_retry;
   6605 			} else
   6606 				break;
   6607 		case PCI_INTR_TYPE_INTX:
   6608 		default:
   6609 			/* See below */
   6610 			break;
   6611 		}
   6612 	}
   6613 	if (intr_type == PCI_INTR_TYPE_INTX) {
   6614 		adapter->feat_en &= ~IXGBE_FEATURE_MSI;
   6615 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6616 	}
   6617 	if (adapter->osdep.ihs[0] == NULL) {
   6618 		aprint_error_dev(dev,
   6619 		    "couldn't establish interrupt%s%s\n",
   6620 		    intrstr ? " at " : "", intrstr ? intrstr : "");
   6621 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
   6622 		adapter->osdep.intrs = NULL;
   6623 		return ENXIO;
   6624 	}
   6625 	aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
   6626 	/*
   6627 	 * Try allocating a fast interrupt and the associated deferred
   6628 	 * processing contexts.
   6629 	 */
   6630 	if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   6631 		txr->txr_si =
   6632 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6633 			ixgbe_deferred_mq_start, txr);
   6634 
   6635 		snprintf(wqname, sizeof(wqname), "%sdeferTx",
   6636 		    device_xname(dev));
   6637 		defertx_error = workqueue_create(&adapter->txr_wq, wqname,
   6638 		    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI,
   6639 		    IPL_NET, IXGBE_WORKQUEUE_FLAGS);
   6640 		adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
   6641 	}
   6642 	que->que_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6643 	    ixgbe_handle_que, que);
   6644 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
   6645 	error = workqueue_create(&adapter->que_wq, wqname,
   6646 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6647 	    IXGBE_WORKQUEUE_FLAGS);
   6648 
   6649 	if ((!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)
   6650 		&& ((txr->txr_si == NULL) || defertx_error != 0))
   6651 	    || (que->que_si == NULL) || error != 0) {
   6652 		aprint_error_dev(dev,
   6653 		    "could not establish software interrupts\n");
   6654 
   6655 		return ENXIO;
   6656 	}
   6657 	/* For simplicity in the handlers */
   6658 	adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
   6659 
   6660 	return (0);
   6661 } /* ixgbe_allocate_legacy */
   6662 
   6663 /************************************************************************
   6664  * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
   6665  ************************************************************************/
   6666 static int
   6667 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
   6668 {
   6669 	device_t	dev = adapter->dev;
   6670 	struct		ix_queue *que = adapter->queues;
   6671 	struct		tx_ring *txr = adapter->tx_rings;
   6672 	pci_chipset_tag_t pc;
   6673 	char		intrbuf[PCI_INTRSTR_LEN];
   6674 	char		intr_xname[32];
   6675 	char		wqname[MAXCOMLEN];
   6676 	const char	*intrstr = NULL;
   6677 	int		error, vector = 0;
   6678 	int		cpu_id = 0;
   6679 	kcpuset_t	*affinity;
   6680 #ifdef RSS
   6681 	unsigned int	rss_buckets = 0;
   6682 	kcpuset_t	cpu_mask;
   6683 #endif
   6684 
   6685 	pc = adapter->osdep.pc;
   6686 #ifdef	RSS
   6687 	/*
   6688 	 * If we're doing RSS, the number of queues needs to
   6689 	 * match the number of RSS buckets that are configured.
   6690 	 *
   6691 	 * + If there's more queues than RSS buckets, we'll end
   6692 	 *   up with queues that get no traffic.
   6693 	 *
   6694 	 * + If there's more RSS buckets than queues, we'll end
   6695 	 *   up having multiple RSS buckets map to the same queue,
   6696 	 *   so there'll be some contention.
   6697 	 */
   6698 	rss_buckets = rss_getnumbuckets();
   6699 	if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
   6700 	    (adapter->num_queues != rss_buckets)) {
   6701 		device_printf(dev,
   6702 		    "%s: number of queues (%d) != number of RSS buckets (%d)"
   6703 		    "; performance will be impacted.\n",
   6704 		    __func__, adapter->num_queues, rss_buckets);
   6705 	}
   6706 #endif
   6707 
   6708 	adapter->osdep.nintrs = adapter->num_queues + 1;
   6709 	if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
   6710 	    adapter->osdep.nintrs) != 0) {
   6711 		aprint_error_dev(dev,
   6712 		    "failed to allocate MSI-X interrupt\n");
   6713 		return (ENXIO);
   6714 	}
   6715 
   6716 	kcpuset_create(&affinity, false);
   6717 	for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
   6718 		snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
   6719 		    device_xname(dev), i);
   6720 		intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
   6721 		    sizeof(intrbuf));
   6722 #ifdef IXGBE_MPSAFE
   6723 		pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
   6724 		    true);
   6725 #endif
   6726 		/* Set the handler function */
   6727 		que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
   6728 		    adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
   6729 		    intr_xname);
   6730 		if (que->res == NULL) {
   6731 			aprint_error_dev(dev,
   6732 			    "Failed to register QUE handler\n");
   6733 			error = ENXIO;
   6734 			goto err_out;
   6735 		}
   6736 		que->msix = vector;
   6737 		adapter->active_queues |= 1ULL << que->msix;
   6738 
   6739 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
   6740 #ifdef	RSS
   6741 			/*
   6742 			 * The queue ID is used as the RSS layer bucket ID.
   6743 			 * We look up the queue ID -> RSS CPU ID and select
   6744 			 * that.
   6745 			 */
   6746 			cpu_id = rss_getcpu(i % rss_getnumbuckets());
   6747 			CPU_SETOF(cpu_id, &cpu_mask);
   6748 #endif
   6749 		} else {
   6750 			/*
   6751 			 * Bind the MSI-X vector, and thus the
   6752 			 * rings to the corresponding CPU.
   6753 			 *
   6754 			 * This just happens to match the default RSS
   6755 			 * round-robin bucket -> queue -> CPU allocation.
   6756 			 */
   6757 			if (adapter->num_queues > 1)
   6758 				cpu_id = i;
   6759 		}
   6760 		/* Round-robin affinity */
   6761 		kcpuset_zero(affinity);
   6762 		kcpuset_set(affinity, cpu_id % ncpu);
   6763 		error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
   6764 		    NULL);
   6765 		aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
   6766 		    intrstr);
   6767 		if (error == 0) {
   6768 #if 1 /* def IXGBE_DEBUG */
   6769 #ifdef	RSS
   6770 			aprintf_normal(", bound RSS bucket %d to CPU %d", i,
   6771 			    cpu_id % ncpu);
   6772 #else
   6773 			aprint_normal(", bound queue %d to cpu %d", i,
   6774 			    cpu_id % ncpu);
   6775 #endif
   6776 #endif /* IXGBE_DEBUG */
   6777 		}
   6778 		aprint_normal("\n");
   6779 
   6780 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   6781 			txr->txr_si = softint_establish(
   6782 				SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6783 				ixgbe_deferred_mq_start, txr);
   6784 			if (txr->txr_si == NULL) {
   6785 				aprint_error_dev(dev,
   6786 				    "couldn't establish software interrupt\n");
   6787 				error = ENXIO;
   6788 				goto err_out;
   6789 			}
   6790 		}
   6791 		que->que_si
   6792 		    = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6793 			ixgbe_handle_que, que);
   6794 		if (que->que_si == NULL) {
   6795 			aprint_error_dev(dev,
   6796 			    "couldn't establish software interrupt\n");
   6797 			error = ENXIO;
   6798 			goto err_out;
   6799 		}
   6800 	}
   6801 	snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
   6802 	error = workqueue_create(&adapter->txr_wq, wqname,
   6803 	    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6804 	    IXGBE_WORKQUEUE_FLAGS);
   6805 	if (error) {
   6806 		aprint_error_dev(dev,
   6807 		    "couldn't create workqueue for deferred Tx\n");
   6808 		goto err_out;
   6809 	}
   6810 	adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
   6811 
   6812 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
   6813 	error = workqueue_create(&adapter->que_wq, wqname,
   6814 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6815 	    IXGBE_WORKQUEUE_FLAGS);
   6816 	if (error) {
   6817 		aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
   6818 		goto err_out;
   6819 	}
   6820 
   6821 	/* and Link */
   6822 	cpu_id++;
   6823 	snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
   6824 	adapter->vector = vector;
   6825 	intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
   6826 	    sizeof(intrbuf));
   6827 #ifdef IXGBE_MPSAFE
   6828 	pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
   6829 	    true);
   6830 #endif
   6831 	/* Set the link handler function */
   6832 	adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
   6833 	    adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_link, adapter,
   6834 	    intr_xname);
   6835 	if (adapter->osdep.ihs[vector] == NULL) {
   6836 		aprint_error_dev(dev, "Failed to register LINK handler\n");
   6837 		error = ENXIO;
   6838 		goto err_out;
   6839 	}
   6840 	/* Round-robin affinity */
   6841 	kcpuset_zero(affinity);
   6842 	kcpuset_set(affinity, cpu_id % ncpu);
   6843 	error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
   6844 	    NULL);
   6845 
   6846 	aprint_normal_dev(dev,
   6847 	    "for link, interrupting at %s", intrstr);
   6848 	if (error == 0)
   6849 		aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
   6850 	else
   6851 		aprint_normal("\n");
   6852 
   6853 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
   6854 		adapter->mbx_si =
   6855 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6856 			ixgbe_handle_mbx, adapter);
   6857 		if (adapter->mbx_si == NULL) {
   6858 			aprint_error_dev(dev,
   6859 			    "could not establish software interrupts\n");
   6860 
   6861 			error = ENXIO;
   6862 			goto err_out;
   6863 		}
   6864 	}
   6865 
   6866 	kcpuset_destroy(affinity);
   6867 	aprint_normal_dev(dev,
   6868 	    "Using MSI-X interrupts with %d vectors\n", vector + 1);
   6869 
   6870 	return (0);
   6871 
   6872 err_out:
   6873 	kcpuset_destroy(affinity);
   6874 	ixgbe_free_softint(adapter);
   6875 	ixgbe_free_pciintr_resources(adapter);
   6876 	return (error);
   6877 } /* ixgbe_allocate_msix */
   6878 
   6879 /************************************************************************
   6880  * ixgbe_configure_interrupts
   6881  *
   6882  *   Setup MSI-X, MSI, or legacy interrupts (in that order).
   6883  *   This will also depend on user settings.
   6884  ************************************************************************/
   6885 static int
   6886 ixgbe_configure_interrupts(struct adapter *adapter)
   6887 {
   6888 	device_t dev = adapter->dev;
   6889 	struct ixgbe_mac_info *mac = &adapter->hw.mac;
   6890 	int want, queues, msgs;
   6891 
   6892 	/* Default to 1 queue if MSI-X setup fails */
   6893 	adapter->num_queues = 1;
   6894 
   6895 	/* Override by tuneable */
   6896 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX))
   6897 		goto msi;
   6898 
   6899 	/*
   6900 	 *  NetBSD only: Use single vector MSI when number of CPU is 1 to save
   6901 	 * interrupt slot.
   6902 	 */
   6903 	if (ncpu == 1)
   6904 		goto msi;
   6905 
   6906 	/* First try MSI-X */
   6907 	msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
   6908 	msgs = MIN(msgs, IXG_MAX_NINTR);
   6909 	if (msgs < 2)
   6910 		goto msi;
   6911 
   6912 	adapter->msix_mem = (void *)1; /* XXX */
   6913 
   6914 	/* Figure out a reasonable auto config value */
   6915 	queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
   6916 
   6917 #ifdef	RSS
   6918 	/* If we're doing RSS, clamp at the number of RSS buckets */
   6919 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
   6920 		queues = min(queues, rss_getnumbuckets());
   6921 #endif
   6922 	if (ixgbe_num_queues > queues) {
   6923 		aprint_error_dev(adapter->dev, "ixgbe_num_queues (%d) is too large, using reduced amount (%d).\n", ixgbe_num_queues, queues);
   6924 		ixgbe_num_queues = queues;
   6925 	}
   6926 
   6927 	if (ixgbe_num_queues != 0)
   6928 		queues = ixgbe_num_queues;
   6929 	else
   6930 		queues = min(queues,
   6931 		    min(mac->max_tx_queues, mac->max_rx_queues));
   6932 
   6933 	/* reflect correct sysctl value */
   6934 	ixgbe_num_queues = queues;
   6935 
   6936 	/*
   6937 	 * Want one vector (RX/TX pair) per queue
   6938 	 * plus an additional for Link.
   6939 	 */
   6940 	want = queues + 1;
   6941 	if (msgs >= want)
   6942 		msgs = want;
   6943 	else {
   6944 		aprint_error_dev(dev, "MSI-X Configuration Problem, "
   6945 		    "%d vectors but %d queues wanted!\n",
   6946 		    msgs, want);
   6947 		goto msi;
   6948 	}
   6949 	adapter->num_queues = queues;
   6950 	adapter->feat_en |= IXGBE_FEATURE_MSIX;
   6951 	return (0);
   6952 
   6953 	/*
   6954 	 * MSI-X allocation failed or provided us with
   6955 	 * less vectors than needed. Free MSI-X resources
   6956 	 * and we'll try enabling MSI.
   6957 	 */
   6958 msi:
   6959 	/* Without MSI-X, some features are no longer supported */
   6960 	adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
   6961 	adapter->feat_en  &= ~IXGBE_FEATURE_RSS;
   6962 	adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
   6963 	adapter->feat_en  &= ~IXGBE_FEATURE_SRIOV;
   6964 
   6965 	msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
   6966 	adapter->msix_mem = NULL; /* XXX */
   6967 	if (msgs > 1)
   6968 		msgs = 1;
   6969 	if (msgs != 0) {
   6970 		msgs = 1;
   6971 		adapter->feat_en |= IXGBE_FEATURE_MSI;
   6972 		return (0);
   6973 	}
   6974 
   6975 	if (!(adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ)) {
   6976 		aprint_error_dev(dev,
   6977 		    "Device does not support legacy interrupts.\n");
   6978 		return 1;
   6979 	}
   6980 
   6981 	adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6982 
   6983 	return (0);
   6984 } /* ixgbe_configure_interrupts */
   6985 
   6986 
   6987 /************************************************************************
   6988  * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
   6989  *
   6990  *   Done outside of interrupt context since the driver might sleep
   6991  ************************************************************************/
   6992 static void
   6993 ixgbe_handle_link(void *context)
   6994 {
   6995 	struct adapter	*adapter = context;
   6996 	struct ixgbe_hw *hw = &adapter->hw;
   6997 
   6998 	IXGBE_CORE_LOCK(adapter);
   6999 	++adapter->link_sicount.ev_count;
   7000 	ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
   7001 	ixgbe_update_link_status(adapter);
   7002 
   7003 	/* Re-enable link interrupts */
   7004 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
   7005 
   7006 	IXGBE_CORE_UNLOCK(adapter);
   7007 } /* ixgbe_handle_link */
   7008 
   7009 /************************************************************************
   7010  * ixgbe_rearm_queues
   7011  ************************************************************************/
   7012 static __inline void
   7013 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
   7014 {
   7015 	u32 mask;
   7016 
   7017 	switch (adapter->hw.mac.type) {
   7018 	case ixgbe_mac_82598EB:
   7019 		mask = (IXGBE_EIMS_RTX_QUEUE & queues);
   7020 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
   7021 		break;
   7022 	case ixgbe_mac_82599EB:
   7023 	case ixgbe_mac_X540:
   7024 	case ixgbe_mac_X550:
   7025 	case ixgbe_mac_X550EM_x:
   7026 	case ixgbe_mac_X550EM_a:
   7027 		mask = (queues & 0xFFFFFFFF);
   7028 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
   7029 		mask = (queues >> 32);
   7030 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
   7031 		break;
   7032 	default:
   7033 		break;
   7034 	}
   7035 } /* ixgbe_rearm_queues */
   7036