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