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