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