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