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