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