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