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