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