1/****************************************************************************** 2 3 Copyright (c) 2001-2011, Intel Corporation 4 All rights reserved. 5 6 Redistribution and use in source and binary forms, with or without 7 modification, are permitted provided that the following conditions are met: 8 9 1. Redistributions of source code must retain the above copyright notice, 10 this list of conditions and the following disclaimer. 11 12 2. Redistributions in binary form must reproduce the above copyright 13 notice, this list of conditions and the following disclaimer in the 14 documentation and/or other materials provided with the distribution. 15 16 3. Neither the name of the Intel Corporation nor the names of its 17 contributors may be used to endorse or promote products derived from 18 this software without specific prior written permission. 19 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 POSSIBILITY OF SUCH DAMAGE. 31 32******************************************************************************/ 33/* 34 * Copyright (c) 2011 The NetBSD Foundation, Inc. 35 * All rights reserved. 36 * 37 * This code is derived from software contributed to The NetBSD Foundation 38 * by Coyote Point Systems, Inc. 39 * 40 * Redistribution and use in source and binary forms, with or without 41 * modification, are permitted provided that the following conditions 42 * are met: 43 * 1. Redistributions of source code must retain the above copyright 44 * notice, this list of conditions and the following disclaimer. 45 * 2. Redistributions in binary form must reproduce the above copyright 46 * notice, this list of conditions and the following disclaimer in the 47 * documentation and/or other materials provided with the distribution. 48 * 49 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 50 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 51 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 52 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 53 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 54 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 55 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 56 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 57 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 58 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 59 * POSSIBILITY OF SUCH DAMAGE. 60 */ 61/*$FreeBSD: src/sys/dev/ixgbe/ixgbe.c,v 1.51 2011/04/25 23:34:21 jfv Exp $*/ 62/*$NetBSD: ixgbe.c,v 1.1 2011/08/12 21:55:29 dyoung Exp $*/ 63 64#include "opt_inet.h" 65 66#include "ixgbe.h" 67 68/********************************************************************* 69 * Set this to one to display debug statistics 70 *********************************************************************/ 71int ixgbe_display_debug_stats = 0; 72 73/********************************************************************* 74 * Driver version 75 *********************************************************************/ 76char ixgbe_driver_version[] = "2.3.10"; 77 78/********************************************************************* 79 * PCI Device ID Table 80 * 81 * Used by probe to select devices to load on 82 * Last field stores an index into ixgbe_strings 83 * Last entry must be all 0s 84 * 85 * { Vendor ID, Device ID, SubVendor ID, SubDevice ID, String Index } 86 *********************************************************************/ 87 88static ixgbe_vendor_info_t ixgbe_vendor_info_array[] = 89{ 90 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_DUAL_PORT, 0, 0, 0}, 91 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AF_SINGLE_PORT, 0, 0, 0}, 92 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_CX4, 0, 0, 0}, 93 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT, 0, 0, 0}, 94 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598AT2, 0, 0, 0}, 95 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598, 0, 0, 0}, 96 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_DA_DUAL_PORT, 0, 0, 0}, 97 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_CX4_DUAL_PORT, 0, 0, 0}, 98 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_XF_LR, 0, 0, 0}, 99 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM, 0, 0, 0}, 100 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82598EB_SFP_LOM, 0, 0, 0}, 101 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4, 0, 0, 0}, 102 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_KX4_MEZZ, 0, 0, 0}, 103 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP, 0, 0, 0}, 104 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_XAUI_LOM, 0, 0, 0}, 105 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_CX4, 0, 0, 0}, 106 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_T3_LOM, 0, 0, 0}, 107 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_COMBO_BACKPLANE, 0, 0, 0}, 108 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_BACKPLANE_FCOE, 0, 0, 0}, 109 {IXGBE_INTEL_VENDOR_ID, IXGBE_DEV_ID_82599_SFP_FCOE, 0, 0, 0}, 110 /* required last entry */ 111 {0, 0, 0, 0, 0} 112}; 113 114/********************************************************************* 115 * Table of branding strings 116 *********************************************************************/ 117 118static const char *ixgbe_strings[] = { 119 "Intel(R) PRO/10GbE PCI-Express Network Driver" 120}; 121 122/********************************************************************* 123 * Function prototypes 124 *********************************************************************/ 125static int ixgbe_probe(device_t, cfdata_t, void *); 126static void ixgbe_attach(device_t, device_t, void *); 127static int ixgbe_detach(device_t, int); 128#if 0 129static int ixgbe_shutdown(device_t); 130#endif 131static void ixgbe_start(struct ifnet *); 132static void ixgbe_start_locked(struct tx_ring *, struct ifnet *); 133#if __FreeBSD_version >= 800000 134static int ixgbe_mq_start(struct ifnet *, struct mbuf *); 135static int ixgbe_mq_start_locked(struct ifnet *, 136 struct tx_ring *, struct mbuf *); 137static void ixgbe_qflush(struct ifnet *); 138#endif 139static int ixgbe_ioctl(struct ifnet *, u_long, void *); 140static void ixgbe_ifstop(struct ifnet *, int); 141static int ixgbe_init(struct ifnet *); 142static void ixgbe_init_locked(struct adapter *); 143static void ixgbe_stop(void *); 144static void ixgbe_media_status(struct ifnet *, struct ifmediareq *); 145static int ixgbe_media_change(struct ifnet *); 146static void ixgbe_identify_hardware(struct adapter *); 147static int ixgbe_allocate_pci_resources(struct adapter *, 148 const struct pci_attach_args *); 149static int ixgbe_allocate_msix(struct adapter *, 150 const struct pci_attach_args *); 151static int ixgbe_allocate_legacy(struct adapter *, 152 const struct pci_attach_args *); 153static int ixgbe_allocate_queues(struct adapter *); 154static int ixgbe_setup_msix(struct adapter *); 155static void ixgbe_free_pci_resources(struct adapter *); 156static void ixgbe_local_timer(void *); 157static int ixgbe_setup_interface(device_t, struct adapter *); 158static void ixgbe_config_link(struct adapter *); 159 160static int ixgbe_allocate_transmit_buffers(struct tx_ring *); 161static int ixgbe_setup_transmit_structures(struct adapter *); 162static void ixgbe_setup_transmit_ring(struct tx_ring *); 163static void ixgbe_initialize_transmit_units(struct adapter *); 164static void ixgbe_free_transmit_structures(struct adapter *); 165static void ixgbe_free_transmit_buffers(struct tx_ring *); 166 167static int ixgbe_allocate_receive_buffers(struct rx_ring *); 168static int ixgbe_setup_receive_structures(struct adapter *); 169static int ixgbe_setup_receive_ring(struct rx_ring *); 170static void ixgbe_initialize_receive_units(struct adapter *); 171static void ixgbe_free_receive_structures(struct adapter *); 172static void ixgbe_free_receive_buffers(struct rx_ring *); 173static void ixgbe_setup_hw_rsc(struct rx_ring *); 174 175static void ixgbe_enable_intr(struct adapter *); 176static void ixgbe_disable_intr(struct adapter *); 177static void ixgbe_update_stats_counters(struct adapter *); 178static bool ixgbe_txeof(struct tx_ring *); 179static bool ixgbe_rxeof(struct ix_queue *, int); 180static void ixgbe_rx_checksum(u32, struct mbuf *, u32, 181 struct ixgbe_hw_stats *); 182static void ixgbe_set_promisc(struct adapter *); 183static void ixgbe_set_multi(struct adapter *); 184static void ixgbe_update_link_status(struct adapter *); 185static void ixgbe_refresh_mbufs(struct rx_ring *, int); 186static int ixgbe_xmit(struct tx_ring *, struct mbuf *); 187static int ixgbe_set_flowcntl(SYSCTLFN_PROTO); 188static int ixgbe_set_advertise(SYSCTLFN_PROTO); 189static int ixgbe_dma_malloc(struct adapter *, bus_size_t, 190 struct ixgbe_dma_alloc *, int); 191static void ixgbe_dma_free(struct adapter *, struct ixgbe_dma_alloc *); 192static void ixgbe_add_rx_process_limit(struct adapter *, const char *, 193 const char *, int *, int); 194static u32 ixgbe_tx_ctx_setup(struct tx_ring *, struct mbuf *); 195static bool ixgbe_tso_setup(struct tx_ring *, struct mbuf *, u32 *); 196static void ixgbe_set_ivar(struct adapter *, u8, u8, s8); 197static void ixgbe_configure_ivars(struct adapter *); 198static u8 * ixgbe_mc_array_itr(struct ixgbe_hw *, u8 **, u32 *); 199 200static void ixgbe_setup_vlan_hw_support(struct adapter *); 201#if 0 202static void ixgbe_register_vlan(void *, struct ifnet *, u16); 203static void ixgbe_unregister_vlan(void *, struct ifnet *, u16); 204#endif 205 206static void ixgbe_add_hw_stats(struct adapter *adapter); 207 208static __inline void ixgbe_rx_discard(struct rx_ring *, int); 209static __inline void ixgbe_rx_input(struct rx_ring *, struct ifnet *, 210 struct mbuf *, u32); 211 212/* Support for pluggable optic modules */ 213static bool ixgbe_sfp_probe(struct adapter *); 214static void ixgbe_setup_optics(struct adapter *); 215 216/* Legacy (single vector interrupt handler */ 217static int ixgbe_legacy_irq(void *); 218 219#if defined(NETBSD_MSI_OR_MSIX) 220/* The MSI/X Interrupt handlers */ 221static void ixgbe_msix_que(void *); 222static void ixgbe_msix_link(void *); 223#endif 224 225/* Software interrupts for deferred work */ 226static void ixgbe_handle_que(void *); 227static void ixgbe_handle_link(void *); 228static void ixgbe_handle_msf(void *); 229static void ixgbe_handle_mod(void *); 230 231const struct sysctlnode *ixgbe_sysctl_instance(struct adapter *); 232static ixgbe_vendor_info_t *ixgbe_lookup(const struct pci_attach_args *); 233 234#ifdef IXGBE_FDIR 235static void ixgbe_atr(struct tx_ring *, struct mbuf *); 236static void ixgbe_reinit_fdir(void *, int); 237#endif 238 239/********************************************************************* 240 * FreeBSD Device Interface Entry Points 241 *********************************************************************/ 242 243CFATTACH_DECL3_NEW(ixg, sizeof(struct adapter), 244 ixgbe_probe, ixgbe_attach, ixgbe_detach, NULL, NULL, NULL, 245 DVF_DETACH_SHUTDOWN); 246 247#if 0 248devclass_t ixgbe_devclass; 249DRIVER_MODULE(ixgbe, pci, ixgbe_driver, ixgbe_devclass, 0, 0); 250 251MODULE_DEPEND(ixgbe, pci, 1, 1, 1); 252MODULE_DEPEND(ixgbe, ether, 1, 1, 1); 253#endif 254 255/* 256** TUNEABLE PARAMETERS: 257*/ 258 259/* 260** AIM: Adaptive Interrupt Moderation 261** which means that the interrupt rate 262** is varied over time based on the 263** traffic for that interrupt vector 264*/ 265static int ixgbe_enable_aim = TRUE; 266#define TUNABLE_INT(__x, __y) 267TUNABLE_INT("hw.ixgbe.enable_aim", &ixgbe_enable_aim); 268 269static int ixgbe_max_interrupt_rate = (8000000 / IXGBE_LOW_LATENCY); 270TUNABLE_INT("hw.ixgbe.max_interrupt_rate", &ixgbe_max_interrupt_rate); 271 272/* How many packets rxeof tries to clean at a time */ 273static int ixgbe_rx_process_limit = 256; 274TUNABLE_INT("hw.ixgbe.rx_process_limit", &ixgbe_rx_process_limit); 275 276/* Flow control setting, default to full */ 277static int ixgbe_flow_control = ixgbe_fc_full; 278TUNABLE_INT("hw.ixgbe.flow_control", &ixgbe_flow_control); 279 280/* 281** Smart speed setting, default to on 282** this only works as a compile option 283** right now as its during attach, set 284** this to 'ixgbe_smart_speed_off' to 285** disable. 286*/ 287static int ixgbe_smart_speed = ixgbe_smart_speed_on; 288 289/* 290 * MSIX should be the default for best performance, 291 * but this allows it to be forced off for testing. 292 */ 293static int ixgbe_enable_msix = 1; 294TUNABLE_INT("hw.ixgbe.enable_msix", &ixgbe_enable_msix); 295 296/* 297 * Header split: this causes the hardware to DMA 298 * the header into a separate mbuf from the payload, 299 * it can be a performance win in some workloads, but 300 * in others it actually hurts, its off by default. 301 */ 302static bool ixgbe_header_split = FALSE; 303TUNABLE_INT("hw.ixgbe.hdr_split", &ixgbe_header_split); 304 305#if defined(NETBSD_MSI_OR_MSIX) 306/* 307 * Number of Queues, can be set to 0, 308 * it then autoconfigures based on the 309 * number of cpus with a max of 8. This 310 * can be overriden manually here. 311 */ 312static int ixgbe_num_queues = 0; 313TUNABLE_INT("hw.ixgbe.num_queues", &ixgbe_num_queues); 314#endif 315 316/* 317** Number of TX descriptors per ring, 318** setting higher than RX as this seems 319** the better performing choice. 320*/ 321static int ixgbe_txd = PERFORM_TXD; 322TUNABLE_INT("hw.ixgbe.txd", &ixgbe_txd); 323 324/* Number of RX descriptors per ring */ 325static int ixgbe_rxd = PERFORM_RXD; 326TUNABLE_INT("hw.ixgbe.rxd", &ixgbe_rxd); 327 328/* Keep running tab on them for sanity check */ 329static int ixgbe_total_ports; 330 331#ifdef IXGBE_FDIR 332/* 333** For Flow Director: this is the 334** number of TX packets we sample 335** for the filter pool, this means 336** every 20th packet will be probed. 337** 338** This feature can be disabled by 339** setting this to 0. 340*/ 341static int atr_sample_rate = 20; 342/* 343** Flow Director actually 'steals' 344** part of the packet buffer as its 345** filter pool, this variable controls 346** how much it uses: 347** 0 = 64K, 1 = 128K, 2 = 256K 348*/ 349static int fdir_pballoc = 1; 350#endif 351 352/********************************************************************* 353 * Device identification routine 354 * 355 * ixgbe_probe determines if the driver should be loaded on 356 * adapter based on PCI vendor/device id of the adapter. 357 * 358 * return 1 on success, 0 on failure 359 *********************************************************************/ 360 361static int 362ixgbe_probe(device_t dev, cfdata_t cf, void *aux) 363{ 364 const struct pci_attach_args *pa = aux; 365 366 return (ixgbe_lookup(pa) != NULL) ? 1 : 0; 367} 368 369static ixgbe_vendor_info_t * 370ixgbe_lookup(const struct pci_attach_args *pa) 371{ 372 pcireg_t subid; 373 ixgbe_vendor_info_t *ent; 374 375 INIT_DEBUGOUT("ixgbe_probe: begin"); 376 377 if (PCI_VENDOR(pa->pa_id) != IXGBE_INTEL_VENDOR_ID) 378 return NULL; 379 380 subid = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_SUBSYS_ID_REG); 381 382 for (ent = ixgbe_vendor_info_array; ent->vendor_id != 0; ent++) { 383 if (PCI_VENDOR(pa->pa_id) == ent->vendor_id && 384 PCI_PRODUCT(pa->pa_id) == ent->device_id && 385 386 (PCI_SUBSYS_VENDOR(subid) == ent->subvendor_id || 387 ent->subvendor_id == 0) && 388 389 (PCI_SUBSYS_ID(subid) == ent->subdevice_id || 390 ent->subdevice_id == 0)) { 391 ++ixgbe_total_ports; 392 return ent; 393 } 394 } 395 return NULL; 396} 397 398 399static void 400ixgbe_sysctl_attach(struct adapter *adapter) 401{ 402 struct sysctllog **log; 403 const struct sysctlnode *rnode, *cnode; 404 device_t dev; 405 406 dev = adapter->dev; 407 log = &adapter->sysctllog; 408 409 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) { 410 aprint_error_dev(dev, "could not create sysctl root\n"); 411 return; 412 } 413 414 if (sysctl_createv(log, 0, &rnode, &cnode, 415 CTLFLAG_READONLY, CTLTYPE_INT, 416 "num_rx_desc", SYSCTL_DESCR("Number of rx descriptors"), 417 NULL, 0, &adapter->num_rx_desc, 0, CTL_CREATE, CTL_EOL) != 0) 418 aprint_error_dev(dev, "could not create sysctl\n"); 419 420 if (sysctl_createv(log, 0, &rnode, &cnode, 421 CTLFLAG_READONLY, CTLTYPE_INT, 422 "num_queues", SYSCTL_DESCR("Number of queues"), 423 NULL, 0, &adapter->num_queues, 0, CTL_CREATE, CTL_EOL) != 0) 424 aprint_error_dev(dev, "could not create sysctl\n"); 425 426 if (sysctl_createv(log, 0, &rnode, &cnode, 427 CTLFLAG_READWRITE, CTLTYPE_INT, 428 "flow_control", SYSCTL_DESCR("Flow Control"), 429 ixgbe_set_flowcntl, 0, adapter, 0, CTL_CREATE, CTL_EOL) != 0) 430 aprint_error_dev(dev, "could not create sysctl\n"); 431 432 if (sysctl_createv(log, 0, &rnode, &cnode, 433 CTLFLAG_READWRITE, CTLTYPE_INT, 434 "advertise_gig", SYSCTL_DESCR("1G Link"), 435 ixgbe_set_advertise, 0, adapter, 0, CTL_CREATE, CTL_EOL) != 0) 436 aprint_error_dev(dev, "could not create sysctl\n"); 437 438 /* XXX This is an *instance* sysctl controlling a *global* variable. 439 * XXX It's that way in the FreeBSD driver that this derives from. 440 */ 441 if (sysctl_createv(log, 0, &rnode, &cnode, 442 CTLFLAG_READWRITE, CTLTYPE_INT, 443 "enable_aim", SYSCTL_DESCR("Interrupt Moderation"), 444 NULL, 0, &ixgbe_enable_aim, 0, CTL_CREATE, CTL_EOL) != 0) 445 aprint_error_dev(dev, "could not create sysctl\n"); 446} 447 448/********************************************************************* 449 * Device initialization routine 450 * 451 * The attach entry point is called when the driver is being loaded. 452 * This routine identifies the type of hardware, allocates all resources 453 * and initializes the hardware. 454 * 455 * return 0 on success, positive on failure 456 *********************************************************************/ 457 458static void 459ixgbe_attach(device_t parent, device_t dev, void *aux) 460{ 461 struct adapter *adapter; 462 struct ixgbe_hw *hw; 463 int error = 0; 464 u16 csum; 465 u32 ctrl_ext; 466 ixgbe_vendor_info_t *ent; 467 const struct pci_attach_args *pa = aux; 468 469 INIT_DEBUGOUT("ixgbe_attach: begin"); 470 471 /* Allocate, clear, and link in our adapter structure */ 472 adapter = device_private(dev); 473 adapter->dev = adapter->osdep.dev = dev; 474 hw = &adapter->hw; 475 adapter->osdep.pc = pa->pa_pc; 476 adapter->osdep.tag = pa->pa_tag; 477 adapter->osdep.dmat = pa->pa_dmat; 478 479 ent = ixgbe_lookup(pa); 480 481 KASSERT(ent != NULL); 482 483 aprint_normal(": %s, Version - %s\n", 484 ixgbe_strings[ent->index], ixgbe_driver_version); 485 486 /* Core Lock Init*/ 487 IXGBE_CORE_LOCK_INIT(adapter, device_xname(dev)); 488 489 /* SYSCTL APIs */ 490 491 ixgbe_sysctl_attach(adapter); 492 493 /* Set up the timer callout */ 494 callout_init(&adapter->timer, 0); 495 496 /* Determine hardware revision */ 497 ixgbe_identify_hardware(adapter); 498 499 /* Do base PCI setup - map BAR0 */ 500 if (ixgbe_allocate_pci_resources(adapter, pa)) { 501 aprint_error_dev(dev, "Allocation of PCI resources failed\n"); 502 error = ENXIO; 503 goto err_out; 504 } 505 506 /* Do descriptor calc and sanity checks */ 507 if (((ixgbe_txd * sizeof(union ixgbe_adv_tx_desc)) % DBA_ALIGN) != 0 || 508 ixgbe_txd < MIN_TXD || ixgbe_txd > MAX_TXD) { 509 aprint_error_dev(dev, "TXD config issue, using default!\n"); 510 adapter->num_tx_desc = DEFAULT_TXD; 511 } else 512 adapter->num_tx_desc = ixgbe_txd; 513 514 /* 515 ** With many RX rings it is easy to exceed the 516 ** system mbuf allocation. Tuning nmbclusters 517 ** can alleviate this. 518 */ 519 if (nmbclusters > 0 ) { 520 int s; 521 s = (ixgbe_rxd * adapter->num_queues) * ixgbe_total_ports; 522 if (s > nmbclusters) { 523 aprint_error_dev(dev, "RX Descriptors exceed " 524 "system mbuf max, using default instead!\n"); 525 ixgbe_rxd = DEFAULT_RXD; 526 } 527 } 528 529 if (((ixgbe_rxd * sizeof(union ixgbe_adv_rx_desc)) % DBA_ALIGN) != 0 || 530 ixgbe_rxd < MIN_TXD || ixgbe_rxd > MAX_TXD) { 531 aprint_error_dev(dev, "RXD config issue, using default!\n"); 532 adapter->num_rx_desc = DEFAULT_RXD; 533 } else 534 adapter->num_rx_desc = ixgbe_rxd; 535 536 /* Allocate our TX/RX Queues */ 537 if (ixgbe_allocate_queues(adapter)) { 538 error = ENOMEM; 539 goto err_out; 540 } 541 542 /* Allocate multicast array memory. */ 543 adapter->mta = malloc(sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS * 544 MAX_NUM_MULTICAST_ADDRESSES, M_DEVBUF, M_NOWAIT); 545 if (adapter->mta == NULL) { 546 aprint_error_dev(dev, "Cannot allocate multicast setup array\n"); 547 error = ENOMEM; 548 goto err_late; 549 } 550 551 /* Initialize the shared code */ 552 error = ixgbe_init_shared_code(hw); 553 if (error == IXGBE_ERR_SFP_NOT_PRESENT) { 554 /* 555 ** No optics in this port, set up 556 ** so the timer routine will probe 557 ** for later insertion. 558 */ 559 adapter->sfp_probe = TRUE; 560 error = 0; 561 } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) { 562 aprint_error_dev(dev,"Unsupported SFP+ module detected!\n"); 563 error = EIO; 564 goto err_late; 565 } else if (error) { 566 aprint_error_dev(dev,"Unable to initialize the shared code\n"); 567 error = EIO; 568 goto err_late; 569 } 570 571 /* Make sure we have a good EEPROM before we read from it */ 572 if (ixgbe_validate_eeprom_checksum(&adapter->hw, &csum) < 0) { 573 aprint_error_dev(dev,"The EEPROM Checksum Is Not Valid\n"); 574 error = EIO; 575 goto err_late; 576 } 577 578 /* Get Hardware Flow Control setting */ 579 hw->fc.requested_mode = ixgbe_fc_full; 580 hw->fc.pause_time = IXGBE_FC_PAUSE; 581 hw->fc.low_water = IXGBE_FC_LO; 582 hw->fc.high_water = IXGBE_FC_HI; 583 hw->fc.send_xon = TRUE; 584 585 error = ixgbe_init_hw(hw); 586 if (error == IXGBE_ERR_EEPROM_VERSION) { 587 aprint_error_dev(dev, "This device is a pre-production adapter/" 588 "LOM. Please be aware there may be issues associated " 589 "with your hardware.\n If you are experiencing problems " 590 "please contact your Intel or hardware representative " 591 "who provided you with this hardware.\n"); 592 } else if (error == IXGBE_ERR_SFP_NOT_SUPPORTED) 593 aprint_error_dev(dev,"Unsupported SFP+ Module\n"); 594 595 if (error) { 596 error = EIO; 597 aprint_error_dev(dev,"Hardware Initialization Failure\n"); 598 goto err_late; 599 } 600 601 /* Detect and set physical type */ 602 ixgbe_setup_optics(adapter); 603 604 if ((adapter->msix > 1) && (ixgbe_enable_msix)) 605 error = ixgbe_allocate_msix(adapter, pa); 606 else 607 error = ixgbe_allocate_legacy(adapter, pa); 608 if (error) 609 goto err_late; 610 611 /* Setup OS specific network interface */ 612 if (ixgbe_setup_interface(dev, adapter) != 0) 613 goto err_late; 614 615 /* Sysctl for limiting the amount of work done in software interrupts */ 616 ixgbe_add_rx_process_limit(adapter, "rx_processing_limit", 617 "max number of rx packets to process", &adapter->rx_process_limit, 618 ixgbe_rx_process_limit); 619 620 /* Initialize statistics */ 621 ixgbe_update_stats_counters(adapter); 622 623 /* Print PCIE bus type/speed/width info */ 624 ixgbe_get_bus_info(hw); 625 aprint_normal_dev(dev,"PCI Express Bus: Speed %s %s\n", 626 ((hw->bus.speed == ixgbe_bus_speed_5000) ? "5.0Gb/s": 627 (hw->bus.speed == ixgbe_bus_speed_2500) ? "2.5Gb/s":"Unknown"), 628 (hw->bus.width == ixgbe_bus_width_pcie_x8) ? "Width x8" : 629 (hw->bus.width == ixgbe_bus_width_pcie_x4) ? "Width x4" : 630 (hw->bus.width == ixgbe_bus_width_pcie_x1) ? "Width x1" : 631 ("Unknown")); 632 633 if ((hw->bus.width <= ixgbe_bus_width_pcie_x4) && 634 (hw->bus.speed == ixgbe_bus_speed_2500)) { 635 aprint_error_dev(dev, "PCI-Express bandwidth available" 636 " for this card\n is not sufficient for" 637 " optimal performance.\n"); 638 aprint_error_dev(dev, "For optimal performance a x8 " 639 "PCIE, or x4 PCIE 2 slot is required.\n"); 640 } 641 642 /* let hardware know driver is loaded */ 643 ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); 644 ctrl_ext |= IXGBE_CTRL_EXT_DRV_LOAD; 645 IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl_ext); 646 647 ixgbe_add_hw_stats(adapter); 648 649 INIT_DEBUGOUT("ixgbe_attach: end"); 650 return; 651err_late: 652 ixgbe_free_transmit_structures(adapter); 653 ixgbe_free_receive_structures(adapter); 654err_out: 655 if (adapter->ifp != NULL) 656 if_free(adapter->ifp); 657 ixgbe_free_pci_resources(adapter); 658 if (adapter->mta != NULL) 659 free(adapter->mta, M_DEVBUF); 660 return; 661 662} 663 664/********************************************************************* 665 * Device removal routine 666 * 667 * The detach entry point is called when the driver is being removed. 668 * This routine stops the adapter and deallocates all the resources 669 * that were allocated for driver operation. 670 * 671 * return 0 on success, positive on failure 672 *********************************************************************/ 673 674static int 675ixgbe_detach(device_t dev, int flags) 676{ 677 struct adapter *adapter = device_private(dev); 678 struct tx_ring *txr = adapter->tx_rings; 679 struct rx_ring *rxr = adapter->rx_rings; 680 struct ixgbe_hw_stats *stats = &adapter->stats; 681 struct ix_queue *que = adapter->queues; 682 u32 ctrl_ext; 683 684 INIT_DEBUGOUT("ixgbe_detach: begin"); 685 686 /* Make sure VLANs are not using driver */ 687 if (!VLAN_ATTACHED(&adapter->osdep.ec)) 688 ; /* nothing to do: no VLANs */ 689 else if ((flags & (DETACH_SHUTDOWN|DETACH_FORCE)) != 0) 690 vlan_ifdetach(adapter->ifp); 691 else { 692 aprint_error_dev(dev, "VLANs in use\n"); 693 return EBUSY; 694 } 695 696 IXGBE_CORE_LOCK(adapter); 697 ixgbe_stop(adapter); 698 IXGBE_CORE_UNLOCK(adapter); 699 700 for (int i = 0; i < adapter->num_queues; i++, que++) { 701 softint_disestablish(que->que_si); 702 } 703 704 /* Drain the Link queue */ 705 softint_disestablish(adapter->link_si); 706 softint_disestablish(adapter->mod_si); 707 softint_disestablish(adapter->msf_si); 708#ifdef IXGBE_FDIR 709 softint_disestablish(adapter->fdir_si); 710#endif 711 712 /* let hardware know driver is unloading */ 713 ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); 714 ctrl_ext &= ~IXGBE_CTRL_EXT_DRV_LOAD; 715 IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, ctrl_ext); 716 717 ether_ifdetach(adapter->ifp); 718 callout_halt(&adapter->timer, NULL); 719 ixgbe_free_pci_resources(adapter); 720#if 0 /* XXX the NetBSD port is probably missing something here */ 721 bus_generic_detach(dev); 722#endif 723 if_detach(adapter->ifp); 724 725 sysctl_teardown(&adapter->sysctllog); 726 evcnt_detach(&adapter->handleq); 727 evcnt_detach(&adapter->req); 728 evcnt_detach(&adapter->morerx); 729 evcnt_detach(&adapter->moretx); 730 evcnt_detach(&adapter->txloops); 731 evcnt_detach(&adapter->efbig_tx_dma_setup); 732 evcnt_detach(&adapter->m_defrag_failed); 733 evcnt_detach(&adapter->efbig2_tx_dma_setup); 734 evcnt_detach(&adapter->einval_tx_dma_setup); 735 evcnt_detach(&adapter->other_tx_dma_setup); 736 evcnt_detach(&adapter->eagain_tx_dma_setup); 737 evcnt_detach(&adapter->enomem_tx_dma_setup); 738 evcnt_detach(&adapter->watchdog_events); 739 evcnt_detach(&adapter->tso_err); 740 evcnt_detach(&adapter->tso_tx); 741 evcnt_detach(&adapter->link_irq); 742 for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) { 743 evcnt_detach(&txr->no_desc_avail); 744 evcnt_detach(&txr->total_packets); 745 746 if (i < __arraycount(adapter->stats.mpc)) { 747 evcnt_detach(&adapter->stats.mpc[i]); 748 } 749 if (i < __arraycount(adapter->stats.pxontxc)) { 750 evcnt_detach(&adapter->stats.pxontxc[i]); 751 evcnt_detach(&adapter->stats.pxonrxc[i]); 752 evcnt_detach(&adapter->stats.pxofftxc[i]); 753 evcnt_detach(&adapter->stats.pxoffrxc[i]); 754 evcnt_detach(&adapter->stats.pxon2offc[i]); 755 } 756 if (i < __arraycount(adapter->stats.qprc)) { 757 evcnt_detach(&adapter->stats.qprc[i]); 758 evcnt_detach(&adapter->stats.qptc[i]); 759 evcnt_detach(&adapter->stats.qbrc[i]); 760 evcnt_detach(&adapter->stats.qbtc[i]); 761 evcnt_detach(&adapter->stats.qprdc[i]); 762 } 763 764 evcnt_detach(&rxr->rx_packets); 765 evcnt_detach(&rxr->rx_bytes); 766 evcnt_detach(&rxr->no_jmbuf); 767 evcnt_detach(&rxr->rx_discarded); 768 evcnt_detach(&rxr->rx_split_packets); 769 evcnt_detach(&rxr->rx_irq); 770 } 771 evcnt_detach(&stats->ipcs); 772 evcnt_detach(&stats->l4cs); 773 evcnt_detach(&stats->ipcs_bad); 774 evcnt_detach(&stats->l4cs_bad); 775 evcnt_detach(&stats->intzero); 776 evcnt_detach(&stats->legint); 777 evcnt_detach(&stats->crcerrs); 778 evcnt_detach(&stats->illerrc); 779 evcnt_detach(&stats->errbc); 780 evcnt_detach(&stats->mspdc); 781 evcnt_detach(&stats->mlfc); 782 evcnt_detach(&stats->mrfc); 783 evcnt_detach(&stats->rlec); 784 evcnt_detach(&stats->lxontxc); 785 evcnt_detach(&stats->lxonrxc); 786 evcnt_detach(&stats->lxofftxc); 787 evcnt_detach(&stats->lxoffrxc); 788 789 /* Packet Reception Stats */ 790 evcnt_detach(&stats->tor); 791 evcnt_detach(&stats->gorc); 792 evcnt_detach(&stats->tpr); 793 evcnt_detach(&stats->gprc); 794 evcnt_detach(&stats->mprc); 795 evcnt_detach(&stats->bprc); 796 evcnt_detach(&stats->prc64); 797 evcnt_detach(&stats->prc127); 798 evcnt_detach(&stats->prc255); 799 evcnt_detach(&stats->prc511); 800 evcnt_detach(&stats->prc1023); 801 evcnt_detach(&stats->prc1522); 802 evcnt_detach(&stats->ruc); 803 evcnt_detach(&stats->rfc); 804 evcnt_detach(&stats->roc); 805 evcnt_detach(&stats->rjc); 806 evcnt_detach(&stats->mngprc); 807 evcnt_detach(&stats->mngptc); 808 evcnt_detach(&stats->xec); 809 810 /* Packet Transmission Stats */ 811 evcnt_detach(&stats->gotc); 812 evcnt_detach(&stats->tpt); 813 evcnt_detach(&stats->gptc); 814 evcnt_detach(&stats->bptc); 815 evcnt_detach(&stats->mptc); 816 evcnt_detach(&stats->mngptc); 817 evcnt_detach(&stats->ptc64); 818 evcnt_detach(&stats->ptc127); 819 evcnt_detach(&stats->ptc255); 820 evcnt_detach(&stats->ptc511); 821 evcnt_detach(&stats->ptc1023); 822 evcnt_detach(&stats->ptc1522); 823 824 /* FC Stats */ 825 evcnt_detach(&stats->fccrc); 826 evcnt_detach(&stats->fclast); 827 if (adapter->hw.mac.type != ixgbe_mac_82598EB) { 828 evcnt_detach(&stats->fcoerpdc); 829 evcnt_detach(&stats->fcoeprc); 830 evcnt_detach(&stats->fcoeptc); 831 evcnt_detach(&stats->fcoedwrc); 832 evcnt_detach(&stats->fcoedwtc); 833 } 834 835 ixgbe_free_transmit_structures(adapter); 836 ixgbe_free_receive_structures(adapter); 837 free(adapter->mta, M_DEVBUF); 838 839 IXGBE_CORE_LOCK_DESTROY(adapter); 840 return (0); 841} 842 843/********************************************************************* 844 * 845 * Shutdown entry point 846 * 847 **********************************************************************/ 848 849#if 0 /* XXX NetBSD ought to register something like this through pmf(9) */ 850static int 851ixgbe_shutdown(device_t dev) 852{ 853 struct adapter *adapter = device_private(dev); 854 IXGBE_CORE_LOCK(adapter); 855 ixgbe_stop(adapter); 856 IXGBE_CORE_UNLOCK(adapter); 857 return (0); 858} 859#endif 860 861 862/********************************************************************* 863 * Transmit entry point 864 * 865 * ixgbe_start is called by the stack to initiate a transmit. 866 * The driver will remain in this routine as long as there are 867 * packets to transmit and transmit resources are available. 868 * In case resources are not available stack is notified and 869 * the packet is requeued. 870 **********************************************************************/ 871 872static void 873ixgbe_start_locked(struct tx_ring *txr, struct ifnet * ifp) 874{ 875 int rc; 876 struct mbuf *m_head; 877 struct adapter *adapter = txr->adapter; 878 879 IXGBE_TX_LOCK_ASSERT(txr); 880 881 if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != 882 IFF_RUNNING) 883 return; 884 if (!adapter->link_active) 885 return; 886 887 while (!IFQ_IS_EMPTY(&ifp->if_snd)) { 888 889 IFQ_POLL(&ifp->if_snd, m_head); 890 if (m_head == NULL) 891 break; 892 893 if ((rc = ixgbe_xmit(txr, m_head)) == EAGAIN) { 894 ifp->if_flags |= IFF_OACTIVE; 895 break; 896 } 897 IFQ_DEQUEUE(&ifp->if_snd, m_head); 898 if (rc == EFBIG) { 899 struct mbuf *mtmp; 900 901 if ((mtmp = m_defrag(m_head, M_DONTWAIT)) != NULL) { 902 m_head = mtmp; 903 rc = ixgbe_xmit(txr, m_head); 904 if (rc != 0) 905 adapter->efbig2_tx_dma_setup.ev_count++; 906 } else 907 adapter->m_defrag_failed.ev_count++; 908 } 909 if (rc != 0) { 910 m_freem(m_head); 911 continue; 912 } 913 914 /* Send a copy of the frame to the BPF listener */ 915 bpf_mtap(ifp, m_head); 916 917 /* Set watchdog on */ 918 getmicrotime(&txr->watchdog_time); 919 txr->queue_status = IXGBE_QUEUE_WORKING; 920 921 } 922 return; 923} 924 925/* 926 * Legacy TX start - called by the stack, this 927 * always uses the first tx ring, and should 928 * not be used with multiqueue tx enabled. 929 */ 930static void 931ixgbe_start(struct ifnet *ifp) 932{ 933 struct adapter *adapter = ifp->if_softc; 934 struct tx_ring *txr = adapter->tx_rings; 935 936 if (ifp->if_flags & IFF_RUNNING) { 937 IXGBE_TX_LOCK(txr); 938 ixgbe_start_locked(txr, ifp); 939 IXGBE_TX_UNLOCK(txr); 940 } 941 return; 942} 943 944#if __FreeBSD_version >= 800000 945/* 946** Multiqueue Transmit driver 947** 948*/ 949static int 950ixgbe_mq_start(struct ifnet *ifp, struct mbuf *m) 951{ 952 struct adapter *adapter = ifp->if_softc; 953 struct ix_queue *que; 954 struct tx_ring *txr; 955 int i = 0, err = 0; 956 957 /* Which queue to use */ 958 if ((m->m_flags & M_FLOWID) != 0) 959 i = m->m_pkthdr.flowid % adapter->num_queues; 960 961 txr = &adapter->tx_rings[i]; 962 que = &adapter->queues[i]; 963 964 if (IXGBE_TX_TRYLOCK(txr)) { 965 err = ixgbe_mq_start_locked(ifp, txr, m); 966 IXGBE_TX_UNLOCK(txr); 967 } else { 968 err = drbr_enqueue(ifp, txr->br, m); 969 softint_schedule(que->que_si); 970 } 971 972 return (err); 973} 974 975static int 976ixgbe_mq_start_locked(struct ifnet *ifp, struct tx_ring *txr, struct mbuf *m) 977{ 978 struct adapter *adapter = txr->adapter; 979 struct mbuf *next; 980 int enqueued, err = 0; 981 982 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != 983 IFF_RUNNING || adapter->link_active == 0) { 984 if (m != NULL) 985 err = drbr_enqueue(ifp, txr->br, m); 986 return (err); 987 } 988 989 enqueued = 0; 990 if (m == NULL) { 991 next = drbr_dequeue(ifp, txr->br); 992 } else if (drbr_needs_enqueue(ifp, txr->br)) { 993 if ((err = drbr_enqueue(ifp, txr->br, m)) != 0) 994 return (err); 995 next = drbr_dequeue(ifp, txr->br); 996 } else 997 next = m; 998 999 /* Process the queue */ 1000 while (next != NULL) { 1001 if ((err = ixgbe_xmit(txr, &next)) != 0) { 1002 if (next != NULL) 1003 err = drbr_enqueue(ifp, txr->br, next); 1004 break; 1005 } 1006 enqueued++; 1007 drbr_stats_update(ifp, next->m_pkthdr.len, next->m_flags); 1008 /* Send a copy of the frame to the BPF listener */ 1009 bpf_mtap(ifp, next); 1010 if ((ifp->if_flags & IFF_RUNNING) == 0) 1011 break; 1012 if (txr->tx_avail < IXGBE_TX_OP_THRESHOLD) 1013 ixgbe_txeof(txr); 1014 if (txr->tx_avail < IXGBE_TX_OP_THRESHOLD) { 1015 ifp->if_flags |= IFF_OACTIVE; 1016 break; 1017 } 1018 next = drbr_dequeue(ifp, txr->br); 1019 } 1020 1021 if (enqueued > 0) { 1022 /* Set watchdog on */ 1023 txr->queue_status = IXGBE_QUEUE_WORKING; 1024 getmicrotime(&txr->watchdog_time); 1025 } 1026 1027 return (err); 1028} 1029 1030/* 1031** Flush all ring buffers 1032*/ 1033static void 1034ixgbe_qflush(struct ifnet *ifp) 1035{ 1036 struct adapter *adapter = ifp->if_softc; 1037 struct tx_ring *txr = adapter->tx_rings; 1038 struct mbuf *m; 1039 1040 for (int i = 0; i < adapter->num_queues; i++, txr++) { 1041 IXGBE_TX_LOCK(txr); 1042 while ((m = buf_ring_dequeue_sc(txr->br)) != NULL) 1043 m_freem(m); 1044 IXGBE_TX_UNLOCK(txr); 1045 } 1046 if_qflush(ifp); 1047} 1048#endif /* __FreeBSD_version >= 800000 */ 1049 1050static int 1051ixgbe_ifflags_cb(struct ethercom *ec) 1052{ 1053 struct ifnet *ifp = &ec->ec_if; 1054 struct adapter *adapter = ifp->if_softc; 1055 int change = ifp->if_flags ^ adapter->if_flags, rc = 0; 1056 1057 IXGBE_CORE_LOCK(adapter); 1058 1059 if (change != 0) 1060 adapter->if_flags = ifp->if_flags; 1061 1062 if ((change & ~(IFF_CANTCHANGE|IFF_DEBUG)) != 0) 1063 rc = ENETRESET; 1064 else if ((change & (IFF_PROMISC | IFF_ALLMULTI)) != 0) 1065 ixgbe_set_promisc(adapter); 1066 1067 IXGBE_CORE_UNLOCK(adapter); 1068 1069 return rc; 1070} 1071 1072/********************************************************************* 1073 * Ioctl entry point 1074 * 1075 * ixgbe_ioctl is called when the user wants to configure the 1076 * interface. 1077 * 1078 * return 0 on success, positive on failure 1079 **********************************************************************/ 1080 1081static int 1082ixgbe_ioctl(struct ifnet * ifp, u_long command, void *data) 1083{ 1084 struct adapter *adapter = ifp->if_softc; 1085 struct ifcapreq *ifcr = data; 1086 struct ifreq *ifr = data; 1087 int error = 0; 1088 int l4csum_en; 1089 const int l4csum = IFCAP_CSUM_TCPv4_Rx|IFCAP_CSUM_UDPv4_Rx| 1090 IFCAP_CSUM_TCPv6_Rx|IFCAP_CSUM_UDPv6_Rx; 1091 1092 switch (command) { 1093 case SIOCSIFFLAGS: 1094 IOCTL_DEBUGOUT("ioctl: SIOCSIFFLAGS (Set Interface Flags)"); 1095 break; 1096 case SIOCADDMULTI: 1097 case SIOCDELMULTI: 1098 IOCTL_DEBUGOUT("ioctl: SIOC(ADD|DEL)MULTI"); 1099 break; 1100 case SIOCSIFMEDIA: 1101 case SIOCGIFMEDIA: 1102 IOCTL_DEBUGOUT("ioctl: SIOCxIFMEDIA (Get/Set Interface Media)"); 1103 break; 1104 case SIOCSIFCAP: 1105 IOCTL_DEBUGOUT("ioctl: SIOCSIFCAP (Set Capabilities)"); 1106 break; 1107 case SIOCSIFMTU: 1108 IOCTL_DEBUGOUT("ioctl: SIOCSIFMTU (Set Interface MTU)"); 1109 break; 1110 default: 1111 IOCTL_DEBUGOUT1("ioctl: UNKNOWN (0x%X)\n", (int)command); 1112 break; 1113 } 1114 1115 switch (command) { 1116 case SIOCSIFMEDIA: 1117 case SIOCGIFMEDIA: 1118 return ifmedia_ioctl(ifp, ifr, &adapter->media, command); 1119 case SIOCSIFCAP: 1120 /* Layer-4 Rx checksum offload has to be turned on and 1121 * off as a unit. 1122 */ 1123 l4csum_en = ifcr->ifcr_capenable & l4csum; 1124 if (l4csum_en != l4csum && l4csum_en != 0) 1125 return EINVAL; 1126 /*FALLTHROUGH*/ 1127 case SIOCADDMULTI: 1128 case SIOCDELMULTI: 1129 case SIOCSIFFLAGS: 1130 case SIOCSIFMTU: 1131 default: 1132 if ((error = ether_ioctl(ifp, command, data)) != ENETRESET) 1133 return error; 1134 if ((ifp->if_flags & IFF_RUNNING) == 0) 1135 ; 1136 else if (command == SIOCSIFCAP || command == SIOCSIFMTU) { 1137 IXGBE_CORE_LOCK(adapter); 1138 ixgbe_init_locked(adapter); 1139 IXGBE_CORE_UNLOCK(adapter); 1140 } else if (command == SIOCADDMULTI || command == SIOCDELMULTI) { 1141 /* 1142 * Multicast list has changed; set the hardware filter 1143 * accordingly. 1144 */ 1145 IXGBE_CORE_LOCK(adapter); 1146 ixgbe_disable_intr(adapter); 1147 ixgbe_set_multi(adapter); 1148 ixgbe_enable_intr(adapter); 1149 IXGBE_CORE_UNLOCK(adapter); 1150 } 1151 return 0; 1152 } 1153} 1154 1155/********************************************************************* 1156 * Init entry point 1157 * 1158 * This routine is used in two ways. It is used by the stack as 1159 * init entry point in network interface structure. It is also used 1160 * by the driver as a hw/sw initialization routine to get to a 1161 * consistent state. 1162 * 1163 * return 0 on success, positive on failure 1164 **********************************************************************/ 1165#define IXGBE_MHADD_MFS_SHIFT 16 1166 1167static void 1168ixgbe_init_locked(struct adapter *adapter) 1169{ 1170 struct ifnet *ifp = adapter->ifp; 1171 device_t dev = adapter->dev; 1172 struct ixgbe_hw *hw = &adapter->hw; 1173 u32 k, txdctl, mhadd, gpie; 1174 u32 rxdctl, rxctrl; 1175 1176 /* XXX check IFF_UP and IFF_RUNNING, power-saving state! */ 1177 1178 KASSERT(mutex_owned(&adapter->core_mtx)); 1179 INIT_DEBUGOUT("ixgbe_init: begin"); 1180 hw->adapter_stopped = FALSE; 1181 ixgbe_stop_adapter(hw); 1182 callout_stop(&adapter->timer); 1183 1184 /* XXX I moved this here from the SIOCSIFMTU case in ixgbe_ioctl(). */ 1185 adapter->max_frame_size = 1186 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; 1187 1188 /* reprogram the RAR[0] in case user changed it. */ 1189 ixgbe_set_rar(hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV); 1190 1191 /* Get the latest mac address, User can use a LAA */ 1192 memcpy(hw->mac.addr, CLLADDR(adapter->ifp->if_sadl), 1193 IXGBE_ETH_LENGTH_OF_ADDRESS); 1194 ixgbe_set_rar(hw, 0, hw->mac.addr, 0, 1); 1195 hw->addr_ctrl.rar_used_count = 1; 1196 1197 /* Prepare transmit descriptors and buffers */ 1198 if (ixgbe_setup_transmit_structures(adapter)) { 1199 device_printf(dev,"Could not setup transmit structures\n"); 1200 ixgbe_stop(adapter); 1201 return; 1202 } 1203 1204 ixgbe_init_hw(hw); 1205 ixgbe_initialize_transmit_units(adapter); 1206 1207 /* Setup Multicast table */ 1208 ixgbe_set_multi(adapter); 1209 1210 /* 1211 ** Determine the correct mbuf pool 1212 ** for doing jumbo/headersplit 1213 */ 1214 if (adapter->max_frame_size <= 2048) 1215 adapter->rx_mbuf_sz = MCLBYTES; 1216 else if (adapter->max_frame_size <= 4096) 1217 adapter->rx_mbuf_sz = MJUMPAGESIZE; 1218 else if (adapter->max_frame_size <= 9216) 1219 adapter->rx_mbuf_sz = MJUM9BYTES; 1220 else 1221 adapter->rx_mbuf_sz = MJUM16BYTES; 1222 1223 /* Prepare receive descriptors and buffers */ 1224 if (ixgbe_setup_receive_structures(adapter)) { 1225 device_printf(dev,"Could not setup receive structures\n"); 1226 ixgbe_stop(adapter); 1227 return; 1228 } 1229 1230 /* Configure RX settings */ 1231 ixgbe_initialize_receive_units(adapter); 1232 1233 gpie = IXGBE_READ_REG(&adapter->hw, IXGBE_GPIE); 1234 1235 /* Enable Fan Failure Interrupt */ 1236 gpie |= IXGBE_SDP1_GPIEN; 1237 1238 /* Add for Thermal detection */ 1239 if (hw->mac.type == ixgbe_mac_82599EB) 1240 gpie |= IXGBE_SDP2_GPIEN; 1241 1242 if (adapter->msix > 1) { 1243 /* Enable Enhanced MSIX mode */ 1244 gpie |= IXGBE_GPIE_MSIX_MODE; 1245 gpie |= IXGBE_GPIE_EIAME | IXGBE_GPIE_PBA_SUPPORT | 1246 IXGBE_GPIE_OCD; 1247 } 1248 IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie); 1249 1250 /* Set MTU size */ 1251 if (ifp->if_mtu > ETHERMTU) { 1252 mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD); 1253 mhadd &= ~IXGBE_MHADD_MFS_MASK; 1254 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT; 1255 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd); 1256 } 1257 1258 /* Now enable all the queues */ 1259 1260 for (int i = 0; i < adapter->num_queues; i++) { 1261 txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i)); 1262 txdctl |= IXGBE_TXDCTL_ENABLE; 1263 /* Set WTHRESH to 8, burst writeback */ 1264 txdctl |= (8 << 16); 1265 IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), txdctl); 1266 } 1267 1268 for (int i = 0; i < adapter->num_queues; i++) { 1269 rxdctl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)); 1270 if (hw->mac.type == ixgbe_mac_82598EB) { 1271 /* 1272 ** PTHRESH = 21 1273 ** HTHRESH = 4 1274 ** WTHRESH = 8 1275 */ 1276 rxdctl &= ~0x3FFFFF; 1277 rxdctl |= 0x080420; 1278 } 1279 rxdctl |= IXGBE_RXDCTL_ENABLE; 1280 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), rxdctl); 1281 /* XXX I don't trust this loop, and I don't trust the 1282 * XXX memory barrier. What is this meant to do? --dyoung 1283 */ 1284 for (k = 0; k < 10; k++) { 1285 if (IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)) & 1286 IXGBE_RXDCTL_ENABLE) 1287 break; 1288 else 1289 msec_delay(1); 1290 } 1291 wmb(); 1292 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), adapter->num_rx_desc - 1); 1293 } 1294 1295 /* Set up VLAN support and filter */ 1296 ixgbe_setup_vlan_hw_support(adapter); 1297 1298 /* Enable Receive engine */ 1299 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); 1300 if (hw->mac.type == ixgbe_mac_82598EB) 1301 rxctrl |= IXGBE_RXCTRL_DMBYPS; 1302 rxctrl |= IXGBE_RXCTRL_RXEN; 1303 ixgbe_enable_rx_dma(hw, rxctrl); 1304 1305 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter); 1306 1307 /* Set up MSI/X routing */ 1308 if (ixgbe_enable_msix) { 1309 ixgbe_configure_ivars(adapter); 1310 /* Set up auto-mask */ 1311 if (hw->mac.type == ixgbe_mac_82598EB) 1312 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE); 1313 else { 1314 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(0), 0xFFFFFFFF); 1315 IXGBE_WRITE_REG(hw, IXGBE_EIAM_EX(1), 0xFFFFFFFF); 1316 } 1317 } else { /* Simple settings for Legacy/MSI */ 1318 ixgbe_set_ivar(adapter, 0, 0, 0); 1319 ixgbe_set_ivar(adapter, 0, 0, 1); 1320 IXGBE_WRITE_REG(hw, IXGBE_EIAM, IXGBE_EICS_RTX_QUEUE); 1321 } 1322 1323#ifdef IXGBE_FDIR 1324 /* Init Flow director */ 1325 if (hw->mac.type != ixgbe_mac_82598EB) 1326 ixgbe_init_fdir_signature_82599(&adapter->hw, fdir_pballoc); 1327#endif 1328 1329 /* 1330 ** Check on any SFP devices that 1331 ** need to be kick-started 1332 */ 1333 if (hw->phy.type == ixgbe_phy_none) { 1334 int err = hw->phy.ops.identify(hw); 1335 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { 1336 device_printf(dev, 1337 "Unsupported SFP+ module type was detected.\n"); 1338 return; 1339 } 1340 } 1341 1342 /* Set moderation on the Link interrupt */ 1343 IXGBE_WRITE_REG(hw, IXGBE_EITR(adapter->linkvec), IXGBE_LINK_ITR); 1344 1345 /* Config/Enable Link */ 1346 ixgbe_config_link(adapter); 1347 1348 /* And now turn on interrupts */ 1349 ixgbe_enable_intr(adapter); 1350 1351 /* Now inform the stack we're ready */ 1352 ifp->if_flags |= IFF_RUNNING; 1353 ifp->if_flags &= ~IFF_OACTIVE; 1354 1355 return; 1356} 1357 1358static int 1359ixgbe_init(struct ifnet *ifp) 1360{ 1361 struct adapter *adapter = ifp->if_softc; 1362 1363 IXGBE_CORE_LOCK(adapter); 1364 ixgbe_init_locked(adapter); 1365 IXGBE_CORE_UNLOCK(adapter); 1366 return 0; /* XXX ixgbe_init_locked cannot fail? really? */ 1367} 1368 1369 1370/* 1371** 1372** MSIX Interrupt Handlers and Tasklets 1373** 1374*/ 1375 1376static inline void 1377ixgbe_enable_queue(struct adapter *adapter, u32 vector) 1378{ 1379 struct ixgbe_hw *hw = &adapter->hw; 1380 u64 queue = (u64)(1 << vector); 1381 u32 mask; 1382 1383 if (hw->mac.type == ixgbe_mac_82598EB) { 1384 mask = (IXGBE_EIMS_RTX_QUEUE & queue); 1385 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask); 1386 } else { 1387 mask = (queue & 0xFFFFFFFF); 1388 if (mask) 1389 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(0), mask); 1390 mask = (queue >> 32); 1391 if (mask) 1392 IXGBE_WRITE_REG(hw, IXGBE_EIMS_EX(1), mask); 1393 } 1394} 1395 1396static inline void 1397ixgbe_disable_queue(struct adapter *adapter, u32 vector) 1398{ 1399 struct ixgbe_hw *hw = &adapter->hw; 1400 u64 queue = (u64)(1 << vector); 1401 u32 mask; 1402 1403 if (hw->mac.type == ixgbe_mac_82598EB) { 1404 mask = (IXGBE_EIMS_RTX_QUEUE & queue); 1405 IXGBE_WRITE_REG(hw, IXGBE_EIMC, mask); 1406 } else { 1407 mask = (queue & 0xFFFFFFFF); 1408 if (mask) 1409 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(0), mask); 1410 mask = (queue >> 32); 1411 if (mask) 1412 IXGBE_WRITE_REG(hw, IXGBE_EIMC_EX(1), mask); 1413 } 1414} 1415 1416static inline void 1417ixgbe_rearm_queues(struct adapter *adapter, u64 queues) 1418{ 1419 u32 mask; 1420 1421 if (adapter->hw.mac.type == ixgbe_mac_82598EB) { 1422 mask = (IXGBE_EIMS_RTX_QUEUE & queues); 1423 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS, mask); 1424 } else { 1425 mask = (queues & 0xFFFFFFFF); 1426 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(0), mask); 1427 mask = (queues >> 32); 1428 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EICS_EX(1), mask); 1429 } 1430} 1431 1432 1433static void 1434ixgbe_handle_que(void *context) 1435{ 1436 struct ix_queue *que = context; 1437 struct adapter *adapter = que->adapter; 1438 struct tx_ring *txr = que->txr; 1439 struct ifnet *ifp = adapter->ifp; 1440 bool more; 1441 1442 adapter->handleq.ev_count++; 1443 1444 if (ifp->if_flags & IFF_RUNNING) { 1445 more = ixgbe_rxeof(que, adapter->rx_process_limit); 1446 IXGBE_TX_LOCK(txr); 1447 ixgbe_txeof(txr); 1448#if __FreeBSD_version >= 800000 1449 if (!drbr_empty(ifp, txr->br)) 1450 ixgbe_mq_start_locked(ifp, txr, NULL); 1451#else 1452 if (!IFQ_IS_EMPTY(&ifp->if_snd)) 1453 ixgbe_start_locked(txr, ifp); 1454#endif 1455 IXGBE_TX_UNLOCK(txr); 1456 if (more) { 1457 adapter->req.ev_count++; 1458 softint_schedule(que->que_si); 1459 return; 1460 } 1461 } 1462 1463 /* Reenable this interrupt */ 1464 ixgbe_enable_queue(adapter, que->msix); 1465 1466 return; 1467} 1468 1469 1470/********************************************************************* 1471 * 1472 * Legacy Interrupt Service routine 1473 * 1474 **********************************************************************/ 1475 1476static int 1477ixgbe_legacy_irq(void *arg) 1478{ 1479 struct ix_queue *que = arg; 1480 struct adapter *adapter = que->adapter; 1481 struct ixgbe_hw *hw = &adapter->hw; 1482 struct tx_ring *txr = adapter->tx_rings; 1483 bool more_tx, more_rx; 1484 u32 reg_eicr, loop = MAX_LOOP; 1485 1486 1487 reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICR); 1488 1489 adapter->stats.legint.ev_count++; 1490 ++que->irqs; 1491 if (reg_eicr == 0) { 1492 adapter->stats.intzero.ev_count++; 1493 ixgbe_enable_intr(adapter); 1494 return 0; 1495 } 1496 1497 more_rx = ixgbe_rxeof(que, adapter->rx_process_limit); 1498 1499 IXGBE_TX_LOCK(txr); 1500 do { 1501 adapter->txloops.ev_count++; 1502 more_tx = ixgbe_txeof(txr); 1503 } while (loop-- && more_tx); 1504 IXGBE_TX_UNLOCK(txr); 1505 1506 if (more_rx || more_tx) { 1507 if (more_rx) 1508 adapter->morerx.ev_count++; 1509 if (more_tx) 1510 adapter->moretx.ev_count++; 1511 softint_schedule(que->que_si); 1512 } 1513 1514 /* Check for fan failure */ 1515 if ((hw->phy.media_type == ixgbe_media_type_copper) && 1516 (reg_eicr & IXGBE_EICR_GPI_SDP1)) { 1517 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! " 1518 "REPLACE IMMEDIATELY!!\n"); 1519 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EICR_GPI_SDP1); 1520 } 1521 1522 /* Link status change */ 1523 if (reg_eicr & IXGBE_EICR_LSC) 1524 softint_schedule(adapter->link_si); 1525 1526 ixgbe_enable_intr(adapter); 1527 return 1; 1528} 1529 1530 1531#if defined(NETBSD_MSI_OR_MSIX) 1532/********************************************************************* 1533 * 1534 * MSI Queue Interrupt Service routine 1535 * 1536 **********************************************************************/ 1537void 1538ixgbe_msix_que(void *arg) 1539{ 1540 struct ix_queue *que = arg; 1541 struct adapter *adapter = que->adapter; 1542 struct tx_ring *txr = que->txr; 1543 struct rx_ring *rxr = que->rxr; 1544 bool more_tx, more_rx; 1545 u32 newitr = 0; 1546 1547 ++que->irqs; 1548 1549 more_rx = ixgbe_rxeof(que, adapter->rx_process_limit); 1550 1551 IXGBE_TX_LOCK(txr); 1552 more_tx = ixgbe_txeof(txr); 1553 IXGBE_TX_UNLOCK(txr); 1554 1555 /* Do AIM now? */ 1556 1557 if (ixgbe_enable_aim == FALSE) 1558 goto no_calc; 1559 /* 1560 ** Do Adaptive Interrupt Moderation: 1561 ** - Write out last calculated setting 1562 ** - Calculate based on average size over 1563 ** the last interval. 1564 */ 1565 if (que->eitr_setting) 1566 IXGBE_WRITE_REG(&adapter->hw, 1567 IXGBE_EITR(que->msix), que->eitr_setting); 1568 1569 que->eitr_setting = 0; 1570 1571 /* Idle, do nothing */ 1572 if ((txr->bytes == 0) && (rxr->bytes == 0)) 1573 goto no_calc; 1574 1575 if ((txr->bytes) && (txr->packets)) 1576 newitr = txr->bytes/txr->packets; 1577 if ((rxr->bytes) && (rxr->packets)) 1578 newitr = max(newitr, 1579 (rxr->bytes / rxr->packets)); 1580 newitr += 24; /* account for hardware frame, crc */ 1581 1582 /* set an upper boundary */ 1583 newitr = min(newitr, 3000); 1584 1585 /* Be nice to the mid range */ 1586 if ((newitr > 300) && (newitr < 1200)) 1587 newitr = (newitr / 3); 1588 else 1589 newitr = (newitr / 2); 1590 1591 if (adapter->hw.mac.type == ixgbe_mac_82598EB) 1592 newitr |= newitr << 16; 1593 else 1594 newitr |= IXGBE_EITR_CNT_WDIS; 1595 1596 /* save for next interrupt */ 1597 que->eitr_setting = newitr; 1598 1599 /* Reset state */ 1600 txr->bytes = 0; 1601 txr->packets = 0; 1602 rxr->bytes = 0; 1603 rxr->packets = 0; 1604 1605no_calc: 1606 if (more_tx || more_rx) 1607 softint_schedule(que->que_si); 1608 else /* Reenable this interrupt */ 1609 ixgbe_enable_queue(adapter, que->msix); 1610 return; 1611} 1612 1613 1614static void 1615ixgbe_msix_link(void *arg) 1616{ 1617 struct adapter *adapter = arg; 1618 struct ixgbe_hw *hw = &adapter->hw; 1619 u32 reg_eicr; 1620 1621 ++adapter->link_irq.ev_count; 1622 1623 /* First get the cause */ 1624 reg_eicr = IXGBE_READ_REG(hw, IXGBE_EICS); 1625 /* Clear interrupt with write */ 1626 IXGBE_WRITE_REG(hw, IXGBE_EICR, reg_eicr); 1627 1628 /* Link status change */ 1629 if (reg_eicr & IXGBE_EICR_LSC) 1630 softint_schedule(adapter->link_si); 1631 1632 if (adapter->hw.mac.type != ixgbe_mac_82598EB) { 1633#ifdef IXGBE_FDIR 1634 if (reg_eicr & IXGBE_EICR_FLOW_DIR) { 1635 /* This is probably overkill :) */ 1636 if (!atomic_cmpset_int(&adapter->fdir_reinit, 0, 1)) 1637 return; 1638 /* Clear the interrupt */ 1639 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_FLOW_DIR); 1640 /* Turn off the interface */ 1641 adapter->ifp->if_flags &= ~IFF_RUNNING; 1642 softint_schedule(adapter->fdir_si); 1643 } else 1644#endif 1645 if (reg_eicr & IXGBE_EICR_ECC) { 1646 device_printf(adapter->dev, "\nCRITICAL: ECC ERROR!! " 1647 "Please Reboot!!\n"); 1648 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_ECC); 1649 } else 1650 1651 if (reg_eicr & IXGBE_EICR_GPI_SDP1) { 1652 /* Clear the interrupt */ 1653 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); 1654 softint_schedule(adapter->msf_si); 1655 } else if (reg_eicr & IXGBE_EICR_GPI_SDP2) { 1656 /* Clear the interrupt */ 1657 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP2); 1658 softint_schedule(adapter->mod_si); 1659 } 1660 } 1661 1662 /* Check for fan failure */ 1663 if ((hw->device_id == IXGBE_DEV_ID_82598AT) && 1664 (reg_eicr & IXGBE_EICR_GPI_SDP1)) { 1665 device_printf(adapter->dev, "\nCRITICAL: FAN FAILURE!! " 1666 "REPLACE IMMEDIATELY!!\n"); 1667 IXGBE_WRITE_REG(hw, IXGBE_EICR, IXGBE_EICR_GPI_SDP1); 1668 } 1669 1670 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, IXGBE_EIMS_OTHER); 1671 return; 1672} 1673#endif 1674 1675/********************************************************************* 1676 * 1677 * Media Ioctl callback 1678 * 1679 * This routine is called whenever the user queries the status of 1680 * the interface using ifconfig. 1681 * 1682 **********************************************************************/ 1683static void 1684ixgbe_media_status(struct ifnet * ifp, struct ifmediareq * ifmr) 1685{ 1686 struct adapter *adapter = ifp->if_softc; 1687 1688 INIT_DEBUGOUT("ixgbe_media_status: begin"); 1689 IXGBE_CORE_LOCK(adapter); 1690 ixgbe_update_link_status(adapter); 1691 1692 ifmr->ifm_status = IFM_AVALID; 1693 ifmr->ifm_active = IFM_ETHER; 1694 1695 if (!adapter->link_active) { 1696 IXGBE_CORE_UNLOCK(adapter); 1697 return; 1698 } 1699 1700 ifmr->ifm_status |= IFM_ACTIVE; 1701 1702 switch (adapter->link_speed) { 1703 case IXGBE_LINK_SPEED_1GB_FULL: 1704 ifmr->ifm_active |= IFM_1000_T | IFM_FDX; 1705 break; 1706 case IXGBE_LINK_SPEED_10GB_FULL: 1707 ifmr->ifm_active |= adapter->optics | IFM_FDX; 1708 break; 1709 } 1710 1711 IXGBE_CORE_UNLOCK(adapter); 1712 1713 return; 1714} 1715 1716/********************************************************************* 1717 * 1718 * Media Ioctl callback 1719 * 1720 * This routine is called when the user changes speed/duplex using 1721 * media/mediopt option with ifconfig. 1722 * 1723 **********************************************************************/ 1724static int 1725ixgbe_media_change(struct ifnet * ifp) 1726{ 1727 struct adapter *adapter = ifp->if_softc; 1728 struct ifmedia *ifm = &adapter->media; 1729 1730 INIT_DEBUGOUT("ixgbe_media_change: begin"); 1731 1732 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) 1733 return (EINVAL); 1734 1735 switch (IFM_SUBTYPE(ifm->ifm_media)) { 1736 case IFM_AUTO: 1737 adapter->hw.phy.autoneg_advertised = 1738 IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_10GB_FULL; 1739 break; 1740 default: 1741 device_printf(adapter->dev, "Only auto media type\n"); 1742 return (EINVAL); 1743 } 1744 1745 return (0); 1746} 1747 1748/********************************************************************* 1749 * 1750 * This routine maps the mbufs to tx descriptors, allowing the 1751 * TX engine to transmit the packets. 1752 * - return 0 on success, positive on failure 1753 * 1754 **********************************************************************/ 1755 1756static int 1757ixgbe_xmit(struct tx_ring *txr, struct mbuf *m_head) 1758{ 1759 struct m_tag *mtag; 1760 struct adapter *adapter = txr->adapter; 1761 struct ethercom *ec = &adapter->osdep.ec; 1762 u32 olinfo_status = 0, cmd_type_len; 1763 u32 paylen = 0; 1764 int i, j, error; 1765 int first, last = 0; 1766 bus_dmamap_t map; 1767 struct ixgbe_tx_buf *txbuf, *txbuf_mapped; 1768 union ixgbe_adv_tx_desc *txd = NULL; 1769 1770 /* Basic descriptor defines */ 1771 cmd_type_len = (IXGBE_ADVTXD_DTYP_DATA | 1772 IXGBE_ADVTXD_DCMD_IFCS | IXGBE_ADVTXD_DCMD_DEXT); 1773 1774 if ((mtag = VLAN_OUTPUT_TAG(ec, m_head)) != NULL) 1775 cmd_type_len |= IXGBE_ADVTXD_DCMD_VLE; 1776 1777 /* 1778 * Important to capture the first descriptor 1779 * used because it will contain the index of 1780 * the one we tell the hardware to report back 1781 */ 1782 first = txr->next_avail_desc; 1783 txbuf = &txr->tx_buffers[first]; 1784 txbuf_mapped = txbuf; 1785 map = txbuf->map; 1786 1787 /* 1788 * Map the packet for DMA. 1789 */ 1790 error = bus_dmamap_load_mbuf(txr->txtag->dt_dmat, map, 1791 m_head, BUS_DMA_NOWAIT); 1792 1793 switch (error) { 1794 case EAGAIN: 1795 adapter->eagain_tx_dma_setup.ev_count++; 1796 return EAGAIN; 1797 case ENOMEM: 1798 adapter->enomem_tx_dma_setup.ev_count++; 1799 return EAGAIN; 1800 case EFBIG: 1801 adapter->efbig_tx_dma_setup.ev_count++; 1802 return error; 1803 case EINVAL: 1804 adapter->einval_tx_dma_setup.ev_count++; 1805 return error; 1806 default: 1807 adapter->other_tx_dma_setup.ev_count++; 1808 return error; 1809 case 0: 1810 break; 1811 } 1812 1813 /* Make certain there are enough descriptors */ 1814 if (map->dm_nsegs > txr->tx_avail - 2) { 1815 txr->no_desc_avail.ev_count++; 1816 ixgbe_dmamap_unload(txr->txtag, txbuf->map); 1817 return EAGAIN; 1818 } 1819 1820 /* 1821 ** Set up the appropriate offload context 1822 ** this becomes the first descriptor of 1823 ** a packet. 1824 */ 1825 if (m_head->m_pkthdr.csum_flags & (M_CSUM_TSOv4|M_CSUM_TSOv6)) { 1826 if (ixgbe_tso_setup(txr, m_head, &paylen)) { 1827 cmd_type_len |= IXGBE_ADVTXD_DCMD_TSE; 1828 olinfo_status |= IXGBE_TXD_POPTS_IXSM << 8; 1829 olinfo_status |= IXGBE_TXD_POPTS_TXSM << 8; 1830 olinfo_status |= paylen << IXGBE_ADVTXD_PAYLEN_SHIFT; 1831 ++adapter->tso_tx.ev_count; 1832 } else { 1833 ++adapter->tso_err.ev_count; 1834 /* XXX unload DMA map! --dyoung */ 1835 return ENXIO; 1836 } 1837 } else 1838 olinfo_status |= ixgbe_tx_ctx_setup(txr, m_head); 1839 1840#ifdef IXGBE_IEEE1588 1841 /* This is changing soon to an mtag detection */ 1842 if (we detect this mbuf has a TSTAMP mtag) 1843 cmd_type_len |= IXGBE_ADVTXD_MAC_TSTAMP; 1844#endif 1845 1846#ifdef IXGBE_FDIR 1847 /* Do the flow director magic */ 1848 if ((txr->atr_sample) && (!adapter->fdir_reinit)) { 1849 ++txr->atr_count; 1850 if (txr->atr_count >= atr_sample_rate) { 1851 ixgbe_atr(txr, m_head); 1852 txr->atr_count = 0; 1853 } 1854 } 1855#endif 1856 /* Record payload length */ 1857 if (paylen == 0) 1858 olinfo_status |= m_head->m_pkthdr.len << 1859 IXGBE_ADVTXD_PAYLEN_SHIFT; 1860 1861 i = txr->next_avail_desc; 1862 for (j = 0; j < map->dm_nsegs; j++) { 1863 bus_size_t seglen; 1864 bus_addr_t segaddr; 1865 1866 txbuf = &txr->tx_buffers[i]; 1867 txd = &txr->tx_base[i]; 1868 seglen = map->dm_segs[j].ds_len; 1869 segaddr = htole64(map->dm_segs[j].ds_addr); 1870 1871 txd->read.buffer_addr = segaddr; 1872 txd->read.cmd_type_len = htole32(txr->txd_cmd | 1873 cmd_type_len |seglen); 1874 txd->read.olinfo_status = htole32(olinfo_status); 1875 last = i; /* descriptor that will get completion IRQ */ 1876 1877 if (++i == adapter->num_tx_desc) 1878 i = 0; 1879 1880 txbuf->m_head = NULL; 1881 txbuf->eop_index = -1; 1882 } 1883 1884 txd->read.cmd_type_len |= 1885 htole32(IXGBE_TXD_CMD_EOP | IXGBE_TXD_CMD_RS); 1886 txr->tx_avail -= map->dm_nsegs; 1887 txr->next_avail_desc = i; 1888 1889 txbuf->m_head = m_head; 1890 /* We exchange the maps instead of copying because otherwise 1891 * we end up with many pointers to the same map and we free 1892 * one map twice in ixgbe_free_transmit_structures(). Who 1893 * knows what other problems this caused. --dyoung 1894 */ 1895 txr->tx_buffers[first].map = txbuf->map; 1896 txbuf->map = map; 1897 bus_dmamap_sync(txr->txtag->dt_dmat, map, 0, m_head->m_pkthdr.len, 1898 BUS_DMASYNC_PREWRITE); 1899 1900 /* Set the index of the descriptor that will be marked done */ 1901 txbuf = &txr->tx_buffers[first]; 1902 txbuf->eop_index = last; 1903 1904 ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 1905 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 1906 /* 1907 * Advance the Transmit Descriptor Tail (Tdt), this tells the 1908 * hardware that this frame is available to transmit. 1909 */ 1910 ++txr->total_packets.ev_count; 1911 IXGBE_WRITE_REG(&adapter->hw, IXGBE_TDT(txr->me), i); 1912 1913 return 0; 1914} 1915 1916static void 1917ixgbe_set_promisc(struct adapter *adapter) 1918{ 1919 u_int32_t reg_rctl; 1920 struct ifnet *ifp = adapter->ifp; 1921 1922 reg_rctl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); 1923 reg_rctl &= (~IXGBE_FCTRL_UPE); 1924 reg_rctl &= (~IXGBE_FCTRL_MPE); 1925 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl); 1926 1927 if (ifp->if_flags & IFF_PROMISC) { 1928 reg_rctl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); 1929 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl); 1930 } else if (ifp->if_flags & IFF_ALLMULTI) { 1931 reg_rctl |= IXGBE_FCTRL_MPE; 1932 reg_rctl &= ~IXGBE_FCTRL_UPE; 1933 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, reg_rctl); 1934 } 1935 return; 1936} 1937 1938 1939/********************************************************************* 1940 * Multicast Update 1941 * 1942 * This routine is called whenever multicast address list is updated. 1943 * 1944 **********************************************************************/ 1945#define IXGBE_RAR_ENTRIES 16 1946 1947static void 1948ixgbe_set_multi(struct adapter *adapter) 1949{ 1950 struct ether_multi *enm; 1951 struct ether_multistep step; 1952 u32 fctrl; 1953 u8 *mta; 1954 u8 *update_ptr; 1955 int mcnt = 0; 1956 struct ethercom *ec = &adapter->osdep.ec; 1957 struct ifnet *ifp = adapter->ifp; 1958 1959 IOCTL_DEBUGOUT("ixgbe_set_multi: begin"); 1960 1961 mta = adapter->mta; 1962 bzero(mta, sizeof(u8) * IXGBE_ETH_LENGTH_OF_ADDRESS * 1963 MAX_NUM_MULTICAST_ADDRESSES); 1964 1965 fctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_FCTRL); 1966 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); 1967 if (ifp->if_flags & IFF_PROMISC) 1968 fctrl |= (IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); 1969 else if (ifp->if_flags & IFF_ALLMULTI) { 1970 fctrl |= IXGBE_FCTRL_MPE; 1971 fctrl &= ~IXGBE_FCTRL_UPE; 1972 } else 1973 fctrl &= ~(IXGBE_FCTRL_UPE | IXGBE_FCTRL_MPE); 1974 1975 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl); 1976 1977 ETHER_FIRST_MULTI(step, ec, enm); 1978 while (enm != NULL) { 1979 if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 1980 ETHER_ADDR_LEN) != 0) { 1981 fctrl |= IXGBE_FCTRL_MPE; 1982 IXGBE_WRITE_REG(&adapter->hw, IXGBE_FCTRL, fctrl); 1983 break; 1984 } 1985 bcopy(enm->enm_addrlo, 1986 &mta[mcnt * IXGBE_ETH_LENGTH_OF_ADDRESS], 1987 IXGBE_ETH_LENGTH_OF_ADDRESS); 1988 mcnt++; 1989 ETHER_NEXT_MULTI(step, enm); 1990 } 1991 1992 update_ptr = mta; 1993 ixgbe_update_mc_addr_list(&adapter->hw, 1994 update_ptr, mcnt, ixgbe_mc_array_itr); 1995 1996 return; 1997} 1998 1999/* 2000 * This is an iterator function now needed by the multicast 2001 * shared code. It simply feeds the shared code routine the 2002 * addresses in the array of ixgbe_set_multi() one by one. 2003 */ 2004static u8 * 2005ixgbe_mc_array_itr(struct ixgbe_hw *hw, u8 **update_ptr, u32 *vmdq) 2006{ 2007 u8 *addr = *update_ptr; 2008 u8 *newptr; 2009 *vmdq = 0; 2010 2011 newptr = addr + IXGBE_ETH_LENGTH_OF_ADDRESS; 2012 *update_ptr = newptr; 2013 return addr; 2014} 2015 2016 2017/********************************************************************* 2018 * Timer routine 2019 * 2020 * This routine checks for link status,updates statistics, 2021 * and runs the watchdog check. 2022 * 2023 **********************************************************************/ 2024 2025static void 2026ixgbe_local_timer1(void *arg) 2027{ 2028 struct adapter *adapter = arg; 2029 device_t dev = adapter->dev; 2030 struct tx_ring *txr = adapter->tx_rings; 2031 2032 KASSERT(mutex_owned(&adapter->core_mtx)); 2033 2034 /* Check for pluggable optics */ 2035 if (adapter->sfp_probe) 2036 if (!ixgbe_sfp_probe(adapter)) 2037 goto out; /* Nothing to do */ 2038 2039 ixgbe_update_link_status(adapter); 2040 ixgbe_update_stats_counters(adapter); 2041 2042 /* 2043 * If the interface has been paused 2044 * then don't do the watchdog check 2045 */ 2046 if (IXGBE_READ_REG(&adapter->hw, IXGBE_TFCS) & IXGBE_TFCS_TXOFF) 2047 goto out; 2048 2049 /* 2050 ** Check status on the TX queues for a hang 2051 */ 2052 for (int i = 0; i < adapter->num_queues; i++, txr++) 2053 if (txr->queue_status == IXGBE_QUEUE_HUNG) 2054 goto hung; 2055 2056out: 2057 ixgbe_rearm_queues(adapter, adapter->que_mask); 2058 callout_reset(&adapter->timer, hz, ixgbe_local_timer, adapter); 2059 return; 2060 2061hung: 2062 device_printf(adapter->dev, "Watchdog timeout -- resetting\n"); 2063 device_printf(dev,"Queue(%d) tdh = %d, hw tdt = %d\n", txr->me, 2064 IXGBE_READ_REG(&adapter->hw, IXGBE_TDH(txr->me)), 2065 IXGBE_READ_REG(&adapter->hw, IXGBE_TDT(txr->me))); 2066 device_printf(dev,"TX(%d) desc avail = %d," 2067 "Next TX to Clean = %d\n", 2068 txr->me, txr->tx_avail, txr->next_to_clean); 2069 adapter->ifp->if_flags &= ~IFF_RUNNING; 2070 adapter->watchdog_events.ev_count++; 2071 ixgbe_init_locked(adapter); 2072} 2073 2074static void 2075ixgbe_local_timer(void *arg) 2076{ 2077 struct adapter *adapter = arg; 2078 2079 IXGBE_CORE_LOCK(adapter); 2080 ixgbe_local_timer1(adapter); 2081 IXGBE_CORE_UNLOCK(adapter); 2082} 2083 2084/* 2085** Note: this routine updates the OS on the link state 2086** the real check of the hardware only happens with 2087** a link interrupt. 2088*/ 2089static void 2090ixgbe_update_link_status(struct adapter *adapter) 2091{ 2092 struct ifnet *ifp = adapter->ifp; 2093 struct tx_ring *txr = adapter->tx_rings; 2094 device_t dev = adapter->dev; 2095 2096 2097 if (adapter->link_up){ 2098 if (adapter->link_active == FALSE) { 2099 if (bootverbose) 2100 device_printf(dev,"Link is up %d Gbps %s \n", 2101 ((adapter->link_speed == 128)? 10:1), 2102 "Full Duplex"); 2103 adapter->link_active = TRUE; 2104 if_link_state_change(ifp, LINK_STATE_UP); 2105 } 2106 } else { /* Link down */ 2107 if (adapter->link_active == TRUE) { 2108 if (bootverbose) 2109 device_printf(dev,"Link is Down\n"); 2110 if_link_state_change(ifp, LINK_STATE_DOWN); 2111 adapter->link_active = FALSE; 2112 for (int i = 0; i < adapter->num_queues; 2113 i++, txr++) 2114 txr->queue_status = IXGBE_QUEUE_IDLE; 2115 } 2116 } 2117 2118 return; 2119} 2120 2121 2122static void 2123ixgbe_ifstop(struct ifnet *ifp, int disable) 2124{ 2125 struct adapter *adapter = ifp->if_softc; 2126 2127 IXGBE_CORE_LOCK(adapter); 2128 ixgbe_stop(adapter); 2129 IXGBE_CORE_UNLOCK(adapter); 2130} 2131 2132/********************************************************************* 2133 * 2134 * This routine disables all traffic on the adapter by issuing a 2135 * global reset on the MAC and deallocates TX/RX buffers. 2136 * 2137 **********************************************************************/ 2138 2139static void 2140ixgbe_stop(void *arg) 2141{ 2142 struct ifnet *ifp; 2143 struct adapter *adapter = arg; 2144 struct ixgbe_hw *hw = &adapter->hw; 2145 ifp = adapter->ifp; 2146 2147 KASSERT(mutex_owned(&adapter->core_mtx)); 2148 2149 INIT_DEBUGOUT("ixgbe_stop: begin\n"); 2150 ixgbe_disable_intr(adapter); 2151 2152 /* Tell the stack that the interface is no longer active */ 2153 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 2154 2155 ixgbe_reset_hw(hw); 2156 hw->adapter_stopped = FALSE; 2157 ixgbe_stop_adapter(hw); 2158 /* Turn off the laser */ 2159 if (hw->phy.multispeed_fiber) 2160 ixgbe_disable_tx_laser(hw); 2161 callout_stop(&adapter->timer); 2162 2163 /* reprogram the RAR[0] in case user changed it. */ 2164 ixgbe_set_rar(&adapter->hw, 0, adapter->hw.mac.addr, 0, IXGBE_RAH_AV); 2165 2166 return; 2167} 2168 2169 2170/********************************************************************* 2171 * 2172 * Determine hardware revision. 2173 * 2174 **********************************************************************/ 2175static void 2176ixgbe_identify_hardware(struct adapter *adapter) 2177{ 2178 pcitag_t tag; 2179 pci_chipset_tag_t pc; 2180 pcireg_t subid, id; 2181 struct ixgbe_hw *hw = &adapter->hw; 2182 2183 pc = adapter->osdep.pc; 2184 tag = adapter->osdep.tag; 2185 2186 id = pci_conf_read(pc, tag, PCI_ID_REG); 2187 subid = pci_conf_read(pc, tag, PCI_SUBSYS_ID_REG); 2188 2189 /* Save off the information about this board */ 2190 hw->vendor_id = PCI_VENDOR(id); 2191 hw->device_id = PCI_PRODUCT(id); 2192 hw->revision_id = 2193 PCI_REVISION(pci_conf_read(pc, tag, PCI_CLASS_REG)); 2194 hw->subsystem_vendor_id = PCI_SUBSYS_VENDOR(subid); 2195 hw->subsystem_device_id = PCI_SUBSYS_ID(subid); 2196 2197 /* We need this here to set the num_segs below */ 2198 ixgbe_set_mac_type(hw); 2199 2200 /* Pick up the 82599 and VF settings */ 2201 if (hw->mac.type != ixgbe_mac_82598EB) { 2202 hw->phy.smart_speed = ixgbe_smart_speed; 2203 adapter->num_segs = IXGBE_82599_SCATTER; 2204 } else 2205 adapter->num_segs = IXGBE_82598_SCATTER; 2206 2207 return; 2208} 2209 2210/********************************************************************* 2211 * 2212 * Determine optic type 2213 * 2214 **********************************************************************/ 2215static void 2216ixgbe_setup_optics(struct adapter *adapter) 2217{ 2218 struct ixgbe_hw *hw = &adapter->hw; 2219 int layer; 2220 2221 layer = ixgbe_get_supported_physical_layer(hw); 2222 switch (layer) { 2223 case IXGBE_PHYSICAL_LAYER_10GBASE_T: 2224 adapter->optics = IFM_10G_T; 2225 break; 2226 case IXGBE_PHYSICAL_LAYER_1000BASE_T: 2227 adapter->optics = IFM_1000_T; 2228 break; 2229 case IXGBE_PHYSICAL_LAYER_10GBASE_LR: 2230 case IXGBE_PHYSICAL_LAYER_10GBASE_LRM: 2231 adapter->optics = IFM_10G_LR; 2232 break; 2233 case IXGBE_PHYSICAL_LAYER_10GBASE_SR: 2234 adapter->optics = IFM_10G_SR; 2235 break; 2236 case IXGBE_PHYSICAL_LAYER_10GBASE_KX4: 2237 case IXGBE_PHYSICAL_LAYER_10GBASE_CX4: 2238 adapter->optics = IFM_10G_CX4; 2239 break; 2240 case IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU: 2241 adapter->optics = IFM_10G_TWINAX; 2242 break; 2243 case IXGBE_PHYSICAL_LAYER_1000BASE_KX: 2244 case IXGBE_PHYSICAL_LAYER_10GBASE_KR: 2245 case IXGBE_PHYSICAL_LAYER_10GBASE_XAUI: 2246 case IXGBE_PHYSICAL_LAYER_UNKNOWN: 2247 default: 2248 adapter->optics = IFM_ETHER | IFM_AUTO; 2249 break; 2250 } 2251 return; 2252} 2253 2254/********************************************************************* 2255 * 2256 * Setup the Legacy or MSI Interrupt handler 2257 * 2258 **********************************************************************/ 2259static int 2260ixgbe_allocate_legacy(struct adapter *adapter, const struct pci_attach_args *pa) 2261{ 2262 device_t dev = adapter->dev; 2263 struct ix_queue *que = adapter->queues; 2264 int rid = 0; 2265 2266 /* MSI RID at 1 */ 2267 if (adapter->msix == 1) 2268 rid = 1; 2269 2270 /* We allocate a single interrupt resource */ 2271 if (pci_intr_map(pa, &adapter->osdep.ih) != 0) { 2272 aprint_error_dev(dev, "unable to map interrupt\n"); 2273 return ENXIO; 2274 } else { 2275 aprint_normal_dev(dev, "interrupting at %s\n", 2276 pci_intr_string(adapter->osdep.pc, adapter->osdep.ih)); 2277 } 2278 2279 /* 2280 * Try allocating a fast interrupt and the associated deferred 2281 * processing contexts. 2282 */ 2283 que->que_si = softint_establish(SOFTINT_NET, ixgbe_handle_que, que); 2284 2285 /* Tasklets for Link, SFP and Multispeed Fiber */ 2286 adapter->link_si = 2287 softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter); 2288 adapter->mod_si = 2289 softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter); 2290 adapter->msf_si = 2291 softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter); 2292 2293#ifdef IXGBE_FDIR 2294 adapter->fdir_si = 2295 softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter); 2296#endif 2297 if (que->que_si == NULL || 2298 adapter->link_si == NULL || 2299 adapter->mod_si == NULL || 2300#ifdef IXGBE_FDIR 2301 adapter->fdir_si == NULL || 2302#endif 2303 adapter->msf_si == NULL) { 2304 aprint_error_dev(dev, 2305 "could not establish software interrupts\n"); 2306 return ENXIO; 2307 } 2308 2309 adapter->osdep.intr = pci_intr_establish(adapter->osdep.pc, 2310 adapter->osdep.ih, IPL_NET, ixgbe_legacy_irq, que); 2311 if (adapter->osdep.intr == NULL) { 2312 aprint_error_dev(dev, "failed to register interrupt handler\n"); 2313 softint_disestablish(que->que_si); 2314 softint_disestablish(adapter->link_si); 2315 softint_disestablish(adapter->mod_si); 2316 softint_disestablish(adapter->msf_si); 2317#ifdef IXGBE_FDIR 2318 softint_disestablish(adapter->fdir_si); 2319#endif 2320 return ENXIO; 2321 } 2322 /* For simplicity in the handlers */ 2323 adapter->que_mask = IXGBE_EIMS_ENABLE_MASK; 2324 2325 return (0); 2326} 2327 2328 2329/********************************************************************* 2330 * 2331 * Setup MSIX Interrupt resources and handlers 2332 * 2333 **********************************************************************/ 2334static int 2335ixgbe_allocate_msix(struct adapter *adapter, const struct pci_attach_args *pa) 2336{ 2337#if !defined(NETBSD_MSI_OR_MSIX) 2338 return 0; 2339#else 2340 device_t dev = adapter->dev; 2341 struct ix_queue *que = adapter->queues; 2342 int error, rid, vector = 0; 2343 2344 for (int i = 0; i < adapter->num_queues; i++, vector++, que++) { 2345 rid = vector + 1; 2346 que->res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 2347 RF_SHAREABLE | RF_ACTIVE); 2348 if (que->res == NULL) { 2349 aprint_error_dev(dev,"Unable to allocate" 2350 " bus resource: que interrupt [%d]\n", vector); 2351 return (ENXIO); 2352 } 2353 /* Set the handler function */ 2354 error = bus_setup_intr(dev, que->res, 2355 INTR_TYPE_NET | INTR_MPSAFE, NULL, 2356 ixgbe_msix_que, que, &que->tag); 2357 if (error) { 2358 que->res = NULL; 2359 aprint_error_dev(dev, 2360 "Failed to register QUE handler\n"); 2361 return error; 2362 } 2363#if __FreeBSD_version >= 800504 2364 bus_describe_intr(dev, que->res, que->tag, "que %d", i); 2365#endif 2366 que->msix = vector; 2367 adapter->que_mask |= (u64)(1 << que->msix); 2368 /* 2369 ** Bind the msix vector, and thus the 2370 ** ring to the corresponding cpu. 2371 */ 2372 if (adapter->num_queues > 1) 2373 bus_bind_intr(dev, que->res, i); 2374 2375 que->que_si = softint_establish(ixgbe_handle_que, que); 2376 if (que->que_si == NULL) { 2377 aprint_error_dev(dev, 2378 "could not establish software interrupt\n"); 2379 } 2380 } 2381 2382 /* and Link */ 2383 rid = vector + 1; 2384 adapter->res = bus_alloc_resource_any(dev, 2385 SYS_RES_IRQ, &rid, RF_SHAREABLE | RF_ACTIVE); 2386 if (!adapter->res) { 2387 aprint_error_dev(dev,"Unable to allocate bus resource: " 2388 "Link interrupt [%d]\n", rid); 2389 return (ENXIO); 2390 } 2391 /* Set the link handler function */ 2392 error = bus_setup_intr(dev, adapter->res, 2393 INTR_TYPE_NET | INTR_MPSAFE, NULL, 2394 ixgbe_msix_link, adapter, &adapter->tag); 2395 if (error) { 2396 adapter->res = NULL; 2397 aprint_error_dev(dev, "Failed to register LINK handler\n"); 2398 return (error); 2399 } 2400#if __FreeBSD_version >= 800504 2401 bus_describe_intr(dev, adapter->res, adapter->tag, "link"); 2402#endif 2403 adapter->linkvec = vector; 2404 /* Tasklets for Link, SFP and Multispeed Fiber */ 2405 adapter->link_si = 2406 softint_establish(SOFTINT_NET, ixgbe_handle_link, adapter); 2407 adapter->mod_si = 2408 softint_establish(SOFTINT_NET, ixgbe_handle_mod, adapter); 2409 adapter->msf_si = 2410 softint_establish(SOFTINT_NET, ixgbe_handle_msf, adapter); 2411#ifdef IXGBE_FDIR 2412 adapter->fdir_si = 2413 softint_establish(SOFTINT_NET, ixgbe_reinit_fdir, adapter); 2414#endif 2415 2416 return (0); 2417#endif 2418} 2419 2420/* 2421 * Setup Either MSI/X or MSI 2422 */ 2423static int 2424ixgbe_setup_msix(struct adapter *adapter) 2425{ 2426#if !defined(NETBSD_MSI_OR_MSIX) 2427 return 0; 2428#else 2429 device_t dev = adapter->dev; 2430 int rid, want, queues, msgs; 2431 2432 /* Override by tuneable */ 2433 if (ixgbe_enable_msix == 0) 2434 goto msi; 2435 2436 /* First try MSI/X */ 2437 rid = PCI_BAR(MSIX_82598_BAR); 2438 adapter->msix_mem = bus_alloc_resource_any(dev, 2439 SYS_RES_MEMORY, &rid, RF_ACTIVE); 2440 if (!adapter->msix_mem) { 2441 rid += 4; /* 82599 maps in higher BAR */ 2442 adapter->msix_mem = bus_alloc_resource_any(dev, 2443 SYS_RES_MEMORY, &rid, RF_ACTIVE); 2444 } 2445 if (!adapter->msix_mem) { 2446 /* May not be enabled */ 2447 device_printf(adapter->dev, 2448 "Unable to map MSIX table \n"); 2449 goto msi; 2450 } 2451 2452 msgs = pci_msix_count(dev); 2453 if (msgs == 0) { /* system has msix disabled */ 2454 bus_release_resource(dev, SYS_RES_MEMORY, 2455 rid, adapter->msix_mem); 2456 adapter->msix_mem = NULL; 2457 goto msi; 2458 } 2459 2460 /* Figure out a reasonable auto config value */ 2461 queues = (mp_ncpus > (msgs-1)) ? (msgs-1) : mp_ncpus; 2462 2463 if (ixgbe_num_queues != 0) 2464 queues = ixgbe_num_queues; 2465 /* Set max queues to 8 when autoconfiguring */ 2466 else if ((ixgbe_num_queues == 0) && (queues > 8)) 2467 queues = 8; 2468 2469 /* 2470 ** Want one vector (RX/TX pair) per queue 2471 ** plus an additional for Link. 2472 */ 2473 want = queues + 1; 2474 if (msgs >= want) 2475 msgs = want; 2476 else { 2477 device_printf(adapter->dev, 2478 "MSIX Configuration Problem, " 2479 "%d vectors but %d queues wanted!\n", 2480 msgs, want); 2481 return (0); /* Will go to Legacy setup */ 2482 } 2483 if ((msgs) && pci_alloc_msix(dev, &msgs) == 0) { 2484 device_printf(adapter->dev, 2485 "Using MSIX interrupts with %d vectors\n", msgs); 2486 adapter->num_queues = queues; 2487 return (msgs); 2488 } 2489msi: 2490 msgs = pci_msi_count(dev); 2491 if (msgs == 1 && pci_alloc_msi(dev, &msgs) == 0) 2492 device_printf(adapter->dev,"Using MSI interrupt\n"); 2493 return (msgs); 2494#endif 2495} 2496 2497 2498static int 2499ixgbe_allocate_pci_resources(struct adapter *adapter, const struct pci_attach_args *pa) 2500{ 2501 pcireg_t memtype; 2502 device_t dev = adapter->dev; 2503 bus_addr_t addr; 2504 int flags; 2505 2506 memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, PCI_BAR(0)); 2507 switch (memtype) { 2508 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_32BIT: 2509 case PCI_MAPREG_TYPE_MEM | PCI_MAPREG_MEM_TYPE_64BIT: 2510 adapter->osdep.mem_bus_space_tag = pa->pa_memt; 2511 if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, PCI_BAR(0), 2512 memtype, &addr, &adapter->osdep.mem_size, &flags) != 0) 2513 goto map_err; 2514 if ((flags & BUS_SPACE_MAP_PREFETCHABLE) != 0) { 2515 aprint_normal_dev(dev, "clearing prefetchable bit\n"); 2516 flags &= ~BUS_SPACE_MAP_PREFETCHABLE; 2517 } 2518 if (bus_space_map(adapter->osdep.mem_bus_space_tag, addr, 2519 adapter->osdep.mem_size, flags, 2520 &adapter->osdep.mem_bus_space_handle) != 0) { 2521map_err: 2522 adapter->osdep.mem_size = 0; 2523 aprint_error_dev(dev, "unable to map BAR0\n"); 2524 return ENXIO; 2525 } 2526 break; 2527 default: 2528 aprint_error_dev(dev, "unexpected type on BAR0\n"); 2529 return ENXIO; 2530 } 2531 2532 /* Legacy defaults */ 2533 adapter->num_queues = 1; 2534 adapter->hw.back = &adapter->osdep; 2535 2536 /* 2537 ** Now setup MSI or MSI/X, should 2538 ** return us the number of supported 2539 ** vectors. (Will be 1 for MSI) 2540 */ 2541 adapter->msix = ixgbe_setup_msix(adapter); 2542 return (0); 2543} 2544 2545static void 2546ixgbe_free_pci_resources(struct adapter * adapter) 2547{ 2548#if defined(NETBSD_MSI_OR_MSIX) 2549 struct ix_queue *que = adapter->queues; 2550#endif 2551 device_t dev = adapter->dev; 2552 int rid, memrid; 2553 2554 printf("%s: enter %s\n", device_xname(dev), __func__); 2555 2556 if (adapter->hw.mac.type == ixgbe_mac_82598EB) 2557 memrid = PCI_BAR(MSIX_82598_BAR); 2558 else 2559 memrid = PCI_BAR(MSIX_82599_BAR); 2560 2561#if defined(NETBSD_MSI_OR_MSIX) 2562 /* 2563 ** There is a slight possibility of a failure mode 2564 ** in attach that will result in entering this function 2565 ** before interrupt resources have been initialized, and 2566 ** in that case we do not want to execute the loops below 2567 ** We can detect this reliably by the state of the adapter 2568 ** res pointer. 2569 */ 2570 if (adapter->res == NULL) 2571 goto mem; 2572 2573 /* 2574 ** Release all msix queue resources: 2575 */ 2576 for (int i = 0; i < adapter->num_queues; i++, que++) { 2577 rid = que->msix + 1; 2578 if (que->tag != NULL) { 2579 bus_teardown_intr(dev, que->res, que->tag); 2580 que->tag = NULL; 2581 } 2582 if (que->res != NULL) 2583 bus_release_resource(dev, SYS_RES_IRQ, rid, que->res); 2584 } 2585#endif 2586 2587 /* Clean the Legacy or Link interrupt last */ 2588 if (adapter->linkvec) /* we are doing MSIX */ 2589 rid = adapter->linkvec + 1; 2590 else 2591 (adapter->msix != 0) ? (rid = 1):(rid = 0); 2592 2593 printf("%s: disestablishing interrupt handler\n", device_xname(dev)); 2594 pci_intr_disestablish(adapter->osdep.pc, adapter->osdep.intr); 2595 adapter->osdep.intr = NULL; 2596 2597#if defined(NETBSD_MSI_OR_MSIX) 2598mem: 2599 if (adapter->msix) 2600 pci_release_msi(dev); 2601 2602 if (adapter->msix_mem != NULL) 2603 bus_release_resource(dev, SYS_RES_MEMORY, 2604 memrid, adapter->msix_mem); 2605#endif 2606 2607 if (adapter->osdep.mem_size != 0) { 2608 bus_space_unmap(adapter->osdep.mem_bus_space_tag, 2609 adapter->osdep.mem_bus_space_handle, 2610 adapter->osdep.mem_size); 2611 } 2612 2613 return; 2614} 2615 2616/********************************************************************* 2617 * 2618 * Setup networking device structure and register an interface. 2619 * 2620 **********************************************************************/ 2621static int 2622ixgbe_setup_interface(device_t dev, struct adapter *adapter) 2623{ 2624 struct ethercom *ec = &adapter->osdep.ec; 2625 struct ixgbe_hw *hw = &adapter->hw; 2626 struct ifnet *ifp; 2627 2628 INIT_DEBUGOUT("ixgbe_setup_interface: begin"); 2629 2630 ifp = adapter->ifp = &ec->ec_if; 2631 strlcpy(ifp->if_xname, device_xname(dev), IFNAMSIZ); 2632 ifp->if_mtu = ETHERMTU; 2633 ifp->if_baudrate = 1000000000; 2634 ifp->if_init = ixgbe_init; 2635 ifp->if_stop = ixgbe_ifstop; 2636 ifp->if_softc = adapter; 2637 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 2638 ifp->if_ioctl = ixgbe_ioctl; 2639 ifp->if_start = ixgbe_start; 2640#if __FreeBSD_version >= 800000 2641 ifp->if_transmit = ixgbe_mq_start; 2642 ifp->if_qflush = ixgbe_qflush; 2643#endif 2644 ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 2; 2645 2646 if_attach(ifp); 2647 ether_ifattach(ifp, adapter->hw.mac.addr); 2648 ether_set_ifflags_cb(ec, ixgbe_ifflags_cb); 2649 2650 adapter->max_frame_size = 2651 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN; 2652 2653 /* 2654 * Tell the upper layer(s) we support long frames. 2655 */ 2656 ifp->if_hdrlen = sizeof(struct ether_vlan_header); 2657 2658 ifp->if_capabilities |= IFCAP_HWCSUM | IFCAP_TSOv4; 2659 ifp->if_capenable = 0; 2660 2661 ec->ec_capabilities |= ETHERCAP_VLAN_HWCSUM; 2662 ec->ec_capabilities |= ETHERCAP_VLAN_HWTAGGING | ETHERCAP_VLAN_MTU; 2663 ec->ec_capabilities |= ETHERCAP_JUMBO_MTU; 2664 ec->ec_capenable = ec->ec_capabilities; 2665 2666 /* Don't enable LRO by default */ 2667 ifp->if_capabilities |= IFCAP_LRO; 2668 2669 /* 2670 ** Dont turn this on by default, if vlans are 2671 ** created on another pseudo device (eg. lagg) 2672 ** then vlan events are not passed thru, breaking 2673 ** operation, but with HW FILTER off it works. If 2674 ** using vlans directly on the em driver you can 2675 ** enable this and get full hardware tag filtering. 2676 */ 2677 ec->ec_capabilities |= ETHERCAP_VLAN_HWFILTER; 2678 2679 /* 2680 * Specify the media types supported by this adapter and register 2681 * callbacks to update media and link information 2682 */ 2683 ifmedia_init(&adapter->media, IFM_IMASK, ixgbe_media_change, 2684 ixgbe_media_status); 2685 ifmedia_add(&adapter->media, IFM_ETHER | adapter->optics, 0, NULL); 2686 ifmedia_set(&adapter->media, IFM_ETHER | adapter->optics); 2687 if (hw->device_id == IXGBE_DEV_ID_82598AT) { 2688 ifmedia_add(&adapter->media, 2689 IFM_ETHER | IFM_1000_T | IFM_FDX, 0, NULL); 2690 ifmedia_add(&adapter->media, 2691 IFM_ETHER | IFM_1000_T, 0, NULL); 2692 } 2693 ifmedia_add(&adapter->media, IFM_ETHER | IFM_AUTO, 0, NULL); 2694 ifmedia_set(&adapter->media, IFM_ETHER | IFM_AUTO); 2695 2696 return (0); 2697} 2698 2699static void 2700ixgbe_config_link(struct adapter *adapter) 2701{ 2702 struct ixgbe_hw *hw = &adapter->hw; 2703 u32 autoneg, err = 0; 2704 bool sfp, negotiate; 2705 2706 sfp = ixgbe_is_sfp(hw); 2707 2708 if (sfp) { 2709 if (hw->phy.multispeed_fiber) { 2710 hw->mac.ops.setup_sfp(hw); 2711 ixgbe_enable_tx_laser(hw); 2712 softint_schedule(adapter->msf_si); 2713 } else { 2714 softint_schedule(adapter->mod_si); 2715 } 2716 } else { 2717 if (hw->mac.ops.check_link) 2718 err = ixgbe_check_link(hw, &autoneg, 2719 &adapter->link_up, FALSE); 2720 if (err) 2721 goto out; 2722 autoneg = hw->phy.autoneg_advertised; 2723 if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) 2724 err = hw->mac.ops.get_link_capabilities(hw, 2725 &autoneg, &negotiate); 2726 if (err) 2727 goto out; 2728 if (hw->mac.ops.setup_link) 2729 err = hw->mac.ops.setup_link(hw, autoneg, 2730 negotiate, adapter->link_up); 2731 } 2732out: 2733 return; 2734} 2735 2736/******************************************************************** 2737 * Manage DMA'able memory. 2738 *******************************************************************/ 2739 2740static int 2741ixgbe_dma_malloc(struct adapter *adapter, const bus_size_t size, 2742 struct ixgbe_dma_alloc *dma, const int mapflags) 2743{ 2744 device_t dev = adapter->dev; 2745 int r, rsegs; 2746 2747 r = ixgbe_dma_tag_create(adapter->osdep.dmat, /* parent */ 2748 DBA_ALIGN, 0, /* alignment, bounds */ 2749 size, /* maxsize */ 2750 1, /* nsegments */ 2751 size, /* maxsegsize */ 2752 BUS_DMA_ALLOCNOW, /* flags */ 2753 &dma->dma_tag); 2754 if (r != 0) { 2755 aprint_error_dev(dev, 2756 "%s: ixgbe_dma_tag_create failed; error %d\n", __func__, r); 2757 goto fail_0; 2758 } 2759 2760 r = bus_dmamem_alloc(dma->dma_tag->dt_dmat, 2761 size, 2762 dma->dma_tag->dt_alignment, 2763 dma->dma_tag->dt_boundary, 2764 &dma->dma_seg, 1, &rsegs, BUS_DMA_NOWAIT); 2765 if (r != 0) { 2766 aprint_error_dev(dev, 2767 "%s: bus_dmamem_alloc failed; error %d\n", __func__, r); 2768 goto fail_1; 2769 } 2770 2771 r = bus_dmamem_map(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs, 2772 size, &dma->dma_vaddr, BUS_DMA_NOWAIT); 2773 if (r != 0) { 2774 aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n", 2775 __func__, r); 2776 goto fail_2; 2777 } 2778 2779 r = ixgbe_dmamap_create(dma->dma_tag, 0, &dma->dma_map); 2780 if (r != 0) { 2781 aprint_error_dev(dev, "%s: bus_dmamem_map failed; error %d\n", 2782 __func__, r); 2783 goto fail_3; 2784 } 2785 2786 r = bus_dmamap_load(dma->dma_tag->dt_dmat, dma->dma_map, dma->dma_vaddr, 2787 size, 2788 NULL, 2789 mapflags | BUS_DMA_NOWAIT); 2790 if (r != 0) { 2791 aprint_error_dev(dev, "%s: bus_dmamap_load failed; error %d\n", 2792 __func__, r); 2793 goto fail_4; 2794 } 2795 dma->dma_paddr = dma->dma_map->dm_segs[0].ds_addr; 2796 dma->dma_size = size; 2797 return 0; 2798fail_4: 2799 ixgbe_dmamap_destroy(dma->dma_tag, dma->dma_map); 2800fail_3: 2801 bus_dmamem_unmap(dma->dma_tag->dt_dmat, dma->dma_vaddr, size); 2802fail_2: 2803 bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, rsegs); 2804fail_1: 2805 ixgbe_dma_tag_destroy(dma->dma_tag); 2806fail_0: 2807 return r; 2808} 2809 2810static void 2811ixgbe_dma_free(struct adapter *adapter, struct ixgbe_dma_alloc *dma) 2812{ 2813 bus_dmamap_sync(dma->dma_tag->dt_dmat, dma->dma_map, 0, dma->dma_size, 2814 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 2815 ixgbe_dmamap_unload(dma->dma_tag, dma->dma_map); 2816 bus_dmamem_free(dma->dma_tag->dt_dmat, &dma->dma_seg, 1); 2817 ixgbe_dma_tag_destroy(dma->dma_tag); 2818} 2819 2820 2821/********************************************************************* 2822 * 2823 * Allocate memory for the transmit and receive rings, and then 2824 * the descriptors associated with each, called only once at attach. 2825 * 2826 **********************************************************************/ 2827static int 2828ixgbe_allocate_queues(struct adapter *adapter) 2829{ 2830 device_t dev = adapter->dev; 2831 struct ix_queue *que; 2832 struct tx_ring *txr; 2833 struct rx_ring *rxr; 2834 int rsize, tsize, error = IXGBE_SUCCESS; 2835 int txconf = 0, rxconf = 0; 2836 2837 /* First allocate the top level queue structs */ 2838 if (!(adapter->queues = 2839 (struct ix_queue *) malloc(sizeof(struct ix_queue) * 2840 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { 2841 aprint_error_dev(dev, "Unable to allocate queue memory\n"); 2842 error = ENOMEM; 2843 goto fail; 2844 } 2845 2846 /* First allocate the TX ring struct memory */ 2847 if (!(adapter->tx_rings = 2848 (struct tx_ring *) malloc(sizeof(struct tx_ring) * 2849 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { 2850 aprint_error_dev(dev, "Unable to allocate TX ring memory\n"); 2851 error = ENOMEM; 2852 goto tx_fail; 2853 } 2854 2855 /* Next allocate the RX */ 2856 if (!(adapter->rx_rings = 2857 (struct rx_ring *) malloc(sizeof(struct rx_ring) * 2858 adapter->num_queues, M_DEVBUF, M_NOWAIT | M_ZERO))) { 2859 aprint_error_dev(dev, "Unable to allocate RX ring memory\n"); 2860 error = ENOMEM; 2861 goto rx_fail; 2862 } 2863 2864 /* For the ring itself */ 2865 tsize = roundup2(adapter->num_tx_desc * 2866 sizeof(union ixgbe_adv_tx_desc), DBA_ALIGN); 2867 2868 /* 2869 * Now set up the TX queues, txconf is needed to handle the 2870 * possibility that things fail midcourse and we need to 2871 * undo memory gracefully 2872 */ 2873 for (int i = 0; i < adapter->num_queues; i++, txconf++) { 2874 /* Set up some basics */ 2875 txr = &adapter->tx_rings[i]; 2876 txr->adapter = adapter; 2877 txr->me = i; 2878 2879 /* Initialize the TX side lock */ 2880 snprintf(txr->mtx_name, sizeof(txr->mtx_name), "%s:tx(%d)", 2881 device_xname(dev), txr->me); 2882 mutex_init(&txr->tx_mtx, MUTEX_DEFAULT, IPL_NET); 2883 2884 if (ixgbe_dma_malloc(adapter, tsize, 2885 &txr->txdma, BUS_DMA_NOWAIT)) { 2886 aprint_error_dev(dev, 2887 "Unable to allocate TX Descriptor memory\n"); 2888 error = ENOMEM; 2889 goto err_tx_desc; 2890 } 2891 txr->tx_base = (union ixgbe_adv_tx_desc *)txr->txdma.dma_vaddr; 2892 bzero((void *)txr->tx_base, tsize); 2893 2894 /* Now allocate transmit buffers for the ring */ 2895 if (ixgbe_allocate_transmit_buffers(txr)) { 2896 aprint_error_dev(dev, 2897 "Critical Failure setting up transmit buffers\n"); 2898 error = ENOMEM; 2899 goto err_tx_desc; 2900 } 2901#if __FreeBSD_version >= 800000 2902 /* Allocate a buf ring */ 2903 txr->br = buf_ring_alloc(IXGBE_BR_SIZE, M_DEVBUF, 2904 M_WAITOK, &txr->tx_mtx); 2905 if (txr->br == NULL) { 2906 aprint_error_dev(dev, 2907 "Critical Failure setting up buf ring\n"); 2908 error = ENOMEM; 2909 goto err_tx_desc; 2910 } 2911#endif 2912 } 2913 2914 /* 2915 * Next the RX queues... 2916 */ 2917 rsize = roundup2(adapter->num_rx_desc * 2918 sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN); 2919 for (int i = 0; i < adapter->num_queues; i++, rxconf++) { 2920 rxr = &adapter->rx_rings[i]; 2921 /* Set up some basics */ 2922 rxr->adapter = adapter; 2923 rxr->me = i; 2924 2925 /* Initialize the RX side lock */ 2926 snprintf(rxr->mtx_name, sizeof(rxr->mtx_name), "%s:rx(%d)", 2927 device_xname(dev), rxr->me); 2928 mutex_init(&rxr->rx_mtx, MUTEX_DEFAULT, IPL_NET); 2929 2930 if (ixgbe_dma_malloc(adapter, rsize, 2931 &rxr->rxdma, BUS_DMA_NOWAIT)) { 2932 aprint_error_dev(dev, 2933 "Unable to allocate RxDescriptor memory\n"); 2934 error = ENOMEM; 2935 goto err_rx_desc; 2936 } 2937 rxr->rx_base = (union ixgbe_adv_rx_desc *)rxr->rxdma.dma_vaddr; 2938 bzero((void *)rxr->rx_base, rsize); 2939 2940 /* Allocate receive buffers for the ring*/ 2941 if (ixgbe_allocate_receive_buffers(rxr)) { 2942 aprint_error_dev(dev, 2943 "Critical Failure setting up receive buffers\n"); 2944 error = ENOMEM; 2945 goto err_rx_desc; 2946 } 2947 } 2948 2949 /* 2950 ** Finally set up the queue holding structs 2951 */ 2952 for (int i = 0; i < adapter->num_queues; i++) { 2953 que = &adapter->queues[i]; 2954 que->adapter = adapter; 2955 que->txr = &adapter->tx_rings[i]; 2956 que->rxr = &adapter->rx_rings[i]; 2957 } 2958 2959 return (0); 2960 2961err_rx_desc: 2962 for (rxr = adapter->rx_rings; rxconf > 0; rxr++, rxconf--) 2963 ixgbe_dma_free(adapter, &rxr->rxdma); 2964err_tx_desc: 2965 for (txr = adapter->tx_rings; txconf > 0; txr++, txconf--) 2966 ixgbe_dma_free(adapter, &txr->txdma); 2967 free(adapter->rx_rings, M_DEVBUF); 2968rx_fail: 2969 free(adapter->tx_rings, M_DEVBUF); 2970tx_fail: 2971 free(adapter->queues, M_DEVBUF); 2972fail: 2973 return (error); 2974} 2975 2976/********************************************************************* 2977 * 2978 * Allocate memory for tx_buffer structures. The tx_buffer stores all 2979 * the information needed to transmit a packet on the wire. This is 2980 * called only once at attach, setup is done every reset. 2981 * 2982 **********************************************************************/ 2983static int 2984ixgbe_allocate_transmit_buffers(struct tx_ring *txr) 2985{ 2986 struct adapter *adapter = txr->adapter; 2987 device_t dev = adapter->dev; 2988 struct ixgbe_tx_buf *txbuf; 2989 int error, i; 2990 2991 /* 2992 * Setup DMA descriptor areas. 2993 */ 2994 if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat, /* parent */ 2995 1, 0, /* alignment, bounds */ 2996 IXGBE_TSO_SIZE, /* maxsize */ 2997 adapter->num_segs, /* nsegments */ 2998 PAGE_SIZE, /* maxsegsize */ 2999 0, /* flags */ 3000 &txr->txtag))) { 3001 aprint_error_dev(dev,"Unable to allocate TX DMA tag\n"); 3002 goto fail; 3003 } 3004 3005 if (!(txr->tx_buffers = 3006 (struct ixgbe_tx_buf *) malloc(sizeof(struct ixgbe_tx_buf) * 3007 adapter->num_tx_desc, M_DEVBUF, M_NOWAIT | M_ZERO))) { 3008 aprint_error_dev(dev, "Unable to allocate tx_buffer memory\n"); 3009 error = ENOMEM; 3010 goto fail; 3011 } 3012 3013 /* Create the descriptor buffer dma maps */ 3014 txbuf = txr->tx_buffers; 3015 for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) { 3016 error = ixgbe_dmamap_create(txr->txtag, 0, &txbuf->map); 3017 if (error != 0) { 3018 aprint_error_dev(dev, "Unable to create TX DMA map\n"); 3019 goto fail; 3020 } 3021 } 3022 3023 return 0; 3024fail: 3025 /* We free all, it handles case where we are in the middle */ 3026 ixgbe_free_transmit_structures(adapter); 3027 return (error); 3028} 3029 3030/********************************************************************* 3031 * 3032 * Initialize a transmit ring. 3033 * 3034 **********************************************************************/ 3035static void 3036ixgbe_setup_transmit_ring(struct tx_ring *txr) 3037{ 3038 struct adapter *adapter = txr->adapter; 3039 struct ixgbe_tx_buf *txbuf; 3040 int i; 3041 3042 /* Clear the old ring contents */ 3043 IXGBE_TX_LOCK(txr); 3044 bzero((void *)txr->tx_base, 3045 (sizeof(union ixgbe_adv_tx_desc)) * adapter->num_tx_desc); 3046 /* Reset indices */ 3047 txr->next_avail_desc = 0; 3048 txr->next_to_clean = 0; 3049 3050 /* Free any existing tx buffers. */ 3051 txbuf = txr->tx_buffers; 3052 for (i = 0; i < adapter->num_tx_desc; i++, txbuf++) { 3053 if (txbuf->m_head != NULL) { 3054 bus_dmamap_sync(txr->txtag->dt_dmat, txbuf->map, 3055 0, txbuf->m_head->m_pkthdr.len, 3056 BUS_DMASYNC_POSTWRITE); 3057 ixgbe_dmamap_unload(txr->txtag, txbuf->map); 3058 m_freem(txbuf->m_head); 3059 txbuf->m_head = NULL; 3060 } 3061 /* Clear the EOP index */ 3062 txbuf->eop_index = -1; 3063 } 3064 3065#ifdef IXGBE_FDIR 3066 /* Set the rate at which we sample packets */ 3067 if (adapter->hw.mac.type != ixgbe_mac_82598EB) 3068 txr->atr_sample = atr_sample_rate; 3069#endif 3070 3071 /* Set number of descriptors available */ 3072 txr->tx_avail = adapter->num_tx_desc; 3073 3074 ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 3075 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 3076 IXGBE_TX_UNLOCK(txr); 3077} 3078 3079/********************************************************************* 3080 * 3081 * Initialize all transmit rings. 3082 * 3083 **********************************************************************/ 3084static int 3085ixgbe_setup_transmit_structures(struct adapter *adapter) 3086{ 3087 struct tx_ring *txr = adapter->tx_rings; 3088 3089 for (int i = 0; i < adapter->num_queues; i++, txr++) 3090 ixgbe_setup_transmit_ring(txr); 3091 3092 return (0); 3093} 3094 3095/********************************************************************* 3096 * 3097 * Enable transmit unit. 3098 * 3099 **********************************************************************/ 3100static void 3101ixgbe_initialize_transmit_units(struct adapter *adapter) 3102{ 3103 struct tx_ring *txr = adapter->tx_rings; 3104 struct ixgbe_hw *hw = &adapter->hw; 3105 3106 /* Setup the Base and Length of the Tx Descriptor Ring */ 3107 3108 for (int i = 0; i < adapter->num_queues; i++, txr++) { 3109 u64 tdba = txr->txdma.dma_paddr; 3110 u32 txctrl; 3111 3112 IXGBE_WRITE_REG(hw, IXGBE_TDBAL(i), 3113 (tdba & 0x00000000ffffffffULL)); 3114 IXGBE_WRITE_REG(hw, IXGBE_TDBAH(i), (tdba >> 32)); 3115 IXGBE_WRITE_REG(hw, IXGBE_TDLEN(i), 3116 adapter->num_tx_desc * sizeof(struct ixgbe_legacy_tx_desc)); 3117 3118 /* Setup the HW Tx Head and Tail descriptor pointers */ 3119 IXGBE_WRITE_REG(hw, IXGBE_TDH(i), 0); 3120 IXGBE_WRITE_REG(hw, IXGBE_TDT(i), 0); 3121 3122 /* Setup Transmit Descriptor Cmd Settings */ 3123 txr->txd_cmd = IXGBE_TXD_CMD_IFCS; 3124 txr->queue_status = IXGBE_QUEUE_IDLE; 3125 3126 /* Disable Head Writeback */ 3127 switch (hw->mac.type) { 3128 case ixgbe_mac_82598EB: 3129 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i)); 3130 break; 3131 case ixgbe_mac_82599EB: 3132 default: 3133 txctrl = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL_82599(i)); 3134 break; 3135 } 3136 txctrl &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN; 3137 switch (hw->mac.type) { 3138 case ixgbe_mac_82598EB: 3139 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), txctrl); 3140 break; 3141 case ixgbe_mac_82599EB: 3142 default: 3143 IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL_82599(i), txctrl); 3144 break; 3145 } 3146 3147 } 3148 3149 if (hw->mac.type != ixgbe_mac_82598EB) { 3150 u32 dmatxctl, rttdcs; 3151 dmatxctl = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); 3152 dmatxctl |= IXGBE_DMATXCTL_TE; 3153 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, dmatxctl); 3154 /* Disable arbiter to set MTQC */ 3155 rttdcs = IXGBE_READ_REG(hw, IXGBE_RTTDCS); 3156 rttdcs |= IXGBE_RTTDCS_ARBDIS; 3157 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); 3158 IXGBE_WRITE_REG(hw, IXGBE_MTQC, IXGBE_MTQC_64Q_1PB); 3159 rttdcs &= ~IXGBE_RTTDCS_ARBDIS; 3160 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, rttdcs); 3161 } 3162 3163 return; 3164} 3165 3166/********************************************************************* 3167 * 3168 * Free all transmit rings. 3169 * 3170 **********************************************************************/ 3171static void 3172ixgbe_free_transmit_structures(struct adapter *adapter) 3173{ 3174 struct tx_ring *txr = adapter->tx_rings; 3175 3176 for (int i = 0; i < adapter->num_queues; i++, txr++) { 3177 IXGBE_TX_LOCK(txr); 3178 ixgbe_free_transmit_buffers(txr); 3179 ixgbe_dma_free(adapter, &txr->txdma); 3180 IXGBE_TX_UNLOCK(txr); 3181 IXGBE_TX_LOCK_DESTROY(txr); 3182 } 3183 free(adapter->tx_rings, M_DEVBUF); 3184} 3185 3186/********************************************************************* 3187 * 3188 * Free transmit ring related data structures. 3189 * 3190 **********************************************************************/ 3191static void 3192ixgbe_free_transmit_buffers(struct tx_ring *txr) 3193{ 3194 struct adapter *adapter = txr->adapter; 3195 struct ixgbe_tx_buf *tx_buffer; 3196 int i; 3197 3198 INIT_DEBUGOUT("free_transmit_ring: begin"); 3199 3200 if (txr->tx_buffers == NULL) 3201 return; 3202 3203 tx_buffer = txr->tx_buffers; 3204 for (i = 0; i < adapter->num_tx_desc; i++, tx_buffer++) { 3205 if (tx_buffer->m_head != NULL) { 3206 bus_dmamap_sync(txr->txtag->dt_dmat, tx_buffer->map, 3207 0, tx_buffer->m_head->m_pkthdr.len, 3208 BUS_DMASYNC_POSTWRITE); 3209 ixgbe_dmamap_unload(txr->txtag, tx_buffer->map); 3210 m_freem(tx_buffer->m_head); 3211 tx_buffer->m_head = NULL; 3212 if (tx_buffer->map != NULL) { 3213 ixgbe_dmamap_destroy(txr->txtag, 3214 tx_buffer->map); 3215 tx_buffer->map = NULL; 3216 } 3217 } else if (tx_buffer->map != NULL) { 3218 ixgbe_dmamap_unload(txr->txtag, tx_buffer->map); 3219 ixgbe_dmamap_destroy(txr->txtag, tx_buffer->map); 3220 tx_buffer->map = NULL; 3221 } 3222 } 3223#if __FreeBSD_version >= 800000 3224 if (txr->br != NULL) 3225 buf_ring_free(txr->br, M_DEVBUF); 3226#endif 3227 if (txr->tx_buffers != NULL) { 3228 free(txr->tx_buffers, M_DEVBUF); 3229 txr->tx_buffers = NULL; 3230 } 3231 if (txr->txtag != NULL) { 3232 ixgbe_dma_tag_destroy(txr->txtag); 3233 txr->txtag = NULL; 3234 } 3235 return; 3236} 3237 3238/********************************************************************* 3239 * 3240 * Advanced Context Descriptor setup for VLAN or L4 CSUM 3241 * 3242 **********************************************************************/ 3243 3244static u32 3245ixgbe_tx_ctx_setup(struct tx_ring *txr, struct mbuf *mp) 3246{ 3247 struct m_tag *mtag; 3248 struct adapter *adapter = txr->adapter; 3249 struct ethercom *ec = &adapter->osdep.ec; 3250 struct ixgbe_adv_tx_context_desc *TXD; 3251 struct ixgbe_tx_buf *tx_buffer; 3252 u32 olinfo = 0, vlan_macip_lens = 0, type_tucmd_mlhl = 0; 3253 struct ether_vlan_header *eh; 3254 struct ip ip; 3255 struct ip6_hdr ip6; 3256 int ehdrlen, ip_hlen = 0; 3257 u16 etype; 3258 u8 ipproto = 0; 3259 bool offload; 3260 int ctxd = txr->next_avail_desc; 3261 u16 vtag = 0; 3262 3263 offload = ((mp->m_pkthdr.csum_flags & M_CSUM_OFFLOAD) != 0); 3264 3265 tx_buffer = &txr->tx_buffers[ctxd]; 3266 TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd]; 3267 3268 /* 3269 ** In advanced descriptors the vlan tag must 3270 ** be placed into the descriptor itself. 3271 */ 3272 if ((mtag = VLAN_OUTPUT_TAG(ec, mp)) != NULL) { 3273 vtag = htole16(VLAN_TAG_VALUE(mtag) & 0xffff); 3274 vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT); 3275 } else if (!offload) 3276 return 0; 3277 3278 /* 3279 * Determine where frame payload starts. 3280 * Jump over vlan headers if already present, 3281 * helpful for QinQ too. 3282 */ 3283 KASSERT(mp->m_len >= offsetof(struct ether_vlan_header, evl_tag)); 3284 eh = mtod(mp, struct ether_vlan_header *); 3285 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { 3286 KASSERT(mp->m_len >= sizeof(struct ether_vlan_header)); 3287 etype = ntohs(eh->evl_proto); 3288 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 3289 } else { 3290 etype = ntohs(eh->evl_encap_proto); 3291 ehdrlen = ETHER_HDR_LEN; 3292 } 3293 3294 /* Set the ether header length */ 3295 vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT; 3296 3297 switch (etype) { 3298 case ETHERTYPE_IP: 3299 m_copydata(mp, ehdrlen, sizeof(ip), &ip); 3300 ip_hlen = ip.ip_hl << 2; 3301 ipproto = ip.ip_p; 3302#if 0 3303 ip.ip_sum = 0; 3304 m_copyback(mp, ehdrlen, sizeof(ip), &ip); 3305#else 3306 KASSERT((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0 || 3307 ip.ip_sum == 0); 3308#endif 3309 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; 3310 break; 3311 case ETHERTYPE_IPV6: 3312 m_copydata(mp, ehdrlen, sizeof(ip6), &ip6); 3313 ip_hlen = sizeof(ip6); 3314 ipproto = ip6.ip6_nxt; 3315 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV6; 3316 break; 3317 default: 3318 break; 3319 } 3320 3321 if ((mp->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0) 3322 olinfo |= IXGBE_TXD_POPTS_IXSM << 8; 3323 3324 vlan_macip_lens |= ip_hlen; 3325 type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT; 3326 3327 if (mp->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_TCPv6)) { 3328 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP; 3329 olinfo |= IXGBE_TXD_POPTS_TXSM << 8; 3330 KASSERT(ipproto == IPPROTO_TCP); 3331 } else if (mp->m_pkthdr.csum_flags & (M_CSUM_UDPv4|M_CSUM_UDPv6)) { 3332 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_UDP; 3333 olinfo |= IXGBE_TXD_POPTS_TXSM << 8; 3334 KASSERT(ipproto == IPPROTO_UDP); 3335 } 3336 3337 /* Now copy bits into descriptor */ 3338 TXD->vlan_macip_lens |= htole32(vlan_macip_lens); 3339 TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl); 3340 TXD->seqnum_seed = htole32(0); 3341 TXD->mss_l4len_idx = htole32(0); 3342 3343 tx_buffer->m_head = NULL; 3344 tx_buffer->eop_index = -1; 3345 3346 /* We've consumed the first desc, adjust counters */ 3347 if (++ctxd == adapter->num_tx_desc) 3348 ctxd = 0; 3349 txr->next_avail_desc = ctxd; 3350 --txr->tx_avail; 3351 3352 return olinfo; 3353} 3354 3355/********************************************************************** 3356 * 3357 * Setup work for hardware segmentation offload (TSO) on 3358 * adapters using advanced tx descriptors 3359 * 3360 **********************************************************************/ 3361static bool 3362ixgbe_tso_setup(struct tx_ring *txr, struct mbuf *mp, u32 *paylen) 3363{ 3364 struct m_tag *mtag; 3365 struct adapter *adapter = txr->adapter; 3366 struct ethercom *ec = &adapter->osdep.ec; 3367 struct ixgbe_adv_tx_context_desc *TXD; 3368 struct ixgbe_tx_buf *tx_buffer; 3369 u32 vlan_macip_lens = 0, type_tucmd_mlhl = 0; 3370 u32 mss_l4len_idx = 0; 3371 u16 vtag = 0; 3372 int ctxd, ehdrlen, hdrlen, ip_hlen, tcp_hlen; 3373 struct ether_vlan_header *eh; 3374 struct ip *ip; 3375 struct tcphdr *th; 3376 3377 3378 /* 3379 * Determine where frame payload starts. 3380 * Jump over vlan headers if already present 3381 */ 3382 eh = mtod(mp, struct ether_vlan_header *); 3383 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) 3384 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 3385 else 3386 ehdrlen = ETHER_HDR_LEN; 3387 3388 /* Ensure we have at least the IP+TCP header in the first mbuf. */ 3389 if (mp->m_len < ehdrlen + sizeof(struct ip) + sizeof(struct tcphdr)) 3390 return FALSE; 3391 3392 ctxd = txr->next_avail_desc; 3393 tx_buffer = &txr->tx_buffers[ctxd]; 3394 TXD = (struct ixgbe_adv_tx_context_desc *) &txr->tx_base[ctxd]; 3395 3396 ip = (struct ip *)(mp->m_data + ehdrlen); 3397 if (ip->ip_p != IPPROTO_TCP) 3398 return FALSE; /* 0 */ 3399 ip->ip_sum = 0; 3400 ip_hlen = ip->ip_hl << 2; 3401 th = (struct tcphdr *)((char *)ip + ip_hlen); 3402 /* XXX Educated guess: FreeBSD's in_pseudo == NetBSD's in_cksum_phdr */ 3403 th->th_sum = in_cksum_phdr(ip->ip_src.s_addr, 3404 ip->ip_dst.s_addr, htons(IPPROTO_TCP)); 3405 tcp_hlen = th->th_off << 2; 3406 hdrlen = ehdrlen + ip_hlen + tcp_hlen; 3407 3408 /* This is used in the transmit desc in encap */ 3409 *paylen = mp->m_pkthdr.len - hdrlen; 3410 3411 /* VLAN MACLEN IPLEN */ 3412 if ((mtag = VLAN_OUTPUT_TAG(ec, mp)) != NULL) { 3413 vtag = htole16(VLAN_TAG_VALUE(mtag) & 0xffff); 3414 vlan_macip_lens |= (vtag << IXGBE_ADVTXD_VLAN_SHIFT); 3415 } 3416 3417 vlan_macip_lens |= ehdrlen << IXGBE_ADVTXD_MACLEN_SHIFT; 3418 vlan_macip_lens |= ip_hlen; 3419 TXD->vlan_macip_lens |= htole32(vlan_macip_lens); 3420 3421 /* ADV DTYPE TUCMD */ 3422 type_tucmd_mlhl |= IXGBE_ADVTXD_DCMD_DEXT | IXGBE_ADVTXD_DTYP_CTXT; 3423 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP; 3424 type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; 3425 TXD->type_tucmd_mlhl |= htole32(type_tucmd_mlhl); 3426 3427 3428 /* MSS L4LEN IDX */ 3429 mss_l4len_idx |= (mp->m_pkthdr.segsz << IXGBE_ADVTXD_MSS_SHIFT); 3430 mss_l4len_idx |= (tcp_hlen << IXGBE_ADVTXD_L4LEN_SHIFT); 3431 TXD->mss_l4len_idx = htole32(mss_l4len_idx); 3432 3433 TXD->seqnum_seed = htole32(0); 3434 tx_buffer->m_head = NULL; 3435 tx_buffer->eop_index = -1; 3436 3437 if (++ctxd == adapter->num_tx_desc) 3438 ctxd = 0; 3439 3440 txr->tx_avail--; 3441 txr->next_avail_desc = ctxd; 3442 return TRUE; 3443} 3444 3445#ifdef IXGBE_FDIR 3446/* 3447** This routine parses packet headers so that Flow 3448** Director can make a hashed filter table entry 3449** allowing traffic flows to be identified and kept 3450** on the same cpu. This would be a performance 3451** hit, but we only do it at IXGBE_FDIR_RATE of 3452** packets. 3453*/ 3454static void 3455ixgbe_atr(struct tx_ring *txr, struct mbuf *mp) 3456{ 3457 struct adapter *adapter = txr->adapter; 3458 struct ix_queue *que; 3459 struct ip *ip; 3460 struct tcphdr *th; 3461 struct udphdr *uh; 3462 struct ether_vlan_header *eh; 3463 union ixgbe_atr_hash_dword input = {.dword = 0}; 3464 union ixgbe_atr_hash_dword common = {.dword = 0}; 3465 int ehdrlen, ip_hlen; 3466 u16 etype; 3467 3468 eh = mtod(mp, struct ether_vlan_header *); 3469 if (eh->evl_encap_proto == htons(ETHERTYPE_VLAN)) { 3470 ehdrlen = ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN; 3471 etype = eh->evl_proto; 3472 } else { 3473 ehdrlen = ETHER_HDR_LEN; 3474 etype = eh->evl_encap_proto; 3475 } 3476 3477 /* Only handling IPv4 */ 3478 if (etype != htons(ETHERTYPE_IP)) 3479 return; 3480 3481 ip = (struct ip *)(mp->m_data + ehdrlen); 3482 ip_hlen = ip->ip_hl << 2; 3483 3484 /* check if we're UDP or TCP */ 3485 switch (ip->ip_p) { 3486 case IPPROTO_TCP: 3487 th = (struct tcphdr *)((char *)ip + ip_hlen); 3488 /* src and dst are inverted */ 3489 common.port.dst ^= th->th_sport; 3490 common.port.src ^= th->th_dport; 3491 input.formatted.flow_type ^= IXGBE_ATR_FLOW_TYPE_TCPV4; 3492 break; 3493 case IPPROTO_UDP: 3494 uh = (struct udphdr *)((char *)ip + ip_hlen); 3495 /* src and dst are inverted */ 3496 common.port.dst ^= uh->uh_sport; 3497 common.port.src ^= uh->uh_dport; 3498 input.formatted.flow_type ^= IXGBE_ATR_FLOW_TYPE_UDPV4; 3499 break; 3500 default: 3501 return; 3502 } 3503 3504 input.formatted.vlan_id = htobe16(mp->m_pkthdr.ether_vtag); 3505 if (mp->m_pkthdr.ether_vtag) 3506 common.flex_bytes ^= htons(ETHERTYPE_VLAN); 3507 else 3508 common.flex_bytes ^= etype; 3509 common.ip ^= ip->ip_src.s_addr ^ ip->ip_dst.s_addr; 3510 3511 que = &adapter->queues[txr->me]; 3512 /* 3513 ** This assumes the Rx queue and Tx 3514 ** queue are bound to the same CPU 3515 */ 3516 ixgbe_fdir_add_signature_filter_82599(&adapter->hw, 3517 input, common, que->msix); 3518} 3519#endif /* IXGBE_FDIR */ 3520 3521/********************************************************************** 3522 * 3523 * Examine each tx_buffer in the used queue. If the hardware is done 3524 * processing the packet then free associated resources. The 3525 * tx_buffer is put back on the free queue. 3526 * 3527 **********************************************************************/ 3528static bool 3529ixgbe_txeof(struct tx_ring *txr) 3530{ 3531 struct adapter *adapter = txr->adapter; 3532 struct ifnet *ifp = adapter->ifp; 3533 u32 first, last, done, processed; 3534 struct ixgbe_tx_buf *tx_buffer; 3535 struct ixgbe_legacy_tx_desc *tx_desc, *eop_desc; 3536 struct timeval now, elapsed; 3537 3538 KASSERT(mutex_owned(&txr->tx_mtx)); 3539 3540 if (txr->tx_avail == adapter->num_tx_desc) { 3541 txr->queue_status = IXGBE_QUEUE_IDLE; 3542 return false; 3543 } 3544 3545 processed = 0; 3546 first = txr->next_to_clean; 3547 tx_buffer = &txr->tx_buffers[first]; 3548 /* For cleanup we just use legacy struct */ 3549 tx_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first]; 3550 last = tx_buffer->eop_index; 3551 if (last == -1) 3552 return false; 3553 eop_desc = (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last]; 3554 3555 /* 3556 ** Get the index of the first descriptor 3557 ** BEYOND the EOP and call that 'done'. 3558 ** I do this so the comparison in the 3559 ** inner while loop below can be simple 3560 */ 3561 if (++last == adapter->num_tx_desc) last = 0; 3562 done = last; 3563 3564 ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 3565 BUS_DMASYNC_POSTREAD); 3566 /* 3567 ** Only the EOP descriptor of a packet now has the DD 3568 ** bit set, this is what we look for... 3569 */ 3570 while (eop_desc->upper.fields.status & IXGBE_TXD_STAT_DD) { 3571 /* We clean the range of the packet */ 3572 while (first != done) { 3573 tx_desc->upper.data = 0; 3574 tx_desc->lower.data = 0; 3575 tx_desc->buffer_addr = 0; 3576 ++txr->tx_avail; 3577 ++processed; 3578 3579 if (tx_buffer->m_head) { 3580 txr->bytes += 3581 tx_buffer->m_head->m_pkthdr.len; 3582 bus_dmamap_sync(txr->txtag->dt_dmat, 3583 tx_buffer->map, 3584 0, tx_buffer->m_head->m_pkthdr.len, 3585 BUS_DMASYNC_POSTWRITE); 3586 ixgbe_dmamap_unload(txr->txtag, tx_buffer->map); 3587 m_freem(tx_buffer->m_head); 3588 tx_buffer->m_head = NULL; 3589 } 3590 tx_buffer->eop_index = -1; 3591 getmicrotime(&txr->watchdog_time); 3592 3593 if (++first == adapter->num_tx_desc) 3594 first = 0; 3595 3596 tx_buffer = &txr->tx_buffers[first]; 3597 tx_desc = 3598 (struct ixgbe_legacy_tx_desc *)&txr->tx_base[first]; 3599 } 3600 ++txr->packets; 3601 ++ifp->if_opackets; 3602 /* See if there is more work now */ 3603 last = tx_buffer->eop_index; 3604 if (last != -1) { 3605 eop_desc = 3606 (struct ixgbe_legacy_tx_desc *)&txr->tx_base[last]; 3607 /* Get next done point */ 3608 if (++last == adapter->num_tx_desc) last = 0; 3609 done = last; 3610 } else 3611 break; 3612 } 3613 ixgbe_dmamap_sync(txr->txdma.dma_tag, txr->txdma.dma_map, 3614 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 3615 3616 txr->next_to_clean = first; 3617 3618 /* 3619 ** Watchdog calculation, we know there's 3620 ** work outstanding or the first return 3621 ** would have been taken, so none processed 3622 ** for too long indicates a hang. 3623 */ 3624 getmicrotime(&now); 3625 timersub(&now, &txr->watchdog_time, &elapsed); 3626 if (!processed && tvtohz(&elapsed) > IXGBE_WATCHDOG) 3627 txr->queue_status = IXGBE_QUEUE_HUNG; 3628 3629 /* 3630 * If we have enough room, clear IFF_OACTIVE to tell the stack that 3631 * it is OK to send packets. If there are no pending descriptors, 3632 * clear the timeout. Otherwise, if some descriptors have been freed, 3633 * restart the timeout. 3634 */ 3635 if (txr->tx_avail > IXGBE_TX_CLEANUP_THRESHOLD) { 3636 ifp->if_flags &= ~IFF_OACTIVE; 3637 if (txr->tx_avail == adapter->num_tx_desc) { 3638 txr->queue_status = IXGBE_QUEUE_IDLE; 3639 return false; 3640 } 3641 } 3642 3643 return true; 3644} 3645 3646/********************************************************************* 3647 * 3648 * Refresh mbuf buffers for RX descriptor rings 3649 * - now keeps its own state so discards due to resource 3650 * exhaustion are unnecessary, if an mbuf cannot be obtained 3651 * it just returns, keeping its placeholder, thus it can simply 3652 * be recalled to try again. 3653 * 3654 **********************************************************************/ 3655static void 3656ixgbe_refresh_mbufs(struct rx_ring *rxr, int limit) 3657{ 3658 struct adapter *adapter = rxr->adapter; 3659 struct ixgbe_rx_buf *rxbuf; 3660 struct mbuf *mh, *mp; 3661 int i, j, error; 3662 bool refreshed = false; 3663 3664 i = j = rxr->next_to_refresh; 3665 /* Control the loop with one beyond */ 3666 if (++j == adapter->num_rx_desc) 3667 j = 0; 3668 3669 while (j != limit) { 3670 rxbuf = &rxr->rx_buffers[i]; 3671 if (rxr->hdr_split == FALSE) 3672 goto no_split; 3673 3674 if (rxbuf->m_head == NULL) { 3675 mh = m_gethdr(M_DONTWAIT, MT_DATA); 3676 if (mh == NULL) 3677 goto update; 3678 } else 3679 mh = rxbuf->m_head; 3680 3681 mh->m_pkthdr.len = mh->m_len = MHLEN; 3682 mh->m_len = MHLEN; 3683 mh->m_flags |= M_PKTHDR; 3684 /* Get the memory mapping */ 3685 error = bus_dmamap_load_mbuf(rxr->htag->dt_dmat, 3686 rxbuf->hmap, mh, BUS_DMA_NOWAIT); 3687 if (error != 0) { 3688 printf("Refresh mbufs: hdr dmamap load" 3689 " failure - %d\n", error); 3690 m_free(mh); 3691 rxbuf->m_head = NULL; 3692 goto update; 3693 } 3694 rxbuf->m_head = mh; 3695 ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap, BUS_DMASYNC_PREREAD); 3696 rxr->rx_base[i].read.hdr_addr = 3697 htole64(rxbuf->hmap->dm_segs[0].ds_addr); 3698 3699no_split: 3700 if (rxbuf->m_pack == NULL) { 3701 mp = ixgbe_getjcl(&adapter->jcl_head, M_DONTWAIT, 3702 MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz); 3703 if (mp == NULL) { 3704 rxr->no_jmbuf.ev_count++; 3705 goto update; 3706 } 3707 } else 3708 mp = rxbuf->m_pack; 3709 3710 mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz; 3711 /* Get the memory mapping */ 3712 error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat, 3713 rxbuf->pmap, mp, BUS_DMA_NOWAIT); 3714 if (error != 0) { 3715 printf("Refresh mbufs: payload dmamap load" 3716 " failure - %d\n", error); 3717 m_free(mp); 3718 rxbuf->m_pack = NULL; 3719 goto update; 3720 } 3721 rxbuf->m_pack = mp; 3722 bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap, 3723 0, mp->m_pkthdr.len, BUS_DMASYNC_PREREAD); 3724 rxr->rx_base[i].read.pkt_addr = 3725 htole64(rxbuf->pmap->dm_segs[0].ds_addr); 3726 3727 refreshed = true; 3728 /* Next is precalculated */ 3729 i = j; 3730 rxr->next_to_refresh = i; 3731 if (++j == adapter->num_rx_desc) 3732 j = 0; 3733 } 3734update: 3735 if (refreshed) /* Update hardware tail index */ 3736 IXGBE_WRITE_REG(&adapter->hw, 3737 IXGBE_RDT(rxr->me), rxr->next_to_refresh); 3738 return; 3739} 3740 3741/********************************************************************* 3742 * 3743 * Allocate memory for rx_buffer structures. Since we use one 3744 * rx_buffer per received packet, the maximum number of rx_buffer's 3745 * that we'll need is equal to the number of receive descriptors 3746 * that we've allocated. 3747 * 3748 **********************************************************************/ 3749static int 3750ixgbe_allocate_receive_buffers(struct rx_ring *rxr) 3751{ 3752 struct adapter *adapter = rxr->adapter; 3753 device_t dev = adapter->dev; 3754 struct ixgbe_rx_buf *rxbuf; 3755 int i, bsize, error; 3756 3757 bsize = sizeof(struct ixgbe_rx_buf) * adapter->num_rx_desc; 3758 if (!(rxr->rx_buffers = 3759 (struct ixgbe_rx_buf *) malloc(bsize, 3760 M_DEVBUF, M_NOWAIT | M_ZERO))) { 3761 aprint_error_dev(dev, "Unable to allocate rx_buffer memory\n"); 3762 error = ENOMEM; 3763 goto fail; 3764 } 3765 3766 if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat, /* parent */ 3767 1, 0, /* alignment, bounds */ 3768 MSIZE, /* maxsize */ 3769 1, /* nsegments */ 3770 MSIZE, /* maxsegsize */ 3771 0, /* flags */ 3772 &rxr->htag))) { 3773 aprint_error_dev(dev, "Unable to create RX DMA tag\n"); 3774 goto fail; 3775 } 3776 3777 if ((error = ixgbe_dma_tag_create(adapter->osdep.dmat, /* parent */ 3778 1, 0, /* alignment, bounds */ 3779 MJUM16BYTES, /* maxsize */ 3780 1, /* nsegments */ 3781 MJUM16BYTES, /* maxsegsize */ 3782 0, /* flags */ 3783 &rxr->ptag))) { 3784 aprint_error_dev(dev, "Unable to create RX DMA tag\n"); 3785 goto fail; 3786 } 3787 3788 for (i = 0; i < adapter->num_rx_desc; i++, rxbuf++) { 3789 rxbuf = &rxr->rx_buffers[i]; 3790 error = ixgbe_dmamap_create(rxr->htag, 3791 BUS_DMA_NOWAIT, &rxbuf->hmap); 3792 if (error) { 3793 aprint_error_dev(dev, "Unable to create RX head map\n"); 3794 goto fail; 3795 } 3796 error = ixgbe_dmamap_create(rxr->ptag, 3797 BUS_DMA_NOWAIT, &rxbuf->pmap); 3798 if (error) { 3799 aprint_error_dev(dev, "Unable to create RX pkt map\n"); 3800 goto fail; 3801 } 3802 } 3803 3804 return (0); 3805 3806fail: 3807 /* Frees all, but can handle partial completion */ 3808 ixgbe_free_receive_structures(adapter); 3809 return (error); 3810} 3811 3812/* 3813** Used to detect a descriptor that has 3814** been merged by Hardware RSC. 3815*/ 3816static inline u32 3817ixgbe_rsc_count(union ixgbe_adv_rx_desc *rx) 3818{ 3819 return (le32toh(rx->wb.lower.lo_dword.data) & 3820 IXGBE_RXDADV_RSCCNT_MASK) >> IXGBE_RXDADV_RSCCNT_SHIFT; 3821} 3822 3823/********************************************************************* 3824 * 3825 * Initialize Hardware RSC (LRO) feature on 82599 3826 * for an RX ring, this is toggled by the LRO capability 3827 * even though it is transparent to the stack. 3828 * 3829 **********************************************************************/ 3830static void 3831ixgbe_setup_hw_rsc(struct rx_ring *rxr) 3832{ 3833 struct adapter *adapter = rxr->adapter; 3834 struct ixgbe_hw *hw = &adapter->hw; 3835 u32 rscctrl, rdrxctl; 3836 3837 rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); 3838 rdrxctl &= ~IXGBE_RDRXCTL_RSCFRSTSIZE; 3839 rdrxctl |= IXGBE_RDRXCTL_CRCSTRIP; 3840 rdrxctl |= IXGBE_RDRXCTL_RSCACKC; 3841 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); 3842 3843 rscctrl = IXGBE_READ_REG(hw, IXGBE_RSCCTL(rxr->me)); 3844 rscctrl |= IXGBE_RSCCTL_RSCEN; 3845 /* 3846 ** Limit the total number of descriptors that 3847 ** can be combined, so it does not exceed 64K 3848 */ 3849 if (adapter->rx_mbuf_sz == MCLBYTES) 3850 rscctrl |= IXGBE_RSCCTL_MAXDESC_16; 3851 else if (adapter->rx_mbuf_sz == MJUMPAGESIZE) 3852 rscctrl |= IXGBE_RSCCTL_MAXDESC_8; 3853 else if (adapter->rx_mbuf_sz == MJUM9BYTES) 3854 rscctrl |= IXGBE_RSCCTL_MAXDESC_4; 3855 else /* Using 16K cluster */ 3856 rscctrl |= IXGBE_RSCCTL_MAXDESC_1; 3857 3858 IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(rxr->me), rscctrl); 3859 3860 /* Enable TCP header recognition */ 3861 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), 3862 (IXGBE_READ_REG(hw, IXGBE_PSRTYPE(0)) | 3863 IXGBE_PSRTYPE_TCPHDR)); 3864 3865 /* Disable RSC for ACK packets */ 3866 IXGBE_WRITE_REG(hw, IXGBE_RSCDBU, 3867 (IXGBE_RSCDBU_RSCACKDIS | IXGBE_READ_REG(hw, IXGBE_RSCDBU))); 3868 3869 rxr->hw_rsc = TRUE; 3870} 3871 3872 3873static void 3874ixgbe_free_receive_ring(struct rx_ring *rxr) 3875{ 3876 struct adapter *adapter; 3877 struct ixgbe_rx_buf *rxbuf; 3878 int i; 3879 3880 adapter = rxr->adapter; 3881 for (i = 0; i < adapter->num_rx_desc; i++) { 3882 rxbuf = &rxr->rx_buffers[i]; 3883 if (rxbuf->m_head != NULL) { 3884 ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap, 3885 BUS_DMASYNC_POSTREAD); 3886 ixgbe_dmamap_unload(rxr->htag, rxbuf->hmap); 3887 rxbuf->m_head->m_flags |= M_PKTHDR; 3888 m_freem(rxbuf->m_head); 3889 } 3890 if (rxbuf->m_pack != NULL) { 3891 bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap, 3892 0, rxbuf->m_pack->m_pkthdr.len, 3893 BUS_DMASYNC_POSTREAD); 3894 ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap); 3895 rxbuf->m_pack->m_flags |= M_PKTHDR; 3896 m_freem(rxbuf->m_pack); 3897 } 3898 rxbuf->m_head = NULL; 3899 rxbuf->m_pack = NULL; 3900 } 3901} 3902 3903 3904/********************************************************************* 3905 * 3906 * Initialize a receive ring and its buffers. 3907 * 3908 **********************************************************************/ 3909static int 3910ixgbe_setup_receive_ring(struct rx_ring *rxr) 3911{ 3912 struct adapter *adapter; 3913 struct ifnet *ifp; 3914 device_t dev; 3915 struct ixgbe_rx_buf *rxbuf; 3916#ifdef LRO 3917 struct lro_ctrl *lro = &rxr->lro; 3918#endif /* LRO */ 3919 int rsize, error = 0; 3920 3921 adapter = rxr->adapter; 3922 ifp = adapter->ifp; 3923 dev = adapter->dev; 3924 3925 /* Clear the ring contents */ 3926 IXGBE_RX_LOCK(rxr); 3927 rsize = roundup2(adapter->num_rx_desc * 3928 sizeof(union ixgbe_adv_rx_desc), DBA_ALIGN); 3929 bzero((void *)rxr->rx_base, rsize); 3930 3931 /* Free current RX buffer structs and their mbufs */ 3932 ixgbe_free_receive_ring(rxr); 3933 3934 /* Now reinitialize our supply of jumbo mbufs. The number 3935 * or size of jumbo mbufs may have changed. 3936 */ 3937 ixgbe_jcl_reinit(&adapter->jcl_head, rxr->ptag->dt_dmat, 3938 2 * adapter->num_rx_desc, adapter->rx_mbuf_sz); 3939 3940 /* Configure header split? */ 3941 if (ixgbe_header_split) 3942 rxr->hdr_split = TRUE; 3943 3944 /* Now replenish the mbufs */ 3945 for (int j = 0; j != adapter->num_rx_desc; ++j) { 3946 struct mbuf *mh, *mp; 3947 3948 rxbuf = &rxr->rx_buffers[j]; 3949 /* 3950 ** Don't allocate mbufs if not 3951 ** doing header split, its wasteful 3952 */ 3953 if (rxr->hdr_split == FALSE) 3954 goto skip_head; 3955 3956 /* First the header */ 3957 rxbuf->m_head = m_gethdr(M_DONTWAIT, MT_DATA); 3958 if (rxbuf->m_head == NULL) { 3959 error = ENOBUFS; 3960 goto fail; 3961 } 3962 m_adj(rxbuf->m_head, ETHER_ALIGN); 3963 mh = rxbuf->m_head; 3964 mh->m_len = mh->m_pkthdr.len = MHLEN; 3965 mh->m_flags |= M_PKTHDR; 3966 /* Get the memory mapping */ 3967 error = bus_dmamap_load_mbuf(rxr->htag->dt_dmat, 3968 rxbuf->hmap, rxbuf->m_head, BUS_DMA_NOWAIT); 3969 if (error != 0) /* Nothing elegant to do here */ 3970 goto fail; 3971 bus_dmamap_sync(rxr->htag->dt_dmat, rxbuf->hmap, 3972 0, mh->m_pkthdr.len, BUS_DMASYNC_PREREAD); 3973 /* Update descriptor */ 3974 rxr->rx_base[j].read.hdr_addr = 3975 htole64(rxbuf->hmap->dm_segs[0].ds_addr); 3976 3977skip_head: 3978 /* Now the payload cluster */ 3979 rxbuf->m_pack = ixgbe_getjcl(&adapter->jcl_head, M_DONTWAIT, 3980 MT_DATA, M_PKTHDR, adapter->rx_mbuf_sz); 3981 if (rxbuf->m_pack == NULL) { 3982 error = ENOBUFS; 3983 goto fail; 3984 } 3985 mp = rxbuf->m_pack; 3986 mp->m_pkthdr.len = mp->m_len = adapter->rx_mbuf_sz; 3987 /* Get the memory mapping */ 3988 error = bus_dmamap_load_mbuf(rxr->ptag->dt_dmat, 3989 rxbuf->pmap, mp, BUS_DMA_NOWAIT); 3990 if (error != 0) 3991 goto fail; 3992 bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap, 3993 0, adapter->rx_mbuf_sz, BUS_DMASYNC_PREREAD); 3994 /* Update descriptor */ 3995 rxr->rx_base[j].read.pkt_addr = 3996 htole64(rxbuf->pmap->dm_segs[0].ds_addr); 3997 } 3998 3999 4000 /* Setup our descriptor indices */ 4001 rxr->next_to_check = 0; 4002 rxr->next_to_refresh = 0; 4003 rxr->lro_enabled = FALSE; 4004 rxr->rx_split_packets.ev_count = 0; 4005 rxr->rx_bytes.ev_count = 0; 4006 rxr->discard = FALSE; 4007 4008 ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 4009 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 4010 4011 /* 4012 ** Now set up the LRO interface: 4013 ** 82598 uses software LRO, the 4014 ** 82599 uses a hardware assist. 4015 */ 4016 if ((adapter->hw.mac.type != ixgbe_mac_82598EB) && 4017 (ifp->if_capenable & IFCAP_RXCSUM) && 4018 (ifp->if_capenable & IFCAP_LRO)) 4019 ixgbe_setup_hw_rsc(rxr); 4020#ifdef LRO 4021 else if (ifp->if_capenable & IFCAP_LRO) { 4022 int err = tcp_lro_init(lro); 4023 if (err) { 4024 device_printf(dev, "LRO Initialization failed!\n"); 4025 goto fail; 4026 } 4027 INIT_DEBUGOUT("RX Soft LRO Initialized\n"); 4028 rxr->lro_enabled = TRUE; 4029 lro->ifp = adapter->ifp; 4030 } 4031#endif /* LRO */ 4032 4033 IXGBE_RX_UNLOCK(rxr); 4034 return (0); 4035 4036fail: 4037 ixgbe_free_receive_ring(rxr); 4038 IXGBE_RX_UNLOCK(rxr); 4039 return (error); 4040} 4041 4042/********************************************************************* 4043 * 4044 * Initialize all receive rings. 4045 * 4046 **********************************************************************/ 4047static int 4048ixgbe_setup_receive_structures(struct adapter *adapter) 4049{ 4050 struct rx_ring *rxr = adapter->rx_rings; 4051 int j; 4052 4053 for (j = 0; j < adapter->num_queues; j++, rxr++) 4054 if (ixgbe_setup_receive_ring(rxr)) 4055 goto fail; 4056 4057 return (0); 4058fail: 4059 /* 4060 * Free RX buffers allocated so far, we will only handle 4061 * the rings that completed, the failing case will have 4062 * cleaned up for itself. 'j' failed, so its the terminus. 4063 */ 4064 for (int i = 0; i < j; ++i) { 4065 rxr = &adapter->rx_rings[i]; 4066 ixgbe_free_receive_ring(rxr); 4067 } 4068 4069 return (ENOBUFS); 4070} 4071 4072/********************************************************************* 4073 * 4074 * Setup receive registers and features. 4075 * 4076 **********************************************************************/ 4077#define IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT 2 4078 4079static void 4080ixgbe_initialize_receive_units(struct adapter *adapter) 4081{ 4082 int i; 4083 struct rx_ring *rxr = adapter->rx_rings; 4084 struct ixgbe_hw *hw = &adapter->hw; 4085 struct ifnet *ifp = adapter->ifp; 4086 u32 bufsz, rxctrl, fctrl, srrctl, rxcsum; 4087 u32 reta, mrqc = 0, hlreg, r[10]; 4088 4089 4090 /* 4091 * Make sure receives are disabled while 4092 * setting up the descriptor ring 4093 */ 4094 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); 4095 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, 4096 rxctrl & ~IXGBE_RXCTRL_RXEN); 4097 4098 /* Enable broadcasts */ 4099 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL); 4100 fctrl |= IXGBE_FCTRL_BAM; 4101 fctrl |= IXGBE_FCTRL_DPF; 4102 fctrl |= IXGBE_FCTRL_PMCF; 4103 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl); 4104 4105 /* Set for Jumbo Frames? */ 4106 hlreg = IXGBE_READ_REG(hw, IXGBE_HLREG0); 4107 if (ifp->if_mtu > ETHERMTU) 4108 hlreg |= IXGBE_HLREG0_JUMBOEN; 4109 else 4110 hlreg &= ~IXGBE_HLREG0_JUMBOEN; 4111 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg); 4112 4113 bufsz = adapter->rx_mbuf_sz >> IXGBE_SRRCTL_BSIZEPKT_SHIFT; 4114 4115 for (i = 0; i < adapter->num_queues; i++, rxr++) { 4116 u64 rdba = rxr->rxdma.dma_paddr; 4117 4118 printf("%s: queue %d rdba %" PRIx64 "\n", __func__, i, rdba); 4119 4120 /* Setup the Base and Length of the Rx Descriptor Ring */ 4121 IXGBE_WRITE_REG(hw, IXGBE_RDBAL(i), 4122 (rdba & 0x00000000ffffffffULL)); 4123 IXGBE_WRITE_REG(hw, IXGBE_RDBAH(i), (rdba >> 32)); 4124 IXGBE_WRITE_REG(hw, IXGBE_RDLEN(i), 4125 adapter->num_rx_desc * sizeof(union ixgbe_adv_rx_desc)); 4126 4127 /* Set up the SRRCTL register */ 4128 srrctl = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i)); 4129 srrctl &= ~IXGBE_SRRCTL_BSIZEHDR_MASK; 4130 srrctl &= ~IXGBE_SRRCTL_BSIZEPKT_MASK; 4131 srrctl |= bufsz; 4132 if (rxr->hdr_split) { 4133 /* Use a standard mbuf for the header */ 4134 srrctl |= ((IXGBE_RX_HDR << 4135 IXGBE_SRRCTL_BSIZEHDRSIZE_SHIFT) 4136 & IXGBE_SRRCTL_BSIZEHDR_MASK); 4137 srrctl |= IXGBE_SRRCTL_DESCTYPE_HDR_SPLIT_ALWAYS; 4138 } else 4139 srrctl |= IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF; 4140 IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl); 4141 4142 /* Setup the HW Rx Head and Tail Descriptor Pointers */ 4143 IXGBE_WRITE_REG(hw, IXGBE_RDH(i), 0); 4144 IXGBE_WRITE_REG(hw, IXGBE_RDT(i), 0); 4145 } 4146 4147 if (adapter->hw.mac.type != ixgbe_mac_82598EB) { 4148 u32 psrtype = IXGBE_PSRTYPE_TCPHDR | 4149 IXGBE_PSRTYPE_UDPHDR | 4150 IXGBE_PSRTYPE_IPV4HDR | 4151 IXGBE_PSRTYPE_IPV6HDR; 4152 IXGBE_WRITE_REG(hw, IXGBE_PSRTYPE(0), psrtype); 4153 } 4154 4155 rxcsum = IXGBE_READ_REG(hw, IXGBE_RXCSUM); 4156 4157 /* Setup RSS */ 4158 if (adapter->num_queues > 1) { 4159 int j; 4160 reta = 0; 4161 4162 /* set up random bits */ 4163 cprng_fast(&r, sizeof(r)); 4164 4165 /* Set up the redirection table */ 4166 for (i = 0, j = 0; i < 128; i++, j++) { 4167 if (j == adapter->num_queues) j = 0; 4168 reta = (reta << 8) | (j * 0x11); 4169 if ((i & 3) == 3) 4170 IXGBE_WRITE_REG(hw, IXGBE_RETA(i >> 2), reta); 4171 } 4172 4173 /* Now fill our hash function seeds */ 4174 for (i = 0; i < 10; i++) 4175 IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), r[i]); 4176 4177 /* Perform hash on these packet types */ 4178 mrqc = IXGBE_MRQC_RSSEN 4179 | IXGBE_MRQC_RSS_FIELD_IPV4 4180 | IXGBE_MRQC_RSS_FIELD_IPV4_TCP 4181 | IXGBE_MRQC_RSS_FIELD_IPV4_UDP 4182 | IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP 4183 | IXGBE_MRQC_RSS_FIELD_IPV6_EX 4184 | IXGBE_MRQC_RSS_FIELD_IPV6 4185 | IXGBE_MRQC_RSS_FIELD_IPV6_TCP 4186 | IXGBE_MRQC_RSS_FIELD_IPV6_UDP 4187 | IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP; 4188 IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc); 4189 4190 /* RSS and RX IPP Checksum are mutually exclusive */ 4191 rxcsum |= IXGBE_RXCSUM_PCSD; 4192 } 4193 4194 if (ifp->if_capenable & IFCAP_RXCSUM) 4195 rxcsum |= IXGBE_RXCSUM_PCSD; 4196 4197 if (!(rxcsum & IXGBE_RXCSUM_PCSD)) 4198 rxcsum |= IXGBE_RXCSUM_IPPCSE; 4199 4200 IXGBE_WRITE_REG(hw, IXGBE_RXCSUM, rxcsum); 4201 4202 return; 4203} 4204 4205/********************************************************************* 4206 * 4207 * Free all receive rings. 4208 * 4209 **********************************************************************/ 4210static void 4211ixgbe_free_receive_structures(struct adapter *adapter) 4212{ 4213 struct rx_ring *rxr = adapter->rx_rings; 4214 4215 for (int i = 0; i < adapter->num_queues; i++, rxr++) { 4216#ifdef LRO 4217 struct lro_ctrl *lro = &rxr->lro; 4218#endif /* LRO */ 4219 ixgbe_free_receive_buffers(rxr); 4220#ifdef LRO 4221 /* Free LRO memory */ 4222 tcp_lro_free(lro); 4223#endif /* LRO */ 4224 /* Free the ring memory as well */ 4225 ixgbe_dma_free(adapter, &rxr->rxdma); 4226 } 4227 4228 free(adapter->rx_rings, M_DEVBUF); 4229} 4230 4231 4232/********************************************************************* 4233 * 4234 * Free receive ring data structures 4235 * 4236 **********************************************************************/ 4237static void 4238ixgbe_free_receive_buffers(struct rx_ring *rxr) 4239{ 4240 struct adapter *adapter = rxr->adapter; 4241 struct ixgbe_rx_buf *rxbuf; 4242 4243 INIT_DEBUGOUT("free_receive_structures: begin"); 4244 4245 /* Cleanup any existing buffers */ 4246 if (rxr->rx_buffers != NULL) { 4247 for (int i = 0; i < adapter->num_rx_desc; i++) { 4248 rxbuf = &rxr->rx_buffers[i]; 4249 if (rxbuf->m_head != NULL) { 4250 ixgbe_dmamap_sync(rxr->htag, rxbuf->hmap, 4251 BUS_DMASYNC_POSTREAD); 4252 ixgbe_dmamap_unload(rxr->htag, rxbuf->hmap); 4253 rxbuf->m_head->m_flags |= M_PKTHDR; 4254 m_freem(rxbuf->m_head); 4255 } 4256 if (rxbuf->m_pack != NULL) { 4257 bus_dmamap_sync(rxr->ptag->dt_dmat, rxbuf->pmap, 4258 0, rxbuf->m_pack->m_pkthdr.len, 4259 BUS_DMASYNC_POSTREAD); 4260 ixgbe_dmamap_unload(rxr->ptag, rxbuf->pmap); 4261 rxbuf->m_pack->m_flags |= M_PKTHDR; 4262 m_freem(rxbuf->m_pack); 4263 } 4264 rxbuf->m_head = NULL; 4265 rxbuf->m_pack = NULL; 4266 if (rxbuf->hmap != NULL) { 4267 ixgbe_dmamap_destroy(rxr->htag, rxbuf->hmap); 4268 rxbuf->hmap = NULL; 4269 } 4270 if (rxbuf->pmap != NULL) { 4271 ixgbe_dmamap_destroy(rxr->ptag, rxbuf->pmap); 4272 rxbuf->pmap = NULL; 4273 } 4274 } 4275 if (rxr->rx_buffers != NULL) { 4276 free(rxr->rx_buffers, M_DEVBUF); 4277 rxr->rx_buffers = NULL; 4278 } 4279 } 4280 4281 if (rxr->htag != NULL) { 4282 ixgbe_dma_tag_destroy(rxr->htag); 4283 rxr->htag = NULL; 4284 } 4285 if (rxr->ptag != NULL) { 4286 ixgbe_dma_tag_destroy(rxr->ptag); 4287 rxr->ptag = NULL; 4288 } 4289 4290 return; 4291} 4292 4293static __inline void 4294ixgbe_rx_input(struct rx_ring *rxr, struct ifnet *ifp, struct mbuf *m, u32 ptype) 4295{ 4296 struct ethercom *ec; 4297 struct adapter *adapter = ifp->if_softc; 4298 int s; 4299 4300 ec = &adapter->osdep.ec; 4301 4302#ifdef LRO 4303 /* 4304 * ATM LRO is only for IPv4/TCP packets and TCP checksum of the packet 4305 * should be computed by hardware. Also it should not have VLAN tag in 4306 * ethernet header. 4307 */ 4308 if (rxr->lro_enabled && 4309 (ec->ec_capenable & ETHERCAP_VLAN_HWTAGGING) != 0 && 4310 (ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 && 4311 (ptype & (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP)) == 4312 (IXGBE_RXDADV_PKTTYPE_IPV4 | IXGBE_RXDADV_PKTTYPE_TCP) && 4313 (m->m_pkthdr.csum_flags & (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) == 4314 (CSUM_DATA_VALID | CSUM_PSEUDO_HDR)) { 4315 /* 4316 * Send to the stack if: 4317 ** - LRO not enabled, or 4318 ** - no LRO resources, or 4319 ** - lro enqueue fails 4320 */ 4321 if (rxr->lro.lro_cnt != 0) 4322 if (tcp_lro_rx(&rxr->lro, m, 0) == 0) 4323 return; 4324 } 4325#endif /* LRO */ 4326 4327 IXGBE_RX_UNLOCK(rxr); 4328 4329 s = splnet(); 4330 /* Pass this up to any BPF listeners. */ 4331 bpf_mtap(ifp, m); 4332 (*ifp->if_input)(ifp, m); 4333 splx(s); 4334 4335 IXGBE_RX_LOCK(rxr); 4336} 4337 4338static __inline void 4339ixgbe_rx_discard(struct rx_ring *rxr, int i) 4340{ 4341 struct ixgbe_rx_buf *rbuf; 4342 4343 rbuf = &rxr->rx_buffers[i]; 4344 4345 printf("%s: enter\n", __func__); 4346 4347 if (rbuf->fmp != NULL) {/* Partial chain ? */ 4348 rbuf->fmp->m_flags |= M_PKTHDR; 4349 m_freem(rbuf->fmp); 4350 rbuf->fmp = NULL; 4351 } 4352 4353 /* 4354 ** With advanced descriptors the writeback 4355 ** clobbers the buffer addrs, so its easier 4356 ** to just free the existing mbufs and take 4357 ** the normal refresh path to get new buffers 4358 ** and mapping. 4359 */ 4360 if (rbuf->m_head) { 4361 m_free(rbuf->m_head); 4362 rbuf->m_head = NULL; 4363 } 4364 4365 if (rbuf->m_pack) { 4366 m_free(rbuf->m_pack); 4367 rbuf->m_pack = NULL; 4368 } 4369 4370 return; 4371} 4372 4373 4374/********************************************************************* 4375 * 4376 * This routine executes in interrupt context. It replenishes 4377 * the mbufs in the descriptor and sends data which has been 4378 * dma'ed into host memory to upper layer. 4379 * 4380 * We loop at most count times if count is > 0, or until done if 4381 * count < 0. 4382 * 4383 * Return TRUE for more work, FALSE for all clean. 4384 *********************************************************************/ 4385static bool 4386ixgbe_rxeof(struct ix_queue *que, int count) 4387{ 4388 struct adapter *adapter = que->adapter; 4389 struct rx_ring *rxr = que->rxr; 4390 struct ifnet *ifp = adapter->ifp; 4391#ifdef LRO 4392 struct lro_ctrl *lro = &rxr->lro; 4393 struct lro_entry *queued; 4394#endif /* LRO */ 4395 int i, nextp, processed = 0; 4396 u32 staterr = 0; 4397 union ixgbe_adv_rx_desc *cur; 4398 struct ixgbe_rx_buf *rbuf, *nbuf; 4399 4400 IXGBE_RX_LOCK(rxr); 4401 4402 for (i = rxr->next_to_check; count != 0;) { 4403 struct mbuf *sendmp, *mh, *mp; 4404 u32 rsc, ptype; 4405 u16 hlen, plen, hdr, vtag; 4406 bool eop; 4407 4408 /* Sync the ring. */ 4409 ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 4410 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 4411 4412 cur = &rxr->rx_base[i]; 4413 staterr = le32toh(cur->wb.upper.status_error); 4414 4415 if ((staterr & IXGBE_RXD_STAT_DD) == 0) 4416 break; 4417 if ((ifp->if_flags & IFF_RUNNING) == 0) 4418 break; 4419 4420 count--; 4421 sendmp = NULL; 4422 nbuf = NULL; 4423 rsc = 0; 4424 cur->wb.upper.status_error = 0; 4425 rbuf = &rxr->rx_buffers[i]; 4426 mh = rbuf->m_head; 4427 mp = rbuf->m_pack; 4428 4429 plen = le16toh(cur->wb.upper.length); 4430 ptype = le32toh(cur->wb.lower.lo_dword.data) & 4431 IXGBE_RXDADV_PKTTYPE_MASK; 4432 hdr = le16toh(cur->wb.lower.lo_dword.hs_rss.hdr_info); 4433 vtag = le16toh(cur->wb.upper.vlan); 4434 eop = ((staterr & IXGBE_RXD_STAT_EOP) != 0); 4435 4436 /* Make sure bad packets are discarded */ 4437 if (((staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK) != 0) || 4438 (rxr->discard)) { 4439 ifp->if_ierrors++; 4440 rxr->rx_discarded.ev_count++; 4441 if (eop) 4442 rxr->discard = FALSE; 4443 else 4444 rxr->discard = TRUE; 4445 ixgbe_rx_discard(rxr, i); 4446 goto next_desc; 4447 } 4448 4449 /* 4450 ** On 82599 which supports a hardware 4451 ** LRO (called HW RSC), packets need 4452 ** not be fragmented across sequential 4453 ** descriptors, rather the next descriptor 4454 ** is indicated in bits of the descriptor. 4455 ** This also means that we might proceses 4456 ** more than one packet at a time, something 4457 ** that has never been true before, it 4458 ** required eliminating global chain pointers 4459 ** in favor of what we are doing here. -jfv 4460 */ 4461 if (!eop) { 4462 /* 4463 ** Figure out the next descriptor 4464 ** of this frame. 4465 */ 4466 if (rxr->hw_rsc == TRUE) { 4467 rsc = ixgbe_rsc_count(cur); 4468 rxr->rsc_num += (rsc - 1); 4469 } 4470 if (rsc) { /* Get hardware index */ 4471 nextp = ((staterr & 4472 IXGBE_RXDADV_NEXTP_MASK) >> 4473 IXGBE_RXDADV_NEXTP_SHIFT); 4474 } else { /* Just sequential */ 4475 nextp = i + 1; 4476 if (nextp == adapter->num_rx_desc) 4477 nextp = 0; 4478 } 4479 nbuf = &rxr->rx_buffers[nextp]; 4480 prefetch(nbuf); 4481 } 4482 /* 4483 ** The header mbuf is ONLY used when header 4484 ** split is enabled, otherwise we get normal 4485 ** behavior, ie, both header and payload 4486 ** are DMA'd into the payload buffer. 4487 ** 4488 ** Rather than using the fmp/lmp global pointers 4489 ** we now keep the head of a packet chain in the 4490 ** buffer struct and pass this along from one 4491 ** descriptor to the next, until we get EOP. 4492 */ 4493 if (rxr->hdr_split && (rbuf->fmp == NULL)) { 4494 /* This must be an initial descriptor */ 4495 hlen = (hdr & IXGBE_RXDADV_HDRBUFLEN_MASK) >> 4496 IXGBE_RXDADV_HDRBUFLEN_SHIFT; 4497 if (hlen > IXGBE_RX_HDR) 4498 hlen = IXGBE_RX_HDR; 4499 mh->m_len = hlen; 4500 mh->m_flags |= M_PKTHDR; 4501 mh->m_next = NULL; 4502 mh->m_pkthdr.len = mh->m_len; 4503 /* Null buf pointer so it is refreshed */ 4504 rbuf->m_head = NULL; 4505 /* 4506 ** Check the payload length, this 4507 ** could be zero if its a small 4508 ** packet. 4509 */ 4510 if (plen > 0) { 4511 mp->m_len = plen; 4512 mp->m_next = NULL; 4513 mp->m_flags &= ~M_PKTHDR; 4514 mh->m_next = mp; 4515 mh->m_pkthdr.len += mp->m_len; 4516 /* Null buf pointer so it is refreshed */ 4517 rbuf->m_pack = NULL; 4518 rxr->rx_split_packets.ev_count++; 4519 } 4520 /* 4521 ** Now create the forward 4522 ** chain so when complete 4523 ** we wont have to. 4524 */ 4525 if (eop == 0) { 4526 /* stash the chain head */ 4527 nbuf->fmp = mh; 4528 /* Make forward chain */ 4529 if (plen) 4530 mp->m_next = nbuf->m_pack; 4531 else 4532 mh->m_next = nbuf->m_pack; 4533 } else { 4534 /* Singlet, prepare to send */ 4535 sendmp = mh; 4536 if (VLAN_ATTACHED(&adapter->osdep.ec) && 4537 (staterr & IXGBE_RXD_STAT_VP)) { 4538 /* XXX Do something reasonable on 4539 * error. 4540 */ 4541#if 0 4542 printf("%s.%d: VLAN_INPUT_TAG\n", 4543 __func__, __LINE__); 4544 Debugger(); 4545#endif 4546 VLAN_INPUT_TAG(ifp, sendmp, vtag, 4547 printf("%s: could not apply VLAN " 4548 "tag", __func__)); 4549 } 4550 } 4551 } else { 4552 /* 4553 ** Either no header split, or a 4554 ** secondary piece of a fragmented 4555 ** split packet. 4556 */ 4557 mp->m_len = plen; 4558 /* 4559 ** See if there is a stored head 4560 ** that determines what we are 4561 */ 4562 sendmp = rbuf->fmp; 4563 rbuf->m_pack = rbuf->fmp = NULL; 4564 4565 if (sendmp != NULL) /* secondary frag */ 4566 sendmp->m_pkthdr.len += mp->m_len; 4567 else { 4568 /* first desc of a non-ps chain */ 4569 sendmp = mp; 4570 sendmp->m_flags |= M_PKTHDR; 4571 sendmp->m_pkthdr.len = mp->m_len; 4572 if (staterr & IXGBE_RXD_STAT_VP) { 4573 /* XXX Do something reasonable on 4574 * error. 4575 */ 4576#if 0 4577 printf("%s.%d: VLAN_INPUT_TAG\n", 4578 __func__, __LINE__); 4579 Debugger(); 4580#endif 4581 VLAN_INPUT_TAG(ifp, sendmp, vtag, 4582 printf("%s: could not apply VLAN " 4583 "tag", __func__)); 4584 } 4585 } 4586 /* Pass the head pointer on */ 4587 if (eop == 0) { 4588 nbuf->fmp = sendmp; 4589 sendmp = NULL; 4590 mp->m_next = nbuf->m_pack; 4591 } 4592 } 4593 ++processed; 4594 /* Sending this frame? */ 4595 if (eop) { 4596 sendmp->m_pkthdr.rcvif = ifp; 4597 ifp->if_ipackets++; 4598 rxr->rx_packets.ev_count++; 4599 /* capture data for AIM */ 4600 rxr->bytes += sendmp->m_pkthdr.len; 4601 rxr->rx_bytes.ev_count += sendmp->m_pkthdr.len; 4602 if ((ifp->if_capenable & IFCAP_RXCSUM) != 0) { 4603 ixgbe_rx_checksum(staterr, sendmp, ptype, 4604 &adapter->stats); 4605 } 4606#if __FreeBSD_version >= 800000 4607 sendmp->m_pkthdr.flowid = que->msix; 4608 sendmp->m_flags |= M_FLOWID; 4609#endif 4610 } 4611next_desc: 4612 ixgbe_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map, 4613 BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); 4614 4615 /* Advance our pointers to the next descriptor. */ 4616 if (++i == adapter->num_rx_desc) 4617 i = 0; 4618 4619 /* Now send to the stack or do LRO */ 4620 if (sendmp != NULL) { 4621 rxr->next_to_check = i; 4622 ixgbe_rx_input(rxr, ifp, sendmp, ptype); 4623 i = rxr->next_to_check; 4624 } 4625 4626 /* Every 8 descriptors we go to refresh mbufs */ 4627 if (processed == 8) { 4628 ixgbe_refresh_mbufs(rxr, i); 4629 processed = 0; 4630 } 4631 } 4632 4633 /* Refresh any remaining buf structs */ 4634 if (ixgbe_rx_unrefreshed(rxr)) 4635 ixgbe_refresh_mbufs(rxr, i); 4636 4637 rxr->next_to_check = i; 4638 4639#ifdef LRO 4640 /* 4641 * Flush any outstanding LRO work 4642 */ 4643 while ((queued = SLIST_FIRST(&lro->lro_active)) != NULL) { 4644 SLIST_REMOVE_HEAD(&lro->lro_active, next); 4645 tcp_lro_flush(lro, queued); 4646 } 4647#endif /* LRO */ 4648 4649 IXGBE_RX_UNLOCK(rxr); 4650 4651 /* 4652 ** We still have cleaning to do? 4653 ** Schedule another interrupt if so. 4654 */ 4655 if ((staterr & IXGBE_RXD_STAT_DD) != 0) { 4656 ixgbe_rearm_queues(adapter, (u64)(1 << que->msix)); 4657 return true; 4658 } 4659 4660 return false; 4661} 4662 4663 4664/********************************************************************* 4665 * 4666 * Verify that the hardware indicated that the checksum is valid. 4667 * Inform the stack about the status of checksum so that stack 4668 * doesn't spend time verifying the checksum. 4669 * 4670 *********************************************************************/ 4671static void 4672ixgbe_rx_checksum(u32 staterr, struct mbuf * mp, u32 ptype, 4673 struct ixgbe_hw_stats *stats) 4674{ 4675 u16 status = (u16) staterr; 4676 u8 errors = (u8) (staterr >> 24); 4677 bool sctp = FALSE; 4678 4679 if ((ptype & IXGBE_RXDADV_PKTTYPE_ETQF) == 0 && 4680 (ptype & IXGBE_RXDADV_PKTTYPE_SCTP) != 0) 4681 sctp = TRUE; 4682 4683 if (status & IXGBE_RXD_STAT_IPCS) { 4684 stats->ipcs.ev_count++; 4685 if (!(errors & IXGBE_RXD_ERR_IPE)) { 4686 /* IP Checksum Good */ 4687 mp->m_pkthdr.csum_flags = M_CSUM_IPv4; 4688 4689 } else { 4690 stats->ipcs_bad.ev_count++; 4691 mp->m_pkthdr.csum_flags = M_CSUM_IPv4|M_CSUM_IPv4_BAD; 4692 } 4693 } 4694 if (status & IXGBE_RXD_STAT_L4CS) { 4695 stats->l4cs.ev_count++; 4696 u16 type = M_CSUM_TCPv4|M_CSUM_TCPv6|M_CSUM_UDPv4|M_CSUM_UDPv6; 4697 if (!(errors & IXGBE_RXD_ERR_TCPE)) { 4698 mp->m_pkthdr.csum_flags |= type; 4699 } else { 4700 stats->l4cs_bad.ev_count++; 4701 mp->m_pkthdr.csum_flags |= type | M_CSUM_TCP_UDP_BAD; 4702 } 4703 } 4704 return; 4705} 4706 4707 4708#if 0 /* XXX Badly need to overhaul vlan(4) on NetBSD. */ 4709/* 4710** This routine is run via an vlan config EVENT, 4711** it enables us to use the HW Filter table since 4712** we can get the vlan id. This just creates the 4713** entry in the soft version of the VFTA, init will 4714** repopulate the real table. 4715*/ 4716static void 4717ixgbe_register_vlan(void *arg, struct ifnet *ifp, u16 vtag) 4718{ 4719 struct adapter *adapter = ifp->if_softc; 4720 u16 index, bit; 4721 4722 if (ifp->if_softc != arg) /* Not our event */ 4723 return; 4724 4725 if ((vtag == 0) || (vtag > 4095)) /* Invalid */ 4726 return; 4727 4728 IXGBE_CORE_LOCK(adapter); 4729 index = (vtag >> 5) & 0x7F; 4730 bit = vtag & 0x1F; 4731 adapter->shadow_vfta[index] |= (1 << bit); 4732 ixgbe_init_locked(adapter); 4733 IXGBE_CORE_UNLOCK(adapter); 4734} 4735 4736/* 4737** This routine is run via an vlan 4738** unconfig EVENT, remove our entry 4739** in the soft vfta. 4740*/ 4741static void 4742ixgbe_unregister_vlan(void *arg, struct ifnet *ifp, u16 vtag) 4743{ 4744 struct adapter *adapter = ifp->if_softc; 4745 u16 index, bit; 4746 4747 if (ifp->if_softc != arg) 4748 return; 4749 4750 if ((vtag == 0) || (vtag > 4095)) /* Invalid */ 4751 return; 4752 4753 IXGBE_CORE_LOCK(adapter); 4754 index = (vtag >> 5) & 0x7F; 4755 bit = vtag & 0x1F; 4756 adapter->shadow_vfta[index] &= ~(1 << bit); 4757 /* Re-init to load the changes */ 4758 ixgbe_init_locked(adapter); 4759 IXGBE_CORE_UNLOCK(adapter); 4760} 4761#endif 4762 4763static void 4764ixgbe_setup_vlan_hw_support(struct adapter *adapter) 4765{ 4766 struct ethercom *ec = &adapter->osdep.ec; 4767 struct ixgbe_hw *hw = &adapter->hw; 4768 u32 ctrl; 4769 4770 printf("%s: %s enter\n", device_xname(adapter->dev), __func__); 4771 4772 /* 4773 ** We get here thru init_locked, meaning 4774 ** a soft reset, this has already cleared 4775 ** the VFTA and other state, so if there 4776 ** have been no vlan's registered do nothing. 4777 */ 4778 if (!VLAN_ATTACHED(&adapter->osdep.ec)) { 4779 printf("%s: no VLANs attached\n", device_xname(adapter->dev)); 4780 return; 4781 } 4782 4783 /* 4784 ** A soft reset zero's out the VFTA, so 4785 ** we need to repopulate it now. 4786 */ 4787 for (int i = 0; i < IXGBE_VFTA_SIZE; i++) 4788 if (adapter->shadow_vfta[i] != 0) 4789 IXGBE_WRITE_REG(hw, IXGBE_VFTA(i), 4790 adapter->shadow_vfta[i]); 4791 4792 ctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL); 4793 /* Enable the Filter Table if enabled */ 4794 if (ec->ec_capenable & ETHERCAP_VLAN_HWFILTER) { 4795 ctrl &= ~IXGBE_VLNCTRL_CFIEN; 4796 ctrl |= IXGBE_VLNCTRL_VFE; 4797 printf("%s: enabled h/w VLAN filter\n", 4798 device_xname(adapter->dev)); 4799 } 4800 if (hw->mac.type == ixgbe_mac_82598EB) 4801 ctrl |= IXGBE_VLNCTRL_VME; 4802 IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, ctrl); 4803 4804 /* On 82599 the VLAN enable is per/queue in RXDCTL */ 4805 if (hw->mac.type != ixgbe_mac_82598EB) 4806 for (int i = 0; i < adapter->num_queues; i++) { 4807 ctrl = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)); 4808 ctrl |= IXGBE_RXDCTL_VME; 4809 IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), ctrl); 4810 printf("%s: enabled VLAN queue %d\n", 4811 device_xname(adapter->dev), i); 4812 } 4813} 4814 4815static void 4816ixgbe_enable_intr(struct adapter *adapter) 4817{ 4818 struct ixgbe_hw *hw = &adapter->hw; 4819 struct ix_queue *que = adapter->queues; 4820 u32 mask = (IXGBE_EIMS_ENABLE_MASK & ~IXGBE_EIMS_RTX_QUEUE); 4821 4822 4823 /* Enable Fan Failure detection */ 4824 if (hw->device_id == IXGBE_DEV_ID_82598AT) 4825 mask |= IXGBE_EIMS_GPI_SDP1; 4826 else { 4827 mask |= IXGBE_EIMS_ECC; 4828 mask |= IXGBE_EIMS_GPI_SDP1; 4829 mask |= IXGBE_EIMS_GPI_SDP2; 4830#ifdef IXGBE_FDIR 4831 mask |= IXGBE_EIMS_FLOW_DIR; 4832#endif 4833 } 4834 4835 IXGBE_WRITE_REG(hw, IXGBE_EIMS, mask); 4836 4837 /* With RSS we use auto clear */ 4838 if (adapter->msix_mem) { 4839 mask = IXGBE_EIMS_ENABLE_MASK; 4840 /* Don't autoclear Link */ 4841 mask &= ~IXGBE_EIMS_OTHER; 4842 mask &= ~IXGBE_EIMS_LSC; 4843 IXGBE_WRITE_REG(hw, IXGBE_EIAC, mask); 4844 } 4845 4846 /* 4847 ** Now enable all queues, this is done separately to 4848 ** allow for handling the extended (beyond 32) MSIX 4849 ** vectors that can be used by 82599 4850 */ 4851 for (int i = 0; i < adapter->num_queues; i++, que++) 4852 ixgbe_enable_queue(adapter, que->msix); 4853 4854 IXGBE_WRITE_FLUSH(hw); 4855 4856 return; 4857} 4858 4859static void 4860ixgbe_disable_intr(struct adapter *adapter) 4861{ 4862 if (adapter->msix_mem) 4863 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIAC, 0); 4864 if (adapter->hw.mac.type == ixgbe_mac_82598EB) { 4865 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0); 4866 } else { 4867 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, 0xFFFF0000); 4868 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(0), ~0); 4869 IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC_EX(1), ~0); 4870 } 4871 IXGBE_WRITE_FLUSH(&adapter->hw); 4872 return; 4873} 4874 4875u16 4876ixgbe_read_pci_cfg(struct ixgbe_hw *hw, u32 reg) 4877{ 4878 switch (reg % 4) { 4879 case 0: 4880 return pci_conf_read(hw->back->pc, hw->back->tag, reg) & 4881 __BITS(15, 0); 4882 case 2: 4883 return __SHIFTOUT(pci_conf_read(hw->back->pc, hw->back->tag, 4884 reg - 2), __BITS(31, 16)); 4885 default: 4886 panic("%s: invalid register (%" PRIx32, __func__, reg); 4887 break; 4888 } 4889} 4890 4891void 4892ixgbe_write_pci_cfg(struct ixgbe_hw *hw, u32 reg, u16 value) 4893{ 4894 pcireg_t old; 4895 4896 switch (reg % 4) { 4897 case 0: 4898 old = pci_conf_read(hw->back->pc, hw->back->tag, reg) & 4899 __BITS(31, 16); 4900 pci_conf_write(hw->back->pc, hw->back->tag, reg, value | old); 4901 break; 4902 case 2: 4903 old = pci_conf_read(hw->back->pc, hw->back->tag, reg - 2) & 4904 __BITS(15, 0); 4905 pci_conf_write(hw->back->pc, hw->back->tag, reg - 2, 4906 __SHIFTIN(value, __BITS(31, 16)) | old); 4907 break; 4908 default: 4909 panic("%s: invalid register (%" PRIx32, __func__, reg); 4910 break; 4911 } 4912 4913 return; 4914} 4915 4916/* 4917** Setup the correct IVAR register for a particular MSIX interrupt 4918** (yes this is all very magic and confusing :) 4919** - entry is the register array entry 4920** - vector is the MSIX vector for this queue 4921** - type is RX/TX/MISC 4922*/ 4923static void 4924ixgbe_set_ivar(struct adapter *adapter, u8 entry, u8 vector, s8 type) 4925{ 4926 struct ixgbe_hw *hw = &adapter->hw; 4927 u32 ivar, index; 4928 4929 vector |= IXGBE_IVAR_ALLOC_VAL; 4930 4931 switch (hw->mac.type) { 4932 4933 case ixgbe_mac_82598EB: 4934 if (type == -1) 4935 entry = IXGBE_IVAR_OTHER_CAUSES_INDEX; 4936 else 4937 entry += (type * 64); 4938 index = (entry >> 2) & 0x1F; 4939 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(index)); 4940 ivar &= ~(0xFF << (8 * (entry & 0x3))); 4941 ivar |= (vector << (8 * (entry & 0x3))); 4942 IXGBE_WRITE_REG(&adapter->hw, IXGBE_IVAR(index), ivar); 4943 break; 4944 4945 case ixgbe_mac_82599EB: 4946 if (type == -1) { /* MISC IVAR */ 4947 index = (entry & 1) * 8; 4948 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR_MISC); 4949 ivar &= ~(0xFF << index); 4950 ivar |= (vector << index); 4951 IXGBE_WRITE_REG(hw, IXGBE_IVAR_MISC, ivar); 4952 } else { /* RX/TX IVARS */ 4953 index = (16 * (entry & 1)) + (8 * type); 4954 ivar = IXGBE_READ_REG(hw, IXGBE_IVAR(entry >> 1)); 4955 ivar &= ~(0xFF << index); 4956 ivar |= (vector << index); 4957 IXGBE_WRITE_REG(hw, IXGBE_IVAR(entry >> 1), ivar); 4958 } 4959 4960 default: 4961 break; 4962 } 4963} 4964 4965static void 4966ixgbe_configure_ivars(struct adapter *adapter) 4967{ 4968 struct ix_queue *que = adapter->queues; 4969 u32 newitr; 4970 4971 if (ixgbe_max_interrupt_rate > 0) 4972 newitr = (8000000 / ixgbe_max_interrupt_rate) & 0x0FF8; 4973 else 4974 newitr = 0; 4975 4976 for (int i = 0; i < adapter->num_queues; i++, que++) { 4977 /* First the RX queue entry */ 4978 ixgbe_set_ivar(adapter, i, que->msix, 0); 4979 /* ... and the TX */ 4980 ixgbe_set_ivar(adapter, i, que->msix, 1); 4981 /* Set an Initial EITR value */ 4982 IXGBE_WRITE_REG(&adapter->hw, 4983 IXGBE_EITR(que->msix), newitr); 4984 } 4985 4986 /* For the Link interrupt */ 4987 ixgbe_set_ivar(adapter, 1, adapter->linkvec, -1); 4988} 4989 4990/* 4991** ixgbe_sfp_probe - called in the local timer to 4992** determine if a port had optics inserted. 4993*/ 4994static bool ixgbe_sfp_probe(struct adapter *adapter) 4995{ 4996 struct ixgbe_hw *hw = &adapter->hw; 4997 device_t dev = adapter->dev; 4998 bool result = FALSE; 4999 5000 if ((hw->phy.type == ixgbe_phy_nl) && 5001 (hw->phy.sfp_type == ixgbe_sfp_type_not_present)) { 5002 s32 ret = hw->phy.ops.identify_sfp(hw); 5003 if (ret) 5004 goto out; 5005 ret = hw->phy.ops.reset(hw); 5006 if (ret == IXGBE_ERR_SFP_NOT_SUPPORTED) { 5007 device_printf(dev,"Unsupported SFP+ module detected!"); 5008 device_printf(dev, "Reload driver with supported module.\n"); 5009 adapter->sfp_probe = FALSE; 5010 goto out; 5011 } else 5012 device_printf(dev,"SFP+ module detected!\n"); 5013 /* We now have supported optics */ 5014 adapter->sfp_probe = FALSE; 5015 /* Set the optics type so system reports correctly */ 5016 ixgbe_setup_optics(adapter); 5017 result = TRUE; 5018 } 5019out: 5020 return (result); 5021} 5022 5023/* 5024** Tasklet handler for MSIX Link interrupts 5025** - do outside interrupt since it might sleep 5026*/ 5027static void 5028ixgbe_handle_link(void *context) 5029{ 5030 struct adapter *adapter = context; 5031 5032 ixgbe_check_link(&adapter->hw, 5033 &adapter->link_speed, &adapter->link_up, 0); 5034 ixgbe_update_link_status(adapter); 5035} 5036 5037/* 5038** Tasklet for handling SFP module interrupts 5039*/ 5040static void 5041ixgbe_handle_mod(void *context) 5042{ 5043 struct adapter *adapter = context; 5044 struct ixgbe_hw *hw = &adapter->hw; 5045 device_t dev = adapter->dev; 5046 u32 err; 5047 5048 err = hw->phy.ops.identify_sfp(hw); 5049 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { 5050 device_printf(dev, 5051 "Unsupported SFP+ module type was detected.\n"); 5052 return; 5053 } 5054 err = hw->mac.ops.setup_sfp(hw); 5055 if (err == IXGBE_ERR_SFP_NOT_SUPPORTED) { 5056 device_printf(dev, 5057 "Setup failure - unsupported SFP+ module type.\n"); 5058 return; 5059 } 5060 softint_schedule(adapter->msf_si); 5061 return; 5062} 5063 5064 5065/* 5066** Tasklet for handling MSF (multispeed fiber) interrupts 5067*/ 5068static void 5069ixgbe_handle_msf(void *context) 5070{ 5071 struct adapter *adapter = context; 5072 struct ixgbe_hw *hw = &adapter->hw; 5073 u32 autoneg; 5074 bool negotiate; 5075 5076 autoneg = hw->phy.autoneg_advertised; 5077 if ((!autoneg) && (hw->mac.ops.get_link_capabilities)) 5078 hw->mac.ops.get_link_capabilities(hw, &autoneg, &negotiate); 5079 if (hw->mac.ops.setup_link) 5080 hw->mac.ops.setup_link(hw, autoneg, negotiate, TRUE); 5081 return; 5082} 5083 5084#ifdef IXGBE_FDIR 5085/* 5086** Tasklet for reinitializing the Flow Director filter table 5087*/ 5088static void 5089ixgbe_reinit_fdir(void *context) 5090{ 5091 struct adapter *adapter = context; 5092 struct ifnet *ifp = adapter->ifp; 5093 5094 if (adapter->fdir_reinit != 1) /* Shouldn't happen */ 5095 return; 5096 ixgbe_reinit_fdir_tables_82599(&adapter->hw); 5097 adapter->fdir_reinit = 0; 5098 /* Restart the interface */ 5099 ifp->if_flags |= IFF_RUNNING; 5100 return; 5101} 5102#endif 5103 5104/********************************************************************** 5105 * 5106 * Update the board statistics counters. 5107 * 5108 **********************************************************************/ 5109static void 5110ixgbe_update_stats_counters(struct adapter *adapter) 5111{ 5112 struct ifnet *ifp = adapter->ifp; 5113 struct ixgbe_hw *hw = &adapter->hw; 5114 u32 missed_rx = 0, bprc, lxon, lxoff, total; 5115 u64 total_missed_rx = 0; 5116 5117 adapter->stats.crcerrs.ev_count += IXGBE_READ_REG(hw, IXGBE_CRCERRS); 5118 adapter->stats.illerrc.ev_count += IXGBE_READ_REG(hw, IXGBE_ILLERRC); 5119 adapter->stats.errbc.ev_count += IXGBE_READ_REG(hw, IXGBE_ERRBC); 5120 adapter->stats.mspdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MSPDC); 5121 5122 for (int i = 0; i < __arraycount(adapter->stats.mpc); i++) { 5123 int j = i % adapter->num_queues; 5124 u32 mp; 5125 mp = IXGBE_READ_REG(hw, IXGBE_MPC(i)); 5126 /* missed_rx tallies misses for the gprc workaround */ 5127 missed_rx += mp; 5128 /* global total per queue */ 5129 adapter->stats.mpc[j].ev_count += mp; 5130 /* Running comprehensive total for stats display */ 5131 total_missed_rx += adapter->stats.mpc[j].ev_count; 5132 if (hw->mac.type == ixgbe_mac_82598EB) 5133 adapter->stats.rnbc[j] += 5134 IXGBE_READ_REG(hw, IXGBE_RNBC(i)); 5135 adapter->stats.pxontxc[j].ev_count += 5136 IXGBE_READ_REG(hw, IXGBE_PXONTXC(i)); 5137 adapter->stats.pxonrxc[j].ev_count += 5138 IXGBE_READ_REG(hw, IXGBE_PXONRXC(i)); 5139 adapter->stats.pxofftxc[j].ev_count += 5140 IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i)); 5141 adapter->stats.pxoffrxc[j].ev_count += 5142 IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i)); 5143 adapter->stats.pxon2offc[j].ev_count += 5144 IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i)); 5145 } 5146 for (int i = 0; i < __arraycount(adapter->stats.qprc); i++) { 5147 int j = i % adapter->num_queues; 5148 adapter->stats.qprc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); 5149 adapter->stats.qptc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); 5150 adapter->stats.qbrc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); 5151 adapter->stats.qbrc[j].ev_count += 5152 ((u64)IXGBE_READ_REG(hw, IXGBE_QBRC(i)) << 32); 5153 adapter->stats.qbtc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); 5154 adapter->stats.qbtc[j].ev_count += 5155 ((u64)IXGBE_READ_REG(hw, IXGBE_QBTC(i)) << 32); 5156 adapter->stats.qprdc[j].ev_count += IXGBE_READ_REG(hw, IXGBE_QPRDC(i)); 5157 } 5158 adapter->stats.mlfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MLFC); 5159 adapter->stats.mrfc.ev_count += IXGBE_READ_REG(hw, IXGBE_MRFC); 5160 adapter->stats.rlec.ev_count += IXGBE_READ_REG(hw, IXGBE_RLEC); 5161 5162 /* Hardware workaround, gprc counts missed packets */ 5163 adapter->stats.gprc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPRC) - missed_rx; 5164 5165 lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC); 5166 adapter->stats.lxontxc.ev_count += lxon; 5167 lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC); 5168 adapter->stats.lxofftxc.ev_count += lxoff; 5169 total = lxon + lxoff; 5170 5171 if (hw->mac.type != ixgbe_mac_82598EB) { 5172 adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCL) + 5173 ((u64)IXGBE_READ_REG(hw, IXGBE_GORCH) << 32); 5174 adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCL) + 5175 ((u64)IXGBE_READ_REG(hw, IXGBE_GOTCH) << 32) - total * ETHER_MIN_LEN; 5176 adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORL) + 5177 ((u64)IXGBE_READ_REG(hw, IXGBE_TORH) << 32); 5178 adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT); 5179 adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT); 5180 } else { 5181 adapter->stats.lxonrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXONRXC); 5182 adapter->stats.lxoffrxc.ev_count += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC); 5183 /* 82598 only has a counter in the high register */ 5184 adapter->stats.gorc.ev_count += IXGBE_READ_REG(hw, IXGBE_GORCH); 5185 adapter->stats.gotc.ev_count += IXGBE_READ_REG(hw, IXGBE_GOTCH) - total * ETHER_MIN_LEN; 5186 adapter->stats.tor.ev_count += IXGBE_READ_REG(hw, IXGBE_TORH); 5187 } 5188 5189 /* 5190 * Workaround: mprc hardware is incorrectly counting 5191 * broadcasts, so for now we subtract those. 5192 */ 5193 bprc = IXGBE_READ_REG(hw, IXGBE_BPRC); 5194 adapter->stats.bprc.ev_count += bprc; 5195 adapter->stats.mprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPRC) - ((hw->mac.type == ixgbe_mac_82598EB) ? bprc : 0); 5196 5197 adapter->stats.prc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC64); 5198 adapter->stats.prc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC127); 5199 adapter->stats.prc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC255); 5200 adapter->stats.prc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC511); 5201 adapter->stats.prc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1023); 5202 adapter->stats.prc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PRC1522); 5203 5204 adapter->stats.gptc.ev_count += IXGBE_READ_REG(hw, IXGBE_GPTC) - total; 5205 adapter->stats.mptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MPTC) - total; 5206 adapter->stats.ptc64.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC64) - total; 5207 5208 adapter->stats.ruc.ev_count += IXGBE_READ_REG(hw, IXGBE_RUC); 5209 adapter->stats.rfc.ev_count += IXGBE_READ_REG(hw, IXGBE_RFC); 5210 adapter->stats.roc.ev_count += IXGBE_READ_REG(hw, IXGBE_ROC); 5211 adapter->stats.rjc.ev_count += IXGBE_READ_REG(hw, IXGBE_RJC); 5212 adapter->stats.mngprc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPRC); 5213 adapter->stats.mngpdc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPDC); 5214 adapter->stats.mngptc.ev_count += IXGBE_READ_REG(hw, IXGBE_MNGPTC); 5215 adapter->stats.tpr.ev_count += IXGBE_READ_REG(hw, IXGBE_TPR); 5216 adapter->stats.tpt.ev_count += IXGBE_READ_REG(hw, IXGBE_TPT); 5217 adapter->stats.ptc127.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC127); 5218 adapter->stats.ptc255.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC255); 5219 adapter->stats.ptc511.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC511); 5220 adapter->stats.ptc1023.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1023); 5221 adapter->stats.ptc1522.ev_count += IXGBE_READ_REG(hw, IXGBE_PTC1522); 5222 adapter->stats.bptc.ev_count += IXGBE_READ_REG(hw, IXGBE_BPTC); 5223 adapter->stats.xec.ev_count += IXGBE_READ_REG(hw, IXGBE_XEC); 5224 adapter->stats.fccrc.ev_count += IXGBE_READ_REG(hw, IXGBE_FCCRC); 5225 adapter->stats.fclast.ev_count += IXGBE_READ_REG(hw, IXGBE_FCLAST); 5226 5227 /* Only read FCOE on 82599 */ 5228 if (hw->mac.type != ixgbe_mac_82598EB) { 5229 adapter->stats.fcoerpdc.ev_count += 5230 IXGBE_READ_REG(hw, IXGBE_FCOERPDC); 5231 adapter->stats.fcoeprc.ev_count += 5232 IXGBE_READ_REG(hw, IXGBE_FCOEPRC); 5233 adapter->stats.fcoeptc.ev_count += 5234 IXGBE_READ_REG(hw, IXGBE_FCOEPTC); 5235 adapter->stats.fcoedwrc.ev_count += 5236 IXGBE_READ_REG(hw, IXGBE_FCOEDWRC); 5237 adapter->stats.fcoedwtc.ev_count += 5238 IXGBE_READ_REG(hw, IXGBE_FCOEDWTC); 5239 } 5240 5241 /* Fill out the OS statistics structure */ 5242 ifp->if_ipackets = adapter->stats.gprc.ev_count; 5243 ifp->if_opackets = adapter->stats.gptc.ev_count; 5244 ifp->if_ibytes = adapter->stats.gorc.ev_count; 5245 ifp->if_obytes = adapter->stats.gotc.ev_count; 5246 ifp->if_imcasts = adapter->stats.mprc.ev_count; 5247 ifp->if_collisions = 0; 5248 5249 /* Rx Errors */ 5250 ifp->if_ierrors = total_missed_rx + adapter->stats.crcerrs.ev_count + 5251 adapter->stats.rlec.ev_count; 5252} 5253 5254/** ixgbe_sysctl_tdh_handler - Handler function 5255 * Retrieves the TDH value from the hardware 5256 */ 5257static int 5258ixgbe_sysctl_tdh_handler(SYSCTLFN_ARGS) 5259{ 5260 struct sysctlnode node; 5261 uint32_t val; 5262 struct tx_ring *txr; 5263 5264 node = *rnode; 5265 txr = (struct tx_ring *)node.sysctl_data; 5266 if (txr == NULL) 5267 return 0; 5268 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDH(txr->me)); 5269 node.sysctl_data = &val; 5270 return sysctl_lookup(SYSCTLFN_CALL(&node)); 5271} 5272 5273/** ixgbe_sysctl_tdt_handler - Handler function 5274 * Retrieves the TDT value from the hardware 5275 */ 5276static int 5277ixgbe_sysctl_tdt_handler(SYSCTLFN_ARGS) 5278{ 5279 struct sysctlnode node; 5280 uint32_t val; 5281 struct tx_ring *txr; 5282 5283 node = *rnode; 5284 txr = (struct tx_ring *)node.sysctl_data; 5285 if (txr == NULL) 5286 return 0; 5287 val = IXGBE_READ_REG(&txr->adapter->hw, IXGBE_TDT(txr->me)); 5288 node.sysctl_data = &val; 5289 return sysctl_lookup(SYSCTLFN_CALL(&node)); 5290} 5291 5292/** ixgbe_sysctl_rdh_handler - Handler function 5293 * Retrieves the RDH value from the hardware 5294 */ 5295static int 5296ixgbe_sysctl_rdh_handler(SYSCTLFN_ARGS) 5297{ 5298 struct sysctlnode node; 5299 uint32_t val; 5300 struct rx_ring *rxr; 5301 5302 node = *rnode; 5303 rxr = (struct rx_ring *)node.sysctl_data; 5304 if (rxr == NULL) 5305 return 0; 5306 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDH(rxr->me)); 5307 node.sysctl_data = &val; 5308 return sysctl_lookup(SYSCTLFN_CALL(&node)); 5309} 5310 5311/** ixgbe_sysctl_rdt_handler - Handler function 5312 * Retrieves the RDT value from the hardware 5313 */ 5314static int 5315ixgbe_sysctl_rdt_handler(SYSCTLFN_ARGS) 5316{ 5317 struct sysctlnode node; 5318 uint32_t val; 5319 struct rx_ring *rxr; 5320 5321 node = *rnode; 5322 rxr = (struct rx_ring *)node.sysctl_data; 5323 if (rxr == NULL) 5324 return 0; 5325 val = IXGBE_READ_REG(&rxr->adapter->hw, IXGBE_RDT(rxr->me)); 5326 node.sysctl_data = &val; 5327 return sysctl_lookup(SYSCTLFN_CALL(&node)); 5328} 5329 5330static int 5331ixgbe_sysctl_interrupt_rate_handler(SYSCTLFN_ARGS) 5332{ 5333 struct sysctlnode node; 5334 struct ix_queue *que; 5335 uint32_t reg, usec, rate; 5336 5337 node = *rnode; 5338 que = (struct ix_queue *)node.sysctl_data; 5339 if (que == NULL) 5340 return 0; 5341 reg = IXGBE_READ_REG(&que->adapter->hw, IXGBE_EITR(que->msix)); 5342 usec = ((reg & 0x0FF8) >> 3); 5343 if (usec > 0) 5344 rate = 1000000 / usec; 5345 else 5346 rate = 0; 5347 node.sysctl_data = &rate; 5348 return sysctl_lookup(SYSCTLFN_CALL(&node)); 5349} 5350 5351const struct sysctlnode * 5352ixgbe_sysctl_instance(struct adapter *adapter) 5353{ 5354 const char *dvname; 5355 struct sysctllog **log; 5356 int rc; 5357 const struct sysctlnode *rnode; 5358 5359 log = &adapter->sysctllog; 5360 dvname = device_xname(adapter->dev); 5361 5362 if ((rc = sysctl_createv(log, 0, NULL, &rnode, 5363 0, CTLTYPE_NODE, "hw", NULL, 5364 NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0) 5365 goto err; 5366 5367 if ((rc = sysctl_createv(log, 0, &rnode, &rnode, 5368 0, CTLTYPE_NODE, dvname, 5369 SYSCTL_DESCR("ixgbe information and settings"), 5370 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0) 5371 goto err; 5372 5373 return rnode; 5374err: 5375 printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc); 5376 return NULL; 5377} 5378 5379/* 5380 * Add sysctl variables, one per statistic, to the system. 5381 */ 5382static void 5383ixgbe_add_hw_stats(struct adapter *adapter) 5384{ 5385 device_t dev = adapter->dev; 5386 const struct sysctlnode *rnode, *cnode; 5387 struct sysctllog **log = &adapter->sysctllog; 5388 struct tx_ring *txr = adapter->tx_rings; 5389 struct rx_ring *rxr = adapter->rx_rings; 5390 struct ixgbe_hw *hw = &adapter->hw; 5391 5392 struct ixgbe_hw_stats *stats = &adapter->stats; 5393 5394 /* Driver Statistics */ 5395#if 0 5396 /* These counters are not updated by the software */ 5397 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "dropped", 5398 CTLFLAG_RD, &adapter->dropped_pkts, 5399 "Driver dropped packets"); 5400 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_header_failed", 5401 CTLFLAG_RD, &adapter->mbuf_header_failed, 5402 "???"); 5403 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_packet_failed", 5404 CTLFLAG_RD, &adapter->mbuf_packet_failed, 5405 "???"); 5406 SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "no_tx_map_avail", 5407 CTLFLAG_RD, &adapter->no_tx_map_avail, 5408 "???"); 5409#endif 5410 evcnt_attach_dynamic(&adapter->handleq, EVCNT_TYPE_MISC, 5411 NULL, device_xname(dev), "Handled queue in softint"); 5412 evcnt_attach_dynamic(&adapter->req, EVCNT_TYPE_MISC, 5413 NULL, device_xname(dev), "Requeued in softint"); 5414 evcnt_attach_dynamic(&adapter->morerx, EVCNT_TYPE_MISC, 5415 NULL, device_xname(dev), "Interrupt handler more rx"); 5416 evcnt_attach_dynamic(&adapter->moretx, EVCNT_TYPE_MISC, 5417 NULL, device_xname(dev), "Interrupt handler more tx"); 5418 evcnt_attach_dynamic(&adapter->txloops, EVCNT_TYPE_MISC, 5419 NULL, device_xname(dev), "Interrupt handler tx loops"); 5420 evcnt_attach_dynamic(&adapter->efbig_tx_dma_setup, EVCNT_TYPE_MISC, 5421 NULL, device_xname(dev), "Driver tx dma soft fail EFBIG"); 5422 evcnt_attach_dynamic(&adapter->m_defrag_failed, EVCNT_TYPE_MISC, 5423 NULL, device_xname(dev), "m_defrag() failed"); 5424 evcnt_attach_dynamic(&adapter->efbig2_tx_dma_setup, EVCNT_TYPE_MISC, 5425 NULL, device_xname(dev), "Driver tx dma hard fail EFBIG"); 5426 evcnt_attach_dynamic(&adapter->einval_tx_dma_setup, EVCNT_TYPE_MISC, 5427 NULL, device_xname(dev), "Driver tx dma hard fail EINVAL"); 5428 evcnt_attach_dynamic(&adapter->other_tx_dma_setup, EVCNT_TYPE_MISC, 5429 NULL, device_xname(dev), "Driver tx dma hard fail other"); 5430 evcnt_attach_dynamic(&adapter->eagain_tx_dma_setup, EVCNT_TYPE_MISC, 5431 NULL, device_xname(dev), "Driver tx dma soft fail EAGAIN"); 5432 evcnt_attach_dynamic(&adapter->enomem_tx_dma_setup, EVCNT_TYPE_MISC, 5433 NULL, device_xname(dev), "Driver tx dma soft fail ENOMEM"); 5434 evcnt_attach_dynamic(&adapter->watchdog_events, EVCNT_TYPE_MISC, 5435 NULL, device_xname(dev), "Watchdog timeouts"); 5436 evcnt_attach_dynamic(&adapter->tso_err, EVCNT_TYPE_MISC, 5437 NULL, device_xname(dev), "TSO errors"); 5438 evcnt_attach_dynamic(&adapter->tso_tx, EVCNT_TYPE_MISC, 5439 NULL, device_xname(dev), "TSO"); 5440 evcnt_attach_dynamic(&adapter->link_irq, EVCNT_TYPE_MISC, 5441 NULL, device_xname(dev), "Link MSIX IRQ Handled"); 5442 5443 for (int i = 0; i < adapter->num_queues; i++, rxr++, txr++) { 5444 snprintf(adapter->queues[i].evnamebuf, 5445 sizeof(adapter->queues[i].evnamebuf), "%s queue%d", 5446 device_xname(dev), i); 5447 snprintf(adapter->queues[i].namebuf, 5448 sizeof(adapter->queues[i].namebuf), "queue%d", i); 5449 5450 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) { 5451 aprint_error_dev(dev, "could not create sysctl root\n"); 5452 break; 5453 } 5454 5455 if (sysctl_createv(log, 0, &rnode, &rnode, 5456 0, CTLTYPE_NODE, 5457 adapter->queues[i].namebuf, SYSCTL_DESCR("Queue Name"), 5458 NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL) != 0) 5459 break; 5460 5461 if (sysctl_createv(log, 0, &rnode, &cnode, 5462 CTLFLAG_READONLY, CTLTYPE_INT, 5463 "interrupt_rate", SYSCTL_DESCR("Interrupt Rate"), 5464 ixgbe_sysctl_interrupt_rate_handler, 0, &adapter->queues[i], 5465 0, CTL_CREATE, CTL_EOL) != 0) 5466 break; 5467 5468 if (sysctl_createv(log, 0, &rnode, &cnode, 5469 CTLFLAG_READONLY, CTLTYPE_INT, 5470 "txd_head", SYSCTL_DESCR("Transmit Descriptor Head"), 5471 ixgbe_sysctl_tdh_handler, 0, txr, 5472 0, CTL_CREATE, CTL_EOL) != 0) 5473 break; 5474 5475 if (sysctl_createv(log, 0, &rnode, &cnode, 5476 CTLFLAG_READONLY, CTLTYPE_INT, 5477 "txd_tail", SYSCTL_DESCR("Transmit Descriptor Tail"), 5478 ixgbe_sysctl_tdt_handler, 0, txr, 5479 0, CTL_CREATE, CTL_EOL) != 0) 5480 break; 5481 5482 evcnt_attach_dynamic(&txr->no_desc_avail, EVCNT_TYPE_MISC, 5483 NULL, adapter->queues[i].evnamebuf, 5484 "Queue No Descriptor Available"); 5485 evcnt_attach_dynamic(&txr->total_packets, EVCNT_TYPE_MISC, 5486 NULL, adapter->queues[i].evnamebuf, 5487 "Queue Packets Transmitted"); 5488 5489#ifdef LRO 5490 struct lro_ctrl *lro = &rxr->lro; 5491#endif /* LRO */ 5492 5493 if (sysctl_createv(log, 0, &rnode, &cnode, 5494 CTLFLAG_READONLY, 5495 CTLTYPE_INT, 5496 "rxd_head", SYSCTL_DESCR("Receive Descriptor Head"), 5497 ixgbe_sysctl_rdh_handler, 0, rxr, 0, 5498 CTL_CREATE, CTL_EOL) != 0) 5499 break; 5500 5501 if (sysctl_createv(log, 0, &rnode, &cnode, 5502 CTLFLAG_READONLY, 5503 CTLTYPE_INT, 5504 "rxd_tail", SYSCTL_DESCR("Receive Descriptor Tail"), 5505 ixgbe_sysctl_rdt_handler, 0, rxr, 0, 5506 CTL_CREATE, CTL_EOL) != 0) 5507 break; 5508 5509 if (i < __arraycount(adapter->stats.mpc)) { 5510 evcnt_attach_dynamic(&adapter->stats.mpc[i], 5511 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5512 "Missed Packet Count"); 5513 } 5514 if (i < __arraycount(adapter->stats.pxontxc)) { 5515 evcnt_attach_dynamic(&adapter->stats.pxontxc[i], 5516 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5517 "pxontxc"); 5518 evcnt_attach_dynamic(&adapter->stats.pxonrxc[i], 5519 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5520 "pxonrxc"); 5521 evcnt_attach_dynamic(&adapter->stats.pxofftxc[i], 5522 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5523 "pxofftxc"); 5524 evcnt_attach_dynamic(&adapter->stats.pxoffrxc[i], 5525 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5526 "pxoffrxc"); 5527 evcnt_attach_dynamic(&adapter->stats.pxon2offc[i], 5528 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5529 "pxon2offc"); 5530 } 5531 if (i < __arraycount(adapter->stats.qprc)) { 5532 evcnt_attach_dynamic(&adapter->stats.qprc[i], 5533 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5534 "qprc"); 5535 evcnt_attach_dynamic(&adapter->stats.qptc[i], 5536 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5537 "qptc"); 5538 evcnt_attach_dynamic(&adapter->stats.qbrc[i], 5539 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5540 "qbrc"); 5541 evcnt_attach_dynamic(&adapter->stats.qbtc[i], 5542 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5543 "qbtc"); 5544 evcnt_attach_dynamic(&adapter->stats.qprdc[i], 5545 EVCNT_TYPE_MISC, NULL, adapter->queues[i].evnamebuf, 5546 "qprdc"); 5547 } 5548 5549 evcnt_attach_dynamic(&rxr->rx_packets, EVCNT_TYPE_MISC, 5550 NULL, adapter->queues[i].evnamebuf, "Queue Packets Received"); 5551 evcnt_attach_dynamic(&rxr->rx_bytes, EVCNT_TYPE_MISC, 5552 NULL, adapter->queues[i].evnamebuf, "Queue Bytes Received"); 5553 evcnt_attach_dynamic(&rxr->no_jmbuf, EVCNT_TYPE_MISC, 5554 NULL, adapter->queues[i].evnamebuf, "Rx no jumbo mbuf"); 5555 evcnt_attach_dynamic(&rxr->rx_discarded, EVCNT_TYPE_MISC, 5556 NULL, adapter->queues[i].evnamebuf, "Rx discarded"); 5557 evcnt_attach_dynamic(&rxr->rx_split_packets, EVCNT_TYPE_MISC, 5558 NULL, adapter->queues[i].evnamebuf, "Rx split packets"); 5559 evcnt_attach_dynamic(&rxr->rx_irq, EVCNT_TYPE_MISC, 5560 NULL, adapter->queues[i].evnamebuf, "Rx interrupts"); 5561#ifdef LRO 5562 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_queued", 5563 CTLFLAG_RD, &lro->lro_queued, 0, 5564 "LRO Queued"); 5565 SYSCTL_ADD_INT(ctx, queue_list, OID_AUTO, "lro_flushed", 5566 CTLFLAG_RD, &lro->lro_flushed, 0, 5567 "LRO Flushed"); 5568#endif /* LRO */ 5569 } 5570 5571 /* MAC stats get the own sub node */ 5572 5573 5574 snprintf(stats->namebuf, 5575 sizeof(stats->namebuf), "%s MAC Statistics", device_xname(dev)); 5576 5577 evcnt_attach_dynamic(&stats->ipcs, EVCNT_TYPE_MISC, NULL, 5578 stats->namebuf, "rx csum offload - IP"); 5579 evcnt_attach_dynamic(&stats->l4cs, EVCNT_TYPE_MISC, NULL, 5580 stats->namebuf, "rx csum offload - L4"); 5581 evcnt_attach_dynamic(&stats->ipcs_bad, EVCNT_TYPE_MISC, NULL, 5582 stats->namebuf, "rx csum offload - IP bad"); 5583 evcnt_attach_dynamic(&stats->l4cs_bad, EVCNT_TYPE_MISC, NULL, 5584 stats->namebuf, "rx csum offload - L4 bad"); 5585 evcnt_attach_dynamic(&stats->intzero, EVCNT_TYPE_MISC, NULL, 5586 stats->namebuf, "Interrupt conditions zero"); 5587 evcnt_attach_dynamic(&stats->legint, EVCNT_TYPE_MISC, NULL, 5588 stats->namebuf, "Legacy interrupts"); 5589 evcnt_attach_dynamic(&stats->crcerrs, EVCNT_TYPE_MISC, NULL, 5590 stats->namebuf, "CRC Errors"); 5591 evcnt_attach_dynamic(&stats->illerrc, EVCNT_TYPE_MISC, NULL, 5592 stats->namebuf, "Illegal Byte Errors"); 5593 evcnt_attach_dynamic(&stats->errbc, EVCNT_TYPE_MISC, NULL, 5594 stats->namebuf, "Byte Errors"); 5595 evcnt_attach_dynamic(&stats->mspdc, EVCNT_TYPE_MISC, NULL, 5596 stats->namebuf, "MAC Short Packets Discarded"); 5597 evcnt_attach_dynamic(&stats->mlfc, EVCNT_TYPE_MISC, NULL, 5598 stats->namebuf, "MAC Local Faults"); 5599 evcnt_attach_dynamic(&stats->mrfc, EVCNT_TYPE_MISC, NULL, 5600 stats->namebuf, "MAC Remote Faults"); 5601 evcnt_attach_dynamic(&stats->rlec, EVCNT_TYPE_MISC, NULL, 5602 stats->namebuf, "Receive Length Errors"); 5603 evcnt_attach_dynamic(&stats->lxontxc, EVCNT_TYPE_MISC, NULL, 5604 stats->namebuf, "Link XON Transmitted"); 5605 evcnt_attach_dynamic(&stats->lxonrxc, EVCNT_TYPE_MISC, NULL, 5606 stats->namebuf, "Link XON Received"); 5607 evcnt_attach_dynamic(&stats->lxofftxc, EVCNT_TYPE_MISC, NULL, 5608 stats->namebuf, "Link XOFF Transmitted"); 5609 evcnt_attach_dynamic(&stats->lxoffrxc, EVCNT_TYPE_MISC, NULL, 5610 stats->namebuf, "Link XOFF Received"); 5611 5612 /* Packet Reception Stats */ 5613 evcnt_attach_dynamic(&stats->tor, EVCNT_TYPE_MISC, NULL, 5614 stats->namebuf, "Total Octets Received"); 5615 evcnt_attach_dynamic(&stats->gorc, EVCNT_TYPE_MISC, NULL, 5616 stats->namebuf, "Good Octets Received"); 5617 evcnt_attach_dynamic(&stats->tpr, EVCNT_TYPE_MISC, NULL, 5618 stats->namebuf, "Total Packets Received"); 5619 evcnt_attach_dynamic(&stats->gprc, EVCNT_TYPE_MISC, NULL, 5620 stats->namebuf, "Good Packets Received"); 5621 evcnt_attach_dynamic(&stats->mprc, EVCNT_TYPE_MISC, NULL, 5622 stats->namebuf, "Multicast Packets Received"); 5623 evcnt_attach_dynamic(&stats->bprc, EVCNT_TYPE_MISC, NULL, 5624 stats->namebuf, "Broadcast Packets Received"); 5625 evcnt_attach_dynamic(&stats->prc64, EVCNT_TYPE_MISC, NULL, 5626 stats->namebuf, "64 byte frames received "); 5627 evcnt_attach_dynamic(&stats->prc127, EVCNT_TYPE_MISC, NULL, 5628 stats->namebuf, "65-127 byte frames received"); 5629 evcnt_attach_dynamic(&stats->prc255, EVCNT_TYPE_MISC, NULL, 5630 stats->namebuf, "128-255 byte frames received"); 5631 evcnt_attach_dynamic(&stats->prc511, EVCNT_TYPE_MISC, NULL, 5632 stats->namebuf, "256-511 byte frames received"); 5633 evcnt_attach_dynamic(&stats->prc1023, EVCNT_TYPE_MISC, NULL, 5634 stats->namebuf, "512-1023 byte frames received"); 5635 evcnt_attach_dynamic(&stats->prc1522, EVCNT_TYPE_MISC, NULL, 5636 stats->namebuf, "1023-1522 byte frames received"); 5637 evcnt_attach_dynamic(&stats->ruc, EVCNT_TYPE_MISC, NULL, 5638 stats->namebuf, "Receive Undersized"); 5639 evcnt_attach_dynamic(&stats->rfc, EVCNT_TYPE_MISC, NULL, 5640 stats->namebuf, "Fragmented Packets Received "); 5641 evcnt_attach_dynamic(&stats->roc, EVCNT_TYPE_MISC, NULL, 5642 stats->namebuf, "Oversized Packets Received"); 5643 evcnt_attach_dynamic(&stats->rjc, EVCNT_TYPE_MISC, NULL, 5644 stats->namebuf, "Received Jabber"); 5645 evcnt_attach_dynamic(&stats->mngprc, EVCNT_TYPE_MISC, NULL, 5646 stats->namebuf, "Management Packets Received"); 5647 evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL, 5648 stats->namebuf, "Management Packets Dropped"); 5649 evcnt_attach_dynamic(&stats->xec, EVCNT_TYPE_MISC, NULL, 5650 stats->namebuf, "Checksum Errors"); 5651 5652 /* Packet Transmission Stats */ 5653 evcnt_attach_dynamic(&stats->gotc, EVCNT_TYPE_MISC, NULL, 5654 stats->namebuf, "Good Octets Transmitted"); 5655 evcnt_attach_dynamic(&stats->tpt, EVCNT_TYPE_MISC, NULL, 5656 stats->namebuf, "Total Packets Transmitted"); 5657 evcnt_attach_dynamic(&stats->gptc, EVCNT_TYPE_MISC, NULL, 5658 stats->namebuf, "Good Packets Transmitted"); 5659 evcnt_attach_dynamic(&stats->bptc, EVCNT_TYPE_MISC, NULL, 5660 stats->namebuf, "Broadcast Packets Transmitted"); 5661 evcnt_attach_dynamic(&stats->mptc, EVCNT_TYPE_MISC, NULL, 5662 stats->namebuf, "Multicast Packets Transmitted"); 5663 evcnt_attach_dynamic(&stats->mngptc, EVCNT_TYPE_MISC, NULL, 5664 stats->namebuf, "Management Packets Transmitted"); 5665 evcnt_attach_dynamic(&stats->ptc64, EVCNT_TYPE_MISC, NULL, 5666 stats->namebuf, "64 byte frames transmitted "); 5667 evcnt_attach_dynamic(&stats->ptc127, EVCNT_TYPE_MISC, NULL, 5668 stats->namebuf, "65-127 byte frames transmitted"); 5669 evcnt_attach_dynamic(&stats->ptc255, EVCNT_TYPE_MISC, NULL, 5670 stats->namebuf, "128-255 byte frames transmitted"); 5671 evcnt_attach_dynamic(&stats->ptc511, EVCNT_TYPE_MISC, NULL, 5672 stats->namebuf, "256-511 byte frames transmitted"); 5673 evcnt_attach_dynamic(&stats->ptc1023, EVCNT_TYPE_MISC, NULL, 5674 stats->namebuf, "512-1023 byte frames transmitted"); 5675 evcnt_attach_dynamic(&stats->ptc1522, EVCNT_TYPE_MISC, NULL, 5676 stats->namebuf, "1024-1522 byte frames transmitted"); 5677 5678 /* FC Stats */ 5679 evcnt_attach_dynamic(&stats->fccrc, EVCNT_TYPE_MISC, NULL, 5680 stats->namebuf, "FC CRC Errors"); 5681 evcnt_attach_dynamic(&stats->fclast, EVCNT_TYPE_MISC, NULL, 5682 stats->namebuf, "FC Last Error"); 5683 if (hw->mac.type != ixgbe_mac_82598EB) { 5684 evcnt_attach_dynamic(&stats->fcoerpdc, EVCNT_TYPE_MISC, NULL, 5685 stats->namebuf, "FCoE Packets Dropped"); 5686 evcnt_attach_dynamic(&stats->fcoeprc, EVCNT_TYPE_MISC, NULL, 5687 stats->namebuf, "FCoE Packets Received"); 5688 evcnt_attach_dynamic(&stats->fcoeptc, EVCNT_TYPE_MISC, NULL, 5689 stats->namebuf, "FCoE Packets Transmitted"); 5690 evcnt_attach_dynamic(&stats->fcoedwrc, EVCNT_TYPE_MISC, NULL, 5691 stats->namebuf, "FCoE DWords Received"); 5692 evcnt_attach_dynamic(&stats->fcoedwtc, EVCNT_TYPE_MISC, NULL, 5693 stats->namebuf, "FCoE DWords Transmitted"); 5694 } 5695} 5696 5697/* 5698** Set flow control using sysctl: 5699** Flow control values: 5700** 0 - off 5701** 1 - rx pause 5702** 2 - tx pause 5703** 3 - full 5704*/ 5705static int 5706ixgbe_set_flowcntl(SYSCTLFN_ARGS) 5707{ 5708 struct sysctlnode node; 5709 int error; 5710 int last = ixgbe_flow_control; 5711 struct adapter *adapter; 5712 5713 node = *rnode; 5714 adapter = (struct adapter *)node.sysctl_data; 5715 node.sysctl_data = &ixgbe_flow_control; 5716 error = sysctl_lookup(SYSCTLFN_CALL(&node)); 5717 if (error != 0 || newp == NULL) 5718 return error; 5719 5720 /* Don't bother if it's not changed */ 5721 if (ixgbe_flow_control == last) 5722 return (0); 5723 5724 switch (ixgbe_flow_control) { 5725 case ixgbe_fc_rx_pause: 5726 case ixgbe_fc_tx_pause: 5727 case ixgbe_fc_full: 5728 adapter->hw.fc.requested_mode = ixgbe_flow_control; 5729 break; 5730 case ixgbe_fc_none: 5731 default: 5732 adapter->hw.fc.requested_mode = ixgbe_fc_none; 5733 } 5734 5735 ixgbe_fc_enable(&adapter->hw, 0); 5736 return 0; 5737} 5738 5739static void 5740ixgbe_add_rx_process_limit(struct adapter *adapter, const char *name, 5741 const char *description, int *limit, int value) 5742{ 5743 const struct sysctlnode *rnode, *cnode; 5744 struct sysctllog **log = &adapter->sysctllog; 5745 5746 *limit = value; 5747 5748 if ((rnode = ixgbe_sysctl_instance(adapter)) == NULL) 5749 aprint_error_dev(adapter->dev, 5750 "could not create sysctl root\n"); 5751 else if (sysctl_createv(log, 0, &rnode, &cnode, 5752 CTLFLAG_READWRITE, 5753 CTLTYPE_INT, 5754 name, SYSCTL_DESCR(description), 5755 NULL, 0, limit, 0, 5756 CTL_CREATE, CTL_EOL) != 0) { 5757 aprint_error_dev(adapter->dev, "%s: could not create sysctl", 5758 __func__); 5759 } 5760} 5761 5762/* 5763** Control link advertise speed: 5764** 0 - normal 5765** 1 - advertise only 1G 5766*/ 5767static int 5768ixgbe_set_advertise(SYSCTLFN_ARGS) 5769{ 5770 struct sysctlnode node; 5771 int t, error; 5772 struct adapter *adapter; 5773 struct ixgbe_hw *hw; 5774 ixgbe_link_speed speed, last; 5775 5776 node = *rnode; 5777 adapter = (struct adapter *)node.sysctl_data; 5778 t = adapter->advertise; 5779 node.sysctl_data = &t; 5780 error = sysctl_lookup(SYSCTLFN_CALL(&node)); 5781 if (error != 0 || newp == NULL) 5782 return error; 5783 5784 if (t == -1) 5785 return 0; 5786 5787 adapter->advertise = t; 5788 5789 hw = &adapter->hw; 5790 last = hw->phy.autoneg_advertised; 5791 5792 if (!((hw->phy.media_type == ixgbe_media_type_copper) || 5793 (hw->phy.multispeed_fiber))) 5794 return 0; 5795 5796 if (adapter->advertise == 1) 5797 speed = IXGBE_LINK_SPEED_1GB_FULL; 5798 else 5799 speed = IXGBE_LINK_SPEED_1GB_FULL | 5800 IXGBE_LINK_SPEED_10GB_FULL; 5801 5802 if (speed == last) /* no change */ 5803 return 0; 5804 5805 hw->mac.autotry_restart = TRUE; 5806 hw->mac.ops.setup_link(hw, speed, TRUE, TRUE); 5807 5808 return 0; 5809} 5810