[BACK]Return to ixgbe.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / pci / ixgbe

Annotation of src/sys/dev/pci/ixgbe/ixgbe.c, Revision 1.20

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

CVSweb <webmaster@jp.NetBSD.org>