Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe.c revision 1.231
      1 /* $NetBSD: ixgbe.c,v 1.231 2020/06/17 09:11:13 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 void	ixgbe_ifstop(struct ifnet *, int);
    172 static int	ixgbe_init(struct ifnet *);
    173 static void	ixgbe_init_locked(struct adapter *);
    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_softint(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_local_timer1(void *);
    193 static void	ixgbe_recovery_mode_timer(void *);
    194 static int	ixgbe_setup_interface(device_t, struct adapter *);
    195 static void	ixgbe_config_gpie(struct adapter *);
    196 static void	ixgbe_config_dmac(struct adapter *);
    197 static void	ixgbe_config_delay_values(struct adapter *);
    198 static void	ixgbe_config_link(struct adapter *);
    199 static void	ixgbe_check_wol_support(struct adapter *);
    200 static int	ixgbe_setup_low_power_mode(struct adapter *);
    201 #if 0
    202 static void	ixgbe_rearm_queues(struct adapter *, u64);
    203 #endif
    204 
    205 static void	ixgbe_initialize_transmit_units(struct adapter *);
    206 static void	ixgbe_initialize_receive_units(struct adapter *);
    207 static void	ixgbe_enable_rx_drop(struct adapter *);
    208 static void	ixgbe_disable_rx_drop(struct adapter *);
    209 static void	ixgbe_initialize_rss_mapping(struct adapter *);
    210 
    211 static void	ixgbe_enable_intr(struct adapter *);
    212 static void	ixgbe_disable_intr(struct adapter *);
    213 static void	ixgbe_update_stats_counters(struct adapter *);
    214 static void	ixgbe_set_rxfilter(struct adapter *);
    215 static void	ixgbe_update_link_status(struct adapter *);
    216 static void	ixgbe_set_ivar(struct adapter *, u8, u8, s8);
    217 static void	ixgbe_configure_ivars(struct adapter *);
    218 static u8 *	ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
    219 static void	ixgbe_eitr_write(struct adapter *, uint32_t, uint32_t);
    220 
    221 static void	ixgbe_setup_vlan_hw_tagging(struct adapter *);
    222 static void	ixgbe_setup_vlan_hw_support(struct adapter *);
    223 static int	ixgbe_vlan_cb(struct ethercom *, uint16_t, bool);
    224 static int	ixgbe_register_vlan(struct adapter *, u16);
    225 static int	ixgbe_unregister_vlan(struct adapter *, u16);
    226 
    227 static void	ixgbe_add_device_sysctls(struct adapter *);
    228 static void	ixgbe_add_hw_stats(struct adapter *);
    229 static void	ixgbe_clear_evcnt(struct adapter *);
    230 static int	ixgbe_set_flowcntl(struct adapter *, int);
    231 static int	ixgbe_set_advertise(struct adapter *, int);
    232 static int	ixgbe_get_advertise(struct adapter *);
    233 
    234 /* Sysctl handlers */
    235 static void	ixgbe_set_sysctl_value(struct adapter *, const char *,
    236 		     const char *, int *, int);
    237 static int	ixgbe_sysctl_flowcntl(SYSCTLFN_PROTO);
    238 static int	ixgbe_sysctl_advertise(SYSCTLFN_PROTO);
    239 static int	ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
    240 static int	ixgbe_sysctl_dmac(SYSCTLFN_PROTO);
    241 static int	ixgbe_sysctl_phy_temp(SYSCTLFN_PROTO);
    242 static int	ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_PROTO);
    243 #ifdef IXGBE_DEBUG
    244 static int	ixgbe_sysctl_power_state(SYSCTLFN_PROTO);
    245 static int	ixgbe_sysctl_print_rss_config(SYSCTLFN_PROTO);
    246 #endif
    247 static int	ixgbe_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
    248 static int	ixgbe_sysctl_rdh_handler(SYSCTLFN_PROTO);
    249 static int	ixgbe_sysctl_rdt_handler(SYSCTLFN_PROTO);
    250 static int	ixgbe_sysctl_tdt_handler(SYSCTLFN_PROTO);
    251 static int	ixgbe_sysctl_tdh_handler(SYSCTLFN_PROTO);
    252 static int	ixgbe_sysctl_eee_state(SYSCTLFN_PROTO);
    253 static int	ixgbe_sysctl_debug(SYSCTLFN_PROTO);
    254 static int	ixgbe_sysctl_wol_enable(SYSCTLFN_PROTO);
    255 static int	ixgbe_sysctl_wufc(SYSCTLFN_PROTO);
    256 
    257 /* Support for pluggable optic modules */
    258 static bool	ixgbe_sfp_probe(struct adapter *);
    259 
    260 /* Legacy (single vector) interrupt handler */
    261 static int	ixgbe_legacy_irq(void *);
    262 
    263 /* The MSI/MSI-X Interrupt handlers */
    264 static int	ixgbe_msix_que(void *);
    265 static int	ixgbe_msix_link(void *);
    266 
    267 /* Software interrupts for deferred work */
    268 static void	ixgbe_handle_que(void *);
    269 static void	ixgbe_handle_link(void *);
    270 static void	ixgbe_handle_mod(void *);
    271 static void	ixgbe_handle_phy(void *);
    272 
    273 static void	ixgbe_handle_msf(struct work *, void *);
    274 
    275 /* Workqueue handler for deferred work */
    276 static void	ixgbe_handle_que_work(struct work *, void *);
    277 
    278 static const ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *);
    279 
    280 /************************************************************************
    281  *  NetBSD Device Interface Entry Points
    282  ************************************************************************/
    283 CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter),
    284     ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL,
    285     DVF_DETACH_SHUTDOWN);
    286 
    287 #if 0
    288 devclass_t ix_devclass;
    289 DRIVER_MODULE(ix, pci, ix_driver, ix_devclass, 0, 0);
    290 
    291 MODULE_DEPEND(ix, pci, 1, 1, 1);
    292 MODULE_DEPEND(ix, ether, 1, 1, 1);
    293 #ifdef DEV_NETMAP
    294 MODULE_DEPEND(ix, netmap, 1, 1, 1);
    295 #endif
    296 #endif
    297 
    298 /*
    299  * TUNEABLE PARAMETERS:
    300  */
    301 
    302 /*
    303  * AIM: Adaptive Interrupt Moderation
    304  * which means that the interrupt rate
    305  * is varied over time based on the
    306  * traffic for that interrupt vector
    307  */
    308 static bool ixgbe_enable_aim = true;
    309 #define SYSCTL_INT(_a1, _a2, _a3, _a4, _a5, _a6, _a7)
    310 SYSCTL_INT(_hw_ix, OID_AUTO, enable_aim, CTLFLAG_RDTUN, &ixgbe_enable_aim, 0,
    311     "Enable adaptive interrupt moderation");
    312 
    313 static int ixgbe_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
    314 SYSCTL_INT(_hw_ix, OID_AUTO, max_interrupt_rate, CTLFLAG_RDTUN,
    315     &ixgbe_max_interrupt_rate, 0, "Maximum interrupts per second");
    316 
    317 /* How many packets rxeof tries to clean at a time */
    318 static int ixgbe_rx_process_limit = 256;
    319 SYSCTL_INT(_hw_ix, OID_AUTO, rx_process_limit, CTLFLAG_RDTUN,
    320     &ixgbe_rx_process_limit, 0, "Maximum number of received packets to process at a time, -1 means unlimited");
    321 
    322 /* How many packets txeof tries to clean at a time */
    323 static int ixgbe_tx_process_limit = 256;
    324 SYSCTL_INT(_hw_ix, OID_AUTO, tx_process_limit, CTLFLAG_RDTUN,
    325     &ixgbe_tx_process_limit, 0,
    326     "Maximum number of sent packets to process at a time, -1 means unlimited");
    327 
    328 /* Flow control setting, default to full */
    329 static int ixgbe_flow_control = ixgbe_fc_full;
    330 SYSCTL_INT(_hw_ix, OID_AUTO, flow_control, CTLFLAG_RDTUN,
    331     &ixgbe_flow_control, 0, "Default flow control used for all adapters");
    332 
    333 /* Which packet processing uses workqueue or softint */
    334 static bool ixgbe_txrx_workqueue = false;
    335 
    336 /*
    337  * Smart speed setting, default to on
    338  * this only works as a compile option
    339  * right now as its during attach, set
    340  * this to 'ixgbe_smart_speed_off' to
    341  * disable.
    342  */
    343 static int ixgbe_smart_speed = ixgbe_smart_speed_on;
    344 
    345 /*
    346  * MSI-X should be the default for best performance,
    347  * but this allows it to be forced off for testing.
    348  */
    349 static int ixgbe_enable_msix = 1;
    350 SYSCTL_INT(_hw_ix, OID_AUTO, enable_msix, CTLFLAG_RDTUN, &ixgbe_enable_msix, 0,
    351     "Enable MSI-X interrupts");
    352 
    353 /*
    354  * Number of Queues, can be set to 0,
    355  * it then autoconfigures based on the
    356  * number of cpus with a max of 8. This
    357  * can be overridden manually here.
    358  */
    359 static int ixgbe_num_queues = 0;
    360 SYSCTL_INT(_hw_ix, OID_AUTO, num_queues, CTLFLAG_RDTUN, &ixgbe_num_queues, 0,
    361     "Number of queues to configure, 0 indicates autoconfigure");
    362 
    363 /*
    364  * Number of TX descriptors per ring,
    365  * setting higher than RX as this seems
    366  * the better performing choice.
    367  */
    368 static int ixgbe_txd = PERFORM_TXD;
    369 SYSCTL_INT(_hw_ix, OID_AUTO, txd, CTLFLAG_RDTUN, &ixgbe_txd, 0,
    370     "Number of transmit descriptors per queue");
    371 
    372 /* Number of RX descriptors per ring */
    373 static int ixgbe_rxd = PERFORM_RXD;
    374 SYSCTL_INT(_hw_ix, OID_AUTO, rxd, CTLFLAG_RDTUN, &ixgbe_rxd, 0,
    375     "Number of receive descriptors per queue");
    376 
    377 /*
    378  * Defining this on will allow the use
    379  * of unsupported SFP+ modules, note that
    380  * doing so you are on your own :)
    381  */
    382 static int allow_unsupported_sfp = false;
    383 #define TUNABLE_INT(__x, __y)
    384 TUNABLE_INT("hw.ix.unsupported_sfp", &allow_unsupported_sfp);
    385 
    386 /*
    387  * Not sure if Flow Director is fully baked,
    388  * so we'll default to turning it off.
    389  */
    390 static int ixgbe_enable_fdir = 0;
    391 SYSCTL_INT(_hw_ix, OID_AUTO, enable_fdir, CTLFLAG_RDTUN, &ixgbe_enable_fdir, 0,
    392     "Enable Flow Director");
    393 
    394 /* Legacy Transmit (single queue) */
    395 static int ixgbe_enable_legacy_tx = 0;
    396 SYSCTL_INT(_hw_ix, OID_AUTO, enable_legacy_tx, CTLFLAG_RDTUN,
    397     &ixgbe_enable_legacy_tx, 0, "Enable Legacy TX flow");
    398 
    399 /* Receive-Side Scaling */
    400 static int ixgbe_enable_rss = 1;
    401 SYSCTL_INT(_hw_ix, OID_AUTO, enable_rss, CTLFLAG_RDTUN, &ixgbe_enable_rss, 0,
    402     "Enable Receive-Side Scaling (RSS)");
    403 
    404 #if 0
    405 static int (*ixgbe_start_locked)(struct ifnet *, struct tx_ring *);
    406 static int (*ixgbe_ring_empty)(struct ifnet *, pcq_t *);
    407 #endif
    408 
    409 #ifdef NET_MPSAFE
    410 #define IXGBE_MPSAFE		1
    411 #define IXGBE_CALLOUT_FLAGS	CALLOUT_MPSAFE
    412 #define IXGBE_SOFTINT_FLAGS	SOFTINT_MPSAFE
    413 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU | WQ_MPSAFE
    414 #define IXGBE_TASKLET_WQ_FLAGS	WQ_MPSAFE
    415 #else
    416 #define IXGBE_CALLOUT_FLAGS	0
    417 #define IXGBE_SOFTINT_FLAGS	0
    418 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU
    419 #define IXGBE_TASKLET_WQ_FLAGS	0
    420 #endif
    421 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
    422 
    423 /************************************************************************
    424  * ixgbe_initialize_rss_mapping
    425  ************************************************************************/
    426 static void
    427 ixgbe_initialize_rss_mapping(struct adapter *adapter)
    428 {
    429 	struct ixgbe_hw	*hw = &adapter->hw;
    430 	u32		reta = 0, mrqc, rss_key[10];
    431 	int		queue_id, table_size, index_mult;
    432 	int		i, j;
    433 	u32		rss_hash_config;
    434 
    435 	/* force use default RSS key. */
    436 #ifdef __NetBSD__
    437 	rss_getkey((uint8_t *) &rss_key);
    438 #else
    439 	if (adapter->feat_en & IXGBE_FEATURE_RSS) {
    440 		/* Fetch the configured RSS key */
    441 		rss_getkey((uint8_t *) &rss_key);
    442 	} else {
    443 		/* set up random bits */
    444 		cprng_fast(&rss_key, sizeof(rss_key));
    445 	}
    446 #endif
    447 
    448 	/* Set multiplier for RETA setup and table size based on MAC */
    449 	index_mult = 0x1;
    450 	table_size = 128;
    451 	switch (adapter->hw.mac.type) {
    452 	case ixgbe_mac_82598EB:
    453 		index_mult = 0x11;
    454 		break;
    455 	case ixgbe_mac_X550:
    456 	case ixgbe_mac_X550EM_x:
    457 	case ixgbe_mac_X550EM_a:
    458 		table_size = 512;
    459 		break;
    460 	default:
    461 		break;
    462 	}
    463 
    464 	/* Set up the redirection table */
    465 	for (i = 0, j = 0; i < table_size; i++, j++) {
    466 		if (j == adapter->num_queues)
    467 			j = 0;
    468 
    469 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
    470 			/*
    471 			 * Fetch the RSS bucket id for the given indirection
    472 			 * entry. Cap it at the number of configured buckets
    473 			 * (which is num_queues.)
    474 			 */
    475 			queue_id = rss_get_indirection_to_bucket(i);
    476 			queue_id = queue_id % adapter->num_queues;
    477 		} else
    478 			queue_id = (j * index_mult);
    479 
    480 		/*
    481 		 * The low 8 bits are for hash value (n+0);
    482 		 * The next 8 bits are for hash value (n+1), etc.
    483 		 */
    484 		reta = reta >> 8;
    485 		reta = reta | (((uint32_t) queue_id) << 24);
    486 		if ((i & 3) == 3) {
    487 			if (i < 128)
    488 				IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta);
    489 			else
    490 				IXGBE_WRITE_REG(hw, IXGBE_ERETA((i >> 2) - 32),
    491 				    reta);
    492 			reta = 0;
    493 		}
    494 	}
    495 
    496 	/* Now fill our hash function seeds */
    497 	for (i = 0; i < 10; i++)
    498 		IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), rss_key[i]);
    499 
    500 	/* Perform hash on these packet types */
    501 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
    502 		rss_hash_config = rss_gethashconfig();
    503 	else {
    504 		/*
    505 		 * Disable UDP - IP fragments aren't currently being handled
    506 		 * and so we end up with a mix of 2-tuple and 4-tuple
    507 		 * traffic.
    508 		 */
    509 		rss_hash_config = RSS_HASHTYPE_RSS_IPV4
    510 				| RSS_HASHTYPE_RSS_TCP_IPV4
    511 				| RSS_HASHTYPE_RSS_IPV6
    512 				| RSS_HASHTYPE_RSS_TCP_IPV6
    513 				| RSS_HASHTYPE_RSS_IPV6_EX
    514 				| RSS_HASHTYPE_RSS_TCP_IPV6_EX;
    515 	}
    516 
    517 	mrqc = IXGBE_MRQC_RSSEN;
    518 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
    519 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
    520 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
    521 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
    522 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
    523 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
    524 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
    525 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
    526 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
    527 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX;
    528 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
    529 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP;
    530 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
    531 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
    532 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
    533 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
    534 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
    535 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP;
    536 	mrqc |= ixgbe_get_mrqc(adapter->iov_mode);
    537 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
    538 } /* ixgbe_initialize_rss_mapping */
    539 
    540 /************************************************************************
    541  * ixgbe_initialize_receive_units - Setup receive registers and features.
    542  ************************************************************************/
    543 #define BSIZEPKT_ROUNDUP ((1<<IXGBE_SRRCTL_BSIZEPKT_SHIFT)-1)
    544 
    545 static void
    546 ixgbe_initialize_receive_units(struct adapter *adapter)
    547 {
    548 	struct	rx_ring	*rxr = adapter->rx_rings;
    549 	struct ixgbe_hw	*hw = &adapter->hw;
    550 	struct ifnet	*ifp = adapter->ifp;
    551 	int		i, j;
    552 	u32		bufsz, fctrl, srrctl, rxcsum;
    553 	u32		hlreg;
    554 
    555 	/*
    556 	 * Make sure receives are disabled while
    557 	 * setting up the descriptor ring
    558 	 */
    559 	ixgbe_disable_rx(hw);
    560 
    561 	/* Enable broadcasts */
    562 	fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
    563 	fctrl |= IXGBE_FCTRL_BAM;
    564 	if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
    565 		fctrl |= IXGBE_FCTRL_DPF;
    566 		fctrl |= IXGBE_FCTRL_PMCF;
    567 	}
    568 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl);
    569 
    570 	/* Set for Jumbo Frames? */
    571 	hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0);
    572 	if (ifp->if_mtu > ETHERMTU)
    573 		hlreg |= IXGBE_HLREG0_JUMBOEN;
    574 	else
    575 		hlreg &= ~IXGBE_HLREG0_JUMBOEN;
    576 
    577 #ifdef DEV_NETMAP
    578 	/* CRC stripping is conditional in Netmap */
    579 	if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
    580 	    (ifp->if_capenable & IFCAP_NETMAP) &&
    581 	    !ix_crcstrip)
    582 		hlreg &= ~IXGBE_HLREG0_RXCRCSTRP;
    583 	else
    584 #endif /* DEV_NETMAP */
    585 		hlreg |= IXGBE_HLREG0_RXCRCSTRP;
    586 
    587 	IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
    588 
    589 	bufsz = (adapter->rx_mbuf_sz + BSIZEPKT_ROUNDUP) >>
    590 	    IXGBE_SRRCTL_BSIZEPKT_SHIFT;
    591 
    592 	for (i = 0; i < adapter->num_queues; i++, rxr++) {
    593 		u64 rdba = rxr->rxdma.dma_paddr;
    594 		u32 reg;
    595 		int regnum = i / 4;	/* 1 register per 4 queues */
    596 		int regshift = i % 4;	/* 4 bits per 1 queue */
    597 		j = rxr->me;
    598 
    599 		/* Setup the Base and Length of the Rx Descriptor Ring */
    600 		IXGBE_WRITE_REG(hw, IXGBE_RDBAL(j),
    601 		    (rdba & 0x00000000ffffffffULL));
    602 		IXGBE_WRITE_REG(hw, IXGBE_RDBAH(j), (rdba >> 32));
    603 		IXGBE_WRITE_REG(hw, IXGBE_RDLEN(j),
    604 		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
    605 
    606 		/* Set up the SRRCTL register */
    607 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(j));
    608 		srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
    609 		srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
    610 		srrctl |= bufsz;
    611 		srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
    612 
    613 		/* Set RQSMR (Receive Queue Statistic Mapping) register */
    614 		reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(regnum));
    615 		reg &= ~(0x000000ffUL << (regshift * 8));
    616 		reg |= i << (regshift * 8);
    617 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(regnum), reg);
    618 
    619 		/*
    620 		 * Set DROP_EN iff we have no flow control and >1 queue.
    621 		 * Note that srrctl was cleared shortly before during reset,
    622 		 * so we do not need to clear the bit, but do it just in case
    623 		 * this code is moved elsewhere.
    624 		 */
    625 		if (adapter->num_queues > 1 &&
    626 		    adapter->hw.fc.requested_mode == ixgbe_fc_none) {
    627 			srrctl |= IXGBE_SRRCTL_DROP_EN;
    628 		} else {
    629 			srrctl &= ~IXGBE_SRRCTL_DROP_EN;
    630 		}
    631 
    632 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(j), srrctl);
    633 
    634 		/* Setup the HW Rx Head and Tail Descriptor Pointers */
    635 		IXGBE_WRITE_REG(hw, IXGBE_RDH(j), 0);
    636 		IXGBE_WRITE_REG(hw, IXGBE_RDT(j), 0);
    637 
    638 		/* Set the driver rx tail address */
    639 		rxr->tail =  IXGBE_RDT(rxr->me);
    640 	}
    641 
    642 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
    643 		u32 psrtype = IXGBE_PSRTYPE_TCPHDR
    644 			    | IXGBE_PSRTYPE_UDPHDR
    645 			    | IXGBE_PSRTYPE_IPV4HDR
    646 			    | IXGBE_PSRTYPE_IPV6HDR;
    647 		IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype);
    648 	}
    649 
    650 	rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM);
    651 
    652 	ixgbe_initialize_rss_mapping(adapter);
    653 
    654 	if (adapter->num_queues > 1) {
    655 		/* RSS and RX IPP Checksum are mutually exclusive */
    656 		rxcsum |= IXGBE_RXCSUM_PCSD;
    657 	}
    658 
    659 	if (ifp->if_capenable & IFCAP_RXCSUM)
    660 		rxcsum |= IXGBE_RXCSUM_PCSD;
    661 
    662 	/* This is useful for calculating UDP/IP fragment checksums */
    663 	if (!(rxcsum & IXGBE_RXCSUM_PCSD))
    664 		rxcsum |= IXGBE_RXCSUM_IPPCSE;
    665 
    666 	IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum);
    667 
    668 } /* ixgbe_initialize_receive_units */
    669 
    670 /************************************************************************
    671  * ixgbe_initialize_transmit_units - Enable transmit units.
    672  ************************************************************************/
    673 static void
    674 ixgbe_initialize_transmit_units(struct adapter *adapter)
    675 {
    676 	struct tx_ring	*txr = adapter->tx_rings;
    677 	struct ixgbe_hw	*hw = &adapter->hw;
    678 	int i;
    679 
    680 	INIT_DEBUGOUT("ixgbe_initialize_transmit_units");
    681 
    682 	/* Setup the Base and Length of the Tx Descriptor Ring */
    683 	for (i = 0; i < adapter->num_queues; i++, txr++) {
    684 		u64 tdba = txr->txdma.dma_paddr;
    685 		u32 txctrl = 0;
    686 		u32 tqsmreg, reg;
    687 		int regnum = i / 4;	/* 1 register per 4 queues */
    688 		int regshift = i % 4;	/* 4 bits per 1 queue */
    689 		int j = txr->me;
    690 
    691 		IXGBE_WRITE_REG(hw, IXGBE_TDBAL(j),
    692 		    (tdba & 0x00000000ffffffffULL));
    693 		IXGBE_WRITE_REG(hw, IXGBE_TDBAH(j), (tdba >> 32));
    694 		IXGBE_WRITE_REG(hw, IXGBE_TDLEN(j),
    695 		    adapter->num_tx_desc * sizeof(union ixgbe_adv_tx_desc));
    696 
    697 		/*
    698 		 * Set TQSMR (Transmit Queue Statistic Mapping) register.
    699 		 * Register location is different between 82598 and others.
    700 		 */
    701 		if (adapter->hw.mac.type == ixgbe_mac_82598EB)
    702 			tqsmreg = IXGBE_TQSMR(regnum);
    703 		else
    704 			tqsmreg = IXGBE_TQSM(regnum);
    705 		reg = IXGBE_READ_REG(hw, tqsmreg);
    706 		reg &= ~(0x000000ffUL << (regshift * 8));
    707 		reg |= i << (regshift * 8);
    708 		IXGBE_WRITE_REG(hw, tqsmreg, reg);
    709 
    710 		/* Setup the HW Tx Head and Tail descriptor pointers */
    711 		IXGBE_WRITE_REG(hw, IXGBE_TDH(j), 0);
    712 		IXGBE_WRITE_REG(hw, IXGBE_TDT(j), 0);
    713 
    714 		/* Cache the tail address */
    715 		txr->tail = IXGBE_TDT(j);
    716 
    717 		txr->txr_no_space = false;
    718 
    719 		/* Disable Head Writeback */
    720 		/*
    721 		 * Note: for X550 series devices, these registers are actually
    722 		 * prefixed with TPH_ isntead of DCA_, but the addresses and
    723 		 * fields remain the same.
    724 		 */
    725 		switch (hw->mac.type) {
    726 		case ixgbe_mac_82598EB:
    727 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(j));
    728 			break;
    729 		default:
    730 			txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(j));
    731 			break;
    732 		}
    733 		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
    734 		switch (hw->mac.type) {
    735 		case ixgbe_mac_82598EB:
    736 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(j), txctrl);
    737 			break;
    738 		default:
    739 			IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(j), txctrl);
    740 			break;
    741 		}
    742 
    743 	}
    744 
    745 	if (hw->mac.type != ixgbe_mac_82598EB) {
    746 		u32 dmatxctl, rttdcs;
    747 
    748 		dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
    749 		dmatxctl |= IXGBE_DMATXCTL_TE;
    750 		IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl);
    751 		/* Disable arbiter to set MTQC */
    752 		rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
    753 		rttdcs |= IXGBE_RTTDCS_ARBDIS;
    754 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
    755 		IXGBE_WRITE_REG(hw, IXGBE_MTQC,
    756 		    ixgbe_get_mtqc(adapter->iov_mode));
    757 		rttdcs &= ~IXGBE_RTTDCS_ARBDIS;
    758 		IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs);
    759 	}
    760 
    761 	return;
    762 } /* ixgbe_initialize_transmit_units */
    763 
    764 /************************************************************************
    765  * ixgbe_attach - Device initialization routine
    766  *
    767  *   Called when the driver is being loaded.
    768  *   Identifies the type of hardware, allocates all resources
    769  *   and initializes the hardware.
    770  *
    771  *   return 0 on success, positive on failure
    772  ************************************************************************/
    773 static void
    774 ixgbe_attach(device_t parent, device_t dev, void *aux)
    775 {
    776 	struct adapter	*adapter;
    777 	struct ixgbe_hw *hw;
    778 	int		error = -1;
    779 	u32		ctrl_ext;
    780 	u16		high, low, nvmreg;
    781 	pcireg_t	id, subid;
    782 	const ixgbe_vendor_info_t *ent;
    783 	struct pci_attach_args *pa = aux;
    784 	bool unsupported_sfp = false;
    785 	const char *str;
    786 	char buf[256];
    787 
    788 	INIT_DEBUGOUT("ixgbe_attach: begin");
    789 
    790 	/* Allocate, clear, and link in our adapter structure */
    791 	adapter = device_private(dev);
    792 	adapter->hw.back = adapter;
    793 	adapter->dev = dev;
    794 	hw = &adapter->hw;
    795 	adapter->osdep.pc = pa->pa_pc;
    796 	adapter->osdep.tag = pa->pa_tag;
    797 	if (pci_dma64_available(pa))
    798 		adapter->osdep.dmat = pa->pa_dmat64;
    799 	else
    800 		adapter->osdep.dmat = pa->pa_dmat;
    801 	adapter->osdep.attached = false;
    802 
    803 	ent = ixgbe_lookup(pa);
    804 
    805 	KASSERT(ent != NULL);
    806 
    807 	aprint_normal(": %s, Version - %s\n",
    808 	    ixgbe_strings[ent->index], ixgbe_driver_version);
    809 
    810 	/* Core Lock Init*/
    811 	IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
    812 
    813 	/* Set up the timer callout */
    814 	callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
    815 
    816 	/* Determine hardware revision */
    817 	id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
    818 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
    819 
    820 	hw->vendor_id = PCI_VENDOR(id);
    821 	hw->device_id = PCI_PRODUCT(id);
    822 	hw->revision_id =
    823 	    PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
    824 	hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
    825 	hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
    826 
    827 	/*
    828 	 * Make sure BUSMASTER is set
    829 	 */
    830 	ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
    831 
    832 	/* Do base PCI setup - map BAR0 */
    833 	if (ixgbe_allocate_pci_resources(adapter, pa)) {
    834 		aprint_error_dev(dev, "Allocation of PCI resources failed\n");
    835 		error = ENXIO;
    836 		goto err_out;
    837 	}
    838 
    839 	/* let hardware know driver is loaded */
    840 	ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
    841 	ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD;
    842 	IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
    843 
    844 	/*
    845 	 * Initialize the shared code
    846 	 */
    847 	if (ixgbe_init_shared_code(hw) != 0) {
    848 		aprint_error_dev(dev, "Unable to initialize the shared code\n");
    849 		error = ENXIO;
    850 		goto err_out;
    851 	}
    852 
    853 	switch (hw->mac.type) {
    854 	case ixgbe_mac_82598EB:
    855 		str = "82598EB";
    856 		break;
    857 	case ixgbe_mac_82599EB:
    858 		str = "82599EB";
    859 		break;
    860 	case ixgbe_mac_X540:
    861 		str = "X540";
    862 		break;
    863 	case ixgbe_mac_X550:
    864 		str = "X550";
    865 		break;
    866 	case ixgbe_mac_X550EM_x:
    867 		str = "X550EM";
    868 		break;
    869 	case ixgbe_mac_X550EM_a:
    870 		str = "X550EM A";
    871 		break;
    872 	default:
    873 		str = "Unknown";
    874 		break;
    875 	}
    876 	aprint_normal_dev(dev, "device %s\n", str);
    877 
    878 	if (hw->mbx.ops.init_params)
    879 		hw->mbx.ops.init_params(hw);
    880 
    881 	hw->allow_unsupported_sfp = allow_unsupported_sfp;
    882 
    883 	/* Pick up the 82599 settings */
    884 	if (hw->mac.type != ixgbe_mac_82598EB) {
    885 		hw->phy.smart_speed = ixgbe_smart_speed;
    886 		adapter->num_segs = IXGBE_82599_SCATTER;
    887 	} else
    888 		adapter->num_segs = IXGBE_82598_SCATTER;
    889 
    890 	/* Ensure SW/FW semaphore is free */
    891 	ixgbe_init_swfw_semaphore(hw);
    892 
    893 	hw->mac.ops.set_lan_id(hw);
    894 	ixgbe_init_device_features(adapter);
    895 
    896 	if (ixgbe_configure_interrupts(adapter)) {
    897 		error = ENXIO;
    898 		goto err_out;
    899 	}
    900 
    901 	/* Allocate multicast array memory. */
    902 	adapter->mta = malloc(sizeof(*adapter->mta) *
    903 	    MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_WAITOK);
    904 
    905 	/* Enable WoL (if supported) */
    906 	ixgbe_check_wol_support(adapter);
    907 
    908 	/* Register for VLAN events */
    909 	ether_set_vlan_cb(&adapter->osdep.ec, ixgbe_vlan_cb);
    910 
    911 	/* Verify adapter fan is still functional (if applicable) */
    912 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
    913 		u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    914 		ixgbe_check_fan_failure(adapter, esdp, FALSE);
    915 	}
    916 
    917 	/* Set an initial default flow control value */
    918 	hw->fc.requested_mode = ixgbe_flow_control;
    919 
    920 	/* Sysctls for limiting the amount of work done in the taskqueues */
    921 	ixgbe_set_sysctl_value(adapter, "rx_processing_limit",
    922 	    "max number of rx packets to process",
    923 	    &adapter->rx_process_limit, ixgbe_rx_process_limit);
    924 
    925 	ixgbe_set_sysctl_value(adapter, "tx_processing_limit",
    926 	    "max number of tx packets to process",
    927 	    &adapter->tx_process_limit, ixgbe_tx_process_limit);
    928 
    929 	/* Do descriptor calc and sanity checks */
    930 	if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
    931 	    ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) {
    932 		aprint_error_dev(dev, "TXD config issue, using default!\n");
    933 		adapter->num_tx_desc = DEFAULT_TXD;
    934 	} else
    935 		adapter->num_tx_desc = ixgbe_txd;
    936 
    937 	if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
    938 	    ixgbe_rxd < MIN_RXD || ixgbe_rxd > MAX_RXD) {
    939 		aprint_error_dev(dev, "RXD config issue, using default!\n");
    940 		adapter->num_rx_desc = DEFAULT_RXD;
    941 	} else
    942 		adapter->num_rx_desc = ixgbe_rxd;
    943 
    944 	/* Allocate our TX/RX Queues */
    945 	if (ixgbe_allocate_queues(adapter)) {
    946 		error = ENOMEM;
    947 		goto err_out;
    948 	}
    949 
    950 	hw->phy.reset_if_overtemp = TRUE;
    951 	error = ixgbe_reset_hw(hw);
    952 	hw->phy.reset_if_overtemp = FALSE;
    953 	if (error == IXGBE_ERR_SFP_NOT_PRESENT) {
    954 		/*
    955 		 * No optics in this port, set up
    956 		 * so the timer routine will probe
    957 		 * for later insertion.
    958 		 */
    959 		adapter->sfp_probe = TRUE;
    960 		error = IXGBE_SUCCESS;
    961 	} else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) {
    962 		aprint_error_dev(dev, "Unsupported SFP+ module detected!\n");
    963 		unsupported_sfp = true;
    964 		error = IXGBE_SUCCESS;
    965 	} else if (error) {
    966 		aprint_error_dev(dev, "Hardware initialization failed\n");
    967 		error = EIO;
    968 		goto err_late;
    969 	}
    970 
    971 	/* Make sure we have a good EEPROM before we read from it */
    972 	if (ixgbe_validate_eeprom_checksum(&adapter->hw, NULL) < 0) {
    973 		aprint_error_dev(dev, "The EEPROM Checksum Is Not Valid\n");
    974 		error = EIO;
    975 		goto err_late;
    976 	}
    977 
    978 	aprint_normal("%s:", device_xname(dev));
    979 	/* NVM Image Version */
    980 	high = low = 0;
    981 	switch (hw->mac.type) {
    982 	case ixgbe_mac_X540:
    983 	case ixgbe_mac_X550EM_a:
    984 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
    985 		if (nvmreg == 0xffff)
    986 			break;
    987 		high = (nvmreg >> 12) & 0x0f;
    988 		low = (nvmreg >> 4) & 0xff;
    989 		id = nvmreg & 0x0f;
    990 		aprint_normal(" NVM Image Version %u.", high);
    991 		if (hw->mac.type == ixgbe_mac_X540)
    992 			str = "%x";
    993 		else
    994 			str = "%02x";
    995 		aprint_normal(str, low);
    996 		aprint_normal(" ID 0x%x,", id);
    997 		break;
    998 	case ixgbe_mac_X550EM_x:
    999 	case ixgbe_mac_X550:
   1000 		hw->eeprom.ops.read(hw, IXGBE_NVM_IMAGE_VER, &nvmreg);
   1001 		if (nvmreg == 0xffff)
   1002 			break;
   1003 		high = (nvmreg >> 12) & 0x0f;
   1004 		low = nvmreg & 0xff;
   1005 		aprint_normal(" NVM Image Version %u.%02x,", high, low);
   1006 		break;
   1007 	default:
   1008 		break;
   1009 	}
   1010 	hw->eeprom.nvm_image_ver_high = high;
   1011 	hw->eeprom.nvm_image_ver_low = low;
   1012 
   1013 	/* PHY firmware revision */
   1014 	switch (hw->mac.type) {
   1015 	case ixgbe_mac_X540:
   1016 	case ixgbe_mac_X550:
   1017 		hw->eeprom.ops.read(hw, IXGBE_PHYFW_REV, &nvmreg);
   1018 		if (nvmreg == 0xffff)
   1019 			break;
   1020 		high = (nvmreg >> 12) & 0x0f;
   1021 		low = (nvmreg >> 4) & 0xff;
   1022 		id = nvmreg & 0x000f;
   1023 		aprint_normal(" PHY FW Revision %u.", high);
   1024 		if (hw->mac.type == ixgbe_mac_X540)
   1025 			str = "%x";
   1026 		else
   1027 			str = "%02x";
   1028 		aprint_normal(str, low);
   1029 		aprint_normal(" ID 0x%x,", id);
   1030 		break;
   1031 	default:
   1032 		break;
   1033 	}
   1034 
   1035 	/* NVM Map version & OEM NVM Image version */
   1036 	switch (hw->mac.type) {
   1037 	case ixgbe_mac_X550:
   1038 	case ixgbe_mac_X550EM_x:
   1039 	case ixgbe_mac_X550EM_a:
   1040 		hw->eeprom.ops.read(hw, IXGBE_NVM_MAP_VER, &nvmreg);
   1041 		if (nvmreg != 0xffff) {
   1042 			high = (nvmreg >> 12) & 0x0f;
   1043 			low = nvmreg & 0x00ff;
   1044 			aprint_normal(" NVM Map version %u.%02x,", high, low);
   1045 		}
   1046 		hw->eeprom.ops.read(hw, IXGBE_OEM_NVM_IMAGE_VER, &nvmreg);
   1047 		if (nvmreg != 0xffff) {
   1048 			high = (nvmreg >> 12) & 0x0f;
   1049 			low = nvmreg & 0x00ff;
   1050 			aprint_verbose(" OEM NVM Image version %u.%02x,", high,
   1051 			    low);
   1052 		}
   1053 		break;
   1054 	default:
   1055 		break;
   1056 	}
   1057 
   1058 	/* Print the ETrackID */
   1059 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_H, &high);
   1060 	hw->eeprom.ops.read(hw, IXGBE_ETRACKID_L, &low);
   1061 	aprint_normal(" ETrackID %08x\n", ((uint32_t)high << 16) | low);
   1062 
   1063 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   1064 		error = ixgbe_allocate_msix(adapter, pa);
   1065 		if (error) {
   1066 			/* Free allocated queue structures first */
   1067 			ixgbe_free_queues(adapter);
   1068 
   1069 			/* Fallback to legacy interrupt */
   1070 			adapter->feat_en &= ~IXGBE_FEATURE_MSIX;
   1071 			if (adapter->feat_cap & IXGBE_FEATURE_MSI)
   1072 				adapter->feat_en |= IXGBE_FEATURE_MSI;
   1073 			adapter->num_queues = 1;
   1074 
   1075 			/* Allocate our TX/RX Queues again */
   1076 			if (ixgbe_allocate_queues(adapter)) {
   1077 				error = ENOMEM;
   1078 				goto err_out;
   1079 			}
   1080 		}
   1081 	}
   1082 	/* Recovery mode */
   1083 	switch (adapter->hw.mac.type) {
   1084 	case ixgbe_mac_X550:
   1085 	case ixgbe_mac_X550EM_x:
   1086 	case ixgbe_mac_X550EM_a:
   1087 		/* >= 2.00 */
   1088 		if (hw->eeprom.nvm_image_ver_high >= 2) {
   1089 			adapter->feat_cap |= IXGBE_FEATURE_RECOVERY_MODE;
   1090 			adapter->feat_en |= IXGBE_FEATURE_RECOVERY_MODE;
   1091 		}
   1092 		break;
   1093 	default:
   1094 		break;
   1095 	}
   1096 
   1097 	if ((adapter->feat_en & IXGBE_FEATURE_MSIX) == 0)
   1098 		error = ixgbe_allocate_legacy(adapter, pa);
   1099 	if (error)
   1100 		goto err_late;
   1101 
   1102 	/* Tasklets for Link, SFP, Multispeed Fiber and Flow Director */
   1103 	adapter->link_si = softint_establish(SOFTINT_NET |IXGBE_SOFTINT_FLAGS,
   1104 	    ixgbe_handle_link, adapter);
   1105 	adapter->mod_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1106 	    ixgbe_handle_mod, adapter);
   1107 	adapter->phy_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1108 	    ixgbe_handle_phy, adapter);
   1109 	if (adapter->feat_en & IXGBE_FEATURE_FDIR)
   1110 		adapter->fdir_si =
   1111 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   1112 			ixgbe_reinit_fdir, adapter);
   1113 	if ((adapter->link_si == NULL) || (adapter->mod_si == NULL)
   1114 	    || (adapter->phy_si == NULL)
   1115 	    || ((adapter->feat_en & IXGBE_FEATURE_FDIR)
   1116 		&& (adapter->fdir_si == NULL))) {
   1117 		aprint_error_dev(dev,
   1118 		    "could not establish software interrupts ()\n");
   1119 		goto err_out;
   1120 	}
   1121 	char wqname[MAXCOMLEN];
   1122 	snprintf(wqname, sizeof(wqname), "%s-msf", device_xname(dev));
   1123 	error = workqueue_create(&adapter->msf_wq, wqname,
   1124 	    ixgbe_handle_msf, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   1125 	    IXGBE_TASKLET_WQ_FLAGS);
   1126 	if (error) {
   1127 		aprint_error_dev(dev,
   1128 		    "could not create MSF workqueue (%d)\n", error);
   1129 		goto err_out;
   1130 	}
   1131 
   1132 	error = ixgbe_start_hw(hw);
   1133 	switch (error) {
   1134 	case IXGBE_ERR_EEPROM_VERSION:
   1135 		aprint_error_dev(dev, "This device is a pre-production adapter/"
   1136 		    "LOM.  Please be aware there may be issues associated "
   1137 		    "with your hardware.\nIf you are experiencing problems "
   1138 		    "please contact your Intel or hardware representative "
   1139 		    "who provided you with this hardware.\n");
   1140 		break;
   1141 	default:
   1142 		break;
   1143 	}
   1144 
   1145 	/* Setup OS specific network interface */
   1146 	if (ixgbe_setup_interface(dev, adapter) != 0)
   1147 		goto err_late;
   1148 
   1149 	/*
   1150 	 *  Print PHY ID only for copper PHY. On device which has SFP(+) cage
   1151 	 * and a module is inserted, phy.id is not MII PHY id but SFF 8024 ID.
   1152 	 */
   1153 	if (hw->phy.media_type == ixgbe_media_type_copper) {
   1154 		uint16_t id1, id2;
   1155 		int oui, model, rev;
   1156 		const char *descr;
   1157 
   1158 		id1 = hw->phy.id >> 16;
   1159 		id2 = hw->phy.id & 0xffff;
   1160 		oui = MII_OUI(id1, id2);
   1161 		model = MII_MODEL(id2);
   1162 		rev = MII_REV(id2);
   1163 		if ((descr = mii_get_descr(oui, model)) != NULL)
   1164 			aprint_normal_dev(dev,
   1165 			    "PHY: %s (OUI 0x%06x, model 0x%04x), rev. %d\n",
   1166 			    descr, oui, model, rev);
   1167 		else
   1168 			aprint_normal_dev(dev,
   1169 			    "PHY OUI 0x%06x, model 0x%04x, rev. %d\n",
   1170 			    oui, model, rev);
   1171 	}
   1172 
   1173 	/* Enable EEE power saving */
   1174 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   1175 		hw->mac.ops.setup_eee(hw,
   1176 		    adapter->feat_en & IXGBE_FEATURE_EEE);
   1177 
   1178 	/* Enable power to the phy. */
   1179 	if (!unsupported_sfp) {
   1180 		/* Enable the optics for 82599 SFP+ fiber */
   1181 		ixgbe_enable_tx_laser(hw);
   1182 
   1183 		/*
   1184 		 * XXX Currently, ixgbe_set_phy_power() supports only copper
   1185 		 * PHY, so it's not required to test with !unsupported_sfp.
   1186 		 */
   1187 		ixgbe_set_phy_power(hw, TRUE);
   1188 	}
   1189 
   1190 	/* Initialize statistics */
   1191 	ixgbe_update_stats_counters(adapter);
   1192 
   1193 	/* Check PCIE slot type/speed/width */
   1194 	ixgbe_get_slot_info(adapter);
   1195 
   1196 	/*
   1197 	 * Do time init and sysctl init here, but
   1198 	 * only on the first port of a bypass adapter.
   1199 	 */
   1200 	ixgbe_bypass_init(adapter);
   1201 
   1202 	/* Set an initial dmac value */
   1203 	adapter->dmac = 0;
   1204 	/* Set initial advertised speeds (if applicable) */
   1205 	adapter->advertise = ixgbe_get_advertise(adapter);
   1206 
   1207 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
   1208 		ixgbe_define_iov_schemas(dev, &error);
   1209 
   1210 	/* Add sysctls */
   1211 	ixgbe_add_device_sysctls(adapter);
   1212 	ixgbe_add_hw_stats(adapter);
   1213 
   1214 	/* For Netmap */
   1215 	adapter->init_locked = ixgbe_init_locked;
   1216 	adapter->stop_locked = ixgbe_stop;
   1217 
   1218 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
   1219 		ixgbe_netmap_attach(adapter);
   1220 
   1221 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
   1222 	aprint_verbose_dev(dev, "feature cap %s\n", buf);
   1223 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
   1224 	aprint_verbose_dev(dev, "feature ena %s\n", buf);
   1225 
   1226 	if (pmf_device_register(dev, ixgbe_suspend, ixgbe_resume))
   1227 		pmf_class_network_register(dev, adapter->ifp);
   1228 	else
   1229 		aprint_error_dev(dev, "couldn't establish power handler\n");
   1230 
   1231 	/* Init recovery mode timer and state variable */
   1232 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE) {
   1233 		adapter->recovery_mode = 0;
   1234 
   1235 		/* Set up the timer callout */
   1236 		callout_init(&adapter->recovery_mode_timer,
   1237 		    IXGBE_CALLOUT_FLAGS);
   1238 
   1239 		/* Start the task */
   1240 		callout_reset(&adapter->recovery_mode_timer, hz,
   1241 		    ixgbe_recovery_mode_timer, adapter);
   1242 	}
   1243 
   1244 	INIT_DEBUGOUT("ixgbe_attach: end");
   1245 	adapter->osdep.attached = true;
   1246 
   1247 	return;
   1248 
   1249 err_late:
   1250 	ixgbe_free_queues(adapter);
   1251 err_out:
   1252 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
   1253 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
   1254 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
   1255 	ixgbe_free_softint(adapter);
   1256 	ixgbe_free_pci_resources(adapter);
   1257 	if (adapter->mta != NULL)
   1258 		free(adapter->mta, M_DEVBUF);
   1259 	IXGBE_CORE_LOCK_DESTROY(adapter);
   1260 
   1261 	return;
   1262 } /* ixgbe_attach */
   1263 
   1264 /************************************************************************
   1265  * ixgbe_check_wol_support
   1266  *
   1267  *   Checks whether the adapter's ports are capable of
   1268  *   Wake On LAN by reading the adapter's NVM.
   1269  *
   1270  *   Sets each port's hw->wol_enabled value depending
   1271  *   on the value read here.
   1272  ************************************************************************/
   1273 static void
   1274 ixgbe_check_wol_support(struct adapter *adapter)
   1275 {
   1276 	struct ixgbe_hw *hw = &adapter->hw;
   1277 	u16		dev_caps = 0;
   1278 
   1279 	/* Find out WoL support for port */
   1280 	adapter->wol_support = hw->wol_enabled = 0;
   1281 	ixgbe_get_device_caps(hw, &dev_caps);
   1282 	if ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0_1) ||
   1283 	    ((dev_caps & IXGBE_DEVICE_CAPS_WOL_PORT0) &&
   1284 	     hw->bus.func == 0))
   1285 		adapter->wol_support = hw->wol_enabled = 1;
   1286 
   1287 	/* Save initial wake up filter configuration */
   1288 	adapter->wufc = IXGBE_READ_REG(hw, IXGBE_WUFC);
   1289 
   1290 	return;
   1291 } /* ixgbe_check_wol_support */
   1292 
   1293 /************************************************************************
   1294  * ixgbe_setup_interface
   1295  *
   1296  *   Setup networking device structure and register an interface.
   1297  ************************************************************************/
   1298 static int
   1299 ixgbe_setup_interface(device_t dev, struct adapter *adapter)
   1300 {
   1301 	struct ethercom *ec = &adapter->osdep.ec;
   1302 	struct ifnet   *ifp;
   1303 	int rv;
   1304 
   1305 	INIT_DEBUGOUT("ixgbe_setup_interface: begin");
   1306 
   1307 	ifp = adapter->ifp = &ec->ec_if;
   1308 	strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
   1309 	ifp->if_baudrate = IF_Gbps(10);
   1310 	ifp->if_init = ixgbe_init;
   1311 	ifp->if_stop = ixgbe_ifstop;
   1312 	ifp->if_softc = adapter;
   1313 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
   1314 #ifdef IXGBE_MPSAFE
   1315 	ifp->if_extflags = IFEF_MPSAFE;
   1316 #endif
   1317 	ifp->if_ioctl = ixgbe_ioctl;
   1318 #if __FreeBSD_version >= 1100045
   1319 	/* TSO parameters */
   1320 	ifp->if_hw_tsomax = 65518;
   1321 	ifp->if_hw_tsomaxsegcount = IXGBE_82599_SCATTER;
   1322 	ifp->if_hw_tsomaxsegsize = 2048;
   1323 #endif
   1324 	if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
   1325 #if 0
   1326 		ixgbe_start_locked = ixgbe_legacy_start_locked;
   1327 #endif
   1328 	} else {
   1329 		ifp->if_transmit = ixgbe_mq_start;
   1330 #if 0
   1331 		ixgbe_start_locked = ixgbe_mq_start_locked;
   1332 #endif
   1333 	}
   1334 	ifp->if_start = ixgbe_legacy_start;
   1335 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
   1336 	IFQ_SET_READY(&ifp->if_snd);
   1337 
   1338 	rv = if_initialize(ifp);
   1339 	if (rv != 0) {
   1340 		aprint_error_dev(dev, "if_initialize failed(%d)\n", rv);
   1341 		return rv;
   1342 	}
   1343 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
   1344 	ether_ifattach(ifp, adapter->hw.mac.addr);
   1345 	aprint_normal_dev(dev, "Ethernet address %s\n",
   1346 	    ether_sprintf(adapter->hw.mac.addr));
   1347 	/*
   1348 	 * We use per TX queue softint, so if_deferred_start_init() isn't
   1349 	 * used.
   1350 	 */
   1351 	ether_set_ifflags_cb(ec, ixgbe_ifflags_cb);
   1352 
   1353 	adapter->max_frame_size = ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
   1354 
   1355 	/*
   1356 	 * Tell the upper layer(s) we support long frames.
   1357 	 */
   1358 	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
   1359 
   1360 	/* Set capability flags */
   1361 	ifp->if_capabilities |= IFCAP_RXCSUM
   1362 			     |	IFCAP_TXCSUM
   1363 			     |	IFCAP_TSOv4
   1364 			     |	IFCAP_TSOv6;
   1365 	ifp->if_capenable = 0;
   1366 
   1367 	ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING
   1368 			    |  ETHERCAP_VLAN_HWCSUM
   1369 			    |  ETHERCAP_JUMBO_MTU
   1370 			    |  ETHERCAP_VLAN_MTU;
   1371 
   1372 	/* Enable the above capabilities by default */
   1373 	ec->ec_capenable = ec->ec_capabilities;
   1374 
   1375 	/*
   1376 	 * Don't turn this on by default, if vlans are
   1377 	 * created on another pseudo device (eg. lagg)
   1378 	 * then vlan events are not passed thru, breaking
   1379 	 * operation, but with HW FILTER off it works. If
   1380 	 * using vlans directly on the ixgbe driver you can
   1381 	 * enable this and get full hardware tag filtering.
   1382 	 */
   1383 	ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER;
   1384 
   1385 	/*
   1386 	 * Specify the media types supported by this adapter and register
   1387 	 * callbacks to update media and link information
   1388 	 */
   1389 	ec->ec_ifmedia = &adapter->media;
   1390 	ifmedia_init_with_lock(&adapter->media, IFM_IMASK, ixgbe_media_change,
   1391 	    ixgbe_media_status, &adapter->core_mtx);
   1392 
   1393 	adapter->phy_layer = ixgbe_get_supported_physical_layer(&adapter->hw);
   1394 	ixgbe_add_media_types(adapter);
   1395 
   1396 	/* Set autoselect media by default */
   1397 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
   1398 
   1399 	if_register(ifp);
   1400 
   1401 	return (0);
   1402 } /* ixgbe_setup_interface */
   1403 
   1404 /************************************************************************
   1405  * ixgbe_add_media_types
   1406  ************************************************************************/
   1407 static void
   1408 ixgbe_add_media_types(struct adapter *adapter)
   1409 {
   1410 	struct ixgbe_hw *hw = &adapter->hw;
   1411 	u64		layer;
   1412 
   1413 	layer = adapter->phy_layer;
   1414 
   1415 #define	ADD(mm, dd)							\
   1416 	ifmedia_add(&adapter->media, IFM_ETHER | (mm), (dd), NULL);
   1417 
   1418 	ADD(IFM_NONE, 0);
   1419 
   1420 	/* Media types with matching NetBSD media defines */
   1421 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_T) {
   1422 		ADD(IFM_10G_T | IFM_FDX, 0);
   1423 	}
   1424 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_T) {
   1425 		ADD(IFM_1000_T | IFM_FDX, 0);
   1426 	}
   1427 	if (layer & IXGBE_PHYSICAL_LAYER_100BASE_TX) {
   1428 		ADD(IFM_100_TX | IFM_FDX, 0);
   1429 	}
   1430 	if (layer & IXGBE_PHYSICAL_LAYER_10BASE_T) {
   1431 		ADD(IFM_10_T | IFM_FDX, 0);
   1432 	}
   1433 
   1434 	if (layer & IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU ||
   1435 	    layer & IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA) {
   1436 		ADD(IFM_10G_TWINAX | IFM_FDX, 0);
   1437 	}
   1438 
   1439 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_LR) {
   1440 		ADD(IFM_10G_LR | IFM_FDX, 0);
   1441 		if (hw->phy.multispeed_fiber) {
   1442 			ADD(IFM_1000_LX | IFM_FDX, 0);
   1443 		}
   1444 	}
   1445 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_SR) {
   1446 		ADD(IFM_10G_SR | IFM_FDX, 0);
   1447 		if (hw->phy.multispeed_fiber) {
   1448 			ADD(IFM_1000_SX | IFM_FDX, 0);
   1449 		}
   1450 	} else if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_SX) {
   1451 		ADD(IFM_1000_SX | IFM_FDX, 0);
   1452 	}
   1453 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_CX4) {
   1454 		ADD(IFM_10G_CX4 | IFM_FDX, 0);
   1455 	}
   1456 
   1457 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KR) {
   1458 		ADD(IFM_10G_KR | IFM_FDX, 0);
   1459 	}
   1460 	if (layer & IXGBE_PHYSICAL_LAYER_10GBASE_KX4) {
   1461 		ADD(IFM_10G_KX4 | IFM_FDX, 0);
   1462 	}
   1463 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_KX) {
   1464 		ADD(IFM_1000_KX | IFM_FDX, 0);
   1465 	}
   1466 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_KX) {
   1467 		ADD(IFM_2500_KX | IFM_FDX, 0);
   1468 	}
   1469 	if (layer & IXGBE_PHYSICAL_LAYER_2500BASE_T) {
   1470 		ADD(IFM_2500_T | IFM_FDX, 0);
   1471 	}
   1472 	if (layer & IXGBE_PHYSICAL_LAYER_5GBASE_T) {
   1473 		ADD(IFM_5000_T | IFM_FDX, 0);
   1474 	}
   1475 	if (layer & IXGBE_PHYSICAL_LAYER_1000BASE_BX)
   1476 		ADD(IFM_1000_BX10 | IFM_FDX, 0);
   1477 	/* XXX no ifmedia_set? */
   1478 
   1479 	ADD(IFM_AUTO, 0);
   1480 
   1481 #undef ADD
   1482 } /* ixgbe_add_media_types */
   1483 
   1484 /************************************************************************
   1485  * ixgbe_is_sfp
   1486  ************************************************************************/
   1487 static inline bool
   1488 ixgbe_is_sfp(struct ixgbe_hw *hw)
   1489 {
   1490 	switch (hw->mac.type) {
   1491 	case ixgbe_mac_82598EB:
   1492 		if (hw->phy.type == ixgbe_phy_nl)
   1493 			return (TRUE);
   1494 		return (FALSE);
   1495 	case ixgbe_mac_82599EB:
   1496 	case ixgbe_mac_X550EM_x:
   1497 	case ixgbe_mac_X550EM_a:
   1498 		switch (hw->mac.ops.get_media_type(hw)) {
   1499 		case ixgbe_media_type_fiber:
   1500 		case ixgbe_media_type_fiber_qsfp:
   1501 			return (TRUE);
   1502 		default:
   1503 			return (FALSE);
   1504 		}
   1505 	default:
   1506 		return (FALSE);
   1507 	}
   1508 } /* ixgbe_is_sfp */
   1509 
   1510 static void
   1511 ixgbe_schedule_msf_tasklet(struct adapter *adapter)
   1512 {
   1513 	if (adapter->schedule_wqs_ok) {
   1514 		if (!adapter->msf_pending) {
   1515 			adapter->msf_pending = true;
   1516 			workqueue_enqueue(adapter->msf_wq,
   1517 			    &adapter->msf_wc, NULL);
   1518 		}
   1519 	}
   1520 }
   1521 
   1522 /************************************************************************
   1523  * ixgbe_config_link
   1524  ************************************************************************/
   1525 static void
   1526 ixgbe_config_link(struct adapter *adapter)
   1527 {
   1528 	struct ixgbe_hw *hw = &adapter->hw;
   1529 	u32		autoneg, err = 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 			kpreempt_disable();
   1538 			ixgbe_schedule_msf_tasklet(adapter);
   1539 			kpreempt_enable();
   1540 		}
   1541 		softint_schedule(adapter->mod_si);
   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->link_irq, EVCNT_TYPE_INTR,
   1770 	    NULL, xname, "Link MSI-X IRQ Handled");
   1771 	evcnt_attach_dynamic(&adapter->link_sicount, EVCNT_TYPE_INTR,
   1772 	    NULL, xname, "Link softint");
   1773 	evcnt_attach_dynamic(&adapter->mod_sicount, EVCNT_TYPE_INTR,
   1774 	    NULL, xname, "module softint");
   1775 	evcnt_attach_dynamic(&adapter->msf_sicount, EVCNT_TYPE_INTR,
   1776 	    NULL, xname, "multimode softint");
   1777 	evcnt_attach_dynamic(&adapter->phy_sicount, EVCNT_TYPE_INTR,
   1778 	    NULL, xname, "external PHY softint");
   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->link_irq.ev_count = 0;
   2076 	adapter->link_sicount.ev_count = 0;
   2077 	adapter->mod_sicount.ev_count = 0;
   2078 	adapter->msf_sicount.ev_count = 0;
   2079 	adapter->phy_sicount.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_link - Link status change ISR (MSI/MSI-X)
   3051  ************************************************************************/
   3052 static int
   3053 ixgbe_msix_link(void *arg)
   3054 {
   3055 	struct adapter	*adapter = arg;
   3056 	struct ixgbe_hw *hw = &adapter->hw;
   3057 	u32		eicr, eicr_mask;
   3058 	s32		retval;
   3059 
   3060 	++adapter->link_irq.ev_count;
   3061 
   3062 	/* Pause other interrupts */
   3063 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_OTHER);
   3064 
   3065 	/* First get the cause */
   3066 	/*
   3067 	 * The specifications of 82598, 82599, X540 and X550 say EICS register
   3068 	 * is write only. However, Linux says it is a workaround for silicon
   3069 	 * errata to read EICS instead of EICR to get interrupt cause. It seems
   3070 	 * there is a problem about read clear mechanism for EICR register.
   3071 	 */
   3072 	eicr = IXGBE_READ_REG(hw, IXGBE_EICS);
   3073 	/* Be sure the queue bits are not cleared */
   3074 	eicr &= ~IXGBE_EICR_RTX_QUEUE;
   3075 	/* Clear interrupt with write */
   3076 	IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr);
   3077 
   3078 	if (ixgbe_is_sfp(hw)) {
   3079 		/* Pluggable optics-related interrupt */
   3080 		if (hw->mac.type >= ixgbe_mac_X540)
   3081 			eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
   3082 		else
   3083 			eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
   3084 
   3085 		/*
   3086 		 *  An interrupt might not arrive when a module is inserted.
   3087 		 * When an link status change interrupt occurred and the driver
   3088 		 * still regard SFP as unplugged, issue the module softint
   3089 		 * and then issue LSC interrupt.
   3090 		 */
   3091 		if ((eicr & eicr_mask)
   3092 		    || ((hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   3093 			&& (eicr & IXGBE_EICR_LSC))) {
   3094 			IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
   3095 			softint_schedule(adapter->mod_si);
   3096 		}
   3097 
   3098 		if ((hw->mac.type == ixgbe_mac_82599EB) &&
   3099 		    (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
   3100 			IXGBE_WRITE_REG(hw, IXGBE_EICR,
   3101 			    IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   3102 			ixgbe_schedule_msf_tasklet(adapter);
   3103 		}
   3104 	}
   3105 
   3106 	/* Link status change */
   3107 	if (eicr & IXGBE_EICR_LSC) {
   3108 		IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_LSC);
   3109 		softint_schedule(adapter->link_si);
   3110 	}
   3111 
   3112 	if (adapter->hw.mac.type != ixgbe_mac_82598EB) {
   3113 		if ((adapter->feat_en & IXGBE_FEATURE_FDIR) &&
   3114 		    (eicr & IXGBE_EICR_FLOW_DIR)) {
   3115 			/* This is probably overkill :) */
   3116 			if (!atomic_cas_uint(&adapter->fdir_reinit, 0, 1))
   3117 				return 1;
   3118 			/* Disable the interrupt */
   3119 			IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_EIMC_FLOW_DIR);
   3120 			softint_schedule(adapter->fdir_si);
   3121 		}
   3122 
   3123 		if (eicr & IXGBE_EICR_ECC) {
   3124 			device_printf(adapter->dev,
   3125 			    "CRITICAL: ECC ERROR!! Please Reboot!!\n");
   3126 			IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC);
   3127 		}
   3128 
   3129 		/* Check for over temp condition */
   3130 		if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR) {
   3131 			switch (adapter->hw.mac.type) {
   3132 			case ixgbe_mac_X550EM_a:
   3133 				if (!(eicr & IXGBE_EICR_GPI_SDP0_X550EM_a))
   3134 					break;
   3135 				IXGBE_WRITE_REG(hw, IXGBE_EIMC,
   3136 				    IXGBE_EICR_GPI_SDP0_X550EM_a);
   3137 				IXGBE_WRITE_REG(hw, IXGBE_EICR,
   3138 				    IXGBE_EICR_GPI_SDP0_X550EM_a);
   3139 				retval = hw->phy.ops.check_overtemp(hw);
   3140 				if (retval != IXGBE_ERR_OVERTEMP)
   3141 					break;
   3142 				device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
   3143 				device_printf(adapter->dev, "System shutdown required!\n");
   3144 				break;
   3145 			default:
   3146 				if (!(eicr & IXGBE_EICR_TS))
   3147 					break;
   3148 				retval = hw->phy.ops.check_overtemp(hw);
   3149 				if (retval != IXGBE_ERR_OVERTEMP)
   3150 					break;
   3151 				device_printf(adapter->dev, "CRITICAL: OVER TEMP!! PHY IS SHUT DOWN!!\n");
   3152 				device_printf(adapter->dev, "System shutdown required!\n");
   3153 				IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_TS);
   3154 				break;
   3155 			}
   3156 		}
   3157 
   3158 		/* Check for VF message */
   3159 		if ((adapter->feat_en & IXGBE_FEATURE_SRIOV) &&
   3160 		    (eicr & IXGBE_EICR_MAILBOX))
   3161 			softint_schedule(adapter->mbx_si);
   3162 	}
   3163 
   3164 	/* Check for fan failure */
   3165 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
   3166 		ixgbe_check_fan_failure(adapter, eicr, TRUE);
   3167 		IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   3168 	}
   3169 
   3170 	/* External PHY interrupt */
   3171 	if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
   3172 	    (eicr & IXGBE_EICR_GPI_SDP0_X540)) {
   3173 		IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP0_X540);
   3174 		softint_schedule(adapter->phy_si);
   3175 	}
   3176 
   3177 	/* Re-enable other interrupts */
   3178 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_OTHER);
   3179 	return 1;
   3180 } /* ixgbe_msix_link */
   3181 
   3182 static void
   3183 ixgbe_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
   3184 {
   3185 
   3186 	if (adapter->hw.mac.type == ixgbe_mac_82598EB)
   3187 		itr |= itr << 16;
   3188 	else
   3189 		itr |= IXGBE_EITR_CNT_WDIS;
   3190 
   3191 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EITR(index), itr);
   3192 }
   3193 
   3194 
   3195 /************************************************************************
   3196  * ixgbe_sysctl_interrupt_rate_handler
   3197  ************************************************************************/
   3198 static int
   3199 ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
   3200 {
   3201 	struct sysctlnode node = *rnode;
   3202 	struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
   3203 	struct adapter	*adapter;
   3204 	uint32_t reg, usec, rate;
   3205 	int error;
   3206 
   3207 	if (que == NULL)
   3208 		return 0;
   3209 
   3210 	adapter = que->adapter;
   3211 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   3212 		return (EPERM);
   3213 
   3214 	reg = IXGBE_READ_REG(&adapter->hw, IXGBE_EITR(que->msix));
   3215 	usec = ((reg & 0x0FF8) >> 3);
   3216 	if (usec > 0)
   3217 		rate = 500000 / usec;
   3218 	else
   3219 		rate = 0;
   3220 	node.sysctl_data = &rate;
   3221 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   3222 	if (error || newp == NULL)
   3223 		return error;
   3224 	reg &= ~0xfff; /* default, no limitation */
   3225 	if (rate > 0 && rate < 500000) {
   3226 		if (rate < 1000)
   3227 			rate = 1000;
   3228 		reg |= ((4000000 / rate) & 0xff8);
   3229 		/*
   3230 		 * When RSC is used, ITR interval must be larger than
   3231 		 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
   3232 		 * The minimum value is always greater than 2us on 100M
   3233 		 * (and 10M?(not documented)), but it's not on 1G and higher.
   3234 		 */
   3235 		if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
   3236 		    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
   3237 			if ((adapter->num_queues > 1)
   3238 			    && (reg < IXGBE_MIN_RSC_EITR_10G1G))
   3239 				return EINVAL;
   3240 		}
   3241 		ixgbe_max_interrupt_rate = rate;
   3242 	} else
   3243 		ixgbe_max_interrupt_rate = 0;
   3244 	ixgbe_eitr_write(adapter, que->msix, reg);
   3245 
   3246 	return (0);
   3247 } /* ixgbe_sysctl_interrupt_rate_handler */
   3248 
   3249 const struct sysctlnode *
   3250 ixgbe_sysctl_instance(struct adapter *adapter)
   3251 {
   3252 	const char *dvname;
   3253 	struct sysctllog **log;
   3254 	int rc;
   3255 	const struct sysctlnode *rnode;
   3256 
   3257 	if (adapter->sysctltop != NULL)
   3258 		return adapter->sysctltop;
   3259 
   3260 	log = &adapter->sysctllog;
   3261 	dvname = device_xname(adapter->dev);
   3262 
   3263 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
   3264 	    0, CTLTYPE_NODE, dvname,
   3265 	    SYSCTL_DESCR("ixgbe information and settings"),
   3266 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
   3267 		goto err;
   3268 
   3269 	return rnode;
   3270 err:
   3271 	device_printf(adapter->dev,
   3272 	    "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
   3273 	return NULL;
   3274 }
   3275 
   3276 /************************************************************************
   3277  * ixgbe_add_device_sysctls
   3278  ************************************************************************/
   3279 static void
   3280 ixgbe_add_device_sysctls(struct adapter *adapter)
   3281 {
   3282 	device_t	       dev = adapter->dev;
   3283 	struct ixgbe_hw	       *hw = &adapter->hw;
   3284 	struct sysctllog **log;
   3285 	const struct sysctlnode *rnode, *cnode;
   3286 
   3287 	log = &adapter->sysctllog;
   3288 
   3289 	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
   3290 		aprint_error_dev(dev, "could not create sysctl root\n");
   3291 		return;
   3292 	}
   3293 
   3294 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3295 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   3296 	    "debug", SYSCTL_DESCR("Debug Info"),
   3297 	    ixgbe_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
   3298 		aprint_error_dev(dev, "could not create sysctl\n");
   3299 
   3300 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3301 	    CTLFLAG_READONLY, CTLTYPE_INT,
   3302 	    "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"),
   3303 	    NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0)
   3304 		aprint_error_dev(dev, "could not create sysctl\n");
   3305 
   3306 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3307 	    CTLFLAG_READONLY, CTLTYPE_INT,
   3308 	    "num_queues", SYSCTL_DESCR("Number of queues"),
   3309 	    NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0)
   3310 		aprint_error_dev(dev, "could not create sysctl\n");
   3311 
   3312 	/* Sysctls for all devices */
   3313 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3314 	    CTLTYPE_INT, "fc", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_SET_FC),
   3315 	    ixgbe_sysctl_flowcntl, 0, (void *)adapter, 0, CTL_CREATE,
   3316 	    CTL_EOL) != 0)
   3317 		aprint_error_dev(dev, "could not create sysctl\n");
   3318 
   3319 	adapter->enable_aim = ixgbe_enable_aim;
   3320 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3321 	    CTLTYPE_BOOL, "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
   3322 	    NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
   3323 		aprint_error_dev(dev, "could not create sysctl\n");
   3324 
   3325 	if (sysctl_createv(log, 0, &rnode, &cnode,
   3326 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   3327 	    "advertise_speed", SYSCTL_DESCR(IXGBE_SYSCTL_DESC_ADV_SPEED),
   3328 	    ixgbe_sysctl_advertise, 0, (void *)adapter, 0, CTL_CREATE,
   3329 	    CTL_EOL) != 0)
   3330 		aprint_error_dev(dev, "could not create sysctl\n");
   3331 
   3332 	/*
   3333 	 * If each "que->txrx_use_workqueue" is changed in sysctl handler,
   3334 	 * it causesflip-flopping softint/workqueue mode in one deferred
   3335 	 * processing. Therefore, preempt_disable()/preempt_enable() are
   3336 	 * required in ixgbe_sched_handle_que() to avoid
   3337 	 * KASSERT(ixgbe_sched_handle_que()) in softint_schedule().
   3338 	 * I think changing "que->txrx_use_workqueue" in interrupt handler
   3339 	 * is lighter than doing preempt_disable()/preempt_enable() in every
   3340 	 * ixgbe_sched_handle_que().
   3341 	 */
   3342 	adapter->txrx_use_workqueue = ixgbe_txrx_workqueue;
   3343 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3344 	    CTLTYPE_BOOL, "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
   3345 	    NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL) != 0)
   3346 		aprint_error_dev(dev, "could not create sysctl\n");
   3347 
   3348 #ifdef IXGBE_DEBUG
   3349 	/* testing sysctls (for all devices) */
   3350 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3351 	    CTLTYPE_INT, "power_state", SYSCTL_DESCR("PCI Power State"),
   3352 	    ixgbe_sysctl_power_state, 0, (void *)adapter, 0, CTL_CREATE,
   3353 	    CTL_EOL) != 0)
   3354 		aprint_error_dev(dev, "could not create sysctl\n");
   3355 
   3356 	if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READONLY,
   3357 	    CTLTYPE_STRING, "print_rss_config",
   3358 	    SYSCTL_DESCR("Prints RSS Configuration"),
   3359 	    ixgbe_sysctl_print_rss_config, 0, (void *)adapter, 0, CTL_CREATE,
   3360 	    CTL_EOL) != 0)
   3361 		aprint_error_dev(dev, "could not create sysctl\n");
   3362 #endif
   3363 	/* for X550 series devices */
   3364 	if (hw->mac.type >= ixgbe_mac_X550)
   3365 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3366 		    CTLTYPE_INT, "dmac", SYSCTL_DESCR("DMA Coalesce"),
   3367 		    ixgbe_sysctl_dmac, 0, (void *)adapter, 0, CTL_CREATE,
   3368 		    CTL_EOL) != 0)
   3369 			aprint_error_dev(dev, "could not create sysctl\n");
   3370 
   3371 	/* for WoL-capable devices */
   3372 	if (adapter->wol_support) {
   3373 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3374 		    CTLTYPE_BOOL, "wol_enable",
   3375 		    SYSCTL_DESCR("Enable/Disable Wake on LAN"),
   3376 		    ixgbe_sysctl_wol_enable, 0, (void *)adapter, 0, CTL_CREATE,
   3377 		    CTL_EOL) != 0)
   3378 			aprint_error_dev(dev, "could not create sysctl\n");
   3379 
   3380 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3381 		    CTLTYPE_INT, "wufc",
   3382 		    SYSCTL_DESCR("Enable/Disable Wake Up Filters"),
   3383 		    ixgbe_sysctl_wufc, 0, (void *)adapter, 0, CTL_CREATE,
   3384 		    CTL_EOL) != 0)
   3385 			aprint_error_dev(dev, "could not create sysctl\n");
   3386 	}
   3387 
   3388 	/* for X552/X557-AT devices */
   3389 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
   3390 		const struct sysctlnode *phy_node;
   3391 
   3392 		if (sysctl_createv(log, 0, &rnode, &phy_node, 0, CTLTYPE_NODE,
   3393 		    "phy", SYSCTL_DESCR("External PHY sysctls"),
   3394 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) {
   3395 			aprint_error_dev(dev, "could not create sysctl\n");
   3396 			return;
   3397 		}
   3398 
   3399 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
   3400 		    CTLTYPE_INT, "temp",
   3401 		    SYSCTL_DESCR("Current External PHY Temperature (Celsius)"),
   3402 		    ixgbe_sysctl_phy_temp, 0, (void *)adapter, 0, CTL_CREATE,
   3403 		    CTL_EOL) != 0)
   3404 			aprint_error_dev(dev, "could not create sysctl\n");
   3405 
   3406 		if (sysctl_createv(log, 0, &phy_node, &cnode, CTLFLAG_READONLY,
   3407 		    CTLTYPE_INT, "overtemp_occurred",
   3408 		    SYSCTL_DESCR("External PHY High Temperature Event Occurred"),
   3409 		    ixgbe_sysctl_phy_overtemp_occurred, 0, (void *)adapter, 0,
   3410 		    CTL_CREATE, CTL_EOL) != 0)
   3411 			aprint_error_dev(dev, "could not create sysctl\n");
   3412 	}
   3413 
   3414 	if ((hw->mac.type == ixgbe_mac_X550EM_a)
   3415 	    && (hw->phy.type == ixgbe_phy_fw))
   3416 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3417 		    CTLTYPE_BOOL, "force_10_100_autonego",
   3418 		    SYSCTL_DESCR("Force autonego on 10M and 100M"),
   3419 		    NULL, 0, &hw->phy.force_10_100_autonego, 0,
   3420 		    CTL_CREATE, CTL_EOL) != 0)
   3421 			aprint_error_dev(dev, "could not create sysctl\n");
   3422 
   3423 	if (adapter->feat_cap & IXGBE_FEATURE_EEE) {
   3424 		if (sysctl_createv(log, 0, &rnode, &cnode, CTLFLAG_READWRITE,
   3425 		    CTLTYPE_INT, "eee_state",
   3426 		    SYSCTL_DESCR("EEE Power Save State"),
   3427 		    ixgbe_sysctl_eee_state, 0, (void *)adapter, 0, CTL_CREATE,
   3428 		    CTL_EOL) != 0)
   3429 			aprint_error_dev(dev, "could not create sysctl\n");
   3430 	}
   3431 } /* ixgbe_add_device_sysctls */
   3432 
   3433 /************************************************************************
   3434  * ixgbe_allocate_pci_resources
   3435  ************************************************************************/
   3436 static int
   3437 ixgbe_allocate_pci_resources(struct adapter *adapter,
   3438     const struct pci_attach_args *pa)
   3439 {
   3440 	pcireg_t	memtype, csr;
   3441 	device_t dev = adapter->dev;
   3442 	bus_addr_t addr;
   3443 	int flags;
   3444 
   3445 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
   3446 	switch (memtype) {
   3447 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
   3448 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
   3449 		adapter->osdep.mem_bus_space_tag = pa->pa_memt;
   3450 		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
   3451 		      memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
   3452 			goto map_err;
   3453 		if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
   3454 			aprint_normal_dev(dev, "clearing prefetchable bit\n");
   3455 			flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
   3456 		}
   3457 		if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
   3458 		     adapter->osdep.mem_size, flags,
   3459 		     &adapter->osdep.mem_bus_space_handle) != 0) {
   3460 map_err:
   3461 			adapter->osdep.mem_size = 0;
   3462 			aprint_error_dev(dev, "unable to map BAR0\n");
   3463 			return ENXIO;
   3464 		}
   3465 		/*
   3466 		 * Enable address decoding for memory range in case BIOS or
   3467 		 * UEFI don't set it.
   3468 		 */
   3469 		csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
   3470 		    PCI_COMMAND_STATUS_REG);
   3471 		csr |= PCI_COMMAND_MEM_ENABLE;
   3472 		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
   3473 		    csr);
   3474 		break;
   3475 	default:
   3476 		aprint_error_dev(dev, "unexpected type on BAR0\n");
   3477 		return ENXIO;
   3478 	}
   3479 
   3480 	return (0);
   3481 } /* ixgbe_allocate_pci_resources */
   3482 
   3483 static void
   3484 ixgbe_free_softint(struct adapter *adapter)
   3485 {
   3486 	struct ix_queue *que = adapter->queues;
   3487 	struct tx_ring *txr = adapter->tx_rings;
   3488 	int i;
   3489 
   3490 	for (i = 0; i < adapter->num_queues; i++, que++, txr++) {
   3491 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   3492 			if (txr->txr_si != NULL)
   3493 				softint_disestablish(txr->txr_si);
   3494 		}
   3495 		if (que->que_si != NULL)
   3496 			softint_disestablish(que->que_si);
   3497 	}
   3498 	if (adapter->txr_wq != NULL)
   3499 		workqueue_destroy(adapter->txr_wq);
   3500 	if (adapter->txr_wq_enqueued != NULL)
   3501 		percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
   3502 	if (adapter->que_wq != NULL)
   3503 		workqueue_destroy(adapter->que_wq);
   3504 
   3505 	/* Drain the Link queue */
   3506 	if (adapter->link_si != NULL) {
   3507 		softint_disestablish(adapter->link_si);
   3508 		adapter->link_si = NULL;
   3509 	}
   3510 	if (adapter->mod_si != NULL) {
   3511 		softint_disestablish(adapter->mod_si);
   3512 		adapter->mod_si = NULL;
   3513 	}
   3514 	if (adapter->msf_wq != NULL) {
   3515 		workqueue_destroy(adapter->msf_wq);
   3516 		adapter->msf_wq = NULL;
   3517 	}
   3518 	if (adapter->phy_si != NULL) {
   3519 		softint_disestablish(adapter->phy_si);
   3520 		adapter->phy_si = NULL;
   3521 	}
   3522 	if (adapter->feat_en & IXGBE_FEATURE_FDIR) {
   3523 		if (adapter->fdir_si != NULL) {
   3524 			softint_disestablish(adapter->fdir_si);
   3525 			adapter->fdir_si = NULL;
   3526 		}
   3527 	}
   3528 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
   3529 		if (adapter->mbx_si != NULL) {
   3530 			softint_disestablish(adapter->mbx_si);
   3531 			adapter->mbx_si = NULL;
   3532 		}
   3533 	}
   3534 } /* ixgbe_free_softint */
   3535 
   3536 /************************************************************************
   3537  * ixgbe_detach - Device removal routine
   3538  *
   3539  *   Called when the driver is being removed.
   3540  *   Stops the adapter and deallocates all the resources
   3541  *   that were allocated for driver operation.
   3542  *
   3543  *   return 0 on success, positive on failure
   3544  ************************************************************************/
   3545 static int
   3546 ixgbe_detach(device_t dev, int flags)
   3547 {
   3548 	struct adapter *adapter = device_private(dev);
   3549 	struct rx_ring *rxr = adapter->rx_rings;
   3550 	struct tx_ring *txr = adapter->tx_rings;
   3551 	struct ixgbe_hw *hw = &adapter->hw;
   3552 	struct ixgbe_hw_stats *stats = &adapter->stats.pf;
   3553 	u32	ctrl_ext;
   3554 	int i;
   3555 
   3556 	INIT_DEBUGOUT("ixgbe_detach: begin");
   3557 	if (adapter->osdep.attached == false)
   3558 		return 0;
   3559 
   3560 	if (ixgbe_pci_iov_detach(dev) != 0) {
   3561 		device_printf(dev, "SR-IOV in use; detach first.\n");
   3562 		return (EBUSY);
   3563 	}
   3564 
   3565 	/*
   3566 	 * Stop the interface. ixgbe_setup_low_power_mode() calls ixgbe_stop(),
   3567 	 * so it's not required to call ixgbe_stop() directly.
   3568 	 */
   3569 	IXGBE_CORE_LOCK(adapter);
   3570 	ixgbe_setup_low_power_mode(adapter);
   3571 	IXGBE_CORE_UNLOCK(adapter);
   3572 #if NVLAN > 0
   3573 	/* Make sure VLANs are not using driver */
   3574 	if (!VLAN_ATTACHED(&adapter->osdep.ec))
   3575 		;	/* nothing to do: no VLANs */
   3576 	else if ((flags & (DETACH_SHUTDOWN | DETACH_FORCE)) != 0)
   3577 		vlan_ifdetach(adapter->ifp);
   3578 	else {
   3579 		aprint_error_dev(dev, "VLANs in use, detach first\n");
   3580 		return (EBUSY);
   3581 	}
   3582 #endif
   3583 
   3584 	pmf_device_deregister(dev);
   3585 
   3586 	ether_ifdetach(adapter->ifp);
   3587 
   3588 	ixgbe_free_softint(adapter);
   3589 
   3590 	/* let hardware know driver is unloading */
   3591 	ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT);
   3592 	ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD;
   3593 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext);
   3594 
   3595 	callout_halt(&adapter->timer, NULL);
   3596 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE) {
   3597 		callout_stop(&adapter->recovery_mode_timer);
   3598 		callout_halt(&adapter->recovery_mode_timer, NULL);
   3599 	}
   3600 
   3601 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
   3602 		netmap_detach(adapter->ifp);
   3603 
   3604 	ixgbe_free_pci_resources(adapter);
   3605 #if 0	/* XXX the NetBSD port is probably missing something here */
   3606 	bus_generic_detach(dev);
   3607 #endif
   3608 	if_detach(adapter->ifp);
   3609 	ifmedia_fini(&adapter->media);
   3610 	if_percpuq_destroy(adapter->ipq);
   3611 
   3612 	sysctl_teardown(&adapter->sysctllog);
   3613 	evcnt_detach(&adapter->efbig_tx_dma_setup);
   3614 	evcnt_detach(&adapter->mbuf_defrag_failed);
   3615 	evcnt_detach(&adapter->efbig2_tx_dma_setup);
   3616 	evcnt_detach(&adapter->einval_tx_dma_setup);
   3617 	evcnt_detach(&adapter->other_tx_dma_setup);
   3618 	evcnt_detach(&adapter->eagain_tx_dma_setup);
   3619 	evcnt_detach(&adapter->enomem_tx_dma_setup);
   3620 	evcnt_detach(&adapter->watchdog_events);
   3621 	evcnt_detach(&adapter->tso_err);
   3622 	evcnt_detach(&adapter->link_irq);
   3623 	evcnt_detach(&adapter->link_sicount);
   3624 	evcnt_detach(&adapter->mod_sicount);
   3625 	evcnt_detach(&adapter->msf_sicount);
   3626 	evcnt_detach(&adapter->phy_sicount);
   3627 
   3628 	for (i = 0; i < IXGBE_TC_COUNTER_NUM; i++) {
   3629 		if (i < __arraycount(stats->mpc)) {
   3630 			evcnt_detach(&stats->mpc[i]);
   3631 			if (hw->mac.type == ixgbe_mac_82598EB)
   3632 				evcnt_detach(&stats->rnbc[i]);
   3633 		}
   3634 		if (i < __arraycount(stats->pxontxc)) {
   3635 			evcnt_detach(&stats->pxontxc[i]);
   3636 			evcnt_detach(&stats->pxonrxc[i]);
   3637 			evcnt_detach(&stats->pxofftxc[i]);
   3638 			evcnt_detach(&stats->pxoffrxc[i]);
   3639 			if (hw->mac.type >= ixgbe_mac_82599EB)
   3640 				evcnt_detach(&stats->pxon2offc[i]);
   3641 		}
   3642 	}
   3643 
   3644 	txr = adapter->tx_rings;
   3645 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   3646 		evcnt_detach(&adapter->queues[i].irqs);
   3647 		evcnt_detach(&adapter->queues[i].handleq);
   3648 		evcnt_detach(&adapter->queues[i].req);
   3649 		evcnt_detach(&txr->no_desc_avail);
   3650 		evcnt_detach(&txr->total_packets);
   3651 		evcnt_detach(&txr->tso_tx);
   3652 #ifndef IXGBE_LEGACY_TX
   3653 		evcnt_detach(&txr->pcq_drops);
   3654 #endif
   3655 
   3656 		if (i < __arraycount(stats->qprc)) {
   3657 			evcnt_detach(&stats->qprc[i]);
   3658 			evcnt_detach(&stats->qptc[i]);
   3659 			evcnt_detach(&stats->qbrc[i]);
   3660 			evcnt_detach(&stats->qbtc[i]);
   3661 			if (hw->mac.type >= ixgbe_mac_82599EB)
   3662 				evcnt_detach(&stats->qprdc[i]);
   3663 		}
   3664 
   3665 		evcnt_detach(&rxr->rx_packets);
   3666 		evcnt_detach(&rxr->rx_bytes);
   3667 		evcnt_detach(&rxr->rx_copies);
   3668 		evcnt_detach(&rxr->no_jmbuf);
   3669 		evcnt_detach(&rxr->rx_discarded);
   3670 	}
   3671 	evcnt_detach(&stats->ipcs);
   3672 	evcnt_detach(&stats->l4cs);
   3673 	evcnt_detach(&stats->ipcs_bad);
   3674 	evcnt_detach(&stats->l4cs_bad);
   3675 	evcnt_detach(&stats->intzero);
   3676 	evcnt_detach(&stats->legint);
   3677 	evcnt_detach(&stats->crcerrs);
   3678 	evcnt_detach(&stats->illerrc);
   3679 	evcnt_detach(&stats->errbc);
   3680 	evcnt_detach(&stats->mspdc);
   3681 	if (hw->mac.type >= ixgbe_mac_X550)
   3682 		evcnt_detach(&stats->mbsdc);
   3683 	evcnt_detach(&stats->mpctotal);
   3684 	evcnt_detach(&stats->mlfc);
   3685 	evcnt_detach(&stats->mrfc);
   3686 	evcnt_detach(&stats->rlec);
   3687 	evcnt_detach(&stats->lxontxc);
   3688 	evcnt_detach(&stats->lxonrxc);
   3689 	evcnt_detach(&stats->lxofftxc);
   3690 	evcnt_detach(&stats->lxoffrxc);
   3691 
   3692 	/* Packet Reception Stats */
   3693 	evcnt_detach(&stats->tor);
   3694 	evcnt_detach(&stats->gorc);
   3695 	evcnt_detach(&stats->tpr);
   3696 	evcnt_detach(&stats->gprc);
   3697 	evcnt_detach(&stats->mprc);
   3698 	evcnt_detach(&stats->bprc);
   3699 	evcnt_detach(&stats->prc64);
   3700 	evcnt_detach(&stats->prc127);
   3701 	evcnt_detach(&stats->prc255);
   3702 	evcnt_detach(&stats->prc511);
   3703 	evcnt_detach(&stats->prc1023);
   3704 	evcnt_detach(&stats->prc1522);
   3705 	evcnt_detach(&stats->ruc);
   3706 	evcnt_detach(&stats->rfc);
   3707 	evcnt_detach(&stats->roc);
   3708 	evcnt_detach(&stats->rjc);
   3709 	evcnt_detach(&stats->mngprc);
   3710 	evcnt_detach(&stats->mngpdc);
   3711 	evcnt_detach(&stats->xec);
   3712 
   3713 	/* Packet Transmission Stats */
   3714 	evcnt_detach(&stats->gotc);
   3715 	evcnt_detach(&stats->tpt);
   3716 	evcnt_detach(&stats->gptc);
   3717 	evcnt_detach(&stats->bptc);
   3718 	evcnt_detach(&stats->mptc);
   3719 	evcnt_detach(&stats->mngptc);
   3720 	evcnt_detach(&stats->ptc64);
   3721 	evcnt_detach(&stats->ptc127);
   3722 	evcnt_detach(&stats->ptc255);
   3723 	evcnt_detach(&stats->ptc511);
   3724 	evcnt_detach(&stats->ptc1023);
   3725 	evcnt_detach(&stats->ptc1522);
   3726 
   3727 	ixgbe_free_queues(adapter);
   3728 	free(adapter->mta, M_DEVBUF);
   3729 
   3730 	IXGBE_CORE_LOCK_DESTROY(adapter);
   3731 
   3732 	return (0);
   3733 } /* ixgbe_detach */
   3734 
   3735 /************************************************************************
   3736  * ixgbe_setup_low_power_mode - LPLU/WoL preparation
   3737  *
   3738  *   Prepare the adapter/port for LPLU and/or WoL
   3739  ************************************************************************/
   3740 static int
   3741 ixgbe_setup_low_power_mode(struct adapter *adapter)
   3742 {
   3743 	struct ixgbe_hw *hw = &adapter->hw;
   3744 	device_t	dev = adapter->dev;
   3745 	s32		error = 0;
   3746 
   3747 	KASSERT(mutex_owned(&adapter->core_mtx));
   3748 
   3749 	/* Limit power management flow to X550EM baseT */
   3750 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T &&
   3751 	    hw->phy.ops.enter_lplu) {
   3752 		/* X550EM baseT adapters need a special LPLU flow */
   3753 		hw->phy.reset_disable = true;
   3754 		ixgbe_stop(adapter);
   3755 		error = hw->phy.ops.enter_lplu(hw);
   3756 		if (error)
   3757 			device_printf(dev,
   3758 			    "Error entering LPLU: %d\n", error);
   3759 		hw->phy.reset_disable = false;
   3760 	} else {
   3761 		/* Just stop for other adapters */
   3762 		ixgbe_stop(adapter);
   3763 	}
   3764 
   3765 	if (!hw->wol_enabled) {
   3766 		ixgbe_set_phy_power(hw, FALSE);
   3767 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
   3768 		IXGBE_WRITE_REG(hw, IXGBE_WUC, 0);
   3769 	} else {
   3770 		/* Turn off support for APM wakeup. (Using ACPI instead) */
   3771 		IXGBE_WRITE_REG(hw, IXGBE_GRC_BY_MAC(hw),
   3772 		    IXGBE_READ_REG(hw, IXGBE_GRC_BY_MAC(hw)) & ~(u32)2);
   3773 
   3774 		/*
   3775 		 * Clear Wake Up Status register to prevent any previous wakeup
   3776 		 * events from waking us up immediately after we suspend.
   3777 		 */
   3778 		IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
   3779 
   3780 		/*
   3781 		 * Program the Wakeup Filter Control register with user filter
   3782 		 * settings
   3783 		 */
   3784 		IXGBE_WRITE_REG(hw, IXGBE_WUFC, adapter->wufc);
   3785 
   3786 		/* Enable wakeups and power management in Wakeup Control */
   3787 		IXGBE_WRITE_REG(hw, IXGBE_WUC,
   3788 		    IXGBE_WUC_WKEN | IXGBE_WUC_PME_EN);
   3789 
   3790 	}
   3791 
   3792 	return error;
   3793 } /* ixgbe_setup_low_power_mode */
   3794 
   3795 /************************************************************************
   3796  * ixgbe_shutdown - Shutdown entry point
   3797  ************************************************************************/
   3798 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
   3799 static int
   3800 ixgbe_shutdown(device_t dev)
   3801 {
   3802 	struct adapter *adapter = device_private(dev);
   3803 	int error = 0;
   3804 
   3805 	INIT_DEBUGOUT("ixgbe_shutdown: begin");
   3806 
   3807 	IXGBE_CORE_LOCK(adapter);
   3808 	error = ixgbe_setup_low_power_mode(adapter);
   3809 	IXGBE_CORE_UNLOCK(adapter);
   3810 
   3811 	return (error);
   3812 } /* ixgbe_shutdown */
   3813 #endif
   3814 
   3815 /************************************************************************
   3816  * ixgbe_suspend
   3817  *
   3818  *   From D0 to D3
   3819  ************************************************************************/
   3820 static bool
   3821 ixgbe_suspend(device_t dev, const pmf_qual_t *qual)
   3822 {
   3823 	struct adapter *adapter = device_private(dev);
   3824 	int	       error = 0;
   3825 
   3826 	INIT_DEBUGOUT("ixgbe_suspend: begin");
   3827 
   3828 	IXGBE_CORE_LOCK(adapter);
   3829 
   3830 	error = ixgbe_setup_low_power_mode(adapter);
   3831 
   3832 	IXGBE_CORE_UNLOCK(adapter);
   3833 
   3834 	return (error);
   3835 } /* ixgbe_suspend */
   3836 
   3837 /************************************************************************
   3838  * ixgbe_resume
   3839  *
   3840  *   From D3 to D0
   3841  ************************************************************************/
   3842 static bool
   3843 ixgbe_resume(device_t dev, const pmf_qual_t *qual)
   3844 {
   3845 	struct adapter	*adapter = device_private(dev);
   3846 	struct ifnet	*ifp = adapter->ifp;
   3847 	struct ixgbe_hw *hw = &adapter->hw;
   3848 	u32		wus;
   3849 
   3850 	INIT_DEBUGOUT("ixgbe_resume: begin");
   3851 
   3852 	IXGBE_CORE_LOCK(adapter);
   3853 
   3854 	/* Read & clear WUS register */
   3855 	wus = IXGBE_READ_REG(hw, IXGBE_WUS);
   3856 	if (wus)
   3857 		device_printf(dev, "Woken up by (WUS): %#010x\n",
   3858 		    IXGBE_READ_REG(hw, IXGBE_WUS));
   3859 	IXGBE_WRITE_REG(hw, IXGBE_WUS, 0xffffffff);
   3860 	/* And clear WUFC until next low-power transition */
   3861 	IXGBE_WRITE_REG(hw, IXGBE_WUFC, 0);
   3862 
   3863 	/*
   3864 	 * Required after D3->D0 transition;
   3865 	 * will re-advertise all previous advertised speeds
   3866 	 */
   3867 	if (ifp->if_flags & IFF_UP)
   3868 		ixgbe_init_locked(adapter);
   3869 
   3870 	IXGBE_CORE_UNLOCK(adapter);
   3871 
   3872 	return true;
   3873 } /* ixgbe_resume */
   3874 
   3875 /*
   3876  * Set the various hardware offload abilities.
   3877  *
   3878  * This takes the ifnet's if_capenable flags (e.g. set by the user using
   3879  * ifconfig) and indicates to the OS via the ifnet's if_hwassist field what
   3880  * mbuf offload flags the driver will understand.
   3881  */
   3882 static void
   3883 ixgbe_set_if_hwassist(struct adapter *adapter)
   3884 {
   3885 	/* XXX */
   3886 }
   3887 
   3888 /************************************************************************
   3889  * ixgbe_init_locked - Init entry point
   3890  *
   3891  *   Used in two ways: It is used by the stack as an init
   3892  *   entry point in network interface structure. It is also
   3893  *   used by the driver as a hw/sw initialization routine to
   3894  *   get to a consistent state.
   3895  *
   3896  *   return 0 on success, positive on failure
   3897  ************************************************************************/
   3898 static void
   3899 ixgbe_init_locked(struct adapter *adapter)
   3900 {
   3901 	struct ifnet   *ifp = adapter->ifp;
   3902 	device_t	dev = adapter->dev;
   3903 	struct ixgbe_hw *hw = &adapter->hw;
   3904 	struct ix_queue *que;
   3905 	struct tx_ring	*txr;
   3906 	struct rx_ring	*rxr;
   3907 	u32		txdctl, mhadd;
   3908 	u32		rxdctl, rxctrl;
   3909 	u32		ctrl_ext;
   3910 	bool		unsupported_sfp = false;
   3911 	int		i, j, err;
   3912 
   3913 	/* XXX check IFF_UP and IFF_RUNNING, power-saving state! */
   3914 
   3915 	KASSERT(mutex_owned(&adapter->core_mtx));
   3916 	INIT_DEBUGOUT("ixgbe_init_locked: begin");
   3917 
   3918 	hw->need_unsupported_sfp_recovery = false;
   3919 	hw->adapter_stopped = FALSE;
   3920 	ixgbe_stop_adapter(hw);
   3921 	callout_stop(&adapter->timer);
   3922 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
   3923 		callout_stop(&adapter->recovery_mode_timer);
   3924 	for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
   3925 		que->disabled_count = 0;
   3926 
   3927 	/* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */
   3928 	adapter->max_frame_size =
   3929 		ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
   3930 
   3931 	/* Queue indices may change with IOV mode */
   3932 	ixgbe_align_all_queue_indices(adapter);
   3933 
   3934 	/* reprogram the RAR[0] in case user changed it. */
   3935 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, IXGBE_RAH_AV);
   3936 
   3937 	/* Get the latest mac address, User can use a LAA */
   3938 	memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
   3939 	    IXGBE_ETH_LENGTH_OF_ADDRESS);
   3940 	ixgbe_set_rar(hw, 0, hw->mac.addr, adapter->pool, 1);
   3941 	hw->addr_ctrl.rar_used_count = 1;
   3942 
   3943 	/* Set hardware offload abilities from ifnet flags */
   3944 	ixgbe_set_if_hwassist(adapter);
   3945 
   3946 	/* Prepare transmit descriptors and buffers */
   3947 	if (ixgbe_setup_transmit_structures(adapter)) {
   3948 		device_printf(dev, "Could not setup transmit structures\n");
   3949 		ixgbe_stop(adapter);
   3950 		return;
   3951 	}
   3952 
   3953 	ixgbe_init_hw(hw);
   3954 
   3955 	ixgbe_initialize_iov(adapter);
   3956 
   3957 	ixgbe_initialize_transmit_units(adapter);
   3958 
   3959 	/* Setup Multicast table */
   3960 	ixgbe_set_rxfilter(adapter);
   3961 
   3962 	/* Determine the correct mbuf pool, based on frame size */
   3963 	if (adapter->max_frame_size <= MCLBYTES)
   3964 		adapter->rx_mbuf_sz = MCLBYTES;
   3965 	else
   3966 		adapter->rx_mbuf_sz = MJUMPAGESIZE;
   3967 
   3968 	/* Prepare receive descriptors and buffers */
   3969 	if (ixgbe_setup_receive_structures(adapter)) {
   3970 		device_printf(dev, "Could not setup receive structures\n");
   3971 		ixgbe_stop(adapter);
   3972 		return;
   3973 	}
   3974 
   3975 	/* Configure RX settings */
   3976 	ixgbe_initialize_receive_units(adapter);
   3977 
   3978 	/* Enable SDP & MSI-X interrupts based on adapter */
   3979 	ixgbe_config_gpie(adapter);
   3980 
   3981 	/* Set MTU size */
   3982 	if (ifp->if_mtu > ETHERMTU) {
   3983 		/* aka IXGBE_MAXFRS on 82599 and newer */
   3984 		mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
   3985 		mhadd &= ~IXGBE_MHADD_MFS_MASK;
   3986 		mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
   3987 		IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
   3988 	}
   3989 
   3990 	/* Now enable all the queues */
   3991 	for (i = 0; i < adapter->num_queues; i++) {
   3992 		txr = &adapter->tx_rings[i];
   3993 		txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(txr->me));
   3994 		txdctl |= IXGBE_TXDCTL_ENABLE;
   3995 		/* Set WTHRESH to 8, burst writeback */
   3996 		txdctl |= (8 << 16);
   3997 		/*
   3998 		 * When the internal queue falls below PTHRESH (32),
   3999 		 * start prefetching as long as there are at least
   4000 		 * HTHRESH (1) buffers ready. The values are taken
   4001 		 * from the Intel linux driver 3.8.21.
   4002 		 * Prefetching enables tx line rate even with 1 queue.
   4003 		 */
   4004 		txdctl |= (32 << 0) | (1 << 8);
   4005 		IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(txr->me), txdctl);
   4006 	}
   4007 
   4008 	for (i = 0; i < adapter->num_queues; i++) {
   4009 		rxr = &adapter->rx_rings[i];
   4010 		rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me));
   4011 		if (hw->mac.type == ixgbe_mac_82598EB) {
   4012 			/*
   4013 			 * PTHRESH = 21
   4014 			 * HTHRESH = 4
   4015 			 * WTHRESH = 8
   4016 			 */
   4017 			rxdctl &= ~0x3FFFFF;
   4018 			rxdctl |= 0x080420;
   4019 		}
   4020 		rxdctl |= IXGBE_RXDCTL_ENABLE;
   4021 		IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(rxr->me), rxdctl);
   4022 		for (j = 0; j < 10; j++) {
   4023 			if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(rxr->me)) &
   4024 			    IXGBE_RXDCTL_ENABLE)
   4025 				break;
   4026 			else
   4027 				msec_delay(1);
   4028 		}
   4029 		IXGBE_WRITE_BARRIER(hw);
   4030 
   4031 		/*
   4032 		 * In netmap mode, we must preserve the buffers made
   4033 		 * available to userspace before the if_init()
   4034 		 * (this is true by default on the TX side, because
   4035 		 * init makes all buffers available to userspace).
   4036 		 *
   4037 		 * netmap_reset() and the device specific routines
   4038 		 * (e.g. ixgbe_setup_receive_rings()) map these
   4039 		 * buffers at the end of the NIC ring, so here we
   4040 		 * must set the RDT (tail) register to make sure
   4041 		 * they are not overwritten.
   4042 		 *
   4043 		 * In this driver the NIC ring starts at RDH = 0,
   4044 		 * RDT points to the last slot available for reception (?),
   4045 		 * so RDT = num_rx_desc - 1 means the whole ring is available.
   4046 		 */
   4047 #ifdef DEV_NETMAP
   4048 		if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
   4049 		    (ifp->if_capenable & IFCAP_NETMAP)) {
   4050 			struct netmap_adapter *na = NA(adapter->ifp);
   4051 			struct netmap_kring *kring = na->rx_rings[i];
   4052 			int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
   4053 
   4054 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me), t);
   4055 		} else
   4056 #endif /* DEV_NETMAP */
   4057 			IXGBE_WRITE_REG(hw, IXGBE_RDT(rxr->me),
   4058 			    adapter->num_rx_desc - 1);
   4059 	}
   4060 
   4061 	/* Enable Receive engine */
   4062 	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
   4063 	if (hw->mac.type == ixgbe_mac_82598EB)
   4064 		rxctrl |= IXGBE_RXCTRL_DMBYPS;
   4065 	rxctrl |= IXGBE_RXCTRL_RXEN;
   4066 	ixgbe_enable_rx_dma(hw, rxctrl);
   4067 
   4068 	callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter);
   4069 	if (adapter->feat_en & IXGBE_FEATURE_RECOVERY_MODE)
   4070 		callout_reset(&adapter->recovery_mode_timer, hz,
   4071 		    ixgbe_recovery_mode_timer, adapter);
   4072 
   4073 	/* Set up MSI/MSI-X routing */
   4074 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   4075 		ixgbe_configure_ivars(adapter);
   4076 		/* Set up auto-mask */
   4077 		if (hw->mac.type == ixgbe_mac_82598EB)
   4078 			IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
   4079 		else {
   4080 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF);
   4081 			IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF);
   4082 		}
   4083 	} else {  /* Simple settings for Legacy/MSI */
   4084 		ixgbe_set_ivar(adapter, 0, 0, 0);
   4085 		ixgbe_set_ivar(adapter, 0, 0, 1);
   4086 		IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE);
   4087 	}
   4088 
   4089 	ixgbe_init_fdir(adapter);
   4090 
   4091 	/*
   4092 	 * Check on any SFP devices that
   4093 	 * need to be kick-started
   4094 	 */
   4095 	if (hw->phy.type == ixgbe_phy_none) {
   4096 		err = hw->phy.ops.identify(hw);
   4097 		if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
   4098 			unsupported_sfp = true;
   4099 	} else if (hw->phy.type == ixgbe_phy_sfp_unsupported)
   4100 		unsupported_sfp = true;
   4101 
   4102 	if (unsupported_sfp)
   4103 		device_printf(dev,
   4104 		    "Unsupported SFP+ module type was detected.\n");
   4105 
   4106 	/* Set moderation on the Link interrupt */
   4107 	ixgbe_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
   4108 
   4109 	/* Enable EEE power saving */
   4110 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   4111 		hw->mac.ops.setup_eee(hw,
   4112 		    adapter->feat_en & IXGBE_FEATURE_EEE);
   4113 
   4114 	/* Enable power to the phy. */
   4115 	if (!unsupported_sfp) {
   4116 		ixgbe_set_phy_power(hw, TRUE);
   4117 
   4118 		/* Config/Enable Link */
   4119 		ixgbe_config_link(adapter);
   4120 	}
   4121 
   4122 	/* Hardware Packet Buffer & Flow Control setup */
   4123 	ixgbe_config_delay_values(adapter);
   4124 
   4125 	/* Initialize the FC settings */
   4126 	ixgbe_start_hw(hw);
   4127 
   4128 	/* Set up VLAN support and filter */
   4129 	ixgbe_setup_vlan_hw_support(adapter);
   4130 
   4131 	/* Setup DMA Coalescing */
   4132 	ixgbe_config_dmac(adapter);
   4133 
   4134 	/* OK to schedule workqueues. */
   4135 	adapter->schedule_wqs_ok = true;
   4136 
   4137 	/* And now turn on interrupts */
   4138 	ixgbe_enable_intr(adapter);
   4139 
   4140 	/* Enable the use of the MBX by the VF's */
   4141 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV) {
   4142 		ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
   4143 		ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
   4144 		IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext);
   4145 	}
   4146 
   4147 	/* Update saved flags. See ixgbe_ifflags_cb() */
   4148 	adapter->if_flags = ifp->if_flags;
   4149 	adapter->ec_capenable = adapter->osdep.ec.ec_capenable;
   4150 
   4151 	/* Now inform the stack we're ready */
   4152 	ifp->if_flags |= IFF_RUNNING;
   4153 
   4154 	return;
   4155 } /* ixgbe_init_locked */
   4156 
   4157 /************************************************************************
   4158  * ixgbe_init
   4159  ************************************************************************/
   4160 static int
   4161 ixgbe_init(struct ifnet *ifp)
   4162 {
   4163 	struct adapter *adapter = ifp->if_softc;
   4164 
   4165 	IXGBE_CORE_LOCK(adapter);
   4166 	ixgbe_init_locked(adapter);
   4167 	IXGBE_CORE_UNLOCK(adapter);
   4168 
   4169 	return 0;	/* XXX ixgbe_init_locked cannot fail?  really? */
   4170 } /* ixgbe_init */
   4171 
   4172 /************************************************************************
   4173  * ixgbe_set_ivar
   4174  *
   4175  *   Setup the correct IVAR register for a particular MSI-X interrupt
   4176  *     (yes this is all very magic and confusing :)
   4177  *    - entry is the register array entry
   4178  *    - vector is the MSI-X vector for this queue
   4179  *    - type is RX/TX/MISC
   4180  ************************************************************************/
   4181 static void
   4182 ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
   4183 {
   4184 	struct ixgbe_hw *hw = &adapter->hw;
   4185 	u32 ivar, index;
   4186 
   4187 	vector |= IXGBE_IVAR_ALLOC_VAL;
   4188 
   4189 	switch (hw->mac.type) {
   4190 	case ixgbe_mac_82598EB:
   4191 		if (type == -1)
   4192 			entry = IXGBE_IVAR_OTHER_CAUSES_INDEX;
   4193 		else
   4194 			entry += (type * 64);
   4195 		index = (entry >> 2) & 0x1F;
   4196 		ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index));
   4197 		ivar &= ~(0xffUL << (8 * (entry & 0x3)));
   4198 		ivar |= ((u32)vector << (8 * (entry & 0x3)));
   4199 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar);
   4200 		break;
   4201 	case ixgbe_mac_82599EB:
   4202 	case ixgbe_mac_X540:
   4203 	case ixgbe_mac_X550:
   4204 	case ixgbe_mac_X550EM_x:
   4205 	case ixgbe_mac_X550EM_a:
   4206 		if (type == -1) { /* MISC IVAR */
   4207 			index = (entry & 1) * 8;
   4208 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC);
   4209 			ivar &= ~(0xffUL << index);
   4210 			ivar |= ((u32)vector << index);
   4211 			IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar);
   4212 		} else {	/* RX/TX IVARS */
   4213 			index = (16 * (entry & 1)) + (8 * type);
   4214 			ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1));
   4215 			ivar &= ~(0xffUL << index);
   4216 			ivar |= ((u32)vector << index);
   4217 			IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar);
   4218 		}
   4219 		break;
   4220 	default:
   4221 		break;
   4222 	}
   4223 } /* ixgbe_set_ivar */
   4224 
   4225 /************************************************************************
   4226  * ixgbe_configure_ivars
   4227  ************************************************************************/
   4228 static void
   4229 ixgbe_configure_ivars(struct adapter *adapter)
   4230 {
   4231 	struct ix_queue *que = adapter->queues;
   4232 	u32		newitr;
   4233 
   4234 	if (ixgbe_max_interrupt_rate > 0)
   4235 		newitr = (4000000 / ixgbe_max_interrupt_rate) & 0x0FF8;
   4236 	else {
   4237 		/*
   4238 		 * Disable DMA coalescing if interrupt moderation is
   4239 		 * disabled.
   4240 		 */
   4241 		adapter->dmac = 0;
   4242 		newitr = 0;
   4243 	}
   4244 
   4245 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   4246 		struct rx_ring *rxr = &adapter->rx_rings[i];
   4247 		struct tx_ring *txr = &adapter->tx_rings[i];
   4248 		/* First the RX queue entry */
   4249 		ixgbe_set_ivar(adapter, rxr->me, que->msix, 0);
   4250 		/* ... and the TX */
   4251 		ixgbe_set_ivar(adapter, txr->me, que->msix, 1);
   4252 		/* Set an Initial EITR value */
   4253 		ixgbe_eitr_write(adapter, que->msix, newitr);
   4254 		/*
   4255 		 * To eliminate influence of the previous state.
   4256 		 * At this point, Tx/Rx interrupt handler
   4257 		 * (ixgbe_msix_que()) cannot be called, so  both
   4258 		 * IXGBE_TX_LOCK and IXGBE_RX_LOCK are not required.
   4259 		 */
   4260 		que->eitr_setting = 0;
   4261 	}
   4262 
   4263 	/* For the Link interrupt */
   4264 	ixgbe_set_ivar(adapter, 1, adapter->vector, -1);
   4265 } /* ixgbe_configure_ivars */
   4266 
   4267 /************************************************************************
   4268  * ixgbe_config_gpie
   4269  ************************************************************************/
   4270 static void
   4271 ixgbe_config_gpie(struct adapter *adapter)
   4272 {
   4273 	struct ixgbe_hw *hw = &adapter->hw;
   4274 	u32		gpie;
   4275 
   4276 	gpie = IXGBE_READ_REG(hw, IXGBE_GPIE);
   4277 
   4278 	if (adapter->feat_en & IXGBE_FEATURE_MSIX) {
   4279 		/* Enable Enhanced MSI-X mode */
   4280 		gpie |= IXGBE_GPIE_MSIX_MODE
   4281 		     |	IXGBE_GPIE_EIAME
   4282 		     |	IXGBE_GPIE_PBA_SUPPORT
   4283 		     |	IXGBE_GPIE_OCD;
   4284 	}
   4285 
   4286 	/* Fan Failure Interrupt */
   4287 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
   4288 		gpie |= IXGBE_SDP1_GPIEN;
   4289 
   4290 	/* Thermal Sensor Interrupt */
   4291 	if (adapter->feat_en & IXGBE_FEATURE_TEMP_SENSOR)
   4292 		gpie |= IXGBE_SDP0_GPIEN_X540;
   4293 
   4294 	/* Link detection */
   4295 	switch (hw->mac.type) {
   4296 	case ixgbe_mac_82599EB:
   4297 		gpie |= IXGBE_SDP1_GPIEN | IXGBE_SDP2_GPIEN;
   4298 		break;
   4299 	case ixgbe_mac_X550EM_x:
   4300 	case ixgbe_mac_X550EM_a:
   4301 		gpie |= IXGBE_SDP0_GPIEN_X540;
   4302 		break;
   4303 	default:
   4304 		break;
   4305 	}
   4306 
   4307 	IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
   4308 
   4309 } /* ixgbe_config_gpie */
   4310 
   4311 /************************************************************************
   4312  * ixgbe_config_delay_values
   4313  *
   4314  *   Requires adapter->max_frame_size to be set.
   4315  ************************************************************************/
   4316 static void
   4317 ixgbe_config_delay_values(struct adapter *adapter)
   4318 {
   4319 	struct ixgbe_hw *hw = &adapter->hw;
   4320 	u32		rxpb, frame, size, tmp;
   4321 
   4322 	frame = adapter->max_frame_size;
   4323 
   4324 	/* Calculate High Water */
   4325 	switch (hw->mac.type) {
   4326 	case ixgbe_mac_X540:
   4327 	case ixgbe_mac_X550:
   4328 	case ixgbe_mac_X550EM_x:
   4329 	case ixgbe_mac_X550EM_a:
   4330 		tmp = IXGBE_DV_X540(frame, frame);
   4331 		break;
   4332 	default:
   4333 		tmp = IXGBE_DV(frame, frame);
   4334 		break;
   4335 	}
   4336 	size = IXGBE_BT2KB(tmp);
   4337 	rxpb = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(0)) >> 10;
   4338 	hw->fc.high_water[0] = rxpb - size;
   4339 
   4340 	/* Now calculate Low Water */
   4341 	switch (hw->mac.type) {
   4342 	case ixgbe_mac_X540:
   4343 	case ixgbe_mac_X550:
   4344 	case ixgbe_mac_X550EM_x:
   4345 	case ixgbe_mac_X550EM_a:
   4346 		tmp = IXGBE_LOW_DV_X540(frame);
   4347 		break;
   4348 	default:
   4349 		tmp = IXGBE_LOW_DV(frame);
   4350 		break;
   4351 	}
   4352 	hw->fc.low_water[0] = IXGBE_BT2KB(tmp);
   4353 
   4354 	hw->fc.pause_time = IXGBE_FC_PAUSE;
   4355 	hw->fc.send_xon = TRUE;
   4356 } /* ixgbe_config_delay_values */
   4357 
   4358 /************************************************************************
   4359  * ixgbe_set_rxfilter - Multicast Update
   4360  *
   4361  *   Called whenever multicast address list is updated.
   4362  ************************************************************************/
   4363 static void
   4364 ixgbe_set_rxfilter(struct adapter *adapter)
   4365 {
   4366 	struct ixgbe_mc_addr	*mta;
   4367 	struct ifnet		*ifp = adapter->ifp;
   4368 	u8			*update_ptr;
   4369 	int			mcnt = 0;
   4370 	u32			fctrl;
   4371 	struct ethercom		*ec = &adapter->osdep.ec;
   4372 	struct ether_multi	*enm;
   4373 	struct ether_multistep	step;
   4374 
   4375 	KASSERT(mutex_owned(&adapter->core_mtx));
   4376 	IOCTL_DEBUGOUT("ixgbe_set_rxfilter: begin");
   4377 
   4378 	mta = adapter->mta;
   4379 	bzero(mta, sizeof(*mta) * MAX_NUM_MULTICAST_ADDRESSES);
   4380 
   4381 	ETHER_LOCK(ec);
   4382 	ec->ec_flags &= ~ETHER_F_ALLMULTI;
   4383 	ETHER_FIRST_MULTI(step, ec, enm);
   4384 	while (enm != NULL) {
   4385 		if ((mcnt == MAX_NUM_MULTICAST_ADDRESSES) ||
   4386 		    (memcmp(enm->enm_addrlo, enm->enm_addrhi,
   4387 			ETHER_ADDR_LEN) != 0)) {
   4388 			ec->ec_flags |= ETHER_F_ALLMULTI;
   4389 			break;
   4390 		}
   4391 		bcopy(enm->enm_addrlo,
   4392 		    mta[mcnt].addr, IXGBE_ETH_LENGTH_OF_ADDRESS);
   4393 		mta[mcnt].vmdq = adapter->pool;
   4394 		mcnt++;
   4395 		ETHER_NEXT_MULTI(step, enm);
   4396 	}
   4397 
   4398 	fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL);
   4399 	if (ifp->if_flags & IFF_PROMISC)
   4400 		fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
   4401 	else if (ec->ec_flags & ETHER_F_ALLMULTI) {
   4402 		fctrl |= IXGBE_FCTRL_MPE;
   4403 		fctrl &= ~IXGBE_FCTRL_UPE;
   4404 	} else
   4405 		fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE);
   4406 
   4407 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl);
   4408 
   4409 	/* Update multicast filter entries only when it's not ALLMULTI */
   4410 	if ((ec->ec_flags & ETHER_F_ALLMULTI) == 0) {
   4411 		ETHER_UNLOCK(ec);
   4412 		update_ptr = (u8 *)mta;
   4413 		ixgbe_update_mc_addr_list(&adapter->hw, update_ptr, mcnt,
   4414 		    ixgbe_mc_array_itr, TRUE);
   4415 	} else
   4416 		ETHER_UNLOCK(ec);
   4417 } /* ixgbe_set_rxfilter */
   4418 
   4419 /************************************************************************
   4420  * ixgbe_mc_array_itr
   4421  *
   4422  *   An iterator function needed by the multicast shared code.
   4423  *   It feeds the shared code routine the addresses in the
   4424  *   array of ixgbe_set_rxfilter() one by one.
   4425  ************************************************************************/
   4426 static u8 *
   4427 ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
   4428 {
   4429 	struct ixgbe_mc_addr *mta;
   4430 
   4431 	mta = (struct ixgbe_mc_addr *)*update_ptr;
   4432 	*vmdq = mta->vmdq;
   4433 
   4434 	*update_ptr = (u8*)(mta + 1);
   4435 
   4436 	return (mta->addr);
   4437 } /* ixgbe_mc_array_itr */
   4438 
   4439 /************************************************************************
   4440  * ixgbe_local_timer - Timer routine
   4441  *
   4442  *   Checks for link status, updates statistics,
   4443  *   and runs the watchdog check.
   4444  ************************************************************************/
   4445 static void
   4446 ixgbe_local_timer(void *arg)
   4447 {
   4448 	struct adapter *adapter = arg;
   4449 
   4450 	IXGBE_CORE_LOCK(adapter);
   4451 	ixgbe_local_timer1(adapter);
   4452 	IXGBE_CORE_UNLOCK(adapter);
   4453 }
   4454 
   4455 static void
   4456 ixgbe_local_timer1(void *arg)
   4457 {
   4458 	struct adapter	*adapter = arg;
   4459 	device_t	dev = adapter->dev;
   4460 	struct ix_queue *que = adapter->queues;
   4461 	u64		queues = 0;
   4462 	u64		v0, v1, v2, v3, v4, v5, v6, v7;
   4463 	int		hung = 0;
   4464 	int		i;
   4465 
   4466 	KASSERT(mutex_owned(&adapter->core_mtx));
   4467 
   4468 	/* Check for pluggable optics */
   4469 	if (adapter->sfp_probe)
   4470 		if (!ixgbe_sfp_probe(adapter))
   4471 			goto out; /* Nothing to do */
   4472 
   4473 	ixgbe_update_link_status(adapter);
   4474 	ixgbe_update_stats_counters(adapter);
   4475 
   4476 	/* Update some event counters */
   4477 	v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
   4478 	que = adapter->queues;
   4479 	for (i = 0; i < adapter->num_queues; i++, que++) {
   4480 		struct tx_ring	*txr = que->txr;
   4481 
   4482 		v0 += txr->q_efbig_tx_dma_setup;
   4483 		v1 += txr->q_mbuf_defrag_failed;
   4484 		v2 += txr->q_efbig2_tx_dma_setup;
   4485 		v3 += txr->q_einval_tx_dma_setup;
   4486 		v4 += txr->q_other_tx_dma_setup;
   4487 		v5 += txr->q_eagain_tx_dma_setup;
   4488 		v6 += txr->q_enomem_tx_dma_setup;
   4489 		v7 += txr->q_tso_err;
   4490 	}
   4491 	adapter->efbig_tx_dma_setup.ev_count = v0;
   4492 	adapter->mbuf_defrag_failed.ev_count = v1;
   4493 	adapter->efbig2_tx_dma_setup.ev_count = v2;
   4494 	adapter->einval_tx_dma_setup.ev_count = v3;
   4495 	adapter->other_tx_dma_setup.ev_count = v4;
   4496 	adapter->eagain_tx_dma_setup.ev_count = v5;
   4497 	adapter->enomem_tx_dma_setup.ev_count = v6;
   4498 	adapter->tso_err.ev_count = v7;
   4499 
   4500 	/*
   4501 	 * Check the TX queues status
   4502 	 *	- mark hung queues so we don't schedule on them
   4503 	 *	- watchdog only if all queues show hung
   4504 	 */
   4505 	que = adapter->queues;
   4506 	for (i = 0; i < adapter->num_queues; i++, que++) {
   4507 		/* Keep track of queues with work for soft irq */
   4508 		if (que->txr->busy)
   4509 			queues |= 1ULL << que->me;
   4510 		/*
   4511 		 * Each time txeof runs without cleaning, but there
   4512 		 * are uncleaned descriptors it increments busy. If
   4513 		 * we get to the MAX we declare it hung.
   4514 		 */
   4515 		if (que->busy == IXGBE_QUEUE_HUNG) {
   4516 			++hung;
   4517 			/* Mark the queue as inactive */
   4518 			adapter->active_queues &= ~(1ULL << que->me);
   4519 			continue;
   4520 		} else {
   4521 			/* Check if we've come back from hung */
   4522 			if ((adapter->active_queues & (1ULL << que->me)) == 0)
   4523 				adapter->active_queues |= 1ULL << que->me;
   4524 		}
   4525 		if (que->busy >= IXGBE_MAX_TX_BUSY) {
   4526 			device_printf(dev,
   4527 			    "Warning queue %d appears to be hung!\n", i);
   4528 			que->txr->busy = IXGBE_QUEUE_HUNG;
   4529 			++hung;
   4530 		}
   4531 	}
   4532 
   4533 	/* Only truely watchdog if all queues show hung */
   4534 	if (hung == adapter->num_queues)
   4535 		goto watchdog;
   4536 #if 0 /* XXX Avoid unexpectedly disabling interrupt forever (PR#53294) */
   4537 	else if (queues != 0) { /* Force an IRQ on queues with work */
   4538 		que = adapter->queues;
   4539 		for (i = 0; i < adapter->num_queues; i++, que++) {
   4540 			mutex_enter(&que->dc_mtx);
   4541 			if (que->disabled_count == 0)
   4542 				ixgbe_rearm_queues(adapter,
   4543 				    queues & ((u64)1 << i));
   4544 			mutex_exit(&que->dc_mtx);
   4545 		}
   4546 	}
   4547 #endif
   4548 
   4549 out:
   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_local_timer */
   4559 
   4560 /************************************************************************
   4561  * ixgbe_recovery_mode_timer - Recovery mode timer routine
   4562  ************************************************************************/
   4563 static void
   4564 ixgbe_recovery_mode_timer(void *arg)
   4565 {
   4566 	struct adapter *adapter = arg;
   4567 	struct ixgbe_hw *hw = &adapter->hw;
   4568 
   4569 	IXGBE_CORE_LOCK(adapter);
   4570 	if (ixgbe_fw_recovery_mode(hw)) {
   4571 		if (atomic_cas_uint(&adapter->recovery_mode, 0, 1)) {
   4572 			/* Firmware error detected, entering recovery mode */
   4573 			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");
   4574 
   4575 			if (hw->adapter_stopped == FALSE)
   4576 				ixgbe_stop(adapter);
   4577 		}
   4578 	} else
   4579 		atomic_cas_uint(&adapter->recovery_mode, 1, 0);
   4580 
   4581 	callout_reset(&adapter->recovery_mode_timer, hz,
   4582 	    ixgbe_recovery_mode_timer, adapter);
   4583 	IXGBE_CORE_UNLOCK(adapter);
   4584 } /* ixgbe_recovery_mode_timer */
   4585 
   4586 /************************************************************************
   4587  * ixgbe_sfp_probe
   4588  *
   4589  *   Determine if a port had optics inserted.
   4590  ************************************************************************/
   4591 static bool
   4592 ixgbe_sfp_probe(struct adapter *adapter)
   4593 {
   4594 	struct ixgbe_hw	*hw = &adapter->hw;
   4595 	device_t	dev = adapter->dev;
   4596 	bool		result = FALSE;
   4597 
   4598 	if ((hw->phy.type == ixgbe_phy_nl) &&
   4599 	    (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) {
   4600 		s32 ret = hw->phy.ops.identify_sfp(hw);
   4601 		if (ret)
   4602 			goto out;
   4603 		ret = hw->phy.ops.reset(hw);
   4604 		adapter->sfp_probe = FALSE;
   4605 		if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4606 			device_printf(dev,"Unsupported SFP+ module detected!");
   4607 			device_printf(dev,
   4608 			    "Reload driver with supported module.\n");
   4609 			goto out;
   4610 		} else
   4611 			device_printf(dev, "SFP+ module detected!\n");
   4612 		/* We now have supported optics */
   4613 		result = TRUE;
   4614 	}
   4615 out:
   4616 
   4617 	return (result);
   4618 } /* ixgbe_sfp_probe */
   4619 
   4620 /************************************************************************
   4621  * ixgbe_handle_mod - Tasklet for SFP module interrupts
   4622  ************************************************************************/
   4623 static void
   4624 ixgbe_handle_mod(void *context)
   4625 {
   4626 	struct adapter	*adapter = context;
   4627 	struct ixgbe_hw *hw = &adapter->hw;
   4628 	device_t	dev = adapter->dev;
   4629 	u32		err, cage_full = 0;
   4630 
   4631 	IXGBE_CORE_LOCK(adapter);
   4632 	++adapter->mod_sicount.ev_count;
   4633 	if (adapter->hw.need_crosstalk_fix) {
   4634 		switch (hw->mac.type) {
   4635 		case ixgbe_mac_82599EB:
   4636 			cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
   4637 			    IXGBE_ESDP_SDP2;
   4638 			break;
   4639 		case ixgbe_mac_X550EM_x:
   4640 		case ixgbe_mac_X550EM_a:
   4641 			cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
   4642 			    IXGBE_ESDP_SDP0;
   4643 			break;
   4644 		default:
   4645 			break;
   4646 		}
   4647 
   4648 		if (!cage_full)
   4649 			goto out;
   4650 	}
   4651 
   4652 	err = hw->phy.ops.identify_sfp(hw);
   4653 	if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4654 		device_printf(dev,
   4655 		    "Unsupported SFP+ module type was detected.\n");
   4656 		goto out;
   4657 	}
   4658 
   4659 	if (hw->need_unsupported_sfp_recovery) {
   4660 		device_printf(dev, "Recovering from unsupported SFP\n");
   4661 		/*
   4662 		 *  We could recover the status by calling setup_sfp(),
   4663 		 * setup_link() and some others. It's complex and might not
   4664 		 * work correctly on some unknown cases. To avoid such type of
   4665 		 * problem, call ixgbe_init_locked(). It's simple and safe
   4666 		 * approach.
   4667 		 */
   4668 		ixgbe_init_locked(adapter);
   4669 	} else {
   4670 		if (hw->mac.type == ixgbe_mac_82598EB)
   4671 			err = hw->phy.ops.reset(hw);
   4672 		else {
   4673 			err = hw->mac.ops.setup_sfp(hw);
   4674 			hw->phy.sfp_setup_needed = FALSE;
   4675 		}
   4676 		if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) {
   4677 			device_printf(dev,
   4678 			    "Setup failure - unsupported SFP+ module type.\n");
   4679 			goto out;
   4680 		}
   4681 	}
   4682 	ixgbe_schedule_msf_tasklet(adapter);
   4683 out:
   4684 	IXGBE_CORE_UNLOCK(adapter);
   4685 } /* ixgbe_handle_mod */
   4686 
   4687 
   4688 /************************************************************************
   4689  * ixgbe_handle_msf - Tasklet for MSF (multispeed fiber) interrupts
   4690  ************************************************************************/
   4691 static void
   4692 ixgbe_handle_msf(struct work *wk, void *context)
   4693 {
   4694 	struct adapter	*adapter = context;
   4695 	struct ifnet	*ifp = adapter->ifp;
   4696 	struct ixgbe_hw *hw = &adapter->hw;
   4697 	u32		autoneg;
   4698 	bool		negotiate;
   4699 
   4700 	/*
   4701 	 * Hold the IFNET_LOCK across this entire call.  This will
   4702 	 * prevent additional changes to adapter->phy_layer
   4703 	 * and serialize calls to this tasklet.  We cannot hold the
   4704 	 * CORE_LOCK while calling into the ifmedia functions as
   4705 	 * they may block while allocating memory.
   4706 	 */
   4707 	IFNET_LOCK(ifp);
   4708 
   4709 	IXGBE_CORE_LOCK(adapter);
   4710 	adapter->msf_pending = false;
   4711 	++adapter->msf_sicount.ev_count;
   4712 	/* get_supported_phy_layer will call hw->phy.ops.identify_sfp() */
   4713 	adapter->phy_layer = ixgbe_get_supported_physical_layer(hw);
   4714 
   4715 	autoneg = hw->phy.autoneg_advertised;
   4716 	if ((!autoneg) && (hw->mac.ops.get_link_capabilities))
   4717 		hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate);
   4718 	else
   4719 		negotiate = 0;
   4720 	if (hw->mac.ops.setup_link)
   4721 		hw->mac.ops.setup_link(hw, autoneg, TRUE);
   4722 	IXGBE_CORE_UNLOCK(adapter);
   4723 
   4724 	/* Adjust media types shown in ifconfig */
   4725 	ifmedia_removeall(&adapter->media);
   4726 	ixgbe_add_media_types(adapter);
   4727 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
   4728 	IFNET_UNLOCK(ifp);
   4729 } /* ixgbe_handle_msf */
   4730 
   4731 /************************************************************************
   4732  * ixgbe_handle_phy - Tasklet for external PHY interrupts
   4733  ************************************************************************/
   4734 static void
   4735 ixgbe_handle_phy(void *context)
   4736 {
   4737 	struct adapter	*adapter = context;
   4738 	struct ixgbe_hw *hw = &adapter->hw;
   4739 	int error;
   4740 
   4741 	++adapter->phy_sicount.ev_count;
   4742 	error = hw->phy.ops.handle_lasi(hw);
   4743 	if (error == IXGBE_ERR_OVERTEMP)
   4744 		device_printf(adapter->dev,
   4745 		    "CRITICAL: EXTERNAL PHY OVER TEMP!! "
   4746 		    " PHY will downshift to lower power state!\n");
   4747 	else if (error)
   4748 		device_printf(adapter->dev,
   4749 		    "Error handling LASI interrupt: %d\n", error);
   4750 } /* ixgbe_handle_phy */
   4751 
   4752 static void
   4753 ixgbe_ifstop(struct ifnet *ifp, int disable)
   4754 {
   4755 	struct adapter *adapter = ifp->if_softc;
   4756 
   4757 	IXGBE_CORE_LOCK(adapter);
   4758 	ixgbe_stop(adapter);
   4759 	IXGBE_CORE_UNLOCK(adapter);
   4760 
   4761 	workqueue_wait(adapter->msf_wq, &adapter->msf_wc);
   4762 	adapter->msf_pending = false;
   4763 }
   4764 
   4765 /************************************************************************
   4766  * ixgbe_stop - Stop the hardware
   4767  *
   4768  *   Disables all traffic on the adapter by issuing a
   4769  *   global reset on the MAC and deallocates TX/RX buffers.
   4770  ************************************************************************/
   4771 static void
   4772 ixgbe_stop(void *arg)
   4773 {
   4774 	struct ifnet	*ifp;
   4775 	struct adapter	*adapter = arg;
   4776 	struct ixgbe_hw *hw = &adapter->hw;
   4777 
   4778 	ifp = adapter->ifp;
   4779 
   4780 	KASSERT(mutex_owned(&adapter->core_mtx));
   4781 
   4782 	INIT_DEBUGOUT("ixgbe_stop: begin\n");
   4783 	ixgbe_disable_intr(adapter);
   4784 	callout_stop(&adapter->timer);
   4785 
   4786 	/* Don't schedule workqueues. */
   4787 	adapter->schedule_wqs_ok = false;
   4788 
   4789 	/* Let the stack know...*/
   4790 	ifp->if_flags &= ~IFF_RUNNING;
   4791 
   4792 	ixgbe_reset_hw(hw);
   4793 	hw->adapter_stopped = FALSE;
   4794 	ixgbe_stop_adapter(hw);
   4795 	if (hw->mac.type == ixgbe_mac_82599EB)
   4796 		ixgbe_stop_mac_link_on_d3_82599(hw);
   4797 	/* Turn off the laser - noop with no optics */
   4798 	ixgbe_disable_tx_laser(hw);
   4799 
   4800 	/* Update the stack */
   4801 	adapter->link_up = FALSE;
   4802 	ixgbe_update_link_status(adapter);
   4803 
   4804 	/* reprogram the RAR[0] in case user changed it. */
   4805 	ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV);
   4806 
   4807 	return;
   4808 } /* ixgbe_stop */
   4809 
   4810 /************************************************************************
   4811  * ixgbe_update_link_status - Update OS on link state
   4812  *
   4813  * Note: Only updates the OS on the cached link state.
   4814  *	 The real check of the hardware only happens with
   4815  *	 a link interrupt.
   4816  ************************************************************************/
   4817 static void
   4818 ixgbe_update_link_status(struct adapter *adapter)
   4819 {
   4820 	struct ifnet	*ifp = adapter->ifp;
   4821 	device_t	dev = adapter->dev;
   4822 	struct ixgbe_hw *hw = &adapter->hw;
   4823 
   4824 	KASSERT(mutex_owned(&adapter->core_mtx));
   4825 
   4826 	if (adapter->link_up) {
   4827 		if (adapter->link_active != LINK_STATE_UP) {
   4828 			/*
   4829 			 * To eliminate influence of the previous state
   4830 			 * in the same way as ixgbe_init_locked().
   4831 			 */
   4832 			struct ix_queue	*que = adapter->queues;
   4833 			for (int i = 0; i < adapter->num_queues; i++, que++)
   4834 				que->eitr_setting = 0;
   4835 
   4836 			if (adapter->link_speed == IXGBE_LINK_SPEED_10GB_FULL){
   4837 				/*
   4838 				 *  Discard count for both MAC Local Fault and
   4839 				 * Remote Fault because those registers are
   4840 				 * valid only when the link speed is up and
   4841 				 * 10Gbps.
   4842 				 */
   4843 				IXGBE_READ_REG(hw, IXGBE_MLFC);
   4844 				IXGBE_READ_REG(hw, IXGBE_MRFC);
   4845 			}
   4846 
   4847 			if (bootverbose) {
   4848 				const char *bpsmsg;
   4849 
   4850 				switch (adapter->link_speed) {
   4851 				case IXGBE_LINK_SPEED_10GB_FULL:
   4852 					bpsmsg = "10 Gbps";
   4853 					break;
   4854 				case IXGBE_LINK_SPEED_5GB_FULL:
   4855 					bpsmsg = "5 Gbps";
   4856 					break;
   4857 				case IXGBE_LINK_SPEED_2_5GB_FULL:
   4858 					bpsmsg = "2.5 Gbps";
   4859 					break;
   4860 				case IXGBE_LINK_SPEED_1GB_FULL:
   4861 					bpsmsg = "1 Gbps";
   4862 					break;
   4863 				case IXGBE_LINK_SPEED_100_FULL:
   4864 					bpsmsg = "100 Mbps";
   4865 					break;
   4866 				case IXGBE_LINK_SPEED_10_FULL:
   4867 					bpsmsg = "10 Mbps";
   4868 					break;
   4869 				default:
   4870 					bpsmsg = "unknown speed";
   4871 					break;
   4872 				}
   4873 				device_printf(dev, "Link is up %s %s \n",
   4874 				    bpsmsg, "Full Duplex");
   4875 			}
   4876 			adapter->link_active = LINK_STATE_UP;
   4877 			/* Update any Flow Control changes */
   4878 			ixgbe_fc_enable(&adapter->hw);
   4879 			/* Update DMA coalescing config */
   4880 			ixgbe_config_dmac(adapter);
   4881 			if_link_state_change(ifp, LINK_STATE_UP);
   4882 
   4883 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   4884 				ixgbe_ping_all_vfs(adapter);
   4885 		}
   4886 	} else {
   4887 		/*
   4888 		 * Do it when link active changes to DOWN. i.e.
   4889 		 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
   4890 		 * b) LINK_STATE_UP	 -> LINK_STATE_DOWN
   4891 		 */
   4892 		if (adapter->link_active != LINK_STATE_DOWN) {
   4893 			if (bootverbose)
   4894 				device_printf(dev, "Link is Down\n");
   4895 			if_link_state_change(ifp, LINK_STATE_DOWN);
   4896 			adapter->link_active = LINK_STATE_DOWN;
   4897 			if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   4898 				ixgbe_ping_all_vfs(adapter);
   4899 			ixgbe_drain_all(adapter);
   4900 		}
   4901 	}
   4902 } /* ixgbe_update_link_status */
   4903 
   4904 /************************************************************************
   4905  * ixgbe_config_dmac - Configure DMA Coalescing
   4906  ************************************************************************/
   4907 static void
   4908 ixgbe_config_dmac(struct adapter *adapter)
   4909 {
   4910 	struct ixgbe_hw *hw = &adapter->hw;
   4911 	struct ixgbe_dmac_config *dcfg = &hw->mac.dmac_config;
   4912 
   4913 	if (hw->mac.type < ixgbe_mac_X550 || !hw->mac.ops.dmac_config)
   4914 		return;
   4915 
   4916 	if (dcfg->watchdog_timer ^ adapter->dmac ||
   4917 	    dcfg->link_speed ^ adapter->link_speed) {
   4918 		dcfg->watchdog_timer = adapter->dmac;
   4919 		dcfg->fcoe_en = false;
   4920 		dcfg->link_speed = adapter->link_speed;
   4921 		dcfg->num_tcs = 1;
   4922 
   4923 		INIT_DEBUGOUT2("dmac settings: watchdog %d, link speed %d\n",
   4924 		    dcfg->watchdog_timer, dcfg->link_speed);
   4925 
   4926 		hw->mac.ops.dmac_config(hw);
   4927 	}
   4928 } /* ixgbe_config_dmac */
   4929 
   4930 /************************************************************************
   4931  * ixgbe_enable_intr
   4932  ************************************************************************/
   4933 static void
   4934 ixgbe_enable_intr(struct adapter *adapter)
   4935 {
   4936 	struct ixgbe_hw	*hw = &adapter->hw;
   4937 	struct ix_queue	*que = adapter->queues;
   4938 	u32		mask, fwsm;
   4939 
   4940 	mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE);
   4941 
   4942 	switch (adapter->hw.mac.type) {
   4943 	case ixgbe_mac_82599EB:
   4944 		mask |= IXGBE_EIMS_ECC;
   4945 		/* Temperature sensor on some adapters */
   4946 		mask |= IXGBE_EIMS_GPI_SDP0;
   4947 		/* SFP+ (RX_LOS_N & MOD_ABS_N) */
   4948 		mask |= IXGBE_EIMS_GPI_SDP1;
   4949 		mask |= IXGBE_EIMS_GPI_SDP2;
   4950 		break;
   4951 	case ixgbe_mac_X540:
   4952 		/* Detect if Thermal Sensor is enabled */
   4953 		fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM);
   4954 		if (fwsm & IXGBE_FWSM_TS_ENABLED)
   4955 			mask |= IXGBE_EIMS_TS;
   4956 		mask |= IXGBE_EIMS_ECC;
   4957 		break;
   4958 	case ixgbe_mac_X550:
   4959 		/* MAC thermal sensor is automatically enabled */
   4960 		mask |= IXGBE_EIMS_TS;
   4961 		mask |= IXGBE_EIMS_ECC;
   4962 		break;
   4963 	case ixgbe_mac_X550EM_x:
   4964 	case ixgbe_mac_X550EM_a:
   4965 		/* Some devices use SDP0 for important information */
   4966 		if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP ||
   4967 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP ||
   4968 		    hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N ||
   4969 		    hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T)
   4970 			mask |= IXGBE_EIMS_GPI_SDP0_BY_MAC(hw);
   4971 		if (hw->phy.type == ixgbe_phy_x550em_ext_t)
   4972 			mask |= IXGBE_EICR_GPI_SDP0_X540;
   4973 		mask |= IXGBE_EIMS_ECC;
   4974 		break;
   4975 	default:
   4976 		break;
   4977 	}
   4978 
   4979 	/* Enable Fan Failure detection */
   4980 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL)
   4981 		mask |= IXGBE_EIMS_GPI_SDP1;
   4982 	/* Enable SR-IOV */
   4983 	if (adapter->feat_en & IXGBE_FEATURE_SRIOV)
   4984 		mask |= IXGBE_EIMS_MAILBOX;
   4985 	/* Enable Flow Director */
   4986 	if (adapter->feat_en & IXGBE_FEATURE_FDIR)
   4987 		mask |= IXGBE_EIMS_FLOW_DIR;
   4988 
   4989 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask);
   4990 
   4991 	/* With MSI-X we use auto clear */
   4992 	if (adapter->msix_mem) {
   4993 		mask = IXGBE_EIMS_ENABLE_MASK;
   4994 		/* Don't autoclear Link */
   4995 		mask &= ~IXGBE_EIMS_OTHER;
   4996 		mask &= ~IXGBE_EIMS_LSC;
   4997 		if (adapter->feat_cap & IXGBE_FEATURE_SRIOV)
   4998 			mask &= ~IXGBE_EIMS_MAILBOX;
   4999 		IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask);
   5000 	}
   5001 
   5002 	/*
   5003 	 * Now enable all queues, this is done separately to
   5004 	 * allow for handling the extended (beyond 32) MSI-X
   5005 	 * vectors that can be used by 82599
   5006 	 */
   5007 	for (int i = 0; i < adapter->num_queues; i++, que++)
   5008 		ixgbe_enable_queue(adapter, que->msix);
   5009 
   5010 	IXGBE_WRITE_FLUSH(hw);
   5011 
   5012 } /* ixgbe_enable_intr */
   5013 
   5014 /************************************************************************
   5015  * ixgbe_disable_intr_internal
   5016  ************************************************************************/
   5017 static void
   5018 ixgbe_disable_intr_internal(struct adapter *adapter, bool nestok)
   5019 {
   5020 	struct ix_queue	*que = adapter->queues;
   5021 
   5022 	/* disable interrupts other than queues */
   5023 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~IXGBE_EIMC_RTX_QUEUE);
   5024 
   5025 	if (adapter->msix_mem)
   5026 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0);
   5027 
   5028 	for (int i = 0; i < adapter->num_queues; i++, que++)
   5029 		ixgbe_disable_queue_internal(adapter, que->msix, nestok);
   5030 
   5031 	IXGBE_WRITE_FLUSH(&adapter->hw);
   5032 
   5033 } /* ixgbe_do_disable_intr_internal */
   5034 
   5035 /************************************************************************
   5036  * ixgbe_disable_intr
   5037  ************************************************************************/
   5038 static void
   5039 ixgbe_disable_intr(struct adapter *adapter)
   5040 {
   5041 
   5042 	ixgbe_disable_intr_internal(adapter, true);
   5043 } /* ixgbe_disable_intr */
   5044 
   5045 /************************************************************************
   5046  * ixgbe_ensure_disabled_intr
   5047  ************************************************************************/
   5048 void
   5049 ixgbe_ensure_disabled_intr(struct adapter *adapter)
   5050 {
   5051 
   5052 	ixgbe_disable_intr_internal(adapter, false);
   5053 } /* ixgbe_ensure_disabled_intr */
   5054 
   5055 /************************************************************************
   5056  * ixgbe_legacy_irq - Legacy Interrupt Service routine
   5057  ************************************************************************/
   5058 static int
   5059 ixgbe_legacy_irq(void *arg)
   5060 {
   5061 	struct ix_queue *que = arg;
   5062 	struct adapter	*adapter = que->adapter;
   5063 	struct ixgbe_hw	*hw = &adapter->hw;
   5064 	struct ifnet	*ifp = adapter->ifp;
   5065 	struct		tx_ring *txr = adapter->tx_rings;
   5066 	bool		more = false;
   5067 	u32		eicr, eicr_mask;
   5068 
   5069 	/* Silicon errata #26 on 82598 */
   5070 	IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
   5071 
   5072 	eicr = IXGBE_READ_REG(hw, IXGBE_EICR);
   5073 
   5074 	adapter->stats.pf.legint.ev_count++;
   5075 	++que->irqs.ev_count;
   5076 	if (eicr == 0) {
   5077 		adapter->stats.pf.intzero.ev_count++;
   5078 		if ((ifp->if_flags & IFF_UP) != 0)
   5079 			ixgbe_enable_intr(adapter);
   5080 		return 0;
   5081 	}
   5082 
   5083 	if ((ifp->if_flags & IFF_RUNNING) != 0) {
   5084 		/*
   5085 		 * The same as ixgbe_msix_que() about "que->txrx_use_workqueue".
   5086 		 */
   5087 		que->txrx_use_workqueue = adapter->txrx_use_workqueue;
   5088 
   5089 #ifdef __NetBSD__
   5090 		/* Don't run ixgbe_rxeof in interrupt context */
   5091 		more = true;
   5092 #else
   5093 		more = ixgbe_rxeof(que);
   5094 #endif
   5095 
   5096 		IXGBE_TX_LOCK(txr);
   5097 		ixgbe_txeof(txr);
   5098 #ifdef notyet
   5099 		if (!ixgbe_ring_empty(ifp, txr->br))
   5100 			ixgbe_start_locked(ifp, txr);
   5101 #endif
   5102 		IXGBE_TX_UNLOCK(txr);
   5103 	}
   5104 
   5105 	/* Check for fan failure */
   5106 	if (adapter->feat_en & IXGBE_FEATURE_FAN_FAIL) {
   5107 		ixgbe_check_fan_failure(adapter, eicr, true);
   5108 		IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   5109 	}
   5110 
   5111 	/* Link status change */
   5112 	if (eicr & IXGBE_EICR_LSC)
   5113 		softint_schedule(adapter->link_si);
   5114 
   5115 	if (ixgbe_is_sfp(hw)) {
   5116 		/* Pluggable optics-related interrupt */
   5117 		if (hw->mac.type >= ixgbe_mac_X540)
   5118 			eicr_mask = IXGBE_EICR_GPI_SDP0_X540;
   5119 		else
   5120 			eicr_mask = IXGBE_EICR_GPI_SDP2_BY_MAC(hw);
   5121 
   5122 		if (eicr & eicr_mask) {
   5123 			IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
   5124 			softint_schedule(adapter->mod_si);
   5125 		}
   5126 
   5127 		if ((hw->mac.type == ixgbe_mac_82599EB) &&
   5128 		    (eicr & IXGBE_EICR_GPI_SDP1_BY_MAC(hw))) {
   5129 			IXGBE_WRITE_REG(hw, IXGBE_EICR,
   5130 			    IXGBE_EICR_GPI_SDP1_BY_MAC(hw));
   5131 			ixgbe_schedule_msf_tasklet(adapter);
   5132 		}
   5133 	}
   5134 
   5135 	/* External PHY interrupt */
   5136 	if ((hw->phy.type == ixgbe_phy_x550em_ext_t) &&
   5137 	    (eicr & IXGBE_EICR_GPI_SDP0_X540))
   5138 		softint_schedule(adapter->phy_si);
   5139 
   5140 	if (more) {
   5141 		que->req.ev_count++;
   5142 		ixgbe_sched_handle_que(adapter, que);
   5143 	} else
   5144 		ixgbe_enable_intr(adapter);
   5145 
   5146 	return 1;
   5147 } /* ixgbe_legacy_irq */
   5148 
   5149 /************************************************************************
   5150  * ixgbe_free_pciintr_resources
   5151  ************************************************************************/
   5152 static void
   5153 ixgbe_free_pciintr_resources(struct adapter *adapter)
   5154 {
   5155 	struct ix_queue *que = adapter->queues;
   5156 	int		rid;
   5157 
   5158 	/*
   5159 	 * Release all msix queue resources:
   5160 	 */
   5161 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   5162 		if (que->res != NULL) {
   5163 			pci_intr_disestablish(adapter->osdep.pc,
   5164 			    adapter->osdep.ihs[i]);
   5165 			adapter->osdep.ihs[i] = NULL;
   5166 		}
   5167 	}
   5168 
   5169 	/* Clean the Legacy or Link interrupt last */
   5170 	if (adapter->vector) /* we are doing MSIX */
   5171 		rid = adapter->vector;
   5172 	else
   5173 		rid = 0;
   5174 
   5175 	if (adapter->osdep.ihs[rid] != NULL) {
   5176 		pci_intr_disestablish(adapter->osdep.pc,
   5177 		    adapter->osdep.ihs[rid]);
   5178 		adapter->osdep.ihs[rid] = NULL;
   5179 	}
   5180 
   5181 	if (adapter->osdep.intrs != NULL) {
   5182 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
   5183 		    adapter->osdep.nintrs);
   5184 		adapter->osdep.intrs = NULL;
   5185 	}
   5186 } /* ixgbe_free_pciintr_resources */
   5187 
   5188 /************************************************************************
   5189  * ixgbe_free_pci_resources
   5190  ************************************************************************/
   5191 static void
   5192 ixgbe_free_pci_resources(struct adapter *adapter)
   5193 {
   5194 
   5195 	ixgbe_free_pciintr_resources(adapter);
   5196 
   5197 	if (adapter->osdep.mem_size != 0) {
   5198 		bus_space_unmap(adapter->osdep.mem_bus_space_tag,
   5199 		    adapter->osdep.mem_bus_space_handle,
   5200 		    adapter->osdep.mem_size);
   5201 	}
   5202 
   5203 } /* ixgbe_free_pci_resources */
   5204 
   5205 /************************************************************************
   5206  * ixgbe_set_sysctl_value
   5207  ************************************************************************/
   5208 static void
   5209 ixgbe_set_sysctl_value(struct adapter *adapter, const char *name,
   5210     const char *description, int *limit, int value)
   5211 {
   5212 	device_t dev =	adapter->dev;
   5213 	struct sysctllog **log;
   5214 	const struct sysctlnode *rnode, *cnode;
   5215 
   5216 	/*
   5217 	 * It's not required to check recovery mode because this function never
   5218 	 * touches hardware.
   5219 	 */
   5220 
   5221 	log = &adapter->sysctllog;
   5222 	if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) {
   5223 		aprint_error_dev(dev, "could not create sysctl root\n");
   5224 		return;
   5225 	}
   5226 	if (sysctl_createv(log, 0, &rnode, &cnode,
   5227 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   5228 	    name, SYSCTL_DESCR(description),
   5229 		NULL, 0, limit, 0, CTL_CREATE, CTL_EOL) != 0)
   5230 		aprint_error_dev(dev, "could not create sysctl\n");
   5231 	*limit = value;
   5232 } /* ixgbe_set_sysctl_value */
   5233 
   5234 /************************************************************************
   5235  * ixgbe_sysctl_flowcntl
   5236  *
   5237  *   SYSCTL wrapper around setting Flow Control
   5238  ************************************************************************/
   5239 static int
   5240 ixgbe_sysctl_flowcntl(SYSCTLFN_ARGS)
   5241 {
   5242 	struct sysctlnode node = *rnode;
   5243 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5244 	int error, fc;
   5245 
   5246 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5247 		return (EPERM);
   5248 
   5249 	fc = adapter->hw.fc.current_mode;
   5250 	node.sysctl_data = &fc;
   5251 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5252 	if (error != 0 || newp == NULL)
   5253 		return error;
   5254 
   5255 	/* Don't bother if it's not changed */
   5256 	if (fc == adapter->hw.fc.current_mode)
   5257 		return (0);
   5258 
   5259 	return ixgbe_set_flowcntl(adapter, fc);
   5260 } /* ixgbe_sysctl_flowcntl */
   5261 
   5262 /************************************************************************
   5263  * ixgbe_set_flowcntl - Set flow control
   5264  *
   5265  *   Flow control values:
   5266  *     0 - off
   5267  *     1 - rx pause
   5268  *     2 - tx pause
   5269  *     3 - full
   5270  ************************************************************************/
   5271 static int
   5272 ixgbe_set_flowcntl(struct adapter *adapter, int fc)
   5273 {
   5274 	switch (fc) {
   5275 		case ixgbe_fc_rx_pause:
   5276 		case ixgbe_fc_tx_pause:
   5277 		case ixgbe_fc_full:
   5278 			adapter->hw.fc.requested_mode = fc;
   5279 			if (adapter->num_queues > 1)
   5280 				ixgbe_disable_rx_drop(adapter);
   5281 			break;
   5282 		case ixgbe_fc_none:
   5283 			adapter->hw.fc.requested_mode = ixgbe_fc_none;
   5284 			if (adapter->num_queues > 1)
   5285 				ixgbe_enable_rx_drop(adapter);
   5286 			break;
   5287 		default:
   5288 			return (EINVAL);
   5289 	}
   5290 
   5291 #if 0 /* XXX NetBSD */
   5292 	/* Don't autoneg if forcing a value */
   5293 	adapter->hw.fc.disable_fc_autoneg = TRUE;
   5294 #endif
   5295 	ixgbe_fc_enable(&adapter->hw);
   5296 
   5297 	return (0);
   5298 } /* ixgbe_set_flowcntl */
   5299 
   5300 /************************************************************************
   5301  * ixgbe_enable_rx_drop
   5302  *
   5303  *   Enable the hardware to drop packets when the buffer is
   5304  *   full. This is useful with multiqueue, so that no single
   5305  *   queue being full stalls the entire RX engine. We only
   5306  *   enable this when Multiqueue is enabled AND Flow Control
   5307  *   is disabled.
   5308  ************************************************************************/
   5309 static void
   5310 ixgbe_enable_rx_drop(struct adapter *adapter)
   5311 {
   5312 	struct ixgbe_hw *hw = &adapter->hw;
   5313 	struct rx_ring	*rxr;
   5314 	u32		srrctl;
   5315 
   5316 	for (int i = 0; i < adapter->num_queues; i++) {
   5317 		rxr = &adapter->rx_rings[i];
   5318 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
   5319 		srrctl |= IXGBE_SRRCTL_DROP_EN;
   5320 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
   5321 	}
   5322 
   5323 	/* enable drop for each vf */
   5324 	for (int i = 0; i < adapter->num_vfs; i++) {
   5325 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
   5326 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT) |
   5327 		    IXGBE_QDE_ENABLE));
   5328 	}
   5329 } /* ixgbe_enable_rx_drop */
   5330 
   5331 /************************************************************************
   5332  * ixgbe_disable_rx_drop
   5333  ************************************************************************/
   5334 static void
   5335 ixgbe_disable_rx_drop(struct adapter *adapter)
   5336 {
   5337 	struct ixgbe_hw *hw = &adapter->hw;
   5338 	struct rx_ring	*rxr;
   5339 	u32		srrctl;
   5340 
   5341 	for (int i = 0; i < adapter->num_queues; i++) {
   5342 		rxr = &adapter->rx_rings[i];
   5343 		srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(rxr->me));
   5344 		srrctl &= ~IXGBE_SRRCTL_DROP_EN;
   5345 		IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(rxr->me), srrctl);
   5346 	}
   5347 
   5348 	/* disable drop for each vf */
   5349 	for (int i = 0; i < adapter->num_vfs; i++) {
   5350 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
   5351 		    (IXGBE_QDE_WRITE | (i << IXGBE_QDE_IDX_SHIFT)));
   5352 	}
   5353 } /* ixgbe_disable_rx_drop */
   5354 
   5355 /************************************************************************
   5356  * ixgbe_sysctl_advertise
   5357  *
   5358  *   SYSCTL wrapper around setting advertised speed
   5359  ************************************************************************/
   5360 static int
   5361 ixgbe_sysctl_advertise(SYSCTLFN_ARGS)
   5362 {
   5363 	struct sysctlnode node = *rnode;
   5364 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5365 	int	       error = 0, advertise;
   5366 
   5367 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5368 		return (EPERM);
   5369 
   5370 	advertise = adapter->advertise;
   5371 	node.sysctl_data = &advertise;
   5372 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5373 	if (error != 0 || newp == NULL)
   5374 		return error;
   5375 
   5376 	return ixgbe_set_advertise(adapter, advertise);
   5377 } /* ixgbe_sysctl_advertise */
   5378 
   5379 /************************************************************************
   5380  * ixgbe_set_advertise - Control advertised link speed
   5381  *
   5382  *   Flags:
   5383  *     0x00 - Default (all capable link speed)
   5384  *     0x01 - advertise 100 Mb
   5385  *     0x02 - advertise 1G
   5386  *     0x04 - advertise 10G
   5387  *     0x08 - advertise 10 Mb
   5388  *     0x10 - advertise 2.5G
   5389  *     0x20 - advertise 5G
   5390  ************************************************************************/
   5391 static int
   5392 ixgbe_set_advertise(struct adapter *adapter, int advertise)
   5393 {
   5394 	device_t	 dev;
   5395 	struct ixgbe_hw	 *hw;
   5396 	ixgbe_link_speed speed = 0;
   5397 	ixgbe_link_speed link_caps = 0;
   5398 	s32		 err = IXGBE_NOT_IMPLEMENTED;
   5399 	bool		 negotiate = FALSE;
   5400 
   5401 	/* Checks to validate new value */
   5402 	if (adapter->advertise == advertise) /* no change */
   5403 		return (0);
   5404 
   5405 	dev = adapter->dev;
   5406 	hw = &adapter->hw;
   5407 
   5408 	/* No speed changes for backplane media */
   5409 	if (hw->phy.media_type == ixgbe_media_type_backplane)
   5410 		return (ENODEV);
   5411 
   5412 	if (!((hw->phy.media_type == ixgbe_media_type_copper) ||
   5413 	    (hw->phy.multispeed_fiber))) {
   5414 		device_printf(dev,
   5415 		    "Advertised speed can only be set on copper or "
   5416 		    "multispeed fiber media types.\n");
   5417 		return (EINVAL);
   5418 	}
   5419 
   5420 	if (advertise < 0x0 || advertise > 0x2f) {
   5421 		device_printf(dev,
   5422 		    "Invalid advertised speed; valid modes are 0x0 through 0x7\n");
   5423 		return (EINVAL);
   5424 	}
   5425 
   5426 	if (hw->mac.ops.get_link_capabilities) {
   5427 		err = hw->mac.ops.get_link_capabilities(hw, &link_caps,
   5428 		    &negotiate);
   5429 		if (err != IXGBE_SUCCESS) {
   5430 			device_printf(dev, "Unable to determine supported advertise speeds\n");
   5431 			return (ENODEV);
   5432 		}
   5433 	}
   5434 
   5435 	/* Set new value and report new advertised mode */
   5436 	if (advertise & 0x1) {
   5437 		if (!(link_caps & IXGBE_LINK_SPEED_100_FULL)) {
   5438 			device_printf(dev, "Interface does not support 100Mb advertised speed\n");
   5439 			return (EINVAL);
   5440 		}
   5441 		speed |= IXGBE_LINK_SPEED_100_FULL;
   5442 	}
   5443 	if (advertise & 0x2) {
   5444 		if (!(link_caps & IXGBE_LINK_SPEED_1GB_FULL)) {
   5445 			device_printf(dev, "Interface does not support 1Gb advertised speed\n");
   5446 			return (EINVAL);
   5447 		}
   5448 		speed |= IXGBE_LINK_SPEED_1GB_FULL;
   5449 	}
   5450 	if (advertise & 0x4) {
   5451 		if (!(link_caps & IXGBE_LINK_SPEED_10GB_FULL)) {
   5452 			device_printf(dev, "Interface does not support 10Gb advertised speed\n");
   5453 			return (EINVAL);
   5454 		}
   5455 		speed |= IXGBE_LINK_SPEED_10GB_FULL;
   5456 	}
   5457 	if (advertise & 0x8) {
   5458 		if (!(link_caps & IXGBE_LINK_SPEED_10_FULL)) {
   5459 			device_printf(dev, "Interface does not support 10Mb advertised speed\n");
   5460 			return (EINVAL);
   5461 		}
   5462 		speed |= IXGBE_LINK_SPEED_10_FULL;
   5463 	}
   5464 	if (advertise & 0x10) {
   5465 		if (!(link_caps & IXGBE_LINK_SPEED_2_5GB_FULL)) {
   5466 			device_printf(dev, "Interface does not support 2.5Gb advertised speed\n");
   5467 			return (EINVAL);
   5468 		}
   5469 		speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
   5470 	}
   5471 	if (advertise & 0x20) {
   5472 		if (!(link_caps & IXGBE_LINK_SPEED_5GB_FULL)) {
   5473 			device_printf(dev, "Interface does not support 5Gb advertised speed\n");
   5474 			return (EINVAL);
   5475 		}
   5476 		speed |= IXGBE_LINK_SPEED_5GB_FULL;
   5477 	}
   5478 	if (advertise == 0)
   5479 		speed = link_caps; /* All capable link speed */
   5480 
   5481 	hw->mac.autotry_restart = TRUE;
   5482 	hw->mac.ops.setup_link(hw, speed, TRUE);
   5483 	adapter->advertise = advertise;
   5484 
   5485 	return (0);
   5486 } /* ixgbe_set_advertise */
   5487 
   5488 /************************************************************************
   5489  * ixgbe_get_advertise - Get current advertised speed settings
   5490  *
   5491  *   Formatted for sysctl usage.
   5492  *   Flags:
   5493  *     0x01 - advertise 100 Mb
   5494  *     0x02 - advertise 1G
   5495  *     0x04 - advertise 10G
   5496  *     0x08 - advertise 10 Mb (yes, Mb)
   5497  *     0x10 - advertise 2.5G
   5498  *     0x20 - advertise 5G
   5499  ************************************************************************/
   5500 static int
   5501 ixgbe_get_advertise(struct adapter *adapter)
   5502 {
   5503 	struct ixgbe_hw	 *hw = &adapter->hw;
   5504 	int		 speed;
   5505 	ixgbe_link_speed link_caps = 0;
   5506 	s32		 err;
   5507 	bool		 negotiate = FALSE;
   5508 
   5509 	/*
   5510 	 * Advertised speed means nothing unless it's copper or
   5511 	 * multi-speed fiber
   5512 	 */
   5513 	if (!(hw->phy.media_type == ixgbe_media_type_copper) &&
   5514 	    !(hw->phy.multispeed_fiber))
   5515 		return (0);
   5516 
   5517 	err = hw->mac.ops.get_link_capabilities(hw, &link_caps, &negotiate);
   5518 	if (err != IXGBE_SUCCESS)
   5519 		return (0);
   5520 
   5521 	speed =
   5522 	    ((link_caps & IXGBE_LINK_SPEED_10GB_FULL)  ? 0x04 : 0) |
   5523 	    ((link_caps & IXGBE_LINK_SPEED_1GB_FULL)   ? 0x02 : 0) |
   5524 	    ((link_caps & IXGBE_LINK_SPEED_100_FULL)   ? 0x01 : 0) |
   5525 	    ((link_caps & IXGBE_LINK_SPEED_10_FULL)    ? 0x08 : 0) |
   5526 	    ((link_caps & IXGBE_LINK_SPEED_2_5GB_FULL) ? 0x10 : 0) |
   5527 	    ((link_caps & IXGBE_LINK_SPEED_5GB_FULL)   ? 0x20 : 0);
   5528 
   5529 	return speed;
   5530 } /* ixgbe_get_advertise */
   5531 
   5532 /************************************************************************
   5533  * ixgbe_sysctl_dmac - Manage DMA Coalescing
   5534  *
   5535  *   Control values:
   5536  *     0/1 - off / on (use default value of 1000)
   5537  *
   5538  *     Legal timer values are:
   5539  *     50,100,250,500,1000,2000,5000,10000
   5540  *
   5541  *     Turning off interrupt moderation will also turn this off.
   5542  ************************************************************************/
   5543 static int
   5544 ixgbe_sysctl_dmac(SYSCTLFN_ARGS)
   5545 {
   5546 	struct sysctlnode node = *rnode;
   5547 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5548 	struct ifnet   *ifp = adapter->ifp;
   5549 	int	       error;
   5550 	int	       newval;
   5551 
   5552 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5553 		return (EPERM);
   5554 
   5555 	newval = adapter->dmac;
   5556 	node.sysctl_data = &newval;
   5557 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5558 	if ((error) || (newp == NULL))
   5559 		return (error);
   5560 
   5561 	switch (newval) {
   5562 	case 0:
   5563 		/* Disabled */
   5564 		adapter->dmac = 0;
   5565 		break;
   5566 	case 1:
   5567 		/* Enable and use default */
   5568 		adapter->dmac = 1000;
   5569 		break;
   5570 	case 50:
   5571 	case 100:
   5572 	case 250:
   5573 	case 500:
   5574 	case 1000:
   5575 	case 2000:
   5576 	case 5000:
   5577 	case 10000:
   5578 		/* Legal values - allow */
   5579 		adapter->dmac = newval;
   5580 		break;
   5581 	default:
   5582 		/* Do nothing, illegal value */
   5583 		return (EINVAL);
   5584 	}
   5585 
   5586 	/* Re-initialize hardware if it's already running */
   5587 	if (ifp->if_flags & IFF_RUNNING)
   5588 		ifp->if_init(ifp);
   5589 
   5590 	return (0);
   5591 }
   5592 
   5593 #ifdef IXGBE_DEBUG
   5594 /************************************************************************
   5595  * ixgbe_sysctl_power_state
   5596  *
   5597  *   Sysctl to test power states
   5598  *   Values:
   5599  *     0      - set device to D0
   5600  *     3      - set device to D3
   5601  *     (none) - get current device power state
   5602  ************************************************************************/
   5603 static int
   5604 ixgbe_sysctl_power_state(SYSCTLFN_ARGS)
   5605 {
   5606 #ifdef notyet
   5607 	struct sysctlnode node = *rnode;
   5608 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5609 	device_t       dev =  adapter->dev;
   5610 	int	       curr_ps, new_ps, error = 0;
   5611 
   5612 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5613 		return (EPERM);
   5614 
   5615 	curr_ps = new_ps = pci_get_powerstate(dev);
   5616 
   5617 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5618 	if ((error) || (req->newp == NULL))
   5619 		return (error);
   5620 
   5621 	if (new_ps == curr_ps)
   5622 		return (0);
   5623 
   5624 	if (new_ps == 3 && curr_ps == 0)
   5625 		error = DEVICE_SUSPEND(dev);
   5626 	else if (new_ps == 0 && curr_ps == 3)
   5627 		error = DEVICE_RESUME(dev);
   5628 	else
   5629 		return (EINVAL);
   5630 
   5631 	device_printf(dev, "New state: %d\n", pci_get_powerstate(dev));
   5632 
   5633 	return (error);
   5634 #else
   5635 	return 0;
   5636 #endif
   5637 } /* ixgbe_sysctl_power_state */
   5638 #endif
   5639 
   5640 /************************************************************************
   5641  * ixgbe_sysctl_wol_enable
   5642  *
   5643  *   Sysctl to enable/disable the WoL capability,
   5644  *   if supported by the adapter.
   5645  *
   5646  *   Values:
   5647  *     0 - disabled
   5648  *     1 - enabled
   5649  ************************************************************************/
   5650 static int
   5651 ixgbe_sysctl_wol_enable(SYSCTLFN_ARGS)
   5652 {
   5653 	struct sysctlnode node = *rnode;
   5654 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5655 	struct ixgbe_hw *hw = &adapter->hw;
   5656 	bool		new_wol_enabled;
   5657 	int		error = 0;
   5658 
   5659 	/*
   5660 	 * It's not required to check recovery mode because this function never
   5661 	 * touches hardware.
   5662 	 */
   5663 	new_wol_enabled = hw->wol_enabled;
   5664 	node.sysctl_data = &new_wol_enabled;
   5665 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5666 	if ((error) || (newp == NULL))
   5667 		return (error);
   5668 	if (new_wol_enabled == hw->wol_enabled)
   5669 		return (0);
   5670 
   5671 	if (new_wol_enabled && !adapter->wol_support)
   5672 		return (ENODEV);
   5673 	else
   5674 		hw->wol_enabled = new_wol_enabled;
   5675 
   5676 	return (0);
   5677 } /* ixgbe_sysctl_wol_enable */
   5678 
   5679 /************************************************************************
   5680  * ixgbe_sysctl_wufc - Wake Up Filter Control
   5681  *
   5682  *   Sysctl to enable/disable the types of packets that the
   5683  *   adapter will wake up on upon receipt.
   5684  *   Flags:
   5685  *     0x1  - Link Status Change
   5686  *     0x2  - Magic Packet
   5687  *     0x4  - Direct Exact
   5688  *     0x8  - Directed Multicast
   5689  *     0x10 - Broadcast
   5690  *     0x20 - ARP/IPv4 Request Packet
   5691  *     0x40 - Direct IPv4 Packet
   5692  *     0x80 - Direct IPv6 Packet
   5693  *
   5694  *   Settings not listed above will cause the sysctl to return an error.
   5695  ************************************************************************/
   5696 static int
   5697 ixgbe_sysctl_wufc(SYSCTLFN_ARGS)
   5698 {
   5699 	struct sysctlnode node = *rnode;
   5700 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5701 	int error = 0;
   5702 	u32 new_wufc;
   5703 
   5704 	/*
   5705 	 * It's not required to check recovery mode because this function never
   5706 	 * touches hardware.
   5707 	 */
   5708 	new_wufc = adapter->wufc;
   5709 	node.sysctl_data = &new_wufc;
   5710 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5711 	if ((error) || (newp == NULL))
   5712 		return (error);
   5713 	if (new_wufc == adapter->wufc)
   5714 		return (0);
   5715 
   5716 	if (new_wufc & 0xffffff00)
   5717 		return (EINVAL);
   5718 
   5719 	new_wufc &= 0xff;
   5720 	new_wufc |= (0xffffff & adapter->wufc);
   5721 	adapter->wufc = new_wufc;
   5722 
   5723 	return (0);
   5724 } /* ixgbe_sysctl_wufc */
   5725 
   5726 #ifdef IXGBE_DEBUG
   5727 /************************************************************************
   5728  * ixgbe_sysctl_print_rss_config
   5729  ************************************************************************/
   5730 static int
   5731 ixgbe_sysctl_print_rss_config(SYSCTLFN_ARGS)
   5732 {
   5733 #ifdef notyet
   5734 	struct sysctlnode node = *rnode;
   5735 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5736 	struct ixgbe_hw *hw = &adapter->hw;
   5737 	device_t	dev = adapter->dev;
   5738 	struct sbuf	*buf;
   5739 	int		error = 0, reta_size;
   5740 	u32		reg;
   5741 
   5742 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5743 		return (EPERM);
   5744 
   5745 	buf = sbuf_new_for_sysctl(NULL, NULL, 128, req);
   5746 	if (!buf) {
   5747 		device_printf(dev, "Could not allocate sbuf for output.\n");
   5748 		return (ENOMEM);
   5749 	}
   5750 
   5751 	// TODO: use sbufs to make a string to print out
   5752 	/* Set multiplier for RETA setup and table size based on MAC */
   5753 	switch (adapter->hw.mac.type) {
   5754 	case ixgbe_mac_X550:
   5755 	case ixgbe_mac_X550EM_x:
   5756 	case ixgbe_mac_X550EM_a:
   5757 		reta_size = 128;
   5758 		break;
   5759 	default:
   5760 		reta_size = 32;
   5761 		break;
   5762 	}
   5763 
   5764 	/* Print out the redirection table */
   5765 	sbuf_cat(buf, "\n");
   5766 	for (int i = 0; i < reta_size; i++) {
   5767 		if (i < 32) {
   5768 			reg = IXGBE_READ_REG(hw, IXGBE_RETA(i));
   5769 			sbuf_printf(buf, "RETA(%2d): 0x%08x\n", i, reg);
   5770 		} else {
   5771 			reg = IXGBE_READ_REG(hw, IXGBE_ERETA(i - 32));
   5772 			sbuf_printf(buf, "ERETA(%2d): 0x%08x\n", i - 32, reg);
   5773 		}
   5774 	}
   5775 
   5776 	// TODO: print more config
   5777 
   5778 	error = sbuf_finish(buf);
   5779 	if (error)
   5780 		device_printf(dev, "Error finishing sbuf: %d\n", error);
   5781 
   5782 	sbuf_delete(buf);
   5783 #endif
   5784 	return (0);
   5785 } /* ixgbe_sysctl_print_rss_config */
   5786 #endif /* IXGBE_DEBUG */
   5787 
   5788 /************************************************************************
   5789  * ixgbe_sysctl_phy_temp - Retrieve temperature of PHY
   5790  *
   5791  *   For X552/X557-AT devices using an external PHY
   5792  ************************************************************************/
   5793 static int
   5794 ixgbe_sysctl_phy_temp(SYSCTLFN_ARGS)
   5795 {
   5796 	struct sysctlnode node = *rnode;
   5797 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5798 	struct ixgbe_hw *hw = &adapter->hw;
   5799 	int val;
   5800 	u16 reg;
   5801 	int		error;
   5802 
   5803 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5804 		return (EPERM);
   5805 
   5806 	if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
   5807 		device_printf(adapter->dev,
   5808 		    "Device has no supported external thermal sensor.\n");
   5809 		return (ENODEV);
   5810 	}
   5811 
   5812 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_CURRENT_TEMP,
   5813 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
   5814 		device_printf(adapter->dev,
   5815 		    "Error reading from PHY's current temperature register\n");
   5816 		return (EAGAIN);
   5817 	}
   5818 
   5819 	node.sysctl_data = &val;
   5820 
   5821 	/* Shift temp for output */
   5822 	val = reg >> 8;
   5823 
   5824 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5825 	if ((error) || (newp == NULL))
   5826 		return (error);
   5827 
   5828 	return (0);
   5829 } /* ixgbe_sysctl_phy_temp */
   5830 
   5831 /************************************************************************
   5832  * ixgbe_sysctl_phy_overtemp_occurred
   5833  *
   5834  *   Reports (directly from the PHY) whether the current PHY
   5835  *   temperature is over the overtemp threshold.
   5836  ************************************************************************/
   5837 static int
   5838 ixgbe_sysctl_phy_overtemp_occurred(SYSCTLFN_ARGS)
   5839 {
   5840 	struct sysctlnode node = *rnode;
   5841 	struct adapter	*adapter = (struct adapter *)node.sysctl_data;
   5842 	struct ixgbe_hw *hw = &adapter->hw;
   5843 	int val, error;
   5844 	u16 reg;
   5845 
   5846 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5847 		return (EPERM);
   5848 
   5849 	if (hw->device_id != IXGBE_DEV_ID_X550EM_X_10G_T) {
   5850 		device_printf(adapter->dev,
   5851 		    "Device has no supported external thermal sensor.\n");
   5852 		return (ENODEV);
   5853 	}
   5854 
   5855 	if (hw->phy.ops.read_reg(hw, IXGBE_PHY_OVERTEMP_STATUS,
   5856 		IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &reg)) {
   5857 		device_printf(adapter->dev,
   5858 		    "Error reading from PHY's temperature status register\n");
   5859 		return (EAGAIN);
   5860 	}
   5861 
   5862 	node.sysctl_data = &val;
   5863 
   5864 	/* Get occurrence bit */
   5865 	val = !!(reg & 0x4000);
   5866 
   5867 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5868 	if ((error) || (newp == NULL))
   5869 		return (error);
   5870 
   5871 	return (0);
   5872 } /* ixgbe_sysctl_phy_overtemp_occurred */
   5873 
   5874 /************************************************************************
   5875  * ixgbe_sysctl_eee_state
   5876  *
   5877  *   Sysctl to set EEE power saving feature
   5878  *   Values:
   5879  *     0      - disable EEE
   5880  *     1      - enable EEE
   5881  *     (none) - get current device EEE state
   5882  ************************************************************************/
   5883 static int
   5884 ixgbe_sysctl_eee_state(SYSCTLFN_ARGS)
   5885 {
   5886 	struct sysctlnode node = *rnode;
   5887 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   5888 	struct ifnet   *ifp = adapter->ifp;
   5889 	device_t       dev = adapter->dev;
   5890 	int	       curr_eee, new_eee, error = 0;
   5891 	s32	       retval;
   5892 
   5893 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   5894 		return (EPERM);
   5895 
   5896 	curr_eee = new_eee = !!(adapter->feat_en & IXGBE_FEATURE_EEE);
   5897 	node.sysctl_data = &new_eee;
   5898 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   5899 	if ((error) || (newp == NULL))
   5900 		return (error);
   5901 
   5902 	/* Nothing to do */
   5903 	if (new_eee == curr_eee)
   5904 		return (0);
   5905 
   5906 	/* Not supported */
   5907 	if (!(adapter->feat_cap & IXGBE_FEATURE_EEE))
   5908 		return (EINVAL);
   5909 
   5910 	/* Bounds checking */
   5911 	if ((new_eee < 0) || (new_eee > 1))
   5912 		return (EINVAL);
   5913 
   5914 	retval = ixgbe_setup_eee(&adapter->hw, new_eee);
   5915 	if (retval) {
   5916 		device_printf(dev, "Error in EEE setup: 0x%08X\n", retval);
   5917 		return (EINVAL);
   5918 	}
   5919 
   5920 	/* Restart auto-neg */
   5921 	ifp->if_init(ifp);
   5922 
   5923 	device_printf(dev, "New EEE state: %d\n", new_eee);
   5924 
   5925 	/* Cache new value */
   5926 	if (new_eee)
   5927 		adapter->feat_en |= IXGBE_FEATURE_EEE;
   5928 	else
   5929 		adapter->feat_en &= ~IXGBE_FEATURE_EEE;
   5930 
   5931 	return (error);
   5932 } /* ixgbe_sysctl_eee_state */
   5933 
   5934 #define PRINTQS(adapter, regname)					\
   5935 	do {								\
   5936 		struct ixgbe_hw	*_hw = &(adapter)->hw;			\
   5937 		int _i;							\
   5938 									\
   5939 		printf("%s: %s", device_xname((adapter)->dev), #regname); \
   5940 		for (_i = 0; _i < (adapter)->num_queues; _i++) {	\
   5941 			printf((_i == 0) ? "\t" : " ");			\
   5942 			printf("%08x", IXGBE_READ_REG(_hw,		\
   5943 				IXGBE_##regname(_i)));			\
   5944 		}							\
   5945 		printf("\n");						\
   5946 	} while (0)
   5947 
   5948 /************************************************************************
   5949  * ixgbe_print_debug_info
   5950  *
   5951  *   Called only when em_display_debug_stats is enabled.
   5952  *   Provides a way to take a look at important statistics
   5953  *   maintained by the driver and hardware.
   5954  ************************************************************************/
   5955 static void
   5956 ixgbe_print_debug_info(struct adapter *adapter)
   5957 {
   5958 	device_t	dev = adapter->dev;
   5959 	struct ixgbe_hw *hw = &adapter->hw;
   5960 	int table_size;
   5961 	int i;
   5962 
   5963 	switch (adapter->hw.mac.type) {
   5964 	case ixgbe_mac_X550:
   5965 	case ixgbe_mac_X550EM_x:
   5966 	case ixgbe_mac_X550EM_a:
   5967 		table_size = 128;
   5968 		break;
   5969 	default:
   5970 		table_size = 32;
   5971 		break;
   5972 	}
   5973 
   5974 	device_printf(dev, "[E]RETA:\n");
   5975 	for (i = 0; i < table_size; i++) {
   5976 		if (i < 32)
   5977 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
   5978 				IXGBE_RETA(i)));
   5979 		else
   5980 			printf("%02x: %08x\n", i, IXGBE_READ_REG(hw,
   5981 				IXGBE_ERETA(i - 32)));
   5982 	}
   5983 
   5984 	device_printf(dev, "queue:");
   5985 	for (i = 0; i < adapter->num_queues; i++) {
   5986 		printf((i == 0) ? "\t" : " ");
   5987 		printf("%8d", i);
   5988 	}
   5989 	printf("\n");
   5990 	PRINTQS(adapter, RDBAL);
   5991 	PRINTQS(adapter, RDBAH);
   5992 	PRINTQS(adapter, RDLEN);
   5993 	PRINTQS(adapter, SRRCTL);
   5994 	PRINTQS(adapter, RDH);
   5995 	PRINTQS(adapter, RDT);
   5996 	PRINTQS(adapter, RXDCTL);
   5997 
   5998 	device_printf(dev, "RQSMR:");
   5999 	for (i = 0; i < adapter->num_queues / 4; i++) {
   6000 		printf((i == 0) ? "\t" : " ");
   6001 		printf("%08x", IXGBE_READ_REG(hw, IXGBE_RQSMR(i)));
   6002 	}
   6003 	printf("\n");
   6004 
   6005 	device_printf(dev, "disabled_count:");
   6006 	for (i = 0; i < adapter->num_queues; i++) {
   6007 		printf((i == 0) ? "\t" : " ");
   6008 		printf("%8d", adapter->queues[i].disabled_count);
   6009 	}
   6010 	printf("\n");
   6011 
   6012 	device_printf(dev, "EIMS:\t%08x\n", IXGBE_READ_REG(hw, IXGBE_EIMS));
   6013 	if (hw->mac.type != ixgbe_mac_82598EB) {
   6014 		device_printf(dev, "EIMS_EX(0):\t%08x\n",
   6015 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(0)));
   6016 		device_printf(dev, "EIMS_EX(1):\t%08x\n",
   6017 			      IXGBE_READ_REG(hw, IXGBE_EIMS_EX(1)));
   6018 	}
   6019 } /* ixgbe_print_debug_info */
   6020 
   6021 /************************************************************************
   6022  * ixgbe_sysctl_debug
   6023  ************************************************************************/
   6024 static int
   6025 ixgbe_sysctl_debug(SYSCTLFN_ARGS)
   6026 {
   6027 	struct sysctlnode node = *rnode;
   6028 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   6029 	int	       error, result = 0;
   6030 
   6031 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   6032 		return (EPERM);
   6033 
   6034 	node.sysctl_data = &result;
   6035 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   6036 
   6037 	if (error || newp == NULL)
   6038 		return error;
   6039 
   6040 	if (result == 1)
   6041 		ixgbe_print_debug_info(adapter);
   6042 
   6043 	return 0;
   6044 } /* ixgbe_sysctl_debug */
   6045 
   6046 /************************************************************************
   6047  * ixgbe_init_device_features
   6048  ************************************************************************/
   6049 static void
   6050 ixgbe_init_device_features(struct adapter *adapter)
   6051 {
   6052 	adapter->feat_cap = IXGBE_FEATURE_NETMAP
   6053 			  | IXGBE_FEATURE_RSS
   6054 			  | IXGBE_FEATURE_MSI
   6055 			  | IXGBE_FEATURE_MSIX
   6056 			  | IXGBE_FEATURE_LEGACY_IRQ
   6057 			  | IXGBE_FEATURE_LEGACY_TX;
   6058 
   6059 	/* Set capabilities first... */
   6060 	switch (adapter->hw.mac.type) {
   6061 	case ixgbe_mac_82598EB:
   6062 		if (adapter->hw.device_id == IXGBE_DEV_ID_82598AT)
   6063 			adapter->feat_cap |= IXGBE_FEATURE_FAN_FAIL;
   6064 		break;
   6065 	case ixgbe_mac_X540:
   6066 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6067 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6068 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X540_BYPASS) &&
   6069 		    (adapter->hw.bus.func == 0))
   6070 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
   6071 		break;
   6072 	case ixgbe_mac_X550:
   6073 		/*
   6074 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6075 		 * NVM Image version.
   6076 		 */
   6077 		adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
   6078 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6079 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6080 		break;
   6081 	case ixgbe_mac_X550EM_x:
   6082 		/*
   6083 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6084 		 * NVM Image version.
   6085 		 */
   6086 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6087 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6088 		break;
   6089 	case ixgbe_mac_X550EM_a:
   6090 		/*
   6091 		 * IXGBE_FEATURE_RECOVERY_MODE will be set after reading
   6092 		 * NVM Image version.
   6093 		 */
   6094 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6095 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6096 		adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
   6097 		if ((adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T) ||
   6098 		    (adapter->hw.device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L)) {
   6099 			adapter->feat_cap |= IXGBE_FEATURE_TEMP_SENSOR;
   6100 			adapter->feat_cap |= IXGBE_FEATURE_EEE;
   6101 		}
   6102 		break;
   6103 	case ixgbe_mac_82599EB:
   6104 		adapter->feat_cap |= IXGBE_FEATURE_SRIOV;
   6105 		adapter->feat_cap |= IXGBE_FEATURE_FDIR;
   6106 		if ((adapter->hw.device_id == IXGBE_DEV_ID_82599_BYPASS) &&
   6107 		    (adapter->hw.bus.func == 0))
   6108 			adapter->feat_cap |= IXGBE_FEATURE_BYPASS;
   6109 		if (adapter->hw.device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP)
   6110 			adapter->feat_cap &= ~IXGBE_FEATURE_LEGACY_IRQ;
   6111 		break;
   6112 	default:
   6113 		break;
   6114 	}
   6115 
   6116 	/* Enabled by default... */
   6117 	/* Fan failure detection */
   6118 	if (adapter->feat_cap & IXGBE_FEATURE_FAN_FAIL)
   6119 		adapter->feat_en |= IXGBE_FEATURE_FAN_FAIL;
   6120 	/* Netmap */
   6121 	if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
   6122 		adapter->feat_en |= IXGBE_FEATURE_NETMAP;
   6123 	/* EEE */
   6124 	if (adapter->feat_cap & IXGBE_FEATURE_EEE)
   6125 		adapter->feat_en |= IXGBE_FEATURE_EEE;
   6126 	/* Thermal Sensor */
   6127 	if (adapter->feat_cap & IXGBE_FEATURE_TEMP_SENSOR)
   6128 		adapter->feat_en |= IXGBE_FEATURE_TEMP_SENSOR;
   6129 	/*
   6130 	 * Recovery mode:
   6131 	 * NetBSD: IXGBE_FEATURE_RECOVERY_MODE will be controlled after reading
   6132 	 * NVM Image version.
   6133 	 */
   6134 
   6135 	/* Enabled via global sysctl... */
   6136 	/* Flow Director */
   6137 	if (ixgbe_enable_fdir) {
   6138 		if (adapter->feat_cap & IXGBE_FEATURE_FDIR)
   6139 			adapter->feat_en |= IXGBE_FEATURE_FDIR;
   6140 		else
   6141 			device_printf(adapter->dev, "Device does not support Flow Director. Leaving disabled.");
   6142 	}
   6143 	/* Legacy (single queue) transmit */
   6144 	if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
   6145 	    ixgbe_enable_legacy_tx)
   6146 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
   6147 	/*
   6148 	 * Message Signal Interrupts - Extended (MSI-X)
   6149 	 * Normal MSI is only enabled if MSI-X calls fail.
   6150 	 */
   6151 	if (!ixgbe_enable_msix)
   6152 		adapter->feat_cap &= ~IXGBE_FEATURE_MSIX;
   6153 	/* Receive-Side Scaling (RSS) */
   6154 	if ((adapter->feat_cap & IXGBE_FEATURE_RSS) && ixgbe_enable_rss)
   6155 		adapter->feat_en |= IXGBE_FEATURE_RSS;
   6156 
   6157 	/* Disable features with unmet dependencies... */
   6158 	/* No MSI-X */
   6159 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX)) {
   6160 		adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
   6161 		adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
   6162 		adapter->feat_en &= ~IXGBE_FEATURE_RSS;
   6163 		adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
   6164 	}
   6165 } /* ixgbe_init_device_features */
   6166 
   6167 /************************************************************************
   6168  * ixgbe_probe - Device identification routine
   6169  *
   6170  *   Determines if the driver should be loaded on
   6171  *   adapter based on its PCI vendor/device ID.
   6172  *
   6173  *   return BUS_PROBE_DEFAULT on success, positive on failure
   6174  ************************************************************************/
   6175 static int
   6176 ixgbe_probe(device_t dev, cfdata_t cf, void *aux)
   6177 {
   6178 	const struct pci_attach_args *pa = aux;
   6179 
   6180 	return (ixgbe_lookup(pa) != NULL) ? 1 : 0;
   6181 }
   6182 
   6183 static const ixgbe_vendor_info_t *
   6184 ixgbe_lookup(const struct pci_attach_args *pa)
   6185 {
   6186 	const ixgbe_vendor_info_t *ent;
   6187 	pcireg_t subid;
   6188 
   6189 	INIT_DEBUGOUT("ixgbe_lookup: begin");
   6190 
   6191 	if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
   6192 		return NULL;
   6193 
   6194 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
   6195 
   6196 	for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) {
   6197 		if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
   6198 		    (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
   6199 		    ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
   6200 			(ent->subvendor_id == 0)) &&
   6201 		    ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
   6202 			(ent->subdevice_id == 0))) {
   6203 			return ent;
   6204 		}
   6205 	}
   6206 	return NULL;
   6207 }
   6208 
   6209 static int
   6210 ixgbe_ifflags_cb(struct ethercom *ec)
   6211 {
   6212 	struct ifnet *ifp = &ec->ec_if;
   6213 	struct adapter *adapter = ifp->if_softc;
   6214 	u_short change;
   6215 	int rv = 0;
   6216 
   6217 	IXGBE_CORE_LOCK(adapter);
   6218 
   6219 	change = ifp->if_flags ^ adapter->if_flags;
   6220 	if (change != 0)
   6221 		adapter->if_flags = ifp->if_flags;
   6222 
   6223 	if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
   6224 		rv = ENETRESET;
   6225 		goto out;
   6226 	} else if ((change & IFF_PROMISC) != 0)
   6227 		ixgbe_set_rxfilter(adapter);
   6228 
   6229 	/* Check for ec_capenable. */
   6230 	change = ec->ec_capenable ^ adapter->ec_capenable;
   6231 	adapter->ec_capenable = ec->ec_capenable;
   6232 	if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
   6233 	    | ETHERCAP_VLAN_HWFILTER)) != 0) {
   6234 		rv = ENETRESET;
   6235 		goto out;
   6236 	}
   6237 
   6238 	/*
   6239 	 * Special handling is not required for ETHERCAP_VLAN_MTU.
   6240 	 * MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
   6241 	 */
   6242 
   6243 	/* Set up VLAN support and filter */
   6244 	if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
   6245 		ixgbe_setup_vlan_hw_support(adapter);
   6246 
   6247 out:
   6248 	IXGBE_CORE_UNLOCK(adapter);
   6249 
   6250 	return rv;
   6251 }
   6252 
   6253 /************************************************************************
   6254  * ixgbe_ioctl - Ioctl entry point
   6255  *
   6256  *   Called when the user wants to configure the interface.
   6257  *
   6258  *   return 0 on success, positive on failure
   6259  ************************************************************************/
   6260 static int
   6261 ixgbe_ioctl(struct ifnet * ifp, u_long command, void *data)
   6262 {
   6263 	struct adapter	*adapter = ifp->if_softc;
   6264 	struct ixgbe_hw *hw = &adapter->hw;
   6265 	struct ifcapreq *ifcr = data;
   6266 	struct ifreq	*ifr = data;
   6267 	int		error = 0;
   6268 	int l4csum_en;
   6269 	const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
   6270 	     IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
   6271 
   6272 	if (ixgbe_fw_recovery_mode_swflag(adapter))
   6273 		return (EPERM);
   6274 
   6275 	switch (command) {
   6276 	case SIOCSIFFLAGS:
   6277 		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
   6278 		break;
   6279 	case SIOCADDMULTI:
   6280 	case SIOCDELMULTI:
   6281 		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
   6282 		break;
   6283 	case SIOCSIFMEDIA:
   6284 	case SIOCGIFMEDIA:
   6285 		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
   6286 		break;
   6287 	case SIOCSIFCAP:
   6288 		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
   6289 		break;
   6290 	case SIOCSIFMTU:
   6291 		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
   6292 		break;
   6293 #ifdef __NetBSD__
   6294 	case SIOCINITIFADDR:
   6295 		IOCTL_DEBUGOUT("ioctl: SIOCINITIFADDR");
   6296 		break;
   6297 	case SIOCGIFFLAGS:
   6298 		IOCTL_DEBUGOUT("ioctl: SIOCGIFFLAGS");
   6299 		break;
   6300 	case SIOCGIFAFLAG_IN:
   6301 		IOCTL_DEBUGOUT("ioctl: SIOCGIFAFLAG_IN");
   6302 		break;
   6303 	case SIOCGIFADDR:
   6304 		IOCTL_DEBUGOUT("ioctl: SIOCGIFADDR");
   6305 		break;
   6306 	case SIOCGIFMTU:
   6307 		IOCTL_DEBUGOUT("ioctl: SIOCGIFMTU (Get Interface MTU)");
   6308 		break;
   6309 	case SIOCGIFCAP:
   6310 		IOCTL_DEBUGOUT("ioctl: SIOCGIFCAP (Get IF cap)");
   6311 		break;
   6312 	case SIOCGETHERCAP:
   6313 		IOCTL_DEBUGOUT("ioctl: SIOCGETHERCAP (Get ethercap)");
   6314 		break;
   6315 	case SIOCGLIFADDR:
   6316 		IOCTL_DEBUGOUT("ioctl: SIOCGLIFADDR (Get Interface addr)");
   6317 		break;
   6318 	case SIOCZIFDATA:
   6319 		IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
   6320 		hw->mac.ops.clear_hw_cntrs(hw);
   6321 		ixgbe_clear_evcnt(adapter);
   6322 		break;
   6323 	case SIOCAIFADDR:
   6324 		IOCTL_DEBUGOUT("ioctl: SIOCAIFADDR (add/chg IF alias)");
   6325 		break;
   6326 #endif
   6327 	default:
   6328 		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
   6329 		break;
   6330 	}
   6331 
   6332 	switch (command) {
   6333 	case SIOCGI2C:
   6334 	{
   6335 		struct ixgbe_i2c_req	i2c;
   6336 
   6337 		IOCTL_DEBUGOUT("ioctl: SIOCGI2C (Get I2C Data)");
   6338 		error = copyin(ifr->ifr_data, &i2c, sizeof(i2c));
   6339 		if (error != 0)
   6340 			break;
   6341 		if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) {
   6342 			error = EINVAL;
   6343 			break;
   6344 		}
   6345 		if (i2c.len > sizeof(i2c.data)) {
   6346 			error = EINVAL;
   6347 			break;
   6348 		}
   6349 
   6350 		hw->phy.ops.read_i2c_byte(hw, i2c.offset,
   6351 		    i2c.dev_addr, i2c.data);
   6352 		error = copyout(&i2c, ifr->ifr_data, sizeof(i2c));
   6353 		break;
   6354 	}
   6355 	case SIOCSIFCAP:
   6356 		/* Layer-4 Rx checksum offload has to be turned on and
   6357 		 * off as a unit.
   6358 		 */
   6359 		l4csum_en = ifcr->ifcr_capenable & l4csum;
   6360 		if (l4csum_en != l4csum && l4csum_en != 0)
   6361 			return EINVAL;
   6362 		/*FALLTHROUGH*/
   6363 	case SIOCADDMULTI:
   6364 	case SIOCDELMULTI:
   6365 	case SIOCSIFFLAGS:
   6366 	case SIOCSIFMTU:
   6367 	default:
   6368 		if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
   6369 			return error;
   6370 		if ((ifp->if_flags & IFF_RUNNING) == 0)
   6371 			;
   6372 		else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
   6373 			IXGBE_CORE_LOCK(adapter);
   6374 			if ((ifp->if_flags & IFF_RUNNING) != 0)
   6375 				ixgbe_init_locked(adapter);
   6376 			ixgbe_recalculate_max_frame(adapter);
   6377 			IXGBE_CORE_UNLOCK(adapter);
   6378 		} else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
   6379 			/*
   6380 			 * Multicast list has changed; set the hardware filter
   6381 			 * accordingly.
   6382 			 */
   6383 			IXGBE_CORE_LOCK(adapter);
   6384 			ixgbe_disable_intr(adapter);
   6385 			ixgbe_set_rxfilter(adapter);
   6386 			ixgbe_enable_intr(adapter);
   6387 			IXGBE_CORE_UNLOCK(adapter);
   6388 		}
   6389 		return 0;
   6390 	}
   6391 
   6392 	return error;
   6393 } /* ixgbe_ioctl */
   6394 
   6395 /************************************************************************
   6396  * ixgbe_check_fan_failure
   6397  ************************************************************************/
   6398 static void
   6399 ixgbe_check_fan_failure(struct adapter *adapter, u32 reg, bool in_interrupt)
   6400 {
   6401 	u32 mask;
   6402 
   6403 	mask = (in_interrupt) ? IXGBE_EICR_GPI_SDP1_BY_MAC(&adapter->hw) :
   6404 	    IXGBE_ESDP_SDP1;
   6405 
   6406 	if (reg & mask)
   6407 		device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! REPLACE IMMEDIATELY!!\n");
   6408 } /* ixgbe_check_fan_failure */
   6409 
   6410 /************************************************************************
   6411  * ixgbe_handle_que
   6412  ************************************************************************/
   6413 static void
   6414 ixgbe_handle_que(void *context)
   6415 {
   6416 	struct ix_queue *que = context;
   6417 	struct adapter	*adapter = que->adapter;
   6418 	struct tx_ring	*txr = que->txr;
   6419 	struct ifnet	*ifp = adapter->ifp;
   6420 	bool		more = false;
   6421 
   6422 	que->handleq.ev_count++;
   6423 
   6424 	if (ifp->if_flags & IFF_RUNNING) {
   6425 		more = ixgbe_rxeof(que);
   6426 		IXGBE_TX_LOCK(txr);
   6427 		more |= ixgbe_txeof(txr);
   6428 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
   6429 			if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
   6430 				ixgbe_mq_start_locked(ifp, txr);
   6431 		/* Only for queue 0 */
   6432 		/* NetBSD still needs this for CBQ */
   6433 		if ((&adapter->queues[0] == que)
   6434 		    && (!ixgbe_legacy_ring_empty(ifp, NULL)))
   6435 			ixgbe_legacy_start_locked(ifp, txr);
   6436 		IXGBE_TX_UNLOCK(txr);
   6437 	}
   6438 
   6439 	if (more) {
   6440 		que->req.ev_count++;
   6441 		ixgbe_sched_handle_que(adapter, que);
   6442 	} else if (que->res != NULL) {
   6443 		/* Re-enable this interrupt */
   6444 		ixgbe_enable_queue(adapter, que->msix);
   6445 	} else
   6446 		ixgbe_enable_intr(adapter);
   6447 
   6448 	return;
   6449 } /* ixgbe_handle_que */
   6450 
   6451 /************************************************************************
   6452  * ixgbe_handle_que_work
   6453  ************************************************************************/
   6454 static void
   6455 ixgbe_handle_que_work(struct work *wk, void *context)
   6456 {
   6457 	struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
   6458 
   6459 	/*
   6460 	 * "enqueued flag" is not required here.
   6461 	 * See ixgbe_msix_que().
   6462 	 */
   6463 	ixgbe_handle_que(que);
   6464 }
   6465 
   6466 /************************************************************************
   6467  * ixgbe_allocate_legacy - Setup the Legacy or MSI Interrupt handler
   6468  ************************************************************************/
   6469 static int
   6470 ixgbe_allocate_legacy(struct adapter *adapter,
   6471     const struct pci_attach_args *pa)
   6472 {
   6473 	device_t	dev = adapter->dev;
   6474 	struct ix_queue *que = adapter->queues;
   6475 	struct tx_ring	*txr = adapter->tx_rings;
   6476 	int		counts[PCI_INTR_TYPE_SIZE];
   6477 	pci_intr_type_t intr_type, max_type;
   6478 	char		intrbuf[PCI_INTRSTR_LEN];
   6479 	char		wqname[MAXCOMLEN];
   6480 	const char	*intrstr = NULL;
   6481 	int defertx_error = 0, error;
   6482 
   6483 	/* We allocate a single interrupt resource */
   6484 	max_type = PCI_INTR_TYPE_MSI;
   6485 	counts[PCI_INTR_TYPE_MSIX] = 0;
   6486 	counts[PCI_INTR_TYPE_MSI] =
   6487 	    (adapter->feat_en & IXGBE_FEATURE_MSI) ? 1 : 0;
   6488 	/* Check not feat_en but feat_cap to fallback to INTx */
   6489 	counts[PCI_INTR_TYPE_INTX] =
   6490 	    (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) ? 1 : 0;
   6491 
   6492 alloc_retry:
   6493 	if (pci_intr_alloc(pa, &adapter->osdep.intrs, counts, max_type) != 0) {
   6494 		aprint_error_dev(dev, "couldn't alloc interrupt\n");
   6495 		return ENXIO;
   6496 	}
   6497 	adapter->osdep.nintrs = 1;
   6498 	intrstr = pci_intr_string(adapter->osdep.pc, adapter->osdep.intrs[0],
   6499 	    intrbuf, sizeof(intrbuf));
   6500 	adapter->osdep.ihs[0] = pci_intr_establish_xname(adapter->osdep.pc,
   6501 	    adapter->osdep.intrs[0], IPL_NET, ixgbe_legacy_irq, que,
   6502 	    device_xname(dev));
   6503 	intr_type = pci_intr_type(adapter->osdep.pc, adapter->osdep.intrs[0]);
   6504 	if (adapter->osdep.ihs[0] == NULL) {
   6505 		aprint_error_dev(dev,"unable to establish %s\n",
   6506 		    (intr_type == PCI_INTR_TYPE_MSI) ? "MSI" : "INTx");
   6507 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
   6508 		adapter->osdep.intrs = NULL;
   6509 		switch (intr_type) {
   6510 		case PCI_INTR_TYPE_MSI:
   6511 			/* The next try is for INTx: Disable MSI */
   6512 			max_type = PCI_INTR_TYPE_INTX;
   6513 			counts[PCI_INTR_TYPE_INTX] = 1;
   6514 			adapter->feat_en &= ~IXGBE_FEATURE_MSI;
   6515 			if (adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ) {
   6516 				adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6517 				goto alloc_retry;
   6518 			} else
   6519 				break;
   6520 		case PCI_INTR_TYPE_INTX:
   6521 		default:
   6522 			/* See below */
   6523 			break;
   6524 		}
   6525 	}
   6526 	if (intr_type == PCI_INTR_TYPE_INTX) {
   6527 		adapter->feat_en &= ~IXGBE_FEATURE_MSI;
   6528 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6529 	}
   6530 	if (adapter->osdep.ihs[0] == NULL) {
   6531 		aprint_error_dev(dev,
   6532 		    "couldn't establish interrupt%s%s\n",
   6533 		    intrstr ? " at " : "", intrstr ? intrstr : "");
   6534 		pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs, 1);
   6535 		adapter->osdep.intrs = NULL;
   6536 		return ENXIO;
   6537 	}
   6538 	aprint_normal_dev(dev, "interrupting at %s\n", intrstr);
   6539 	/*
   6540 	 * Try allocating a fast interrupt and the associated deferred
   6541 	 * processing contexts.
   6542 	 */
   6543 	if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   6544 		txr->txr_si =
   6545 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6546 			ixgbe_deferred_mq_start, txr);
   6547 
   6548 		snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
   6549 		defertx_error = workqueue_create(&adapter->txr_wq, wqname,
   6550 		    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI,
   6551 		    IPL_NET, IXGBE_WORKQUEUE_FLAGS);
   6552 		adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
   6553 	}
   6554 	que->que_si = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6555 	    ixgbe_handle_que, que);
   6556 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
   6557 	error = workqueue_create(&adapter->que_wq, wqname,
   6558 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6559 	    IXGBE_WORKQUEUE_FLAGS);
   6560 
   6561 	if ((!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)
   6562 		&& ((txr->txr_si == NULL) || defertx_error != 0))
   6563 	    || (que->que_si == NULL) || error != 0) {
   6564 		aprint_error_dev(dev,
   6565 		    "could not establish software interrupts\n");
   6566 
   6567 		return ENXIO;
   6568 	}
   6569 	/* For simplicity in the handlers */
   6570 	adapter->active_queues = IXGBE_EIMS_ENABLE_MASK;
   6571 
   6572 	return (0);
   6573 } /* ixgbe_allocate_legacy */
   6574 
   6575 /************************************************************************
   6576  * ixgbe_allocate_msix - Setup MSI-X Interrupt resources and handlers
   6577  ************************************************************************/
   6578 static int
   6579 ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
   6580 {
   6581 	device_t	dev = adapter->dev;
   6582 	struct		ix_queue *que = adapter->queues;
   6583 	struct		tx_ring *txr = adapter->tx_rings;
   6584 	pci_chipset_tag_t pc;
   6585 	char		intrbuf[PCI_INTRSTR_LEN];
   6586 	char		intr_xname[32];
   6587 	char		wqname[MAXCOMLEN];
   6588 	const char	*intrstr = NULL;
   6589 	int		error, vector = 0;
   6590 	int		cpu_id = 0;
   6591 	kcpuset_t	*affinity;
   6592 #ifdef RSS
   6593 	unsigned int	rss_buckets = 0;
   6594 	kcpuset_t	cpu_mask;
   6595 #endif
   6596 
   6597 	pc = adapter->osdep.pc;
   6598 #ifdef	RSS
   6599 	/*
   6600 	 * If we're doing RSS, the number of queues needs to
   6601 	 * match the number of RSS buckets that are configured.
   6602 	 *
   6603 	 * + If there's more queues than RSS buckets, we'll end
   6604 	 *   up with queues that get no traffic.
   6605 	 *
   6606 	 * + If there's more RSS buckets than queues, we'll end
   6607 	 *   up having multiple RSS buckets map to the same queue,
   6608 	 *   so there'll be some contention.
   6609 	 */
   6610 	rss_buckets = rss_getnumbuckets();
   6611 	if ((adapter->feat_en & IXGBE_FEATURE_RSS) &&
   6612 	    (adapter->num_queues != rss_buckets)) {
   6613 		device_printf(dev,
   6614 		    "%s: number of queues (%d) != number of RSS buckets (%d)"
   6615 		    "; performance will be impacted.\n",
   6616 		    __func__, adapter->num_queues, rss_buckets);
   6617 	}
   6618 #endif
   6619 
   6620 	adapter->osdep.nintrs = adapter->num_queues + 1;
   6621 	if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
   6622 	    adapter->osdep.nintrs) != 0) {
   6623 		aprint_error_dev(dev,
   6624 		    "failed to allocate MSI-X interrupt\n");
   6625 		return (ENXIO);
   6626 	}
   6627 
   6628 	kcpuset_create(&affinity, false);
   6629 	for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
   6630 		snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
   6631 		    device_xname(dev), i);
   6632 		intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
   6633 		    sizeof(intrbuf));
   6634 #ifdef IXGBE_MPSAFE
   6635 		pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
   6636 		    true);
   6637 #endif
   6638 		/* Set the handler function */
   6639 		que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
   6640 		    adapter->osdep.intrs[i], IPL_NET, ixgbe_msix_que, que,
   6641 		    intr_xname);
   6642 		if (que->res == NULL) {
   6643 			aprint_error_dev(dev,
   6644 			    "Failed to register QUE handler\n");
   6645 			error = ENXIO;
   6646 			goto err_out;
   6647 		}
   6648 		que->msix = vector;
   6649 		adapter->active_queues |= 1ULL << que->msix;
   6650 
   6651 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
   6652 #ifdef	RSS
   6653 			/*
   6654 			 * The queue ID is used as the RSS layer bucket ID.
   6655 			 * We look up the queue ID -> RSS CPU ID and select
   6656 			 * that.
   6657 			 */
   6658 			cpu_id = rss_getcpu(i % rss_getnumbuckets());
   6659 			CPU_SETOF(cpu_id, &cpu_mask);
   6660 #endif
   6661 		} else {
   6662 			/*
   6663 			 * Bind the MSI-X vector, and thus the
   6664 			 * rings to the corresponding CPU.
   6665 			 *
   6666 			 * This just happens to match the default RSS
   6667 			 * round-robin bucket -> queue -> CPU allocation.
   6668 			 */
   6669 			if (adapter->num_queues > 1)
   6670 				cpu_id = i;
   6671 		}
   6672 		/* Round-robin affinity */
   6673 		kcpuset_zero(affinity);
   6674 		kcpuset_set(affinity, cpu_id % ncpu);
   6675 		error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
   6676 		    NULL);
   6677 		aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
   6678 		    intrstr);
   6679 		if (error == 0) {
   6680 #if 1 /* def IXGBE_DEBUG */
   6681 #ifdef	RSS
   6682 			aprintf_normal(", bound RSS bucket %d to CPU %d", i,
   6683 			    cpu_id % ncpu);
   6684 #else
   6685 			aprint_normal(", bound queue %d to cpu %d", i,
   6686 			    cpu_id % ncpu);
   6687 #endif
   6688 #endif /* IXGBE_DEBUG */
   6689 		}
   6690 		aprint_normal("\n");
   6691 
   6692 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX)) {
   6693 			txr->txr_si = softint_establish(
   6694 				SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6695 				ixgbe_deferred_mq_start, txr);
   6696 			if (txr->txr_si == NULL) {
   6697 				aprint_error_dev(dev,
   6698 				    "couldn't establish software interrupt\n");
   6699 				error = ENXIO;
   6700 				goto err_out;
   6701 			}
   6702 		}
   6703 		que->que_si
   6704 		    = softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6705 			ixgbe_handle_que, que);
   6706 		if (que->que_si == NULL) {
   6707 			aprint_error_dev(dev,
   6708 			    "couldn't establish software interrupt\n");
   6709 			error = ENXIO;
   6710 			goto err_out;
   6711 		}
   6712 	}
   6713 	snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
   6714 	error = workqueue_create(&adapter->txr_wq, wqname,
   6715 	    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6716 	    IXGBE_WORKQUEUE_FLAGS);
   6717 	if (error) {
   6718 		aprint_error_dev(dev, "couldn't create workqueue for deferred Tx\n");
   6719 		goto err_out;
   6720 	}
   6721 	adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
   6722 
   6723 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
   6724 	error = workqueue_create(&adapter->que_wq, wqname,
   6725 	    ixgbe_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   6726 	    IXGBE_WORKQUEUE_FLAGS);
   6727 	if (error) {
   6728 		aprint_error_dev(dev, "couldn't create workqueue for Tx/Rx\n");
   6729 		goto err_out;
   6730 	}
   6731 
   6732 	/* and Link */
   6733 	cpu_id++;
   6734 	snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
   6735 	adapter->vector = vector;
   6736 	intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
   6737 	    sizeof(intrbuf));
   6738 #ifdef IXGBE_MPSAFE
   6739 	pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
   6740 	    true);
   6741 #endif
   6742 	/* Set the link handler function */
   6743 	adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
   6744 	    adapter->osdep.intrs[vector], IPL_NET, ixgbe_msix_link, adapter,
   6745 	    intr_xname);
   6746 	if (adapter->osdep.ihs[vector] == NULL) {
   6747 		aprint_error_dev(dev, "Failed to register LINK handler\n");
   6748 		error = ENXIO;
   6749 		goto err_out;
   6750 	}
   6751 	/* Round-robin affinity */
   6752 	kcpuset_zero(affinity);
   6753 	kcpuset_set(affinity, cpu_id % ncpu);
   6754 	error = interrupt_distribute(adapter->osdep.ihs[vector], affinity,
   6755 	    NULL);
   6756 
   6757 	aprint_normal_dev(dev,
   6758 	    "for link, interrupting at %s", intrstr);
   6759 	if (error == 0)
   6760 		aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
   6761 	else
   6762 		aprint_normal("\n");
   6763 
   6764 	if (adapter->feat_cap & IXGBE_FEATURE_SRIOV) {
   6765 		adapter->mbx_si =
   6766 		    softint_establish(SOFTINT_NET | IXGBE_SOFTINT_FLAGS,
   6767 			ixgbe_handle_mbx, adapter);
   6768 		if (adapter->mbx_si == NULL) {
   6769 			aprint_error_dev(dev,
   6770 			    "could not establish software interrupts\n");
   6771 
   6772 			error = ENXIO;
   6773 			goto err_out;
   6774 		}
   6775 	}
   6776 
   6777 	kcpuset_destroy(affinity);
   6778 	aprint_normal_dev(dev,
   6779 	    "Using MSI-X interrupts with %d vectors\n", vector + 1);
   6780 
   6781 	return (0);
   6782 
   6783 err_out:
   6784 	kcpuset_destroy(affinity);
   6785 	ixgbe_free_softint(adapter);
   6786 	ixgbe_free_pciintr_resources(adapter);
   6787 	return (error);
   6788 } /* ixgbe_allocate_msix */
   6789 
   6790 /************************************************************************
   6791  * ixgbe_configure_interrupts
   6792  *
   6793  *   Setup MSI-X, MSI, or legacy interrupts (in that order).
   6794  *   This will also depend on user settings.
   6795  ************************************************************************/
   6796 static int
   6797 ixgbe_configure_interrupts(struct adapter *adapter)
   6798 {
   6799 	device_t dev = adapter->dev;
   6800 	struct ixgbe_mac_info *mac = &adapter->hw.mac;
   6801 	int want, queues, msgs;
   6802 
   6803 	/* Default to 1 queue if MSI-X setup fails */
   6804 	adapter->num_queues = 1;
   6805 
   6806 	/* Override by tuneable */
   6807 	if (!(adapter->feat_cap & IXGBE_FEATURE_MSIX))
   6808 		goto msi;
   6809 
   6810 	/*
   6811 	 *  NetBSD only: Use single vector MSI when number of CPU is 1 to save
   6812 	 * interrupt slot.
   6813 	 */
   6814 	if (ncpu == 1)
   6815 		goto msi;
   6816 
   6817 	/* First try MSI-X */
   6818 	msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
   6819 	msgs = MIN(msgs, IXG_MAX_NINTR);
   6820 	if (msgs < 2)
   6821 		goto msi;
   6822 
   6823 	adapter->msix_mem = (void *)1; /* XXX */
   6824 
   6825 	/* Figure out a reasonable auto config value */
   6826 	queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
   6827 
   6828 #ifdef	RSS
   6829 	/* If we're doing RSS, clamp at the number of RSS buckets */
   6830 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
   6831 		queues = uimin(queues, rss_getnumbuckets());
   6832 #endif
   6833 	if (ixgbe_num_queues > queues) {
   6834 		aprint_error_dev(adapter->dev, "ixgbe_num_queues (%d) is too large, using reduced amount (%d).\n", ixgbe_num_queues, queues);
   6835 		ixgbe_num_queues = queues;
   6836 	}
   6837 
   6838 	if (ixgbe_num_queues != 0)
   6839 		queues = ixgbe_num_queues;
   6840 	else
   6841 		queues = uimin(queues,
   6842 		    uimin(mac->max_tx_queues, mac->max_rx_queues));
   6843 
   6844 	/* reflect correct sysctl value */
   6845 	ixgbe_num_queues = queues;
   6846 
   6847 	/*
   6848 	 * Want one vector (RX/TX pair) per queue
   6849 	 * plus an additional for Link.
   6850 	 */
   6851 	want = queues + 1;
   6852 	if (msgs >= want)
   6853 		msgs = want;
   6854 	else {
   6855 		aprint_error_dev(dev, "MSI-X Configuration Problem, "
   6856 		    "%d vectors but %d queues wanted!\n",
   6857 		    msgs, want);
   6858 		goto msi;
   6859 	}
   6860 	adapter->num_queues = queues;
   6861 	adapter->feat_en |= IXGBE_FEATURE_MSIX;
   6862 	return (0);
   6863 
   6864 	/*
   6865 	 * MSI-X allocation failed or provided us with
   6866 	 * less vectors than needed. Free MSI-X resources
   6867 	 * and we'll try enabling MSI.
   6868 	 */
   6869 msi:
   6870 	/* Without MSI-X, some features are no longer supported */
   6871 	adapter->feat_cap &= ~IXGBE_FEATURE_RSS;
   6872 	adapter->feat_en  &= ~IXGBE_FEATURE_RSS;
   6873 	adapter->feat_cap &= ~IXGBE_FEATURE_SRIOV;
   6874 	adapter->feat_en  &= ~IXGBE_FEATURE_SRIOV;
   6875 
   6876 	msgs = pci_msi_count(adapter->osdep.pc, adapter->osdep.tag);
   6877 	adapter->msix_mem = NULL; /* XXX */
   6878 	if (msgs > 1)
   6879 		msgs = 1;
   6880 	if (msgs != 0) {
   6881 		msgs = 1;
   6882 		adapter->feat_en |= IXGBE_FEATURE_MSI;
   6883 		return (0);
   6884 	}
   6885 
   6886 	if (!(adapter->feat_cap & IXGBE_FEATURE_LEGACY_IRQ)) {
   6887 		aprint_error_dev(dev,
   6888 		    "Device does not support legacy interrupts.\n");
   6889 		return 1;
   6890 	}
   6891 
   6892 	adapter->feat_en |= IXGBE_FEATURE_LEGACY_IRQ;
   6893 
   6894 	return (0);
   6895 } /* ixgbe_configure_interrupts */
   6896 
   6897 
   6898 /************************************************************************
   6899  * ixgbe_handle_link - Tasklet for MSI-X Link interrupts
   6900  *
   6901  *   Done outside of interrupt context since the driver might sleep
   6902  ************************************************************************/
   6903 static void
   6904 ixgbe_handle_link(void *context)
   6905 {
   6906 	struct adapter	*adapter = context;
   6907 	struct ixgbe_hw *hw = &adapter->hw;
   6908 
   6909 	IXGBE_CORE_LOCK(adapter);
   6910 	++adapter->link_sicount.ev_count;
   6911 	ixgbe_check_link(hw, &adapter->link_speed, &adapter->link_up, 0);
   6912 	ixgbe_update_link_status(adapter);
   6913 
   6914 	/* Re-enable link interrupts */
   6915 	IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_LSC);
   6916 
   6917 	IXGBE_CORE_UNLOCK(adapter);
   6918 } /* ixgbe_handle_link */
   6919 
   6920 #if 0
   6921 /************************************************************************
   6922  * ixgbe_rearm_queues
   6923  ************************************************************************/
   6924 static __inline void
   6925 ixgbe_rearm_queues(struct adapter *adapter, u64 queues)
   6926 {
   6927 	u32 mask;
   6928 
   6929 	switch (adapter->hw.mac.type) {
   6930 	case ixgbe_mac_82598EB:
   6931 		mask = (IXGBE_EIMS_RTX_QUEUE & queues);
   6932 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask);
   6933 		break;
   6934 	case ixgbe_mac_82599EB:
   6935 	case ixgbe_mac_X540:
   6936 	case ixgbe_mac_X550:
   6937 	case ixgbe_mac_X550EM_x:
   6938 	case ixgbe_mac_X550EM_a:
   6939 		mask = (queues & 0xFFFFFFFF);
   6940 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask);
   6941 		mask = (queues >> 32);
   6942 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask);
   6943 		break;
   6944 	default:
   6945 		break;
   6946 	}
   6947 } /* ixgbe_rearm_queues */
   6948 #endif
   6949