Home | History | Annotate | Line # | Download | only in ixgbe
ixv.c revision 1.144
      1 /*$NetBSD: ixv.c,v 1.144 2020/01/21 14:55:55 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_ixv.c 331224 2018-03-19 20:55:05Z erj $*/
     36 
     37 #ifdef _KERNEL_OPT
     38 #include "opt_inet.h"
     39 #include "opt_inet6.h"
     40 #include "opt_net_mpsafe.h"
     41 #endif
     42 
     43 #include "ixgbe.h"
     44 #include "vlan.h"
     45 
     46 /************************************************************************
     47  * Driver version
     48  ************************************************************************/
     49 static const char ixv_driver_version[] = "2.0.1-k";
     50 /* XXX NetBSD: + 1.5.17 */
     51 
     52 /************************************************************************
     53  * PCI Device ID Table
     54  *
     55  *   Used by probe to select devices to load on
     56  *   Last field stores an index into ixv_strings
     57  *   Last entry must be all 0s
     58  *
     59  *   { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index }
     60  ************************************************************************/
     61 static const ixgbe_vendor_info_t ixv_vendor_info_array[] =
     62 {
     63 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_VF, 0, 0, 0},
     64 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X540_VF, 0, 0, 0},
     65 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550_VF, 0, 0, 0},
     66 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_X_VF, 0, 0, 0},
     67 	{IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_X550EM_A_VF, 0, 0, 0},
     68 	/* required last entry */
     69 	{0, 0, 0, 0, 0}
     70 };
     71 
     72 /************************************************************************
     73  * Table of branding strings
     74  ************************************************************************/
     75 static const char *ixv_strings[] = {
     76 	"Intel(R) PRO/10GbE Virtual Function Network Driver"
     77 };
     78 
     79 /*********************************************************************
     80  *  Function prototypes
     81  *********************************************************************/
     82 static int	ixv_probe(device_t, cfdata_t, void *);
     83 static void	ixv_attach(device_t, device_t, void *);
     84 static int	ixv_detach(device_t, int);
     85 #if 0
     86 static int	ixv_shutdown(device_t);
     87 #endif
     88 static int	ixv_ifflags_cb(struct ethercom *);
     89 static int	ixv_ioctl(struct ifnet *, u_long, void *);
     90 static int	ixv_init(struct ifnet *);
     91 static void	ixv_init_locked(struct adapter *);
     92 static void	ixv_ifstop(struct ifnet *, int);
     93 static void	ixv_stop(void *);
     94 static void	ixv_init_device_features(struct adapter *);
     95 static void	ixv_media_status(struct ifnet *, struct ifmediareq *);
     96 static int	ixv_media_change(struct ifnet *);
     97 static int	ixv_allocate_pci_resources(struct adapter *,
     98 		    const struct pci_attach_args *);
     99 static int	ixv_allocate_msix(struct adapter *,
    100 		    const struct pci_attach_args *);
    101 static int	ixv_configure_interrupts(struct adapter *);
    102 static void	ixv_free_pci_resources(struct adapter *);
    103 static void	ixv_local_timer(void *);
    104 static void	ixv_local_timer_locked(void *);
    105 static int	ixv_setup_interface(device_t, struct adapter *);
    106 static int	ixv_negotiate_api(struct adapter *);
    107 
    108 static void	ixv_initialize_transmit_units(struct adapter *);
    109 static void	ixv_initialize_receive_units(struct adapter *);
    110 static void	ixv_initialize_rss_mapping(struct adapter *);
    111 static s32	ixv_check_link(struct adapter *);
    112 
    113 static void	ixv_enable_intr(struct adapter *);
    114 static void	ixv_disable_intr(struct adapter *);
    115 static int	ixv_set_rxfilter(struct adapter *);
    116 static void	ixv_update_link_status(struct adapter *);
    117 static int	ixv_sysctl_debug(SYSCTLFN_PROTO);
    118 static void	ixv_set_ivar(struct adapter *, u8, u8, s8);
    119 static void	ixv_configure_ivars(struct adapter *);
    120 static u8 *	ixv_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *);
    121 static void	ixv_eitr_write(struct adapter *, uint32_t, uint32_t);
    122 
    123 static void	ixv_setup_vlan_tagging(struct adapter *);
    124 static int	ixv_setup_vlan_support(struct adapter *);
    125 static int	ixv_vlan_cb(struct ethercom *, uint16_t, bool);
    126 static int	ixv_register_vlan(struct adapter *, u16);
    127 static int	ixv_unregister_vlan(struct adapter *, u16);
    128 
    129 static void	ixv_add_device_sysctls(struct adapter *);
    130 static void	ixv_save_stats(struct adapter *);
    131 static void	ixv_init_stats(struct adapter *);
    132 static void	ixv_update_stats(struct adapter *);
    133 static void	ixv_add_stats_sysctls(struct adapter *);
    134 static void	ixv_clear_evcnt(struct adapter *);
    135 
    136 /* Sysctl handlers */
    137 static void	ixv_set_sysctl_value(struct adapter *, const char *,
    138 		    const char *, int *, int);
    139 static int	ixv_sysctl_interrupt_rate_handler(SYSCTLFN_PROTO);
    140 static int	ixv_sysctl_next_to_check_handler(SYSCTLFN_PROTO);
    141 static int	ixv_sysctl_rdh_handler(SYSCTLFN_PROTO);
    142 static int	ixv_sysctl_rdt_handler(SYSCTLFN_PROTO);
    143 static int	ixv_sysctl_tdt_handler(SYSCTLFN_PROTO);
    144 static int	ixv_sysctl_tdh_handler(SYSCTLFN_PROTO);
    145 
    146 /* The MSI-X Interrupt handlers */
    147 static int	ixv_msix_que(void *);
    148 static int	ixv_msix_mbx(void *);
    149 
    150 /* Deferred interrupt tasklets */
    151 static void	ixv_handle_que(void *);
    152 static void	ixv_handle_link(void *);
    153 
    154 /* Workqueue handler for deferred work */
    155 static void	ixv_handle_que_work(struct work *, void *);
    156 
    157 const struct sysctlnode *ixv_sysctl_instance(struct adapter *);
    158 static const ixgbe_vendor_info_t *ixv_lookup(const struct pci_attach_args *);
    159 
    160 /************************************************************************
    161  * FreeBSD Device Interface Entry Points
    162  ************************************************************************/
    163 CFATTACH_DECL3_NEW(ixv, sizeof(struct adapter),
    164     ixv_probe, ixv_attach, ixv_detach, NULL, NULL, NULL,
    165     DVF_DETACH_SHUTDOWN);
    166 
    167 #if 0
    168 static driver_t ixv_driver = {
    169 	"ixv", ixv_methods, sizeof(struct adapter),
    170 };
    171 
    172 devclass_t ixv_devclass;
    173 DRIVER_MODULE(ixv, pci, ixv_driver, ixv_devclass, 0, 0);
    174 MODULE_DEPEND(ixv, pci, 1, 1, 1);
    175 MODULE_DEPEND(ixv, ether, 1, 1, 1);
    176 #endif
    177 
    178 /*
    179  * TUNEABLE PARAMETERS:
    180  */
    181 
    182 /* Number of Queues - do not exceed MSI-X vectors - 1 */
    183 static int ixv_num_queues = 0;
    184 #define	TUNABLE_INT(__x, __y)
    185 TUNABLE_INT("hw.ixv.num_queues", &ixv_num_queues);
    186 
    187 /*
    188  * AIM: Adaptive Interrupt Moderation
    189  * which means that the interrupt rate
    190  * is varied over time based on the
    191  * traffic for that interrupt vector
    192  */
    193 static bool ixv_enable_aim = false;
    194 TUNABLE_INT("hw.ixv.enable_aim", &ixv_enable_aim);
    195 
    196 static int ixv_max_interrupt_rate = (4000000 / IXGBE_LOW_LATENCY);
    197 TUNABLE_INT("hw.ixv.max_interrupt_rate", &ixv_max_interrupt_rate);
    198 
    199 /* How many packets rxeof tries to clean at a time */
    200 static int ixv_rx_process_limit = 256;
    201 TUNABLE_INT("hw.ixv.rx_process_limit", &ixv_rx_process_limit);
    202 
    203 /* How many packets txeof tries to clean at a time */
    204 static int ixv_tx_process_limit = 256;
    205 TUNABLE_INT("hw.ixv.tx_process_limit", &ixv_tx_process_limit);
    206 
    207 /* Which packet processing uses workqueue or softint */
    208 static bool ixv_txrx_workqueue = false;
    209 
    210 /*
    211  * Number of TX descriptors per ring,
    212  * setting higher than RX as this seems
    213  * the better performing choice.
    214  */
    215 static int ixv_txd = PERFORM_TXD;
    216 TUNABLE_INT("hw.ixv.txd", &ixv_txd);
    217 
    218 /* Number of RX descriptors per ring */
    219 static int ixv_rxd = PERFORM_RXD;
    220 TUNABLE_INT("hw.ixv.rxd", &ixv_rxd);
    221 
    222 /* Legacy Transmit (single queue) */
    223 static int ixv_enable_legacy_tx = 0;
    224 TUNABLE_INT("hw.ixv.enable_legacy_tx", &ixv_enable_legacy_tx);
    225 
    226 #ifdef NET_MPSAFE
    227 #define IXGBE_MPSAFE		1
    228 #define IXGBE_CALLOUT_FLAGS	CALLOUT_MPSAFE
    229 #define IXGBE_SOFTINFT_FLAGS	SOFTINT_MPSAFE
    230 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU | WQ_MPSAFE
    231 #else
    232 #define IXGBE_CALLOUT_FLAGS	0
    233 #define IXGBE_SOFTINFT_FLAGS	0
    234 #define IXGBE_WORKQUEUE_FLAGS	WQ_PERCPU
    235 #endif
    236 #define IXGBE_WORKQUEUE_PRI PRI_SOFTNET
    237 
    238 #if 0
    239 static int (*ixv_start_locked)(struct ifnet *, struct tx_ring *);
    240 static int (*ixv_ring_empty)(struct ifnet *, struct buf_ring *);
    241 #endif
    242 
    243 /************************************************************************
    244  * ixv_probe - Device identification routine
    245  *
    246  *   Determines if the driver should be loaded on
    247  *   adapter based on its PCI vendor/device ID.
    248  *
    249  *   return BUS_PROBE_DEFAULT on success, positive on failure
    250  ************************************************************************/
    251 static int
    252 ixv_probe(device_t dev, cfdata_t cf, void *aux)
    253 {
    254 #ifdef __HAVE_PCI_MSI_MSIX
    255 	const struct pci_attach_args *pa = aux;
    256 
    257 	return (ixv_lookup(pa) != NULL) ? 1 : 0;
    258 #else
    259 	return 0;
    260 #endif
    261 } /* ixv_probe */
    262 
    263 static const ixgbe_vendor_info_t *
    264 ixv_lookup(const struct pci_attach_args *pa)
    265 {
    266 	const ixgbe_vendor_info_t *ent;
    267 	pcireg_t subid;
    268 
    269 	INIT_DEBUGOUT("ixv_lookup: begin");
    270 
    271 	if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID)
    272 		return NULL;
    273 
    274 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
    275 
    276 	for (ent = ixv_vendor_info_array; ent->vendor_id != 0; ent++) {
    277 		if ((PCI_VENDOR(pa->pa_id) == ent->vendor_id) &&
    278 		    (PCI_PRODUCT(pa->pa_id) == ent->device_id) &&
    279 		    ((PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id) ||
    280 		     (ent->subvendor_id == 0)) &&
    281 		    ((PCI_SUBSYS_ID(subid) == ent->subdevice_id) ||
    282 		     (ent->subdevice_id == 0))) {
    283 			return ent;
    284 		}
    285 	}
    286 
    287 	return NULL;
    288 }
    289 
    290 /************************************************************************
    291  * ixv_attach - Device initialization routine
    292  *
    293  *   Called when the driver is being loaded.
    294  *   Identifies the type of hardware, allocates all resources
    295  *   and initializes the hardware.
    296  *
    297  *   return 0 on success, positive on failure
    298  ************************************************************************/
    299 static void
    300 ixv_attach(device_t parent, device_t dev, void *aux)
    301 {
    302 	struct adapter *adapter;
    303 	struct ixgbe_hw *hw;
    304 	int		error = 0;
    305 	pcireg_t	id, subid;
    306 	const ixgbe_vendor_info_t *ent;
    307 	const struct pci_attach_args *pa = aux;
    308 	const char *apivstr;
    309 	const char *str;
    310 	char buf[256];
    311 
    312 	INIT_DEBUGOUT("ixv_attach: begin");
    313 
    314 	/*
    315 	 * Make sure BUSMASTER is set, on a VM under
    316 	 * KVM it may not be and will break things.
    317 	 */
    318 	ixgbe_pci_enable_busmaster(pa->pa_pc, pa->pa_tag);
    319 
    320 	/* Allocate, clear, and link in our adapter structure */
    321 	adapter = device_private(dev);
    322 	adapter->dev = dev;
    323 	adapter->hw.back = adapter;
    324 	hw = &adapter->hw;
    325 
    326 	adapter->init_locked = ixv_init_locked;
    327 	adapter->stop_locked = ixv_stop;
    328 
    329 	adapter->osdep.pc = pa->pa_pc;
    330 	adapter->osdep.tag = pa->pa_tag;
    331 	if (pci_dma64_available(pa))
    332 		adapter->osdep.dmat = pa->pa_dmat64;
    333 	else
    334 		adapter->osdep.dmat = pa->pa_dmat;
    335 	adapter->osdep.attached = false;
    336 
    337 	ent = ixv_lookup(pa);
    338 
    339 	KASSERT(ent != NULL);
    340 
    341 	aprint_normal(": %s, Version - %s\n",
    342 	    ixv_strings[ent->index], ixv_driver_version);
    343 
    344 	/* Core Lock Init*/
    345 	IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev));
    346 
    347 	/* Do base PCI setup - map BAR0 */
    348 	if (ixv_allocate_pci_resources(adapter, pa)) {
    349 		aprint_error_dev(dev, "ixv_allocate_pci_resources() failed!\n");
    350 		error = ENXIO;
    351 		goto err_out;
    352 	}
    353 
    354 	/* SYSCTL APIs */
    355 	ixv_add_device_sysctls(adapter);
    356 
    357 	/* Set up the timer callout */
    358 	callout_init(&adapter->timer, IXGBE_CALLOUT_FLAGS);
    359 
    360 	/* Save off the information about this board */
    361 	id = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG);
    362 	subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
    363 	hw->vendor_id = PCI_VENDOR(id);
    364 	hw->device_id = PCI_PRODUCT(id);
    365 	hw->revision_id =
    366 	    PCI_REVISION(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_CLASS_REG));
    367 	hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid);
    368 	hw->subsystem_device_id = PCI_SUBSYS_ID(subid);
    369 
    370 	/* A subset of set_mac_type */
    371 	switch (hw->device_id) {
    372 	case IXGBE_DEV_ID_82599_VF:
    373 		hw->mac.type = ixgbe_mac_82599_vf;
    374 		str = "82599 VF";
    375 		break;
    376 	case IXGBE_DEV_ID_X540_VF:
    377 		hw->mac.type = ixgbe_mac_X540_vf;
    378 		str = "X540 VF";
    379 		break;
    380 	case IXGBE_DEV_ID_X550_VF:
    381 		hw->mac.type = ixgbe_mac_X550_vf;
    382 		str = "X550 VF";
    383 		break;
    384 	case IXGBE_DEV_ID_X550EM_X_VF:
    385 		hw->mac.type = ixgbe_mac_X550EM_x_vf;
    386 		str = "X550EM X VF";
    387 		break;
    388 	case IXGBE_DEV_ID_X550EM_A_VF:
    389 		hw->mac.type = ixgbe_mac_X550EM_a_vf;
    390 		str = "X550EM A VF";
    391 		break;
    392 	default:
    393 		/* Shouldn't get here since probe succeeded */
    394 		aprint_error_dev(dev, "Unknown device ID!\n");
    395 		error = ENXIO;
    396 		goto err_out;
    397 		break;
    398 	}
    399 	aprint_normal_dev(dev, "device %s\n", str);
    400 
    401 	ixv_init_device_features(adapter);
    402 
    403 	/* Initialize the shared code */
    404 	error = ixgbe_init_ops_vf(hw);
    405 	if (error) {
    406 		aprint_error_dev(dev, "ixgbe_init_ops_vf() failed!\n");
    407 		error = EIO;
    408 		goto err_out;
    409 	}
    410 
    411 	/* Setup the mailbox */
    412 	ixgbe_init_mbx_params_vf(hw);
    413 
    414 	/* Set the right number of segments */
    415 	adapter->num_segs = IXGBE_82599_SCATTER;
    416 
    417 	/* Reset mbox api to 1.0 */
    418 	error = hw->mac.ops.reset_hw(hw);
    419 	if (error == IXGBE_ERR_RESET_FAILED)
    420 		aprint_error_dev(dev, "...reset_hw() failure: Reset Failed!\n");
    421 	else if (error)
    422 		aprint_error_dev(dev, "...reset_hw() failed with error %d\n",
    423 		    error);
    424 	if (error) {
    425 		error = EIO;
    426 		goto err_out;
    427 	}
    428 
    429 	error = hw->mac.ops.init_hw(hw);
    430 	if (error) {
    431 		aprint_error_dev(dev, "...init_hw() failed!\n");
    432 		error = EIO;
    433 		goto err_out;
    434 	}
    435 
    436 	/* Negotiate mailbox API version */
    437 	error = ixv_negotiate_api(adapter);
    438 	if (error)
    439 		aprint_normal_dev(dev,
    440 		    "MBX API negotiation failed during attach!\n");
    441 	switch (hw->api_version) {
    442 	case ixgbe_mbox_api_10:
    443 		apivstr = "1.0";
    444 		break;
    445 	case ixgbe_mbox_api_20:
    446 		apivstr = "2.0";
    447 		break;
    448 	case ixgbe_mbox_api_11:
    449 		apivstr = "1.1";
    450 		break;
    451 	case ixgbe_mbox_api_12:
    452 		apivstr = "1.2";
    453 		break;
    454 	case ixgbe_mbox_api_13:
    455 		apivstr = "1.3";
    456 		break;
    457 	default:
    458 		apivstr = "unknown";
    459 		break;
    460 	}
    461 	aprint_normal_dev(dev, "Mailbox API %s\n", apivstr);
    462 
    463 	/* If no mac address was assigned, make a random one */
    464 	if (!ixv_check_ether_addr(hw->mac.addr)) {
    465 		u8 addr[ETHER_ADDR_LEN];
    466 		uint64_t rndval = cprng_strong64();
    467 
    468 		memcpy(addr, &rndval, sizeof(addr));
    469 		addr[0] &= 0xFE;
    470 		addr[0] |= 0x02;
    471 		bcopy(addr, hw->mac.addr, sizeof(addr));
    472 	}
    473 
    474 	/* Register for VLAN events */
    475 	ether_set_vlan_cb(&adapter->osdep.ec, ixv_vlan_cb);
    476 
    477 	/* Sysctls for limiting the amount of work done in the taskqueues */
    478 	ixv_set_sysctl_value(adapter, "rx_processing_limit",
    479 	    "max number of rx packets to process",
    480 	    &adapter->rx_process_limit, ixv_rx_process_limit);
    481 
    482 	ixv_set_sysctl_value(adapter, "tx_processing_limit",
    483 	    "max number of tx packets to process",
    484 	    &adapter->tx_process_limit, ixv_tx_process_limit);
    485 
    486 	/* Do descriptor calc and sanity checks */
    487 	if (((ixv_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 ||
    488 	    ixv_txd < MIN_TXD || ixv_txd > MAX_TXD) {
    489 		aprint_error_dev(dev, "TXD config issue, using default!\n");
    490 		adapter->num_tx_desc = DEFAULT_TXD;
    491 	} else
    492 		adapter->num_tx_desc = ixv_txd;
    493 
    494 	if (((ixv_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 ||
    495 	    ixv_rxd < MIN_RXD || ixv_rxd > MAX_RXD) {
    496 		aprint_error_dev(dev, "RXD config issue, using default!\n");
    497 		adapter->num_rx_desc = DEFAULT_RXD;
    498 	} else
    499 		adapter->num_rx_desc = ixv_rxd;
    500 
    501 	/* Setup MSI-X */
    502 	error = ixv_configure_interrupts(adapter);
    503 	if (error)
    504 		goto err_out;
    505 
    506 	/* Allocate our TX/RX Queues */
    507 	if (ixgbe_allocate_queues(adapter)) {
    508 		aprint_error_dev(dev, "ixgbe_allocate_queues() failed!\n");
    509 		error = ENOMEM;
    510 		goto err_out;
    511 	}
    512 
    513 	/* hw.ix defaults init */
    514 	adapter->enable_aim = ixv_enable_aim;
    515 
    516 	adapter->txrx_use_workqueue = ixv_txrx_workqueue;
    517 
    518 	error = ixv_allocate_msix(adapter, pa);
    519 	if (error) {
    520 		aprint_error_dev(dev, "ixv_allocate_msix() failed!\n");
    521 		goto err_late;
    522 	}
    523 
    524 	/* Setup OS specific network interface */
    525 	error = ixv_setup_interface(dev, adapter);
    526 	if (error != 0) {
    527 		aprint_error_dev(dev, "ixv_setup_interface() failed!\n");
    528 		goto err_late;
    529 	}
    530 
    531 	/* Do the stats setup */
    532 	ixv_save_stats(adapter);
    533 	ixv_init_stats(adapter);
    534 	ixv_add_stats_sysctls(adapter);
    535 
    536 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
    537 		ixgbe_netmap_attach(adapter);
    538 
    539 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_cap);
    540 	aprint_verbose_dev(dev, "feature cap %s\n", buf);
    541 	snprintb(buf, sizeof(buf), IXGBE_FEATURE_FLAGS, adapter->feat_en);
    542 	aprint_verbose_dev(dev, "feature ena %s\n", buf);
    543 
    544 	INIT_DEBUGOUT("ixv_attach: end");
    545 	adapter->osdep.attached = true;
    546 
    547 	return;
    548 
    549 err_late:
    550 	ixgbe_free_queues(adapter);
    551 err_out:
    552 	ixv_free_pci_resources(adapter);
    553 	IXGBE_CORE_LOCK_DESTROY(adapter);
    554 
    555 	return;
    556 } /* ixv_attach */
    557 
    558 /************************************************************************
    559  * ixv_detach - Device removal routine
    560  *
    561  *   Called when the driver is being removed.
    562  *   Stops the adapter and deallocates all the resources
    563  *   that were allocated for driver operation.
    564  *
    565  *   return 0 on success, positive on failure
    566  ************************************************************************/
    567 static int
    568 ixv_detach(device_t dev, int flags)
    569 {
    570 	struct adapter	*adapter = device_private(dev);
    571 	struct ixgbe_hw *hw = &adapter->hw;
    572 	struct ix_queue *que = adapter->queues;
    573 	struct tx_ring *txr = adapter->tx_rings;
    574 	struct rx_ring *rxr = adapter->rx_rings;
    575 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
    576 
    577 	INIT_DEBUGOUT("ixv_detach: begin");
    578 	if (adapter->osdep.attached == false)
    579 		return 0;
    580 
    581 	/* Stop the interface. Callouts are stopped in it. */
    582 	ixv_ifstop(adapter->ifp, 1);
    583 
    584 #if NVLAN > 0
    585 	/* Make sure VLANs are not using driver */
    586 	if (!VLAN_ATTACHED(&adapter->osdep.ec))
    587 		;	/* nothing to do: no VLANs */
    588 	else if ((flags & (DETACH_SHUTDOWN | DETACH_FORCE)) != 0)
    589 		vlan_ifdetach(adapter->ifp);
    590 	else {
    591 		aprint_error_dev(dev, "VLANs in use, detach first\n");
    592 		return EBUSY;
    593 	}
    594 #endif
    595 
    596 	for (int i = 0; i < adapter->num_queues; i++, que++, txr++) {
    597 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
    598 			softint_disestablish(txr->txr_si);
    599 		softint_disestablish(que->que_si);
    600 	}
    601 	if (adapter->txr_wq != NULL)
    602 		workqueue_destroy(adapter->txr_wq);
    603 	if (adapter->txr_wq_enqueued != NULL)
    604 		percpu_free(adapter->txr_wq_enqueued, sizeof(u_int));
    605 	if (adapter->que_wq != NULL)
    606 		workqueue_destroy(adapter->que_wq);
    607 
    608 	/* Drain the Mailbox(link) queue */
    609 	softint_disestablish(adapter->link_si);
    610 
    611 	ether_ifdetach(adapter->ifp);
    612 	callout_halt(&adapter->timer, NULL);
    613 
    614 	if (adapter->feat_en & IXGBE_FEATURE_NETMAP)
    615 		netmap_detach(adapter->ifp);
    616 
    617 	ixv_free_pci_resources(adapter);
    618 #if 0 /* XXX the NetBSD port is probably missing something here */
    619 	bus_generic_detach(dev);
    620 #endif
    621 	if_detach(adapter->ifp);
    622 	if_percpuq_destroy(adapter->ipq);
    623 
    624 	sysctl_teardown(&adapter->sysctllog);
    625 	evcnt_detach(&adapter->efbig_tx_dma_setup);
    626 	evcnt_detach(&adapter->mbuf_defrag_failed);
    627 	evcnt_detach(&adapter->efbig2_tx_dma_setup);
    628 	evcnt_detach(&adapter->einval_tx_dma_setup);
    629 	evcnt_detach(&adapter->other_tx_dma_setup);
    630 	evcnt_detach(&adapter->eagain_tx_dma_setup);
    631 	evcnt_detach(&adapter->enomem_tx_dma_setup);
    632 	evcnt_detach(&adapter->watchdog_events);
    633 	evcnt_detach(&adapter->tso_err);
    634 	evcnt_detach(&adapter->link_irq);
    635 
    636 	txr = adapter->tx_rings;
    637 	for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
    638 		evcnt_detach(&adapter->queues[i].irqs);
    639 		evcnt_detach(&adapter->queues[i].handleq);
    640 		evcnt_detach(&adapter->queues[i].req);
    641 		evcnt_detach(&txr->no_desc_avail);
    642 		evcnt_detach(&txr->total_packets);
    643 		evcnt_detach(&txr->tso_tx);
    644 #ifndef IXGBE_LEGACY_TX
    645 		evcnt_detach(&txr->pcq_drops);
    646 #endif
    647 
    648 		evcnt_detach(&rxr->rx_packets);
    649 		evcnt_detach(&rxr->rx_bytes);
    650 		evcnt_detach(&rxr->rx_copies);
    651 		evcnt_detach(&rxr->no_jmbuf);
    652 		evcnt_detach(&rxr->rx_discarded);
    653 	}
    654 	evcnt_detach(&stats->ipcs);
    655 	evcnt_detach(&stats->l4cs);
    656 	evcnt_detach(&stats->ipcs_bad);
    657 	evcnt_detach(&stats->l4cs_bad);
    658 
    659 	/* Packet Reception Stats */
    660 	evcnt_detach(&stats->vfgorc);
    661 	evcnt_detach(&stats->vfgprc);
    662 	evcnt_detach(&stats->vfmprc);
    663 
    664 	/* Packet Transmission Stats */
    665 	evcnt_detach(&stats->vfgotc);
    666 	evcnt_detach(&stats->vfgptc);
    667 
    668 	/* Mailbox Stats */
    669 	evcnt_detach(&hw->mbx.stats.msgs_tx);
    670 	evcnt_detach(&hw->mbx.stats.msgs_rx);
    671 	evcnt_detach(&hw->mbx.stats.acks);
    672 	evcnt_detach(&hw->mbx.stats.reqs);
    673 	evcnt_detach(&hw->mbx.stats.rsts);
    674 
    675 	ixgbe_free_queues(adapter);
    676 
    677 	IXGBE_CORE_LOCK_DESTROY(adapter);
    678 
    679 	return (0);
    680 } /* ixv_detach */
    681 
    682 /************************************************************************
    683  * ixv_init_locked - Init entry point
    684  *
    685  *   Used in two ways: It is used by the stack as an init entry
    686  *   point in network interface structure. It is also used
    687  *   by the driver as a hw/sw initialization routine to get
    688  *   to a consistent state.
    689  *
    690  *   return 0 on success, positive on failure
    691  ************************************************************************/
    692 static void
    693 ixv_init_locked(struct adapter *adapter)
    694 {
    695 	struct ifnet	*ifp = adapter->ifp;
    696 	device_t	dev = adapter->dev;
    697 	struct ixgbe_hw *hw = &adapter->hw;
    698 	struct ix_queue	*que;
    699 	int		error = 0;
    700 	uint32_t mask;
    701 	int i;
    702 
    703 	INIT_DEBUGOUT("ixv_init_locked: begin");
    704 	KASSERT(mutex_owned(&adapter->core_mtx));
    705 	hw->adapter_stopped = FALSE;
    706 	hw->mac.ops.stop_adapter(hw);
    707 	callout_stop(&adapter->timer);
    708 	for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
    709 		que->disabled_count = 0;
    710 
    711 	adapter->max_frame_size =
    712 	    ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
    713 
    714 	/* reprogram the RAR[0] in case user changed it. */
    715 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
    716 
    717 	/* Get the latest mac address, User can use a LAA */
    718 	memcpy(hw->mac.addr, CLLADDR(ifp->if_sadl),
    719 	     IXGBE_ETH_LENGTH_OF_ADDRESS);
    720 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, 1);
    721 
    722 	/* Prepare transmit descriptors and buffers */
    723 	if (ixgbe_setup_transmit_structures(adapter)) {
    724 		aprint_error_dev(dev, "Could not setup transmit structures\n");
    725 		ixv_stop(adapter);
    726 		return;
    727 	}
    728 
    729 	/* Reset VF and renegotiate mailbox API version */
    730 	hw->mac.ops.reset_hw(hw);
    731 	hw->mac.ops.start_hw(hw);
    732 	error = ixv_negotiate_api(adapter);
    733 	if (error)
    734 		device_printf(dev,
    735 		    "Mailbox API negotiation failed in init_locked!\n");
    736 
    737 	ixv_initialize_transmit_units(adapter);
    738 
    739 	/* Setup Multicast table */
    740 	ixv_set_rxfilter(adapter);
    741 
    742 	/*
    743 	 * Determine the correct mbuf pool
    744 	 * for doing jumbo/headersplit
    745 	 */
    746 	if (adapter->max_frame_size <= MCLBYTES)
    747 		adapter->rx_mbuf_sz = MCLBYTES;
    748 	else
    749 		adapter->rx_mbuf_sz = MJUMPAGESIZE;
    750 
    751 	/* Prepare receive descriptors and buffers */
    752 	if (ixgbe_setup_receive_structures(adapter)) {
    753 		device_printf(dev, "Could not setup receive structures\n");
    754 		ixv_stop(adapter);
    755 		return;
    756 	}
    757 
    758 	/* Configure RX settings */
    759 	ixv_initialize_receive_units(adapter);
    760 
    761 	/* Set up VLAN offload and filter */
    762 	ixv_setup_vlan_support(adapter);
    763 
    764 	/* Set up MSI-X routing */
    765 	ixv_configure_ivars(adapter);
    766 
    767 	/* Set up auto-mask */
    768 	mask = (1 << adapter->vector);
    769 	for (i = 0, que = adapter->queues; i < adapter->num_queues; i++, que++)
    770 		mask |= (1 << que->msix);
    771 	IXGBE_WRITE_REG(hw, IXGBE_VTEIAM, mask);
    772 
    773 	/* Set moderation on the Link interrupt */
    774 	ixv_eitr_write(adapter, adapter->vector, IXGBE_LINK_ITR);
    775 
    776 	/* Stats init */
    777 	ixv_init_stats(adapter);
    778 
    779 	/* Config/Enable Link */
    780 	hw->mac.get_link_status = TRUE;
    781 	hw->mac.ops.check_link(hw, &adapter->link_speed, &adapter->link_up,
    782 	    FALSE);
    783 
    784 	/* Start watchdog */
    785 	callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
    786 
    787 	/* And now turn on interrupts */
    788 	ixv_enable_intr(adapter);
    789 
    790 	/* Update saved flags. See ixgbe_ifflags_cb() */
    791 	adapter->if_flags = ifp->if_flags;
    792 	adapter->ec_capenable = adapter->osdep.ec.ec_capenable;
    793 
    794 	/* Now inform the stack we're ready */
    795 	ifp->if_flags |= IFF_RUNNING;
    796 	ifp->if_flags &= ~IFF_OACTIVE;
    797 
    798 	return;
    799 } /* ixv_init_locked */
    800 
    801 /************************************************************************
    802  * ixv_enable_queue
    803  ************************************************************************/
    804 static inline void
    805 ixv_enable_queue(struct adapter *adapter, u32 vector)
    806 {
    807 	struct ixgbe_hw *hw = &adapter->hw;
    808 	struct ix_queue *que = &adapter->queues[vector];
    809 	u32		queue = 1UL << vector;
    810 	u32		mask;
    811 
    812 	mutex_enter(&que->dc_mtx);
    813 	if (que->disabled_count > 0 && --que->disabled_count > 0)
    814 		goto out;
    815 
    816 	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
    817 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, mask);
    818 out:
    819 	mutex_exit(&que->dc_mtx);
    820 } /* ixv_enable_queue */
    821 
    822 /************************************************************************
    823  * ixv_disable_queue
    824  ************************************************************************/
    825 static inline void
    826 ixv_disable_queue(struct adapter *adapter, u32 vector)
    827 {
    828 	struct ixgbe_hw *hw = &adapter->hw;
    829 	struct ix_queue *que = &adapter->queues[vector];
    830 	u32		queue = 1UL << vector;
    831 	u32		mask;
    832 
    833 	mutex_enter(&que->dc_mtx);
    834 	if (que->disabled_count++ > 0)
    835 		goto  out;
    836 
    837 	mask = (IXGBE_EIMS_RTX_QUEUE & queue);
    838 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMC, mask);
    839 out:
    840 	mutex_exit(&que->dc_mtx);
    841 } /* ixv_disable_queue */
    842 
    843 #if 0
    844 static inline void
    845 ixv_rearm_queues(struct adapter *adapter, u64 queues)
    846 {
    847 	u32 mask = (IXGBE_EIMS_RTX_QUEUE & queues);
    848 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEICS, mask);
    849 } /* ixv_rearm_queues */
    850 #endif
    851 
    852 
    853 /************************************************************************
    854  * ixv_msix_que - MSI-X Queue Interrupt Service routine
    855  ************************************************************************/
    856 static int
    857 ixv_msix_que(void *arg)
    858 {
    859 	struct ix_queue	*que = arg;
    860 	struct adapter	*adapter = que->adapter;
    861 	struct tx_ring	*txr = que->txr;
    862 	struct rx_ring	*rxr = que->rxr;
    863 	bool		more;
    864 	u32		newitr = 0;
    865 
    866 	ixv_disable_queue(adapter, que->msix);
    867 	++que->irqs.ev_count;
    868 
    869 #ifdef __NetBSD__
    870 	/* Don't run ixgbe_rxeof in interrupt context */
    871 	more = true;
    872 #else
    873 	more = ixgbe_rxeof(que);
    874 #endif
    875 
    876 	IXGBE_TX_LOCK(txr);
    877 	ixgbe_txeof(txr);
    878 	IXGBE_TX_UNLOCK(txr);
    879 
    880 	/* Do AIM now? */
    881 
    882 	if (adapter->enable_aim == false)
    883 		goto no_calc;
    884 	/*
    885 	 * Do Adaptive Interrupt Moderation:
    886 	 *  - Write out last calculated setting
    887 	 *  - Calculate based on average size over
    888 	 *    the last interval.
    889 	 */
    890 	if (que->eitr_setting)
    891 		ixv_eitr_write(adapter, que->msix, que->eitr_setting);
    892 
    893 	que->eitr_setting = 0;
    894 
    895 	/* Idle, do nothing */
    896 	if ((txr->bytes == 0) && (rxr->bytes == 0))
    897 		goto no_calc;
    898 
    899 	if ((txr->bytes) && (txr->packets))
    900 		newitr = txr->bytes/txr->packets;
    901 	if ((rxr->bytes) && (rxr->packets))
    902 		newitr = uimax(newitr, (rxr->bytes / rxr->packets));
    903 	newitr += 24; /* account for hardware frame, crc */
    904 
    905 	/* set an upper boundary */
    906 	newitr = uimin(newitr, 3000);
    907 
    908 	/* Be nice to the mid range */
    909 	if ((newitr > 300) && (newitr < 1200))
    910 		newitr = (newitr / 3);
    911 	else
    912 		newitr = (newitr / 2);
    913 
    914 	/*
    915 	 * When RSC is used, ITR interval must be larger than RSC_DELAY.
    916 	 * Currently, we use 2us for RSC_DELAY. The minimum value is always
    917 	 * greater than 2us on 100M (and 10M?(not documented)), but it's not
    918 	 * on 1G and higher.
    919 	 */
    920 	if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
    921 	    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
    922 		if (newitr < IXGBE_MIN_RSC_EITR_10G1G)
    923 			newitr = IXGBE_MIN_RSC_EITR_10G1G;
    924 	}
    925 
    926 	/* save for next interrupt */
    927 	que->eitr_setting = newitr;
    928 
    929 	/* Reset state */
    930 	txr->bytes = 0;
    931 	txr->packets = 0;
    932 	rxr->bytes = 0;
    933 	rxr->packets = 0;
    934 
    935 no_calc:
    936 	if (more)
    937 		softint_schedule(que->que_si);
    938 	else /* Re-enable this interrupt */
    939 		ixv_enable_queue(adapter, que->msix);
    940 
    941 	return 1;
    942 } /* ixv_msix_que */
    943 
    944 /************************************************************************
    945  * ixv_msix_mbx
    946  ************************************************************************/
    947 static int
    948 ixv_msix_mbx(void *arg)
    949 {
    950 	struct adapter	*adapter = arg;
    951 	struct ixgbe_hw *hw = &adapter->hw;
    952 
    953 	++adapter->link_irq.ev_count;
    954 	/* NetBSD: We use auto-clear, so it's not required to write VTEICR */
    955 
    956 	/* Link status change */
    957 	hw->mac.get_link_status = TRUE;
    958 	softint_schedule(adapter->link_si);
    959 
    960 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << adapter->vector));
    961 
    962 	return 1;
    963 } /* ixv_msix_mbx */
    964 
    965 static void
    966 ixv_eitr_write(struct adapter *adapter, uint32_t index, uint32_t itr)
    967 {
    968 
    969 	/*
    970 	 * Newer devices than 82598 have VF function, so this function is
    971 	 * simple.
    972 	 */
    973 	itr |= IXGBE_EITR_CNT_WDIS;
    974 
    975 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEITR(index), itr);
    976 }
    977 
    978 
    979 /************************************************************************
    980  * ixv_media_status - Media Ioctl callback
    981  *
    982  *   Called whenever the user queries the status of
    983  *   the interface using ifconfig.
    984  ************************************************************************/
    985 static void
    986 ixv_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
    987 {
    988 	struct adapter *adapter = ifp->if_softc;
    989 
    990 	INIT_DEBUGOUT("ixv_media_status: begin");
    991 	IXGBE_CORE_LOCK(adapter);
    992 	ixv_update_link_status(adapter);
    993 
    994 	ifmr->ifm_status = IFM_AVALID;
    995 	ifmr->ifm_active = IFM_ETHER;
    996 
    997 	if (adapter->link_active != LINK_STATE_UP) {
    998 		ifmr->ifm_active |= IFM_NONE;
    999 		IXGBE_CORE_UNLOCK(adapter);
   1000 		return;
   1001 	}
   1002 
   1003 	ifmr->ifm_status |= IFM_ACTIVE;
   1004 
   1005 	switch (adapter->link_speed) {
   1006 		case IXGBE_LINK_SPEED_10GB_FULL:
   1007 			ifmr->ifm_active |= IFM_10G_T | IFM_FDX;
   1008 			break;
   1009 		case IXGBE_LINK_SPEED_5GB_FULL:
   1010 			ifmr->ifm_active |= IFM_5000_T | IFM_FDX;
   1011 			break;
   1012 		case IXGBE_LINK_SPEED_2_5GB_FULL:
   1013 			ifmr->ifm_active |= IFM_2500_T | IFM_FDX;
   1014 			break;
   1015 		case IXGBE_LINK_SPEED_1GB_FULL:
   1016 			ifmr->ifm_active |= IFM_1000_T | IFM_FDX;
   1017 			break;
   1018 		case IXGBE_LINK_SPEED_100_FULL:
   1019 			ifmr->ifm_active |= IFM_100_TX | IFM_FDX;
   1020 			break;
   1021 		case IXGBE_LINK_SPEED_10_FULL:
   1022 			ifmr->ifm_active |= IFM_10_T | IFM_FDX;
   1023 			break;
   1024 	}
   1025 
   1026 	ifp->if_baudrate = ifmedia_baudrate(ifmr->ifm_active);
   1027 
   1028 	IXGBE_CORE_UNLOCK(adapter);
   1029 } /* ixv_media_status */
   1030 
   1031 /************************************************************************
   1032  * ixv_media_change - Media Ioctl callback
   1033  *
   1034  *   Called when the user changes speed/duplex using
   1035  *   media/mediopt option with ifconfig.
   1036  ************************************************************************/
   1037 static int
   1038 ixv_media_change(struct ifnet *ifp)
   1039 {
   1040 	struct adapter *adapter = ifp->if_softc;
   1041 	struct ifmedia *ifm = &adapter->media;
   1042 
   1043 	INIT_DEBUGOUT("ixv_media_change: begin");
   1044 
   1045 	if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
   1046 		return (EINVAL);
   1047 
   1048 	switch (IFM_SUBTYPE(ifm->ifm_media)) {
   1049 	case IFM_AUTO:
   1050 		break;
   1051 	default:
   1052 		device_printf(adapter->dev, "Only auto media type\n");
   1053 		return (EINVAL);
   1054 	}
   1055 
   1056 	return (0);
   1057 } /* ixv_media_change */
   1058 
   1059 /************************************************************************
   1060  * ixv_negotiate_api
   1061  *
   1062  *   Negotiate the Mailbox API with the PF;
   1063  *   start with the most featured API first.
   1064  ************************************************************************/
   1065 static int
   1066 ixv_negotiate_api(struct adapter *adapter)
   1067 {
   1068 	struct ixgbe_hw *hw = &adapter->hw;
   1069 	int		mbx_api[] = { ixgbe_mbox_api_13,
   1070 				      ixgbe_mbox_api_12,
   1071 				      ixgbe_mbox_api_11,
   1072 				      ixgbe_mbox_api_10,
   1073 				      ixgbe_mbox_api_unknown };
   1074 	int		i = 0;
   1075 
   1076 	while (mbx_api[i] != ixgbe_mbox_api_unknown) {
   1077 		if (ixgbevf_negotiate_api_version(hw, mbx_api[i]) == 0)
   1078 			return (0);
   1079 		i++;
   1080 	}
   1081 
   1082 	return (EINVAL);
   1083 } /* ixv_negotiate_api */
   1084 
   1085 
   1086 /************************************************************************
   1087  * ixv_set_multi - Multicast Update
   1088  *
   1089  *   Called whenever multicast address list is updated.
   1090  ************************************************************************/
   1091 static int
   1092 ixv_set_rxfilter(struct adapter *adapter)
   1093 {
   1094 	u8	mta[IXGBE_MAX_VF_MC * IXGBE_ETH_LENGTH_OF_ADDRESS];
   1095 	struct ifnet		*ifp = adapter->ifp;
   1096 	struct ixgbe_hw		*hw = &adapter->hw;
   1097 	u8			*update_ptr;
   1098 	int			mcnt = 0;
   1099 	struct ethercom		*ec = &adapter->osdep.ec;
   1100 	struct ether_multi	*enm;
   1101 	struct ether_multistep	step;
   1102 	bool			overflow = false;
   1103 	int			error, rc = 0;
   1104 
   1105 	KASSERT(mutex_owned(&adapter->core_mtx));
   1106 	IOCTL_DEBUGOUT("ixv_set_rxfilter: begin");
   1107 
   1108 	/* 1: For PROMISC */
   1109 	if (ifp->if_flags & IFF_PROMISC) {
   1110 		error = hw->mac.ops.update_xcast_mode(hw,
   1111 		    IXGBEVF_XCAST_MODE_PROMISC);
   1112 		if (error == IXGBE_ERR_NOT_TRUSTED) {
   1113 			device_printf(adapter->dev,
   1114 			    "this interface is not trusted\n");
   1115 			error = EPERM;
   1116 		} else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
   1117 			device_printf(adapter->dev,
   1118 			    "the PF doesn't support promisc mode\n");
   1119 			error = EOPNOTSUPP;
   1120 		} else if (error == IXGBE_ERR_NOT_IN_PROMISC) {
   1121 			device_printf(adapter->dev,
   1122 			    "the PF may not in promisc mode\n");
   1123 			error = EINVAL;
   1124 		} else if (error) {
   1125 			device_printf(adapter->dev,
   1126 			    "failed to set promisc mode. error = %d\n",
   1127 			    error);
   1128 			error = EIO;
   1129 		} else
   1130 			return 0;
   1131 		rc = error;
   1132 	}
   1133 
   1134 	/* 2: For ALLMULTI or normal */
   1135 	ETHER_LOCK(ec);
   1136 	ETHER_FIRST_MULTI(step, ec, enm);
   1137 	while (enm != NULL) {
   1138 		if ((mcnt >= IXGBE_MAX_VF_MC) ||
   1139 		    (memcmp(enm->enm_addrlo, enm->enm_addrhi,
   1140 			ETHER_ADDR_LEN) != 0)) {
   1141 			overflow = true;
   1142 			break;
   1143 		}
   1144 		bcopy(enm->enm_addrlo,
   1145 		    &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS],
   1146 		    IXGBE_ETH_LENGTH_OF_ADDRESS);
   1147 		mcnt++;
   1148 		ETHER_NEXT_MULTI(step, enm);
   1149 	}
   1150 	ETHER_UNLOCK(ec);
   1151 
   1152 	/* 3: For ALLMULTI */
   1153 	if (overflow) {
   1154 		error = hw->mac.ops.update_xcast_mode(hw,
   1155 		    IXGBEVF_XCAST_MODE_ALLMULTI);
   1156 		if (error == IXGBE_ERR_NOT_TRUSTED) {
   1157 			device_printf(adapter->dev,
   1158 			    "this interface is not trusted\n");
   1159 			error = EPERM;
   1160 		} else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
   1161 			device_printf(adapter->dev,
   1162 			    "the PF doesn't support allmulti mode\n");
   1163 			error = EOPNOTSUPP;
   1164 		} else if (error) {
   1165 			device_printf(adapter->dev,
   1166 			    "number of Ethernet multicast addresses "
   1167 			    "exceeds the limit (%d). error = %d\n",
   1168 			    IXGBE_MAX_VF_MC, error);
   1169 			error = ENOSPC;
   1170 		} else {
   1171 			ETHER_LOCK(ec);
   1172 			ec->ec_flags |= ETHER_F_ALLMULTI;
   1173 			ETHER_UNLOCK(ec);
   1174 			return rc; /* Promisc might failed */
   1175 		}
   1176 
   1177 		if (rc == 0)
   1178 			rc = error;
   1179 
   1180 		/* Continue to update the multicast table as many as we can */
   1181 	}
   1182 
   1183 	/* 4: For normal operation */
   1184 	error = hw->mac.ops.update_xcast_mode(hw, IXGBEVF_XCAST_MODE_MULTI);
   1185 	if ((error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) || (error == 0)) {
   1186 		/* Normal operation */
   1187 		ETHER_LOCK(ec);
   1188 		ec->ec_flags &= ~ETHER_F_ALLMULTI;
   1189 		ETHER_UNLOCK(ec);
   1190 		error = 0;
   1191 	} else if (error) {
   1192 		device_printf(adapter->dev,
   1193 		    "failed to set Ethernet multicast address "
   1194 		    "operation to normal. error = %d\n", error);
   1195 	}
   1196 
   1197 	update_ptr = mta;
   1198 
   1199 	error = adapter->hw.mac.ops.update_mc_addr_list(&adapter->hw,
   1200 	    update_ptr, mcnt, ixv_mc_array_itr, TRUE);
   1201 	if (rc == 0)
   1202 		rc = error;
   1203 
   1204 	return rc;
   1205 } /* ixv_set_rxfilter */
   1206 
   1207 /************************************************************************
   1208  * ixv_mc_array_itr
   1209  *
   1210  *   An iterator function needed by the multicast shared code.
   1211  *   It feeds the shared code routine the addresses in the
   1212  *   array of ixv_set_rxfilter() one by one.
   1213  ************************************************************************/
   1214 static u8 *
   1215 ixv_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq)
   1216 {
   1217 	u8 *addr = *update_ptr;
   1218 	u8 *newptr;
   1219 
   1220 	*vmdq = 0;
   1221 
   1222 	newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS;
   1223 	*update_ptr = newptr;
   1224 
   1225 	return addr;
   1226 } /* ixv_mc_array_itr */
   1227 
   1228 /************************************************************************
   1229  * ixv_local_timer - Timer routine
   1230  *
   1231  *   Checks for link status, updates statistics,
   1232  *   and runs the watchdog check.
   1233  ************************************************************************/
   1234 static void
   1235 ixv_local_timer(void *arg)
   1236 {
   1237 	struct adapter *adapter = arg;
   1238 
   1239 	IXGBE_CORE_LOCK(adapter);
   1240 	ixv_local_timer_locked(adapter);
   1241 	IXGBE_CORE_UNLOCK(adapter);
   1242 }
   1243 
   1244 static void
   1245 ixv_local_timer_locked(void *arg)
   1246 {
   1247 	struct adapter	*adapter = arg;
   1248 	device_t	dev = adapter->dev;
   1249 	struct ix_queue	*que = adapter->queues;
   1250 	u64		queues = 0;
   1251 	u64		v0, v1, v2, v3, v4, v5, v6, v7;
   1252 	int		hung = 0;
   1253 	int		i;
   1254 
   1255 	KASSERT(mutex_owned(&adapter->core_mtx));
   1256 
   1257 	if (ixv_check_link(adapter)) {
   1258 		ixv_init_locked(adapter);
   1259 		return;
   1260 	}
   1261 
   1262 	/* Stats Update */
   1263 	ixv_update_stats(adapter);
   1264 
   1265 	/* Update some event counters */
   1266 	v0 = v1 = v2 = v3 = v4 = v5 = v6 = v7 = 0;
   1267 	que = adapter->queues;
   1268 	for (i = 0; i < adapter->num_queues; i++, que++) {
   1269 		struct tx_ring	*txr = que->txr;
   1270 
   1271 		v0 += txr->q_efbig_tx_dma_setup;
   1272 		v1 += txr->q_mbuf_defrag_failed;
   1273 		v2 += txr->q_efbig2_tx_dma_setup;
   1274 		v3 += txr->q_einval_tx_dma_setup;
   1275 		v4 += txr->q_other_tx_dma_setup;
   1276 		v5 += txr->q_eagain_tx_dma_setup;
   1277 		v6 += txr->q_enomem_tx_dma_setup;
   1278 		v7 += txr->q_tso_err;
   1279 	}
   1280 	adapter->efbig_tx_dma_setup.ev_count = v0;
   1281 	adapter->mbuf_defrag_failed.ev_count = v1;
   1282 	adapter->efbig2_tx_dma_setup.ev_count = v2;
   1283 	adapter->einval_tx_dma_setup.ev_count = v3;
   1284 	adapter->other_tx_dma_setup.ev_count = v4;
   1285 	adapter->eagain_tx_dma_setup.ev_count = v5;
   1286 	adapter->enomem_tx_dma_setup.ev_count = v6;
   1287 	adapter->tso_err.ev_count = v7;
   1288 
   1289 	/*
   1290 	 * Check the TX queues status
   1291 	 *	- mark hung queues so we don't schedule on them
   1292 	 *	- watchdog only if all queues show hung
   1293 	 */
   1294 	que = adapter->queues;
   1295 	for (i = 0; i < adapter->num_queues; i++, que++) {
   1296 		/* Keep track of queues with work for soft irq */
   1297 		if (que->txr->busy)
   1298 			queues |= ((u64)1 << que->me);
   1299 		/*
   1300 		 * Each time txeof runs without cleaning, but there
   1301 		 * are uncleaned descriptors it increments busy. If
   1302 		 * we get to the MAX we declare it hung.
   1303 		 */
   1304 		if (que->busy == IXGBE_QUEUE_HUNG) {
   1305 			++hung;
   1306 			/* Mark the queue as inactive */
   1307 			adapter->active_queues &= ~((u64)1 << que->me);
   1308 			continue;
   1309 		} else {
   1310 			/* Check if we've come back from hung */
   1311 			if ((adapter->active_queues & ((u64)1 << que->me)) == 0)
   1312 				adapter->active_queues |= ((u64)1 << que->me);
   1313 		}
   1314 		if (que->busy >= IXGBE_MAX_TX_BUSY) {
   1315 			device_printf(dev,
   1316 			    "Warning queue %d appears to be hung!\n", i);
   1317 			que->txr->busy = IXGBE_QUEUE_HUNG;
   1318 			++hung;
   1319 		}
   1320 	}
   1321 
   1322 	/* Only truly watchdog if all queues show hung */
   1323 	if (hung == adapter->num_queues)
   1324 		goto watchdog;
   1325 #if 0
   1326 	else if (queues != 0) { /* Force an IRQ on queues with work */
   1327 		ixv_rearm_queues(adapter, queues);
   1328 	}
   1329 #endif
   1330 
   1331 	callout_reset(&adapter->timer, hz, ixv_local_timer, adapter);
   1332 
   1333 	return;
   1334 
   1335 watchdog:
   1336 
   1337 	device_printf(adapter->dev, "Watchdog timeout -- resetting\n");
   1338 	adapter->ifp->if_flags &= ~IFF_RUNNING;
   1339 	adapter->watchdog_events.ev_count++;
   1340 	ixv_init_locked(adapter);
   1341 } /* ixv_local_timer */
   1342 
   1343 /************************************************************************
   1344  * ixv_update_link_status - Update OS on link state
   1345  *
   1346  * Note: Only updates the OS on the cached link state.
   1347  *	 The real check of the hardware only happens with
   1348  *	 a link interrupt.
   1349  ************************************************************************/
   1350 static void
   1351 ixv_update_link_status(struct adapter *adapter)
   1352 {
   1353 	struct ifnet *ifp = adapter->ifp;
   1354 	device_t     dev = adapter->dev;
   1355 
   1356 	KASSERT(mutex_owned(&adapter->core_mtx));
   1357 
   1358 	if (adapter->link_up) {
   1359 		if (adapter->link_active != LINK_STATE_UP) {
   1360 			if (bootverbose) {
   1361 				const char *bpsmsg;
   1362 
   1363 				switch (adapter->link_speed) {
   1364 				case IXGBE_LINK_SPEED_10GB_FULL:
   1365 					bpsmsg = "10 Gbps";
   1366 					break;
   1367 				case IXGBE_LINK_SPEED_5GB_FULL:
   1368 					bpsmsg = "5 Gbps";
   1369 					break;
   1370 				case IXGBE_LINK_SPEED_2_5GB_FULL:
   1371 					bpsmsg = "2.5 Gbps";
   1372 					break;
   1373 				case IXGBE_LINK_SPEED_1GB_FULL:
   1374 					bpsmsg = "1 Gbps";
   1375 					break;
   1376 				case IXGBE_LINK_SPEED_100_FULL:
   1377 					bpsmsg = "100 Mbps";
   1378 					break;
   1379 				case IXGBE_LINK_SPEED_10_FULL:
   1380 					bpsmsg = "10 Mbps";
   1381 					break;
   1382 				default:
   1383 					bpsmsg = "unknown speed";
   1384 					break;
   1385 				}
   1386 				device_printf(dev, "Link is up %s %s \n",
   1387 				    bpsmsg, "Full Duplex");
   1388 			}
   1389 			adapter->link_active = LINK_STATE_UP;
   1390 			if_link_state_change(ifp, LINK_STATE_UP);
   1391 		}
   1392 	} else {
   1393 		/*
   1394 		 * Do it when link active changes to DOWN. i.e.
   1395 		 * a) LINK_STATE_UNKNOWN -> LINK_STATE_DOWN
   1396 		 * b) LINK_STATE_UP	 -> LINK_STATE_DOWN
   1397 		 */
   1398 		if (adapter->link_active != LINK_STATE_DOWN) {
   1399 			if (bootverbose)
   1400 				device_printf(dev, "Link is Down\n");
   1401 			if_link_state_change(ifp, LINK_STATE_DOWN);
   1402 			adapter->link_active = LINK_STATE_DOWN;
   1403 		}
   1404 	}
   1405 } /* ixv_update_link_status */
   1406 
   1407 
   1408 /************************************************************************
   1409  * ixv_stop - Stop the hardware
   1410  *
   1411  *   Disables all traffic on the adapter by issuing a
   1412  *   global reset on the MAC and deallocates TX/RX buffers.
   1413  ************************************************************************/
   1414 static void
   1415 ixv_ifstop(struct ifnet *ifp, int disable)
   1416 {
   1417 	struct adapter *adapter = ifp->if_softc;
   1418 
   1419 	IXGBE_CORE_LOCK(adapter);
   1420 	ixv_stop(adapter);
   1421 	IXGBE_CORE_UNLOCK(adapter);
   1422 }
   1423 
   1424 static void
   1425 ixv_stop(void *arg)
   1426 {
   1427 	struct ifnet	*ifp;
   1428 	struct adapter	*adapter = arg;
   1429 	struct ixgbe_hw *hw = &adapter->hw;
   1430 
   1431 	ifp = adapter->ifp;
   1432 
   1433 	KASSERT(mutex_owned(&adapter->core_mtx));
   1434 
   1435 	INIT_DEBUGOUT("ixv_stop: begin\n");
   1436 	ixv_disable_intr(adapter);
   1437 
   1438 	/* Tell the stack that the interface is no longer active */
   1439 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
   1440 
   1441 	hw->mac.ops.reset_hw(hw);
   1442 	adapter->hw.adapter_stopped = FALSE;
   1443 	hw->mac.ops.stop_adapter(hw);
   1444 	callout_stop(&adapter->timer);
   1445 
   1446 	/* reprogram the RAR[0] in case user changed it. */
   1447 	hw->mac.ops.set_rar(hw, 0, hw->mac.addr, 0, IXGBE_RAH_AV);
   1448 
   1449 	return;
   1450 } /* ixv_stop */
   1451 
   1452 
   1453 /************************************************************************
   1454  * ixv_allocate_pci_resources
   1455  ************************************************************************/
   1456 static int
   1457 ixv_allocate_pci_resources(struct adapter *adapter,
   1458     const struct pci_attach_args *pa)
   1459 {
   1460 	pcireg_t	memtype, csr;
   1461 	device_t	dev = adapter->dev;
   1462 	bus_addr_t addr;
   1463 	int flags;
   1464 
   1465 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0));
   1466 	switch (memtype) {
   1467 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT:
   1468 	case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT:
   1469 		adapter->osdep.mem_bus_space_tag = pa->pa_memt;
   1470 		if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0),
   1471 		      memtype, &addr, &adapter->osdep.mem_size, &flags) != 0)
   1472 			goto map_err;
   1473 		if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) {
   1474 			aprint_normal_dev(dev, "clearing prefetchable bit\n");
   1475 			flags &= ~BUS_SPACE_MAP_PREFETCHABLE;
   1476 		}
   1477 		if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr,
   1478 		     adapter->osdep.mem_size, flags,
   1479 		     &adapter->osdep.mem_bus_space_handle) != 0) {
   1480 map_err:
   1481 			adapter->osdep.mem_size = 0;
   1482 			aprint_error_dev(dev, "unable to map BAR0\n");
   1483 			return ENXIO;
   1484 		}
   1485 		/*
   1486 		 * Enable address decoding for memory range in case it's not
   1487 		 * set.
   1488 		 */
   1489 		csr = pci_conf_read(pa->pa_pc, pa->pa_tag,
   1490 		    PCI_COMMAND_STATUS_REG);
   1491 		csr |= PCI_COMMAND_MEM_ENABLE;
   1492 		pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG,
   1493 		    csr);
   1494 		break;
   1495 	default:
   1496 		aprint_error_dev(dev, "unexpected type on BAR0\n");
   1497 		return ENXIO;
   1498 	}
   1499 
   1500 	/* Pick up the tuneable queues */
   1501 	adapter->num_queues = ixv_num_queues;
   1502 
   1503 	return (0);
   1504 } /* ixv_allocate_pci_resources */
   1505 
   1506 /************************************************************************
   1507  * ixv_free_pci_resources
   1508  ************************************************************************/
   1509 static void
   1510 ixv_free_pci_resources(struct adapter * adapter)
   1511 {
   1512 	struct		ix_queue *que = adapter->queues;
   1513 	int		rid;
   1514 
   1515 	/*
   1516 	 *  Release all msix queue resources:
   1517 	 */
   1518 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   1519 		if (que->res != NULL)
   1520 			pci_intr_disestablish(adapter->osdep.pc,
   1521 			    adapter->osdep.ihs[i]);
   1522 	}
   1523 
   1524 
   1525 	/* Clean the Mailbox interrupt last */
   1526 	rid = adapter->vector;
   1527 
   1528 	if (adapter->osdep.ihs[rid] != NULL) {
   1529 		pci_intr_disestablish(adapter->osdep.pc,
   1530 		    adapter->osdep.ihs[rid]);
   1531 		adapter->osdep.ihs[rid] = NULL;
   1532 	}
   1533 
   1534 	pci_intr_release(adapter->osdep.pc, adapter->osdep.intrs,
   1535 	    adapter->osdep.nintrs);
   1536 
   1537 	if (adapter->osdep.mem_size != 0) {
   1538 		bus_space_unmap(adapter->osdep.mem_bus_space_tag,
   1539 		    adapter->osdep.mem_bus_space_handle,
   1540 		    adapter->osdep.mem_size);
   1541 	}
   1542 
   1543 	return;
   1544 } /* ixv_free_pci_resources */
   1545 
   1546 /************************************************************************
   1547  * ixv_setup_interface
   1548  *
   1549  *   Setup networking device structure and register an interface.
   1550  ************************************************************************/
   1551 static int
   1552 ixv_setup_interface(device_t dev, struct adapter *adapter)
   1553 {
   1554 	struct ethercom *ec = &adapter->osdep.ec;
   1555 	struct ifnet   *ifp;
   1556 	int rv;
   1557 
   1558 	INIT_DEBUGOUT("ixv_setup_interface: begin");
   1559 
   1560 	ifp = adapter->ifp = &ec->ec_if;
   1561 	strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ);
   1562 	ifp->if_baudrate = IF_Gbps(10);
   1563 	ifp->if_init = ixv_init;
   1564 	ifp->if_stop = ixv_ifstop;
   1565 	ifp->if_softc = adapter;
   1566 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
   1567 #ifdef IXGBE_MPSAFE
   1568 	ifp->if_extflags = IFEF_MPSAFE;
   1569 #endif
   1570 	ifp->if_ioctl = ixv_ioctl;
   1571 	if (adapter->feat_en & IXGBE_FEATURE_LEGACY_TX) {
   1572 #if 0
   1573 		ixv_start_locked = ixgbe_legacy_start_locked;
   1574 #endif
   1575 	} else {
   1576 		ifp->if_transmit = ixgbe_mq_start;
   1577 #if 0
   1578 		ixv_start_locked = ixgbe_mq_start_locked;
   1579 #endif
   1580 	}
   1581 	ifp->if_start = ixgbe_legacy_start;
   1582 	IFQ_SET_MAXLEN(&ifp->if_snd, adapter->num_tx_desc - 2);
   1583 	IFQ_SET_READY(&ifp->if_snd);
   1584 
   1585 	rv = if_initialize(ifp);
   1586 	if (rv != 0) {
   1587 		aprint_error_dev(dev, "if_initialize failed(%d)\n", rv);
   1588 		return rv;
   1589 	}
   1590 	adapter->ipq = if_percpuq_create(&adapter->osdep.ec.ec_if);
   1591 	ether_ifattach(ifp, adapter->hw.mac.addr);
   1592 	aprint_normal_dev(dev, "Ethernet address %s\n",
   1593 	    ether_sprintf(adapter->hw.mac.addr));
   1594 	/*
   1595 	 * We use per TX queue softint, so if_deferred_start_init() isn't
   1596 	 * used.
   1597 	 */
   1598 	ether_set_ifflags_cb(ec, ixv_ifflags_cb);
   1599 
   1600 	adapter->max_frame_size = ifp->if_mtu + IXGBE_MTU_HDR;
   1601 
   1602 	/*
   1603 	 * Tell the upper layer(s) we support long frames.
   1604 	 */
   1605 	ifp->if_hdrlen = sizeof(struct ether_vlan_header);
   1606 
   1607 	/* Set capability flags */
   1608 	ifp->if_capabilities |= IFCAP_HWCSUM
   1609 			     |	IFCAP_TSOv4
   1610 			     |	IFCAP_TSOv6;
   1611 	ifp->if_capenable = 0;
   1612 
   1613 	ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER
   1614 			    |  ETHERCAP_VLAN_HWTAGGING
   1615 			    |  ETHERCAP_VLAN_HWCSUM
   1616 			    |  ETHERCAP_JUMBO_MTU
   1617 			    |  ETHERCAP_VLAN_MTU;
   1618 
   1619 	/* Enable the above capabilities by default */
   1620 	ec->ec_capenable = ec->ec_capabilities;
   1621 
   1622 	/* Don't enable LRO by default */
   1623 #if 0
   1624 	/* NetBSD doesn't support LRO yet */
   1625 	ifp->if_capabilities |= IFCAP_LRO;
   1626 #endif
   1627 
   1628 	/*
   1629 	 * Specify the media types supported by this adapter and register
   1630 	 * callbacks to update media and link information
   1631 	 */
   1632 	ec->ec_ifmedia = &adapter->media;
   1633 	ifmedia_init(&adapter->media, IFM_IMASK, ixv_media_change,
   1634 	    ixv_media_status);
   1635 	ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL);
   1636 	ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO);
   1637 
   1638 	if_register(ifp);
   1639 
   1640 	return 0;
   1641 } /* ixv_setup_interface */
   1642 
   1643 
   1644 /************************************************************************
   1645  * ixv_initialize_transmit_units - Enable transmit unit.
   1646  ************************************************************************/
   1647 static void
   1648 ixv_initialize_transmit_units(struct adapter *adapter)
   1649 {
   1650 	struct tx_ring	*txr = adapter->tx_rings;
   1651 	struct ixgbe_hw	*hw = &adapter->hw;
   1652 	int i;
   1653 
   1654 	for (i = 0; i < adapter->num_queues; i++, txr++) {
   1655 		u64 tdba = txr->txdma.dma_paddr;
   1656 		u32 txctrl, txdctl;
   1657 		int j = txr->me;
   1658 
   1659 		/* Set WTHRESH to 8, burst writeback */
   1660 		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
   1661 		txdctl |= (8 << 16);
   1662 		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
   1663 
   1664 		/* Set the HW Tx Head and Tail indices */
   1665 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDH(j), 0);
   1666 		IXGBE_WRITE_REG(&adapter->hw, IXGBE_VFTDT(j), 0);
   1667 
   1668 		/* Set Tx Tail register */
   1669 		txr->tail = IXGBE_VFTDT(j);
   1670 
   1671 		txr->txr_no_space = false;
   1672 
   1673 		/* Set Ring parameters */
   1674 		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAL(j),
   1675 		    (tdba & 0x00000000ffffffffULL));
   1676 		IXGBE_WRITE_REG(hw, IXGBE_VFTDBAH(j), (tdba >> 32));
   1677 		IXGBE_WRITE_REG(hw, IXGBE_VFTDLEN(j),
   1678 		    adapter->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc));
   1679 		txctrl = IXGBE_READ_REG(hw, IXGBE_VFDCA_TXCTRL(j));
   1680 		txctrl &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
   1681 		IXGBE_WRITE_REG(hw, IXGBE_VFDCA_TXCTRL(j), txctrl);
   1682 
   1683 		/* Now enable */
   1684 		txdctl = IXGBE_READ_REG(hw, IXGBE_VFTXDCTL(j));
   1685 		txdctl |= IXGBE_TXDCTL_ENABLE;
   1686 		IXGBE_WRITE_REG(hw, IXGBE_VFTXDCTL(j), txdctl);
   1687 	}
   1688 
   1689 	return;
   1690 } /* ixv_initialize_transmit_units */
   1691 
   1692 
   1693 /************************************************************************
   1694  * ixv_initialize_rss_mapping
   1695  ************************************************************************/
   1696 static void
   1697 ixv_initialize_rss_mapping(struct adapter *adapter)
   1698 {
   1699 	struct ixgbe_hw *hw = &adapter->hw;
   1700 	u32		reta = 0, mrqc, rss_key[10];
   1701 	int		queue_id;
   1702 	int		i, j;
   1703 	u32		rss_hash_config;
   1704 
   1705 	/* force use default RSS key. */
   1706 #ifdef __NetBSD__
   1707 	rss_getkey((uint8_t *) &rss_key);
   1708 #else
   1709 	if (adapter->feat_en & IXGBE_FEATURE_RSS) {
   1710 		/* Fetch the configured RSS key */
   1711 		rss_getkey((uint8_t *)&rss_key);
   1712 	} else {
   1713 		/* set up random bits */
   1714 		cprng_fast(&rss_key, sizeof(rss_key));
   1715 	}
   1716 #endif
   1717 
   1718 	/* Now fill out hash function seeds */
   1719 	for (i = 0; i < 10; i++)
   1720 		IXGBE_WRITE_REG(hw, IXGBE_VFRSSRK(i), rss_key[i]);
   1721 
   1722 	/* Set up the redirection table */
   1723 	for (i = 0, j = 0; i < 64; i++, j++) {
   1724 		if (j == adapter->num_queues)
   1725 			j = 0;
   1726 
   1727 		if (adapter->feat_en & IXGBE_FEATURE_RSS) {
   1728 			/*
   1729 			 * Fetch the RSS bucket id for the given indirection
   1730 			 * entry. Cap it at the number of configured buckets
   1731 			 * (which is num_queues.)
   1732 			 */
   1733 			queue_id = rss_get_indirection_to_bucket(i);
   1734 			queue_id = queue_id % adapter->num_queues;
   1735 		} else
   1736 			queue_id = j;
   1737 
   1738 		/*
   1739 		 * The low 8 bits are for hash value (n+0);
   1740 		 * The next 8 bits are for hash value (n+1), etc.
   1741 		 */
   1742 		reta >>= 8;
   1743 		reta |= ((uint32_t)queue_id) << 24;
   1744 		if ((i & 3) == 3) {
   1745 			IXGBE_WRITE_REG(hw, IXGBE_VFRETA(i >> 2), reta);
   1746 			reta = 0;
   1747 		}
   1748 	}
   1749 
   1750 	/* Perform hash on these packet types */
   1751 	if (adapter->feat_en & IXGBE_FEATURE_RSS)
   1752 		rss_hash_config = rss_gethashconfig();
   1753 	else {
   1754 		/*
   1755 		 * Disable UDP - IP fragments aren't currently being handled
   1756 		 * and so we end up with a mix of 2-tuple and 4-tuple
   1757 		 * traffic.
   1758 		 */
   1759 		rss_hash_config = RSS_HASHTYPE_RSS_IPV4
   1760 				| RSS_HASHTYPE_RSS_TCP_IPV4
   1761 				| RSS_HASHTYPE_RSS_IPV6
   1762 				| RSS_HASHTYPE_RSS_TCP_IPV6;
   1763 	}
   1764 
   1765 	mrqc = IXGBE_MRQC_RSSEN;
   1766 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV4)
   1767 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4;
   1768 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV4)
   1769 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_TCP;
   1770 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6)
   1771 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6;
   1772 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6)
   1773 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_TCP;
   1774 	if (rss_hash_config & RSS_HASHTYPE_RSS_IPV6_EX)
   1775 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_IPV6_EX defined, but not supported\n",
   1776 		    __func__);
   1777 	if (rss_hash_config & RSS_HASHTYPE_RSS_TCP_IPV6_EX)
   1778 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_TCP_IPV6_EX defined, but not supported\n",
   1779 		    __func__);
   1780 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV4)
   1781 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV4_UDP;
   1782 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6)
   1783 		mrqc |= IXGBE_MRQC_RSS_FIELD_IPV6_UDP;
   1784 	if (rss_hash_config & RSS_HASHTYPE_RSS_UDP_IPV6_EX)
   1785 		device_printf(adapter->dev, "%s: RSS_HASHTYPE_RSS_UDP_IPV6_EX defined, but not supported\n",
   1786 		    __func__);
   1787 	IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, mrqc);
   1788 } /* ixv_initialize_rss_mapping */
   1789 
   1790 
   1791 /************************************************************************
   1792  * ixv_initialize_receive_units - Setup receive registers and features.
   1793  ************************************************************************/
   1794 static void
   1795 ixv_initialize_receive_units(struct adapter *adapter)
   1796 {
   1797 	struct	rx_ring	*rxr = adapter->rx_rings;
   1798 	struct ixgbe_hw	*hw = &adapter->hw;
   1799 	struct ifnet	*ifp = adapter->ifp;
   1800 	u32		bufsz, psrtype;
   1801 
   1802 	if (ifp->if_mtu > ETHERMTU)
   1803 		bufsz = 4096 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
   1804 	else
   1805 		bufsz = 2048 >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
   1806 
   1807 	psrtype = IXGBE_PSRTYPE_TCPHDR
   1808 		| IXGBE_PSRTYPE_UDPHDR
   1809 		| IXGBE_PSRTYPE_IPV4HDR
   1810 		| IXGBE_PSRTYPE_IPV6HDR
   1811 		| IXGBE_PSRTYPE_L2HDR;
   1812 
   1813 	if (adapter->num_queues > 1)
   1814 		psrtype |= 1 << 29;
   1815 
   1816 	IXGBE_WRITE_REG(hw, IXGBE_VFPSRTYPE, psrtype);
   1817 
   1818 	/* Tell PF our max_frame size */
   1819 	if (ixgbevf_rlpml_set_vf(hw, adapter->max_frame_size) != 0) {
   1820 		device_printf(adapter->dev, "There is a problem with the PF setup.  It is likely the receive unit for this VF will not function correctly.\n");
   1821 	}
   1822 
   1823 	for (int i = 0; i < adapter->num_queues; i++, rxr++) {
   1824 		u64 rdba = rxr->rxdma.dma_paddr;
   1825 		u32 reg, rxdctl;
   1826 		int j = rxr->me;
   1827 
   1828 		/* Disable the queue */
   1829 		rxdctl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j));
   1830 		rxdctl &= ~IXGBE_RXDCTL_ENABLE;
   1831 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
   1832 		for (int k = 0; k < 10; k++) {
   1833 			if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
   1834 			    IXGBE_RXDCTL_ENABLE)
   1835 				msec_delay(1);
   1836 			else
   1837 				break;
   1838 		}
   1839 		IXGBE_WRITE_BARRIER(hw);
   1840 		/* Setup the Base and Length of the Rx Descriptor Ring */
   1841 		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAL(j),
   1842 		    (rdba & 0x00000000ffffffffULL));
   1843 		IXGBE_WRITE_REG(hw, IXGBE_VFRDBAH(j), (rdba >> 32));
   1844 		IXGBE_WRITE_REG(hw, IXGBE_VFRDLEN(j),
   1845 		    adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc));
   1846 
   1847 		/* Reset the ring indices */
   1848 		IXGBE_WRITE_REG(hw, IXGBE_VFRDH(rxr->me), 0);
   1849 		IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), 0);
   1850 
   1851 		/* Set up the SRRCTL register */
   1852 		reg = IXGBE_READ_REG(hw, IXGBE_VFSRRCTL(j));
   1853 		reg &= ~IXGBE_SRRCTL_BSIZEHDR_MASK;
   1854 		reg &= ~IXGBE_SRRCTL_BSIZEPKT_MASK;
   1855 		reg |= bufsz;
   1856 		reg |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
   1857 		IXGBE_WRITE_REG(hw, IXGBE_VFSRRCTL(j), reg);
   1858 
   1859 		/* Capture Rx Tail index */
   1860 		rxr->tail = IXGBE_VFRDT(rxr->me);
   1861 
   1862 		/* Do the queue enabling last */
   1863 		rxdctl |= IXGBE_RXDCTL_ENABLE | IXGBE_RXDCTL_VME;
   1864 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(j), rxdctl);
   1865 		for (int k = 0; k < 10; k++) {
   1866 			if (IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(j)) &
   1867 			    IXGBE_RXDCTL_ENABLE)
   1868 				break;
   1869 			msec_delay(1);
   1870 		}
   1871 		IXGBE_WRITE_BARRIER(hw);
   1872 
   1873 		/* Set the Tail Pointer */
   1874 #ifdef DEV_NETMAP
   1875 		/*
   1876 		 * In netmap mode, we must preserve the buffers made
   1877 		 * available to userspace before the if_init()
   1878 		 * (this is true by default on the TX side, because
   1879 		 * init makes all buffers available to userspace).
   1880 		 *
   1881 		 * netmap_reset() and the device specific routines
   1882 		 * (e.g. ixgbe_setup_receive_rings()) map these
   1883 		 * buffers at the end of the NIC ring, so here we
   1884 		 * must set the RDT (tail) register to make sure
   1885 		 * they are not overwritten.
   1886 		 *
   1887 		 * In this driver the NIC ring starts at RDH = 0,
   1888 		 * RDT points to the last slot available for reception (?),
   1889 		 * so RDT = num_rx_desc - 1 means the whole ring is available.
   1890 		 */
   1891 		if ((adapter->feat_en & IXGBE_FEATURE_NETMAP) &&
   1892 		    (ifp->if_capenable & IFCAP_NETMAP)) {
   1893 			struct netmap_adapter *na = NA(adapter->ifp);
   1894 			struct netmap_kring *kring = na->rx_rings[i];
   1895 			int t = na->num_rx_desc - 1 - nm_kr_rxspace(kring);
   1896 
   1897 			IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me), t);
   1898 		} else
   1899 #endif /* DEV_NETMAP */
   1900 			IXGBE_WRITE_REG(hw, IXGBE_VFRDT(rxr->me),
   1901 			    adapter->num_rx_desc - 1);
   1902 	}
   1903 
   1904 	if (adapter->hw.mac.type >= ixgbe_mac_X550_vf)
   1905 		ixv_initialize_rss_mapping(adapter);
   1906 } /* ixv_initialize_receive_units */
   1907 
   1908 /************************************************************************
   1909  * ixv_sysctl_tdh_handler - Transmit Descriptor Head handler function
   1910  *
   1911  *   Retrieves the TDH value from the hardware
   1912  ************************************************************************/
   1913 static int
   1914 ixv_sysctl_tdh_handler(SYSCTLFN_ARGS)
   1915 {
   1916 	struct sysctlnode node = *rnode;
   1917 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
   1918 	uint32_t val;
   1919 
   1920 	if (!txr)
   1921 		return (0);
   1922 
   1923 	val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDH(txr->me));
   1924 	node.sysctl_data = &val;
   1925 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   1926 } /* ixv_sysctl_tdh_handler */
   1927 
   1928 /************************************************************************
   1929  * ixgbe_sysctl_tdt_handler - Transmit Descriptor Tail handler function
   1930  *
   1931  *   Retrieves the TDT value from the hardware
   1932  ************************************************************************/
   1933 static int
   1934 ixv_sysctl_tdt_handler(SYSCTLFN_ARGS)
   1935 {
   1936 	struct sysctlnode node = *rnode;
   1937 	struct tx_ring *txr = (struct tx_ring *)node.sysctl_data;
   1938 	uint32_t val;
   1939 
   1940 	if (!txr)
   1941 		return (0);
   1942 
   1943 	val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_VFTDT(txr->me));
   1944 	node.sysctl_data = &val;
   1945 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   1946 } /* ixv_sysctl_tdt_handler */
   1947 
   1948 /************************************************************************
   1949  * ixv_sysctl_next_to_check_handler - Receive Descriptor next to check
   1950  * handler function
   1951  *
   1952  *   Retrieves the next_to_check value
   1953  ************************************************************************/
   1954 static int
   1955 ixv_sysctl_next_to_check_handler(SYSCTLFN_ARGS)
   1956 {
   1957 	struct sysctlnode node = *rnode;
   1958 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   1959 	uint32_t val;
   1960 
   1961 	if (!rxr)
   1962 		return (0);
   1963 
   1964 	val = rxr->next_to_check;
   1965 	node.sysctl_data = &val;
   1966 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   1967 } /* ixv_sysctl_next_to_check_handler */
   1968 
   1969 /************************************************************************
   1970  * ixv_sysctl_rdh_handler - Receive Descriptor Head handler function
   1971  *
   1972  *   Retrieves the RDH value from the hardware
   1973  ************************************************************************/
   1974 static int
   1975 ixv_sysctl_rdh_handler(SYSCTLFN_ARGS)
   1976 {
   1977 	struct sysctlnode node = *rnode;
   1978 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   1979 	uint32_t val;
   1980 
   1981 	if (!rxr)
   1982 		return (0);
   1983 
   1984 	val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDH(rxr->me));
   1985 	node.sysctl_data = &val;
   1986 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   1987 } /* ixv_sysctl_rdh_handler */
   1988 
   1989 /************************************************************************
   1990  * ixv_sysctl_rdt_handler - Receive Descriptor Tail handler function
   1991  *
   1992  *   Retrieves the RDT value from the hardware
   1993  ************************************************************************/
   1994 static int
   1995 ixv_sysctl_rdt_handler(SYSCTLFN_ARGS)
   1996 {
   1997 	struct sysctlnode node = *rnode;
   1998 	struct rx_ring *rxr = (struct rx_ring *)node.sysctl_data;
   1999 	uint32_t val;
   2000 
   2001 	if (!rxr)
   2002 		return (0);
   2003 
   2004 	val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_VFRDT(rxr->me));
   2005 	node.sysctl_data = &val;
   2006 	return sysctl_lookup(SYSCTLFN_CALL(&node));
   2007 } /* ixv_sysctl_rdt_handler */
   2008 
   2009 static void
   2010 ixv_setup_vlan_tagging(struct adapter *adapter)
   2011 {
   2012 	struct ethercom *ec = &adapter->osdep.ec;
   2013 	struct ixgbe_hw *hw = &adapter->hw;
   2014 	struct rx_ring	*rxr;
   2015 	u32		ctrl;
   2016 	int		i;
   2017 	bool		hwtagging;
   2018 
   2019 	/* Enable HW tagging only if any vlan is attached */
   2020 	hwtagging = (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING)
   2021 	    && VLAN_ATTACHED(ec);
   2022 
   2023 	/* Enable the queues */
   2024 	for (i = 0; i < adapter->num_queues; i++) {
   2025 		rxr = &adapter->rx_rings[i];
   2026 		ctrl = IXGBE_READ_REG(hw, IXGBE_VFRXDCTL(rxr->me));
   2027 		if (hwtagging)
   2028 			ctrl |= IXGBE_RXDCTL_VME;
   2029 		else
   2030 			ctrl &= ~IXGBE_RXDCTL_VME;
   2031 		IXGBE_WRITE_REG(hw, IXGBE_VFRXDCTL(rxr->me), ctrl);
   2032 		/*
   2033 		 * Let Rx path know that it needs to store VLAN tag
   2034 		 * as part of extra mbuf info.
   2035 		 */
   2036 		rxr->vtag_strip = hwtagging ? TRUE : FALSE;
   2037 	}
   2038 } /* ixv_setup_vlan_tagging */
   2039 
   2040 /************************************************************************
   2041  * ixv_setup_vlan_support
   2042  ************************************************************************/
   2043 static int
   2044 ixv_setup_vlan_support(struct adapter *adapter)
   2045 {
   2046 	struct ethercom *ec = &adapter->osdep.ec;
   2047 	struct ixgbe_hw *hw = &adapter->hw;
   2048 	u32		vid, vfta, retry;
   2049 	struct vlanid_list *vlanidp;
   2050 	int rv, error = 0;
   2051 
   2052 	/*
   2053 	 *  This function is called from both if_init and ifflags_cb()
   2054 	 * on NetBSD.
   2055 	 */
   2056 
   2057 	/*
   2058 	 * Part 1:
   2059 	 * Setup VLAN HW tagging
   2060 	 */
   2061 	ixv_setup_vlan_tagging(adapter);
   2062 
   2063 	if (!VLAN_ATTACHED(ec))
   2064 		return 0;
   2065 
   2066 	/*
   2067 	 * Part 2:
   2068 	 * Setup VLAN HW filter
   2069 	 */
   2070 	/* Cleanup shadow_vfta */
   2071 	for (int i = 0; i < IXGBE_VFTA_SIZE; i++)
   2072 		adapter->shadow_vfta[i] = 0;
   2073 	/* Generate shadow_vfta from ec_vids */
   2074 	ETHER_LOCK(ec);
   2075 	SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
   2076 		uint32_t idx;
   2077 
   2078 		idx = vlanidp->vid / 32;
   2079 		KASSERT(idx < IXGBE_VFTA_SIZE);
   2080 		adapter->shadow_vfta[idx] |= (u32)1 << (vlanidp->vid % 32);
   2081 	}
   2082 	ETHER_UNLOCK(ec);
   2083 
   2084 	/*
   2085 	 * A soft reset zero's out the VFTA, so
   2086 	 * we need to repopulate it now.
   2087 	 */
   2088 	for (int i = 0; i < IXGBE_VFTA_SIZE; i++) {
   2089 		if (adapter->shadow_vfta[i] == 0)
   2090 			continue;
   2091 		vfta = adapter->shadow_vfta[i];
   2092 		/*
   2093 		 * Reconstruct the vlan id's
   2094 		 * based on the bits set in each
   2095 		 * of the array ints.
   2096 		 */
   2097 		for (int j = 0; j < 32; j++) {
   2098 			retry = 0;
   2099 			if ((vfta & ((u32)1 << j)) == 0)
   2100 				continue;
   2101 			vid = (i * 32) + j;
   2102 
   2103 			/* Call the shared code mailbox routine */
   2104 			while ((rv = hw->mac.ops.set_vfta(hw, vid, 0, TRUE,
   2105 			    FALSE)) != 0) {
   2106 				if (++retry > 5) {
   2107 					device_printf(adapter->dev,
   2108 					    "%s: max retry exceeded\n",
   2109 						__func__);
   2110 					break;
   2111 				}
   2112 			}
   2113 			if (rv != 0) {
   2114 				device_printf(adapter->dev,
   2115 				    "failed to set vlan %d\n", vid);
   2116 				error = EACCES;
   2117 			}
   2118 		}
   2119 	}
   2120 	return error;
   2121 } /* ixv_setup_vlan_support */
   2122 
   2123 static int
   2124 ixv_vlan_cb(struct ethercom *ec, uint16_t vid, bool set)
   2125 {
   2126 	struct ifnet *ifp = &ec->ec_if;
   2127 	struct adapter *adapter = ifp->if_softc;
   2128 	int rv;
   2129 
   2130 	if (set)
   2131 		rv = ixv_register_vlan(adapter, vid);
   2132 	else
   2133 		rv = ixv_unregister_vlan(adapter, vid);
   2134 
   2135 	if (rv != 0)
   2136 		return rv;
   2137 
   2138 	/*
   2139 	 * Control VLAN HW tagging when ec_nvlan is changed from 1 to 0
   2140 	 * or 0 to 1.
   2141 	 */
   2142 	if ((set && (ec->ec_nvlans == 1)) || (!set && (ec->ec_nvlans == 0)))
   2143 		ixv_setup_vlan_tagging(adapter);
   2144 
   2145 	return rv;
   2146 }
   2147 
   2148 /************************************************************************
   2149  * ixv_register_vlan
   2150  *
   2151  *   Run via a vlan config EVENT, it enables us to use the
   2152  *   HW Filter table since we can get the vlan id. This just
   2153  *   creates the entry in the soft version of the VFTA, init
   2154  *   will repopulate the real table.
   2155  ************************************************************************/
   2156 static int
   2157 ixv_register_vlan(struct adapter *adapter, u16 vtag)
   2158 {
   2159 	struct ixgbe_hw *hw = &adapter->hw;
   2160 	u16		index, bit;
   2161 	int error;
   2162 
   2163 	if ((vtag == 0) || (vtag > 4095)) /* Invalid */
   2164 		return EINVAL;
   2165 	IXGBE_CORE_LOCK(adapter);
   2166 	index = (vtag >> 5) & 0x7F;
   2167 	bit = vtag & 0x1F;
   2168 	adapter->shadow_vfta[index] |= ((u32)1 << bit);
   2169 	error = hw->mac.ops.set_vfta(hw, vtag, 0, true, false);
   2170 	IXGBE_CORE_UNLOCK(adapter);
   2171 
   2172 	if (error != 0) {
   2173 		device_printf(adapter->dev, "failed to register vlan %hu\n",
   2174 		    vtag);
   2175 		error = EACCES;
   2176 	}
   2177 	return error;
   2178 } /* ixv_register_vlan */
   2179 
   2180 /************************************************************************
   2181  * ixv_unregister_vlan
   2182  *
   2183  *   Run via a vlan unconfig EVENT, remove our entry
   2184  *   in the soft vfta.
   2185  ************************************************************************/
   2186 static int
   2187 ixv_unregister_vlan(struct adapter *adapter, u16 vtag)
   2188 {
   2189 	struct ixgbe_hw *hw = &adapter->hw;
   2190 	u16		index, bit;
   2191 	int		error;
   2192 
   2193 	if ((vtag == 0) || (vtag > 4095))  /* Invalid */
   2194 		return EINVAL;
   2195 
   2196 	IXGBE_CORE_LOCK(adapter);
   2197 	index = (vtag >> 5) & 0x7F;
   2198 	bit = vtag & 0x1F;
   2199 	adapter->shadow_vfta[index] &= ~((u32)1 << bit);
   2200 	error = hw->mac.ops.set_vfta(hw, vtag, 0, false, false);
   2201 	IXGBE_CORE_UNLOCK(adapter);
   2202 
   2203 	if (error != 0) {
   2204 		device_printf(adapter->dev, "failed to unregister vlan %hu\n",
   2205 		    vtag);
   2206 		error = EIO;
   2207 	}
   2208 	return error;
   2209 } /* ixv_unregister_vlan */
   2210 
   2211 /************************************************************************
   2212  * ixv_enable_intr
   2213  ************************************************************************/
   2214 static void
   2215 ixv_enable_intr(struct adapter *adapter)
   2216 {
   2217 	struct ixgbe_hw *hw = &adapter->hw;
   2218 	struct ix_queue *que = adapter->queues;
   2219 	u32		mask;
   2220 	int i;
   2221 
   2222 	/* For VTEIAC */
   2223 	mask = (1 << adapter->vector);
   2224 	for (i = 0; i < adapter->num_queues; i++, que++)
   2225 		mask |= (1 << que->msix);
   2226 	IXGBE_WRITE_REG(hw, IXGBE_VTEIAC, mask);
   2227 
   2228 	/* For VTEIMS */
   2229 	IXGBE_WRITE_REG(hw, IXGBE_VTEIMS, (1 << adapter->vector));
   2230 	que = adapter->queues;
   2231 	for (i = 0; i < adapter->num_queues; i++, que++)
   2232 		ixv_enable_queue(adapter, que->msix);
   2233 
   2234 	IXGBE_WRITE_FLUSH(hw);
   2235 } /* ixv_enable_intr */
   2236 
   2237 /************************************************************************
   2238  * ixv_disable_intr
   2239  ************************************************************************/
   2240 static void
   2241 ixv_disable_intr(struct adapter *adapter)
   2242 {
   2243 	struct ix_queue	*que = adapter->queues;
   2244 
   2245 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIAC, 0);
   2246 
   2247 	/* disable interrupts other than queues */
   2248 	IXGBE_WRITE_REG(&adapter->hw, IXGBE_VTEIMC, adapter->vector);
   2249 
   2250 	for (int i = 0; i < adapter->num_queues; i++, que++)
   2251 		ixv_disable_queue(adapter, que->msix);
   2252 
   2253 	IXGBE_WRITE_FLUSH(&adapter->hw);
   2254 } /* ixv_disable_intr */
   2255 
   2256 /************************************************************************
   2257  * ixv_set_ivar
   2258  *
   2259  *   Setup the correct IVAR register for a particular MSI-X interrupt
   2260  *    - entry is the register array entry
   2261  *    - vector is the MSI-X vector for this queue
   2262  *    - type is RX/TX/MISC
   2263  ************************************************************************/
   2264 static void
   2265 ixv_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type)
   2266 {
   2267 	struct ixgbe_hw *hw = &adapter->hw;
   2268 	u32		ivar, index;
   2269 
   2270 	vector |= IXGBE_IVAR_ALLOC_VAL;
   2271 
   2272 	if (type == -1) { /* MISC IVAR */
   2273 		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR_MISC);
   2274 		ivar &= ~0xFF;
   2275 		ivar |= vector;
   2276 		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR_MISC, ivar);
   2277 	} else {	  /* RX/TX IVARS */
   2278 		index = (16 * (entry & 1)) + (8 * type);
   2279 		ivar = IXGBE_READ_REG(hw, IXGBE_VTIVAR(entry >> 1));
   2280 		ivar &= ~(0xffUL << index);
   2281 		ivar |= ((u32)vector << index);
   2282 		IXGBE_WRITE_REG(hw, IXGBE_VTIVAR(entry >> 1), ivar);
   2283 	}
   2284 } /* ixv_set_ivar */
   2285 
   2286 /************************************************************************
   2287  * ixv_configure_ivars
   2288  ************************************************************************/
   2289 static void
   2290 ixv_configure_ivars(struct adapter *adapter)
   2291 {
   2292 	struct ix_queue *que = adapter->queues;
   2293 
   2294 	/* XXX We should sync EITR value calculation with ixgbe.c? */
   2295 
   2296 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   2297 		/* First the RX queue entry */
   2298 		ixv_set_ivar(adapter, i, que->msix, 0);
   2299 		/* ... and the TX */
   2300 		ixv_set_ivar(adapter, i, que->msix, 1);
   2301 		/* Set an initial value in EITR */
   2302 		ixv_eitr_write(adapter, que->msix, IXGBE_EITR_DEFAULT);
   2303 	}
   2304 
   2305 	/* For the mailbox interrupt */
   2306 	ixv_set_ivar(adapter, 1, adapter->vector, -1);
   2307 } /* ixv_configure_ivars */
   2308 
   2309 
   2310 /************************************************************************
   2311  * ixv_save_stats
   2312  *
   2313  *   The VF stats registers never have a truly virgin
   2314  *   starting point, so this routine tries to make an
   2315  *   artificial one, marking ground zero on attach as
   2316  *   it were.
   2317  ************************************************************************/
   2318 static void
   2319 ixv_save_stats(struct adapter *adapter)
   2320 {
   2321 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
   2322 
   2323 	if (stats->vfgprc.ev_count || stats->vfgptc.ev_count) {
   2324 		stats->saved_reset_vfgprc +=
   2325 		    stats->vfgprc.ev_count - stats->base_vfgprc;
   2326 		stats->saved_reset_vfgptc +=
   2327 		    stats->vfgptc.ev_count - stats->base_vfgptc;
   2328 		stats->saved_reset_vfgorc +=
   2329 		    stats->vfgorc.ev_count - stats->base_vfgorc;
   2330 		stats->saved_reset_vfgotc +=
   2331 		    stats->vfgotc.ev_count - stats->base_vfgotc;
   2332 		stats->saved_reset_vfmprc +=
   2333 		    stats->vfmprc.ev_count - stats->base_vfmprc;
   2334 	}
   2335 } /* ixv_save_stats */
   2336 
   2337 /************************************************************************
   2338  * ixv_init_stats
   2339  ************************************************************************/
   2340 static void
   2341 ixv_init_stats(struct adapter *adapter)
   2342 {
   2343 	struct ixgbe_hw *hw = &adapter->hw;
   2344 
   2345 	adapter->stats.vf.last_vfgprc = IXGBE_READ_REG(hw, IXGBE_VFGPRC);
   2346 	adapter->stats.vf.last_vfgorc = IXGBE_READ_REG(hw, IXGBE_VFGORC_LSB);
   2347 	adapter->stats.vf.last_vfgorc |=
   2348 	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGORC_MSB))) << 32);
   2349 
   2350 	adapter->stats.vf.last_vfgptc = IXGBE_READ_REG(hw, IXGBE_VFGPTC);
   2351 	adapter->stats.vf.last_vfgotc = IXGBE_READ_REG(hw, IXGBE_VFGOTC_LSB);
   2352 	adapter->stats.vf.last_vfgotc |=
   2353 	    (((u64)(IXGBE_READ_REG(hw, IXGBE_VFGOTC_MSB))) << 32);
   2354 
   2355 	adapter->stats.vf.last_vfmprc = IXGBE_READ_REG(hw, IXGBE_VFMPRC);
   2356 
   2357 	adapter->stats.vf.base_vfgprc = adapter->stats.vf.last_vfgprc;
   2358 	adapter->stats.vf.base_vfgorc = adapter->stats.vf.last_vfgorc;
   2359 	adapter->stats.vf.base_vfgptc = adapter->stats.vf.last_vfgptc;
   2360 	adapter->stats.vf.base_vfgotc = adapter->stats.vf.last_vfgotc;
   2361 	adapter->stats.vf.base_vfmprc = adapter->stats.vf.last_vfmprc;
   2362 } /* ixv_init_stats */
   2363 
   2364 #define UPDATE_STAT_32(reg, last, count)		\
   2365 {							\
   2366 	u32 current = IXGBE_READ_REG(hw, (reg));	\
   2367 	if (current < (last))				\
   2368 		count.ev_count += 0x100000000LL;	\
   2369 	(last) = current;				\
   2370 	count.ev_count &= 0xFFFFFFFF00000000LL;		\
   2371 	count.ev_count |= current;			\
   2372 }
   2373 
   2374 #define UPDATE_STAT_36(lsb, msb, last, count)		\
   2375 {							\
   2376 	u64 cur_lsb = IXGBE_READ_REG(hw, (lsb));	\
   2377 	u64 cur_msb = IXGBE_READ_REG(hw, (msb));	\
   2378 	u64 current = ((cur_msb << 32) | cur_lsb);	\
   2379 	if (current < (last))				\
   2380 		count.ev_count += 0x1000000000LL;	\
   2381 	(last) = current;				\
   2382 	count.ev_count &= 0xFFFFFFF000000000LL;		\
   2383 	count.ev_count |= current;			\
   2384 }
   2385 
   2386 /************************************************************************
   2387  * ixv_update_stats - Update the board statistics counters.
   2388  ************************************************************************/
   2389 void
   2390 ixv_update_stats(struct adapter *adapter)
   2391 {
   2392 	struct ixgbe_hw *hw = &adapter->hw;
   2393 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
   2394 
   2395 	UPDATE_STAT_32(IXGBE_VFGPRC, stats->last_vfgprc, stats->vfgprc);
   2396 	UPDATE_STAT_32(IXGBE_VFGPTC, stats->last_vfgptc, stats->vfgptc);
   2397 	UPDATE_STAT_36(IXGBE_VFGORC_LSB, IXGBE_VFGORC_MSB, stats->last_vfgorc,
   2398 	    stats->vfgorc);
   2399 	UPDATE_STAT_36(IXGBE_VFGOTC_LSB, IXGBE_VFGOTC_MSB, stats->last_vfgotc,
   2400 	    stats->vfgotc);
   2401 	UPDATE_STAT_32(IXGBE_VFMPRC, stats->last_vfmprc, stats->vfmprc);
   2402 
   2403 	/* Fill out the OS statistics structure */
   2404 	/*
   2405 	 * NetBSD: Don't override if_{i|o}{packets|bytes|mcasts} with
   2406 	 * adapter->stats counters. It's required to make ifconfig -z
   2407 	 * (SOICZIFDATA) work.
   2408 	 */
   2409 } /* ixv_update_stats */
   2410 
   2411 /************************************************************************
   2412  * ixv_sysctl_interrupt_rate_handler
   2413  ************************************************************************/
   2414 static int
   2415 ixv_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS)
   2416 {
   2417 	struct sysctlnode node = *rnode;
   2418 	struct ix_queue *que = (struct ix_queue *)node.sysctl_data;
   2419 	struct adapter	*adapter = que->adapter;
   2420 	uint32_t reg, usec, rate;
   2421 	int error;
   2422 
   2423 	if (que == NULL)
   2424 		return 0;
   2425 	reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_VTEITR(que->msix));
   2426 	usec = ((reg & 0x0FF8) >> 3);
   2427 	if (usec > 0)
   2428 		rate = 500000 / usec;
   2429 	else
   2430 		rate = 0;
   2431 	node.sysctl_data = &rate;
   2432 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   2433 	if (error || newp == NULL)
   2434 		return error;
   2435 	reg &= ~0xfff; /* default, no limitation */
   2436 	if (rate > 0 && rate < 500000) {
   2437 		if (rate < 1000)
   2438 			rate = 1000;
   2439 		reg |= ((4000000/rate) & 0xff8);
   2440 		/*
   2441 		 * When RSC is used, ITR interval must be larger than
   2442 		 * RSC_DELAY. Currently, we use 2us for RSC_DELAY.
   2443 		 * The minimum value is always greater than 2us on 100M
   2444 		 * (and 10M?(not documented)), but it's not on 1G and higher.
   2445 		 */
   2446 		if ((adapter->link_speed != IXGBE_LINK_SPEED_100_FULL)
   2447 		    && (adapter->link_speed != IXGBE_LINK_SPEED_10_FULL)) {
   2448 			if ((adapter->num_queues > 1)
   2449 			    && (reg < IXGBE_MIN_RSC_EITR_10G1G))
   2450 				return EINVAL;
   2451 		}
   2452 		ixv_max_interrupt_rate = rate;
   2453 	} else
   2454 		ixv_max_interrupt_rate = 0;
   2455 	ixv_eitr_write(adapter, que->msix, reg);
   2456 
   2457 	return (0);
   2458 } /* ixv_sysctl_interrupt_rate_handler */
   2459 
   2460 const struct sysctlnode *
   2461 ixv_sysctl_instance(struct adapter *adapter)
   2462 {
   2463 	const char *dvname;
   2464 	struct sysctllog **log;
   2465 	int rc;
   2466 	const struct sysctlnode *rnode;
   2467 
   2468 	log = &adapter->sysctllog;
   2469 	dvname = device_xname(adapter->dev);
   2470 
   2471 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
   2472 	    0, CTLTYPE_NODE, dvname,
   2473 	    SYSCTL_DESCR("ixv information and settings"),
   2474 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL)) != 0)
   2475 		goto err;
   2476 
   2477 	return rnode;
   2478 err:
   2479 	device_printf(adapter->dev,
   2480 	    "%s: sysctl_createv failed, rc = %d\n", __func__, rc);
   2481 	return NULL;
   2482 }
   2483 
   2484 static void
   2485 ixv_add_device_sysctls(struct adapter *adapter)
   2486 {
   2487 	struct sysctllog **log;
   2488 	const struct sysctlnode *rnode, *cnode;
   2489 	device_t dev;
   2490 
   2491 	dev = adapter->dev;
   2492 	log = &adapter->sysctllog;
   2493 
   2494 	if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
   2495 		aprint_error_dev(dev, "could not create sysctl root\n");
   2496 		return;
   2497 	}
   2498 
   2499 	if (sysctl_createv(log, 0, &rnode, &cnode,
   2500 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   2501 	    "debug", SYSCTL_DESCR("Debug Info"),
   2502 	    ixv_sysctl_debug, 0, (void *)adapter, 0, CTL_CREATE, CTL_EOL) != 0)
   2503 		aprint_error_dev(dev, "could not create sysctl\n");
   2504 
   2505 	if (sysctl_createv(log, 0, &rnode, &cnode,
   2506 	    CTLFLAG_READWRITE, CTLTYPE_BOOL,
   2507 	    "enable_aim", SYSCTL_DESCR("Interrupt Moderation"),
   2508 	    NULL, 0, &adapter->enable_aim, 0, CTL_CREATE, CTL_EOL) != 0)
   2509 		aprint_error_dev(dev, "could not create sysctl\n");
   2510 
   2511 	if (sysctl_createv(log, 0, &rnode, &cnode,
   2512 	    CTLFLAG_READWRITE, CTLTYPE_BOOL,
   2513 	    "txrx_workqueue", SYSCTL_DESCR("Use workqueue for packet processing"),
   2514 		NULL, 0, &adapter->txrx_use_workqueue, 0, CTL_CREATE, CTL_EOL) != 0)
   2515 		aprint_error_dev(dev, "could not create sysctl\n");
   2516 }
   2517 
   2518 /************************************************************************
   2519  * ixv_add_stats_sysctls - Add statistic sysctls for the VF.
   2520  ************************************************************************/
   2521 static void
   2522 ixv_add_stats_sysctls(struct adapter *adapter)
   2523 {
   2524 	device_t		dev = adapter->dev;
   2525 	struct tx_ring		*txr = adapter->tx_rings;
   2526 	struct rx_ring		*rxr = adapter->rx_rings;
   2527 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
   2528 	struct ixgbe_hw *hw = &adapter->hw;
   2529 	const struct sysctlnode *rnode, *cnode;
   2530 	struct sysctllog **log = &adapter->sysctllog;
   2531 	const char *xname = device_xname(dev);
   2532 
   2533 	/* Driver Statistics */
   2534 	evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC,
   2535 	    NULL, xname, "Driver tx dma soft fail EFBIG");
   2536 	evcnt_attach_dynamic(&adapter->mbuf_defrag_failed, EVCNT_TYPE_MISC,
   2537 	    NULL, xname, "m_defrag() failed");
   2538 	evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC,
   2539 	    NULL, xname, "Driver tx dma hard fail EFBIG");
   2540 	evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC,
   2541 	    NULL, xname, "Driver tx dma hard fail EINVAL");
   2542 	evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC,
   2543 	    NULL, xname, "Driver tx dma hard fail other");
   2544 	evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC,
   2545 	    NULL, xname, "Driver tx dma soft fail EAGAIN");
   2546 	evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC,
   2547 	    NULL, xname, "Driver tx dma soft fail ENOMEM");
   2548 	evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC,
   2549 	    NULL, xname, "Watchdog timeouts");
   2550 	evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC,
   2551 	    NULL, xname, "TSO errors");
   2552 	evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_INTR,
   2553 	    NULL, xname, "Link MSI-X IRQ Handled");
   2554 
   2555 	for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   2556 		snprintf(adapter->queues[i].evnamebuf,
   2557 		    sizeof(adapter->queues[i].evnamebuf), "%s q%d",
   2558 		    xname, i);
   2559 		snprintf(adapter->queues[i].namebuf,
   2560 		    sizeof(adapter->queues[i].namebuf), "q%d", i);
   2561 
   2562 		if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
   2563 			aprint_error_dev(dev, "could not create sysctl root\n");
   2564 			break;
   2565 		}
   2566 
   2567 		if (sysctl_createv(log, 0, &rnode, &rnode,
   2568 		    0, CTLTYPE_NODE,
   2569 		    adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"),
   2570 		    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0)
   2571 			break;
   2572 
   2573 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2574 		    CTLFLAG_READWRITE, CTLTYPE_INT,
   2575 		    "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"),
   2576 		    ixv_sysctl_interrupt_rate_handler, 0,
   2577 		    (void *)&adapter->queues[i], 0, CTL_CREATE, CTL_EOL) != 0)
   2578 			break;
   2579 
   2580 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2581 		    CTLFLAG_READONLY, CTLTYPE_INT,
   2582 		    "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"),
   2583 		    ixv_sysctl_tdh_handler, 0, (void *)txr,
   2584 		    0, CTL_CREATE, CTL_EOL) != 0)
   2585 			break;
   2586 
   2587 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2588 		    CTLFLAG_READONLY, CTLTYPE_INT,
   2589 		    "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"),
   2590 		    ixv_sysctl_tdt_handler, 0, (void *)txr,
   2591 		    0, CTL_CREATE, CTL_EOL) != 0)
   2592 			break;
   2593 
   2594 		evcnt_attach_dynamic(&adapter->queues[i].irqs, EVCNT_TYPE_INTR,
   2595 		    NULL, adapter->queues[i].evnamebuf, "IRQs on queue");
   2596 		evcnt_attach_dynamic(&adapter->queues[i].handleq,
   2597 		    EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf,
   2598 		    "Handled queue in softint");
   2599 		evcnt_attach_dynamic(&adapter->queues[i].req, EVCNT_TYPE_MISC,
   2600 		    NULL, adapter->queues[i].evnamebuf, "Requeued in softint");
   2601 		evcnt_attach_dynamic(&txr->tso_tx, EVCNT_TYPE_MISC,
   2602 		    NULL, adapter->queues[i].evnamebuf, "TSO");
   2603 		evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC,
   2604 		    NULL, adapter->queues[i].evnamebuf,
   2605 		    "Queue No Descriptor Available");
   2606 		evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC,
   2607 		    NULL, adapter->queues[i].evnamebuf,
   2608 		    "Queue Packets Transmitted");
   2609 #ifndef IXGBE_LEGACY_TX
   2610 		evcnt_attach_dynamic(&txr->pcq_drops, EVCNT_TYPE_MISC,
   2611 		    NULL, adapter->queues[i].evnamebuf,
   2612 		    "Packets dropped in pcq");
   2613 #endif
   2614 
   2615 #ifdef LRO
   2616 		struct lro_ctrl *lro = &rxr->lro;
   2617 #endif /* LRO */
   2618 
   2619 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2620 		    CTLFLAG_READONLY,
   2621 		    CTLTYPE_INT,
   2622 		    "rxd_nxck", SYSCTL_DESCR("Receive Descriptor next to check"),
   2623 			ixv_sysctl_next_to_check_handler, 0, (void *)rxr, 0,
   2624 		    CTL_CREATE, CTL_EOL) != 0)
   2625 			break;
   2626 
   2627 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2628 		    CTLFLAG_READONLY,
   2629 		    CTLTYPE_INT,
   2630 		    "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"),
   2631 		    ixv_sysctl_rdh_handler, 0, (void *)rxr, 0,
   2632 		    CTL_CREATE, CTL_EOL) != 0)
   2633 			break;
   2634 
   2635 		if (sysctl_createv(log, 0, &rnode, &cnode,
   2636 		    CTLFLAG_READONLY,
   2637 		    CTLTYPE_INT,
   2638 		    "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"),
   2639 		    ixv_sysctl_rdt_handler, 0, (void *)rxr, 0,
   2640 		    CTL_CREATE, CTL_EOL) != 0)
   2641 			break;
   2642 
   2643 		evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC,
   2644 		    NULL, adapter->queues[i].evnamebuf, "Queue Packets Received");
   2645 		evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC,
   2646 		    NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received");
   2647 		evcnt_attach_dynamic(&rxr->rx_copies, EVCNT_TYPE_MISC,
   2648 		    NULL, adapter->queues[i].evnamebuf, "Copied RX Frames");
   2649 		evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC,
   2650 		    NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf");
   2651 		evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC,
   2652 		    NULL, adapter->queues[i].evnamebuf, "Rx discarded");
   2653 #ifdef LRO
   2654 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued",
   2655 				CTLFLAG_RD, &lro->lro_queued, 0,
   2656 				"LRO Queued");
   2657 		SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed",
   2658 				CTLFLAG_RD, &lro->lro_flushed, 0,
   2659 				"LRO Flushed");
   2660 #endif /* LRO */
   2661 	}
   2662 
   2663 	/* MAC stats get their own sub node */
   2664 
   2665 	snprintf(stats->namebuf,
   2666 	    sizeof(stats->namebuf), "%s MAC Statistics", xname);
   2667 
   2668 	evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL,
   2669 	    stats->namebuf, "rx csum offload - IP");
   2670 	evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL,
   2671 	    stats->namebuf, "rx csum offload - L4");
   2672 	evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL,
   2673 	    stats->namebuf, "rx csum offload - IP bad");
   2674 	evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL,
   2675 	    stats->namebuf, "rx csum offload - L4 bad");
   2676 
   2677 	/* Packet Reception Stats */
   2678 	evcnt_attach_dynamic(&stats->vfgprc, EVCNT_TYPE_MISC, NULL,
   2679 	    xname, "Good Packets Received");
   2680 	evcnt_attach_dynamic(&stats->vfgorc, EVCNT_TYPE_MISC, NULL,
   2681 	    xname, "Good Octets Received");
   2682 	evcnt_attach_dynamic(&stats->vfmprc, EVCNT_TYPE_MISC, NULL,
   2683 	    xname, "Multicast Packets Received");
   2684 	evcnt_attach_dynamic(&stats->vfgptc, EVCNT_TYPE_MISC, NULL,
   2685 	    xname, "Good Packets Transmitted");
   2686 	evcnt_attach_dynamic(&stats->vfgotc, EVCNT_TYPE_MISC, NULL,
   2687 	    xname, "Good Octets Transmitted");
   2688 
   2689 	/* Mailbox Stats */
   2690 	evcnt_attach_dynamic(&hw->mbx.stats.msgs_tx, EVCNT_TYPE_MISC, NULL,
   2691 	    xname, "message TXs");
   2692 	evcnt_attach_dynamic(&hw->mbx.stats.msgs_rx, EVCNT_TYPE_MISC, NULL,
   2693 	    xname, "message RXs");
   2694 	evcnt_attach_dynamic(&hw->mbx.stats.acks, EVCNT_TYPE_MISC, NULL,
   2695 	    xname, "ACKs");
   2696 	evcnt_attach_dynamic(&hw->mbx.stats.reqs, EVCNT_TYPE_MISC, NULL,
   2697 	    xname, "REQs");
   2698 	evcnt_attach_dynamic(&hw->mbx.stats.rsts, EVCNT_TYPE_MISC, NULL,
   2699 	    xname, "RSTs");
   2700 
   2701 } /* ixv_add_stats_sysctls */
   2702 
   2703 static void
   2704 ixv_clear_evcnt(struct adapter *adapter)
   2705 {
   2706 	struct tx_ring		*txr = adapter->tx_rings;
   2707 	struct rx_ring		*rxr = adapter->rx_rings;
   2708 	struct ixgbevf_hw_stats *stats = &adapter->stats.vf;
   2709 	struct ixgbe_hw *hw = &adapter->hw;
   2710 	int i;
   2711 
   2712 	/* Driver Statistics */
   2713 	adapter->efbig_tx_dma_setup.ev_count = 0;
   2714 	adapter->mbuf_defrag_failed.ev_count = 0;
   2715 	adapter->efbig2_tx_dma_setup.ev_count = 0;
   2716 	adapter->einval_tx_dma_setup.ev_count = 0;
   2717 	adapter->other_tx_dma_setup.ev_count = 0;
   2718 	adapter->eagain_tx_dma_setup.ev_count = 0;
   2719 	adapter->enomem_tx_dma_setup.ev_count = 0;
   2720 	adapter->watchdog_events.ev_count = 0;
   2721 	adapter->tso_err.ev_count = 0;
   2722 	adapter->link_irq.ev_count = 0;
   2723 
   2724 	for (i = 0; i < adapter->num_queues; i++, rxr++, txr++) {
   2725 		adapter->queues[i].irqs.ev_count = 0;
   2726 		adapter->queues[i].handleq.ev_count = 0;
   2727 		adapter->queues[i].req.ev_count = 0;
   2728 		txr->tso_tx.ev_count = 0;
   2729 		txr->no_desc_avail.ev_count = 0;
   2730 		txr->total_packets.ev_count = 0;
   2731 #ifndef IXGBE_LEGACY_TX
   2732 		txr->pcq_drops.ev_count = 0;
   2733 #endif
   2734 		txr->q_efbig_tx_dma_setup = 0;
   2735 		txr->q_mbuf_defrag_failed = 0;
   2736 		txr->q_efbig2_tx_dma_setup = 0;
   2737 		txr->q_einval_tx_dma_setup = 0;
   2738 		txr->q_other_tx_dma_setup = 0;
   2739 		txr->q_eagain_tx_dma_setup = 0;
   2740 		txr->q_enomem_tx_dma_setup = 0;
   2741 		txr->q_tso_err = 0;
   2742 
   2743 		rxr->rx_packets.ev_count = 0;
   2744 		rxr->rx_bytes.ev_count = 0;
   2745 		rxr->rx_copies.ev_count = 0;
   2746 		rxr->no_jmbuf.ev_count = 0;
   2747 		rxr->rx_discarded.ev_count = 0;
   2748 	}
   2749 
   2750 	/* MAC stats get their own sub node */
   2751 
   2752 	stats->ipcs.ev_count = 0;
   2753 	stats->l4cs.ev_count = 0;
   2754 	stats->ipcs_bad.ev_count = 0;
   2755 	stats->l4cs_bad.ev_count = 0;
   2756 
   2757 	/* Packet Reception Stats */
   2758 	stats->vfgprc.ev_count = 0;
   2759 	stats->vfgorc.ev_count = 0;
   2760 	stats->vfmprc.ev_count = 0;
   2761 	stats->vfgptc.ev_count = 0;
   2762 	stats->vfgotc.ev_count = 0;
   2763 
   2764 	/* Mailbox Stats */
   2765 	hw->mbx.stats.msgs_tx.ev_count = 0;
   2766 	hw->mbx.stats.msgs_rx.ev_count = 0;
   2767 	hw->mbx.stats.acks.ev_count = 0;
   2768 	hw->mbx.stats.reqs.ev_count = 0;
   2769 	hw->mbx.stats.rsts.ev_count = 0;
   2770 
   2771 } /* ixv_clear_evcnt */
   2772 
   2773 /************************************************************************
   2774  * ixv_set_sysctl_value
   2775  ************************************************************************/
   2776 static void
   2777 ixv_set_sysctl_value(struct adapter *adapter, const char *name,
   2778 	const char *description, int *limit, int value)
   2779 {
   2780 	device_t dev =	adapter->dev;
   2781 	struct sysctllog **log;
   2782 	const struct sysctlnode *rnode, *cnode;
   2783 
   2784 	log = &adapter->sysctllog;
   2785 	if ((rnode = ixv_sysctl_instance(adapter)) == NULL) {
   2786 		aprint_error_dev(dev, "could not create sysctl root\n");
   2787 		return;
   2788 	}
   2789 	if (sysctl_createv(log, 0, &rnode, &cnode,
   2790 	    CTLFLAG_READWRITE, CTLTYPE_INT,
   2791 	    name, SYSCTL_DESCR(description),
   2792 	    NULL, 0, limit, 0, CTL_CREATE, CTL_EOL) != 0)
   2793 		aprint_error_dev(dev, "could not create sysctl\n");
   2794 	*limit = value;
   2795 } /* ixv_set_sysctl_value */
   2796 
   2797 /************************************************************************
   2798  * ixv_print_debug_info
   2799  *
   2800  *   Called only when em_display_debug_stats is enabled.
   2801  *   Provides a way to take a look at important statistics
   2802  *   maintained by the driver and hardware.
   2803  ************************************************************************/
   2804 static void
   2805 ixv_print_debug_info(struct adapter *adapter)
   2806 {
   2807 	device_t	dev = adapter->dev;
   2808 	struct ix_queue *que = adapter->queues;
   2809 	struct rx_ring	*rxr;
   2810 	struct tx_ring	*txr;
   2811 #ifdef LRO
   2812 	struct lro_ctrl *lro;
   2813 #endif /* LRO */
   2814 
   2815 	for (int i = 0; i < adapter->num_queues; i++, que++) {
   2816 		txr = que->txr;
   2817 		rxr = que->rxr;
   2818 #ifdef LRO
   2819 		lro = &rxr->lro;
   2820 #endif /* LRO */
   2821 		device_printf(dev, "QUE(%d) IRQs Handled: %lu\n",
   2822 		    que->msix, (long)que->irqs.ev_count);
   2823 		device_printf(dev, "RX(%d) Packets Received: %lld\n",
   2824 		    rxr->me, (long long)rxr->rx_packets.ev_count);
   2825 		device_printf(dev, "RX(%d) Bytes Received: %lu\n",
   2826 		    rxr->me, (long)rxr->rx_bytes.ev_count);
   2827 #ifdef LRO
   2828 		device_printf(dev, "RX(%d) LRO Queued= %ju\n",
   2829 		    rxr->me, (uintmax_t)lro->lro_queued);
   2830 		device_printf(dev, "RX(%d) LRO Flushed= %ju\n",
   2831 		    rxr->me, (uintmax_t)lro->lro_flushed);
   2832 #endif /* LRO */
   2833 		device_printf(dev, "TX(%d) Packets Sent: %lu\n",
   2834 		    txr->me, (long)txr->total_packets.ev_count);
   2835 		device_printf(dev, "TX(%d) NO Desc Avail: %lu\n",
   2836 		    txr->me, (long)txr->no_desc_avail.ev_count);
   2837 	}
   2838 
   2839 	device_printf(dev, "MBX IRQ Handled: %lu\n",
   2840 	    (long)adapter->link_irq.ev_count);
   2841 } /* ixv_print_debug_info */
   2842 
   2843 /************************************************************************
   2844  * ixv_sysctl_debug
   2845  ************************************************************************/
   2846 static int
   2847 ixv_sysctl_debug(SYSCTLFN_ARGS)
   2848 {
   2849 	struct sysctlnode node = *rnode;
   2850 	struct adapter *adapter = (struct adapter *)node.sysctl_data;
   2851 	int	       error, result;
   2852 
   2853 	node.sysctl_data = &result;
   2854 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
   2855 
   2856 	if (error || newp == NULL)
   2857 		return error;
   2858 
   2859 	if (result == 1)
   2860 		ixv_print_debug_info(adapter);
   2861 
   2862 	return 0;
   2863 } /* ixv_sysctl_debug */
   2864 
   2865 /************************************************************************
   2866  * ixv_init_device_features
   2867  ************************************************************************/
   2868 static void
   2869 ixv_init_device_features(struct adapter *adapter)
   2870 {
   2871 	adapter->feat_cap = IXGBE_FEATURE_NETMAP
   2872 			  | IXGBE_FEATURE_VF
   2873 			  | IXGBE_FEATURE_RSS
   2874 			  | IXGBE_FEATURE_LEGACY_TX;
   2875 
   2876 	/* A tad short on feature flags for VFs, atm. */
   2877 	switch (adapter->hw.mac.type) {
   2878 	case ixgbe_mac_82599_vf:
   2879 		break;
   2880 	case ixgbe_mac_X540_vf:
   2881 		break;
   2882 	case ixgbe_mac_X550_vf:
   2883 	case ixgbe_mac_X550EM_x_vf:
   2884 	case ixgbe_mac_X550EM_a_vf:
   2885 		adapter->feat_cap |= IXGBE_FEATURE_NEEDS_CTXD;
   2886 		break;
   2887 	default:
   2888 		break;
   2889 	}
   2890 
   2891 	/* Enabled by default... */
   2892 	/* Is a virtual function (VF) */
   2893 	if (adapter->feat_cap & IXGBE_FEATURE_VF)
   2894 		adapter->feat_en |= IXGBE_FEATURE_VF;
   2895 	/* Netmap */
   2896 	if (adapter->feat_cap & IXGBE_FEATURE_NETMAP)
   2897 		adapter->feat_en |= IXGBE_FEATURE_NETMAP;
   2898 	/* Receive-Side Scaling (RSS) */
   2899 	if (adapter->feat_cap & IXGBE_FEATURE_RSS)
   2900 		adapter->feat_en |= IXGBE_FEATURE_RSS;
   2901 	/* Needs advanced context descriptor regardless of offloads req'd */
   2902 	if (adapter->feat_cap & IXGBE_FEATURE_NEEDS_CTXD)
   2903 		adapter->feat_en |= IXGBE_FEATURE_NEEDS_CTXD;
   2904 
   2905 	/* Enabled via sysctl... */
   2906 	/* Legacy (single queue) transmit */
   2907 	if ((adapter->feat_cap & IXGBE_FEATURE_LEGACY_TX) &&
   2908 	    ixv_enable_legacy_tx)
   2909 		adapter->feat_en |= IXGBE_FEATURE_LEGACY_TX;
   2910 } /* ixv_init_device_features */
   2911 
   2912 /************************************************************************
   2913  * ixv_shutdown - Shutdown entry point
   2914  ************************************************************************/
   2915 #if 0 /* XXX NetBSD ought to register something like this through pmf(9) */
   2916 static int
   2917 ixv_shutdown(device_t dev)
   2918 {
   2919 	struct adapter *adapter = device_private(dev);
   2920 	IXGBE_CORE_LOCK(adapter);
   2921 	ixv_stop(adapter);
   2922 	IXGBE_CORE_UNLOCK(adapter);
   2923 
   2924 	return (0);
   2925 } /* ixv_shutdown */
   2926 #endif
   2927 
   2928 static int
   2929 ixv_ifflags_cb(struct ethercom *ec)
   2930 {
   2931 	struct ifnet *ifp = &ec->ec_if;
   2932 	struct adapter *adapter = ifp->if_softc;
   2933 	u_short saved_flags;
   2934 	u_short change;
   2935 	int rv = 0;
   2936 
   2937 	IXGBE_CORE_LOCK(adapter);
   2938 
   2939 	saved_flags = adapter->if_flags;
   2940 	change = ifp->if_flags ^ adapter->if_flags;
   2941 	if (change != 0)
   2942 		adapter->if_flags = ifp->if_flags;
   2943 
   2944 	if ((change & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) {
   2945 		rv = ENETRESET;
   2946 		goto out;
   2947 	} else if ((change & IFF_PROMISC) != 0) {
   2948 		rv = ixv_set_rxfilter(adapter);
   2949 		if (rv != 0) {
   2950 			/* Restore previous */
   2951 			adapter->if_flags = saved_flags;
   2952 			goto out;
   2953 		}
   2954 	}
   2955 
   2956 	/* Check for ec_capenable. */
   2957 	change = ec->ec_capenable ^ adapter->ec_capenable;
   2958 	adapter->ec_capenable = ec->ec_capenable;
   2959 	if ((change & ~(ETHERCAP_VLAN_MTU | ETHERCAP_VLAN_HWTAGGING
   2960 	    | ETHERCAP_VLAN_HWFILTER)) != 0) {
   2961 		rv = ENETRESET;
   2962 		goto out;
   2963 	}
   2964 
   2965 	/*
   2966 	 * Special handling is not required for ETHERCAP_VLAN_MTU.
   2967 	 * PF's MAXFRS(MHADD) does not include the 4bytes of the VLAN header.
   2968 	 */
   2969 
   2970 	/* Set up VLAN support and filter */
   2971 	if ((change & (ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_HWFILTER)) != 0)
   2972 		rv = ixv_setup_vlan_support(adapter);
   2973 
   2974 out:
   2975 	IXGBE_CORE_UNLOCK(adapter);
   2976 
   2977 	return rv;
   2978 }
   2979 
   2980 
   2981 /************************************************************************
   2982  * ixv_ioctl - Ioctl entry point
   2983  *
   2984  *   Called when the user wants to configure the interface.
   2985  *
   2986  *   return 0 on success, positive on failure
   2987  ************************************************************************/
   2988 static int
   2989 ixv_ioctl(struct ifnet *ifp, u_long command, void *data)
   2990 {
   2991 	struct adapter	*adapter = ifp->if_softc;
   2992 	struct ixgbe_hw *hw = &adapter->hw;
   2993 	struct ifcapreq *ifcr = data;
   2994 	int		error;
   2995 	int l4csum_en;
   2996 	const int l4csum = IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
   2997 	     IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx;
   2998 
   2999 	switch (command) {
   3000 	case SIOCSIFFLAGS:
   3001 		IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)");
   3002 		break;
   3003 	case SIOCADDMULTI: {
   3004 		struct ether_multi *enm;
   3005 		struct ether_multistep step;
   3006 		struct ethercom *ec = &adapter->osdep.ec;
   3007 		bool overflow = false;
   3008 		int mcnt = 0;
   3009 
   3010 		/*
   3011 		 * Check the number of multicast address. If it exceeds,
   3012 		 * return ENOSPC.
   3013 		 * Update this code when we support API 1.3.
   3014 		 */
   3015 		ETHER_LOCK(ec);
   3016 		ETHER_FIRST_MULTI(step, ec, enm);
   3017 		while (enm != NULL) {
   3018 			mcnt++;
   3019 
   3020 			/*
   3021 			 * This code is before adding, so one room is required
   3022 			 * at least.
   3023 			 */
   3024 			if (mcnt > (IXGBE_MAX_VF_MC - 1)) {
   3025 				overflow = true;
   3026 				break;
   3027 			}
   3028 			ETHER_NEXT_MULTI(step, enm);
   3029 		}
   3030 		ETHER_UNLOCK(ec);
   3031 		error = 0;
   3032 		if (overflow && ((ec->ec_flags & ETHER_F_ALLMULTI) == 0)) {
   3033 			error = hw->mac.ops.update_xcast_mode(hw,
   3034 			    IXGBEVF_XCAST_MODE_ALLMULTI);
   3035 			if (error == IXGBE_ERR_NOT_TRUSTED) {
   3036 				device_printf(adapter->dev,
   3037 				    "this interface is not trusted\n");
   3038 				error = EPERM;
   3039 			} else if (error == IXGBE_ERR_FEATURE_NOT_SUPPORTED) {
   3040 				device_printf(adapter->dev,
   3041 				    "the PF doesn't support allmulti mode\n");
   3042 				error = EOPNOTSUPP;
   3043 			} else if (error) {
   3044 				device_printf(adapter->dev,
   3045 				    "number of Ethernet multicast addresses "
   3046 				    "exceeds the limit (%d). error = %d\n",
   3047 				    IXGBE_MAX_VF_MC, error);
   3048 				error = ENOSPC;
   3049 			} else
   3050 				ec->ec_flags |= ETHER_F_ALLMULTI;
   3051 		}
   3052 		if (error)
   3053 			return error;
   3054 	}
   3055 		/*FALLTHROUGH*/
   3056 	case SIOCDELMULTI:
   3057 		IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI");
   3058 		break;
   3059 	case SIOCSIFMEDIA:
   3060 	case SIOCGIFMEDIA:
   3061 		IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)");
   3062 		break;
   3063 	case SIOCSIFCAP:
   3064 		IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)");
   3065 		break;
   3066 	case SIOCSIFMTU:
   3067 		IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)");
   3068 		break;
   3069 	case SIOCZIFDATA:
   3070 		IOCTL_DEBUGOUT("ioctl: SIOCZIFDATA (Zero counter)");
   3071 		ixv_update_stats(adapter);
   3072 		ixv_clear_evcnt(adapter);
   3073 		break;
   3074 	default:
   3075 		IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)", (int)command);
   3076 		break;
   3077 	}
   3078 
   3079 	switch (command) {
   3080 	case SIOCSIFCAP:
   3081 		/* Layer-4 Rx checksum offload has to be turned on and
   3082 		 * off as a unit.
   3083 		 */
   3084 		l4csum_en = ifcr->ifcr_capenable & l4csum;
   3085 		if (l4csum_en != l4csum && l4csum_en != 0)
   3086 			return EINVAL;
   3087 		/*FALLTHROUGH*/
   3088 	case SIOCADDMULTI:
   3089 	case SIOCDELMULTI:
   3090 	case SIOCSIFFLAGS:
   3091 	case SIOCSIFMTU:
   3092 	default:
   3093 		if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
   3094 			return error;
   3095 		if ((ifp->if_flags & IFF_RUNNING) == 0)
   3096 			;
   3097 		else if (command == SIOCSIFCAP || command == SIOCSIFMTU) {
   3098 			IXGBE_CORE_LOCK(adapter);
   3099 			ixv_init_locked(adapter);
   3100 			IXGBE_CORE_UNLOCK(adapter);
   3101 		} else if (command == SIOCADDMULTI || command == SIOCDELMULTI) {
   3102 			/*
   3103 			 * Multicast list has changed; set the hardware filter
   3104 			 * accordingly.
   3105 			 */
   3106 			IXGBE_CORE_LOCK(adapter);
   3107 			ixv_disable_intr(adapter);
   3108 			ixv_set_rxfilter(adapter);
   3109 			ixv_enable_intr(adapter);
   3110 			IXGBE_CORE_UNLOCK(adapter);
   3111 		}
   3112 		return 0;
   3113 	}
   3114 } /* ixv_ioctl */
   3115 
   3116 /************************************************************************
   3117  * ixv_init
   3118  ************************************************************************/
   3119 static int
   3120 ixv_init(struct ifnet *ifp)
   3121 {
   3122 	struct adapter *adapter = ifp->if_softc;
   3123 
   3124 	IXGBE_CORE_LOCK(adapter);
   3125 	ixv_init_locked(adapter);
   3126 	IXGBE_CORE_UNLOCK(adapter);
   3127 
   3128 	return 0;
   3129 } /* ixv_init */
   3130 
   3131 /************************************************************************
   3132  * ixv_handle_que
   3133  ************************************************************************/
   3134 static void
   3135 ixv_handle_que(void *context)
   3136 {
   3137 	struct ix_queue *que = context;
   3138 	struct adapter	*adapter = que->adapter;
   3139 	struct tx_ring	*txr = que->txr;
   3140 	struct ifnet	*ifp = adapter->ifp;
   3141 	bool		more;
   3142 
   3143 	que->handleq.ev_count++;
   3144 
   3145 	if (ifp->if_flags & IFF_RUNNING) {
   3146 		more = ixgbe_rxeof(que);
   3147 		IXGBE_TX_LOCK(txr);
   3148 		more |= ixgbe_txeof(txr);
   3149 		if (!(adapter->feat_en & IXGBE_FEATURE_LEGACY_TX))
   3150 			if (!ixgbe_mq_ring_empty(ifp, txr->txr_interq))
   3151 				ixgbe_mq_start_locked(ifp, txr);
   3152 		/* Only for queue 0 */
   3153 		/* NetBSD still needs this for CBQ */
   3154 		if ((&adapter->queues[0] == que)
   3155 		    && (!ixgbe_legacy_ring_empty(ifp, NULL)))
   3156 			ixgbe_legacy_start_locked(ifp, txr);
   3157 		IXGBE_TX_UNLOCK(txr);
   3158 		if (more) {
   3159 			que->req.ev_count++;
   3160 			if (adapter->txrx_use_workqueue) {
   3161 				/*
   3162 				 * "enqueued flag" is not required here
   3163 				 * the same as ixg(4). See ixgbe_msix_que().
   3164 				 */
   3165 				workqueue_enqueue(adapter->que_wq,
   3166 				    &que->wq_cookie, curcpu());
   3167 			} else
   3168 				  softint_schedule(que->que_si);
   3169 			return;
   3170 		}
   3171 	}
   3172 
   3173 	/* Re-enable this interrupt */
   3174 	ixv_enable_queue(adapter, que->msix);
   3175 
   3176 	return;
   3177 } /* ixv_handle_que */
   3178 
   3179 /************************************************************************
   3180  * ixv_handle_que_work
   3181  ************************************************************************/
   3182 static void
   3183 ixv_handle_que_work(struct work *wk, void *context)
   3184 {
   3185 	struct ix_queue *que = container_of(wk, struct ix_queue, wq_cookie);
   3186 
   3187 	/*
   3188 	 * "enqueued flag" is not required here the same as ixg(4).
   3189 	 * See ixgbe_msix_que().
   3190 	 */
   3191 	ixv_handle_que(que);
   3192 }
   3193 
   3194 /************************************************************************
   3195  * ixv_allocate_msix - Setup MSI-X Interrupt resources and handlers
   3196  ************************************************************************/
   3197 static int
   3198 ixv_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa)
   3199 {
   3200 	device_t	dev = adapter->dev;
   3201 	struct ix_queue *que = adapter->queues;
   3202 	struct		tx_ring *txr = adapter->tx_rings;
   3203 	int		error, msix_ctrl, rid, vector = 0;
   3204 	pci_chipset_tag_t pc;
   3205 	pcitag_t	tag;
   3206 	char		intrbuf[PCI_INTRSTR_LEN];
   3207 	char		wqname[MAXCOMLEN];
   3208 	char		intr_xname[32];
   3209 	const char	*intrstr = NULL;
   3210 	kcpuset_t	*affinity;
   3211 	int		cpu_id = 0;
   3212 
   3213 	pc = adapter->osdep.pc;
   3214 	tag = adapter->osdep.tag;
   3215 
   3216 	adapter->osdep.nintrs = adapter->num_queues + 1;
   3217 	if (pci_msix_alloc_exact(pa, &adapter->osdep.intrs,
   3218 	    adapter->osdep.nintrs) != 0) {
   3219 		aprint_error_dev(dev,
   3220 		    "failed to allocate MSI-X interrupt\n");
   3221 		return (ENXIO);
   3222 	}
   3223 
   3224 	kcpuset_create(&affinity, false);
   3225 	for (int i = 0; i < adapter->num_queues; i++, vector++, que++, txr++) {
   3226 		snprintf(intr_xname, sizeof(intr_xname), "%s TXRX%d",
   3227 		    device_xname(dev), i);
   3228 		intrstr = pci_intr_string(pc, adapter->osdep.intrs[i], intrbuf,
   3229 		    sizeof(intrbuf));
   3230 #ifdef IXGBE_MPSAFE
   3231 		pci_intr_setattr(pc, &adapter->osdep.intrs[i], PCI_INTR_MPSAFE,
   3232 		    true);
   3233 #endif
   3234 		/* Set the handler function */
   3235 		que->res = adapter->osdep.ihs[i] = pci_intr_establish_xname(pc,
   3236 		    adapter->osdep.intrs[i], IPL_NET, ixv_msix_que, que,
   3237 		    intr_xname);
   3238 		if (que->res == NULL) {
   3239 			pci_intr_release(pc, adapter->osdep.intrs,
   3240 			    adapter->osdep.nintrs);
   3241 			aprint_error_dev(dev,
   3242 			    "Failed to register QUE handler\n");
   3243 			kcpuset_destroy(affinity);
   3244 			return (ENXIO);
   3245 		}
   3246 		que->msix = vector;
   3247 		adapter->active_queues |= (u64)(1 << que->msix);
   3248 
   3249 		cpu_id = i;
   3250 		/* Round-robin affinity */
   3251 		kcpuset_zero(affinity);
   3252 		kcpuset_set(affinity, cpu_id % ncpu);
   3253 		error = interrupt_distribute(adapter->osdep.ihs[i], affinity,
   3254 		    NULL);
   3255 		aprint_normal_dev(dev, "for TX/RX, interrupting at %s",
   3256 		    intrstr);
   3257 		if (error == 0)
   3258 			aprint_normal(", bound queue %d to cpu %d\n",
   3259 			    i, cpu_id % ncpu);
   3260 		else
   3261 			aprint_normal("\n");
   3262 
   3263 #ifndef IXGBE_LEGACY_TX
   3264 		txr->txr_si
   3265 		    = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
   3266 			ixgbe_deferred_mq_start, txr);
   3267 #endif
   3268 		que->que_si
   3269 		    = softint_establish(SOFTINT_NET | IXGBE_SOFTINFT_FLAGS,
   3270 			ixv_handle_que, que);
   3271 		if (que->que_si == NULL) {
   3272 			aprint_error_dev(dev,
   3273 			    "could not establish software interrupt\n");
   3274 		}
   3275 	}
   3276 	snprintf(wqname, sizeof(wqname), "%sdeferTx", device_xname(dev));
   3277 	error = workqueue_create(&adapter->txr_wq, wqname,
   3278 	    ixgbe_deferred_mq_start_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   3279 	    IXGBE_WORKQUEUE_FLAGS);
   3280 	if (error) {
   3281 		aprint_error_dev(dev, "couldn't create workqueue for deferred Tx\n");
   3282 	}
   3283 	adapter->txr_wq_enqueued = percpu_alloc(sizeof(u_int));
   3284 
   3285 	snprintf(wqname, sizeof(wqname), "%sTxRx", device_xname(dev));
   3286 	error = workqueue_create(&adapter->que_wq, wqname,
   3287 	    ixv_handle_que_work, adapter, IXGBE_WORKQUEUE_PRI, IPL_NET,
   3288 	    IXGBE_WORKQUEUE_FLAGS);
   3289 	if (error) {
   3290 		aprint_error_dev(dev,
   3291 		    "couldn't create workqueue\n");
   3292 	}
   3293 
   3294 	/* and Mailbox */
   3295 	cpu_id++;
   3296 	snprintf(intr_xname, sizeof(intr_xname), "%s link", device_xname(dev));
   3297 	adapter->vector = vector;
   3298 	intrstr = pci_intr_string(pc, adapter->osdep.intrs[vector], intrbuf,
   3299 	    sizeof(intrbuf));
   3300 #ifdef IXGBE_MPSAFE
   3301 	pci_intr_setattr(pc, &adapter->osdep.intrs[vector], PCI_INTR_MPSAFE,
   3302 	    true);
   3303 #endif
   3304 	/* Set the mbx handler function */
   3305 	adapter->osdep.ihs[vector] = pci_intr_establish_xname(pc,
   3306 	    adapter->osdep.intrs[vector], IPL_NET, ixv_msix_mbx, adapter,
   3307 	    intr_xname);
   3308 	if (adapter->osdep.ihs[vector] == NULL) {
   3309 		aprint_error_dev(dev, "Failed to register LINK handler\n");
   3310 		kcpuset_destroy(affinity);
   3311 		return (ENXIO);
   3312 	}
   3313 	/* Round-robin affinity */
   3314 	kcpuset_zero(affinity);
   3315 	kcpuset_set(affinity, cpu_id % ncpu);
   3316 	error = interrupt_distribute(adapter->osdep.ihs[vector],
   3317 	    affinity, NULL);
   3318 
   3319 	aprint_normal_dev(dev,
   3320 	    "for link, interrupting at %s", intrstr);
   3321 	if (error == 0)
   3322 		aprint_normal(", affinity to cpu %d\n", cpu_id % ncpu);
   3323 	else
   3324 		aprint_normal("\n");
   3325 
   3326 	/* Tasklets for Mailbox */
   3327 	adapter->link_si = softint_establish(SOFTINT_NET |IXGBE_SOFTINFT_FLAGS,
   3328 	    ixv_handle_link, adapter);
   3329 	/*
   3330 	 * Due to a broken design QEMU will fail to properly
   3331 	 * enable the guest for MSI-X unless the vectors in
   3332 	 * the table are all set up, so we must rewrite the
   3333 	 * ENABLE in the MSI-X control register again at this
   3334 	 * point to cause it to successfully initialize us.
   3335 	 */
   3336 	if (adapter->hw.mac.type == ixgbe_mac_82599_vf) {
   3337 		pci_get_capability(pc, tag, PCI_CAP_MSIX, &rid, NULL);
   3338 		rid += PCI_MSIX_CTL;
   3339 		msix_ctrl = pci_conf_read(pc, tag, rid);
   3340 		msix_ctrl |= PCI_MSIX_CTL_ENABLE;
   3341 		pci_conf_write(pc, tag, rid, msix_ctrl);
   3342 	}
   3343 
   3344 	kcpuset_destroy(affinity);
   3345 	return (0);
   3346 } /* ixv_allocate_msix */
   3347 
   3348 /************************************************************************
   3349  * ixv_configure_interrupts - Setup MSI-X resources
   3350  *
   3351  *   Note: The VF device MUST use MSI-X, there is no fallback.
   3352  ************************************************************************/
   3353 static int
   3354 ixv_configure_interrupts(struct adapter *adapter)
   3355 {
   3356 	device_t dev = adapter->dev;
   3357 	int want, queues, msgs;
   3358 
   3359 	/* Must have at least 2 MSI-X vectors */
   3360 	msgs = pci_msix_count(adapter->osdep.pc, adapter->osdep.tag);
   3361 	if (msgs < 2) {
   3362 		aprint_error_dev(dev, "MSIX config error\n");
   3363 		return (ENXIO);
   3364 	}
   3365 	msgs = MIN(msgs, IXG_MAX_NINTR);
   3366 
   3367 	/* Figure out a reasonable auto config value */
   3368 	queues = (ncpu > (msgs - 1)) ? (msgs - 1) : ncpu;
   3369 
   3370 	if (ixv_num_queues != 0)
   3371 		queues = ixv_num_queues;
   3372 	else if ((ixv_num_queues == 0) && (queues > IXGBE_VF_MAX_TX_QUEUES))
   3373 		queues = IXGBE_VF_MAX_TX_QUEUES;
   3374 
   3375 	/*
   3376 	 * Want vectors for the queues,
   3377 	 * plus an additional for mailbox.
   3378 	 */
   3379 	want = queues + 1;
   3380 	if (msgs >= want)
   3381 		msgs = want;
   3382 	else {
   3383 		aprint_error_dev(dev,
   3384 		    "MSI-X Configuration Problem, "
   3385 		    "%d vectors but %d queues wanted!\n",
   3386 		    msgs, want);
   3387 		return -1;
   3388 	}
   3389 
   3390 	adapter->msix_mem = (void *)1; /* XXX */
   3391 	aprint_normal_dev(dev,
   3392 	    "Using MSI-X interrupts with %d vectors\n", msgs);
   3393 	adapter->num_queues = queues;
   3394 
   3395 	return (0);
   3396 } /* ixv_configure_interrupts */
   3397 
   3398 
   3399 /************************************************************************
   3400  * ixv_handle_link - Tasklet handler for MSI-X MBX interrupts
   3401  *
   3402  *   Done outside of interrupt context since the driver might sleep
   3403  ************************************************************************/
   3404 static void
   3405 ixv_handle_link(void *context)
   3406 {
   3407 	struct adapter *adapter = context;
   3408 
   3409 	IXGBE_CORE_LOCK(adapter);
   3410 
   3411 	adapter->hw.mac.ops.check_link(&adapter->hw, &adapter->link_speed,
   3412 	    &adapter->link_up, FALSE);
   3413 	ixv_update_link_status(adapter);
   3414 
   3415 	IXGBE_CORE_UNLOCK(adapter);
   3416 } /* ixv_handle_link */
   3417 
   3418 /************************************************************************
   3419  * ixv_check_link - Used in the local timer to poll for link changes
   3420  ************************************************************************/
   3421 static s32
   3422 ixv_check_link(struct adapter *adapter)
   3423 {
   3424 	s32 error;
   3425 
   3426 	KASSERT(mutex_owned(&adapter->core_mtx));
   3427 
   3428 	adapter->hw.mac.get_link_status = TRUE;
   3429 
   3430 	error = adapter->hw.mac.ops.check_link(&adapter->hw,
   3431 	    &adapter->link_speed, &adapter->link_up, FALSE);
   3432 	ixv_update_link_status(adapter);
   3433 
   3434 	return error;
   3435 } /* ixv_check_link */
   3436