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