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