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