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