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