1f2f3bb8fSRobert Mustacchi /* 2f2f3bb8fSRobert Mustacchi * This file and its contents are supplied under the terms of the 3f2f3bb8fSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4f2f3bb8fSRobert Mustacchi * You may only use this file in accordance with the terms of version 5f2f3bb8fSRobert Mustacchi * 1.0 of the CDDL. 6f2f3bb8fSRobert Mustacchi * 7f2f3bb8fSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8f2f3bb8fSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9f2f3bb8fSRobert Mustacchi * http://www.illumos.org/license/CDDL. 10f2f3bb8fSRobert Mustacchi */ 11f2f3bb8fSRobert Mustacchi 12f2f3bb8fSRobert Mustacchi /* 13f2f3bb8fSRobert Mustacchi * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved. 14*5ca90d72SRyan Zezeski * Copyright 2019 Joyent, Inc. 1547fdb1a2SPaul Winder * Copyright 2017 Tegile Systems, Inc. All rights reserved. 16f2f3bb8fSRobert Mustacchi */ 17f2f3bb8fSRobert Mustacchi 18f2f3bb8fSRobert Mustacchi /* 19f2f3bb8fSRobert Mustacchi * Please see i40e_main.c for an introduction to the device driver, its layout, 20f2f3bb8fSRobert Mustacchi * and more. 21f2f3bb8fSRobert Mustacchi */ 22f2f3bb8fSRobert Mustacchi 23f2f3bb8fSRobert Mustacchi #ifndef _I40E_SW_H 24f2f3bb8fSRobert Mustacchi #define _I40E_SW_H 25f2f3bb8fSRobert Mustacchi 26f2f3bb8fSRobert Mustacchi #ifdef __cplusplus 27f2f3bb8fSRobert Mustacchi extern "C" { 28f2f3bb8fSRobert Mustacchi #endif 29f2f3bb8fSRobert Mustacchi 30f2f3bb8fSRobert Mustacchi #include <sys/types.h> 31f2f3bb8fSRobert Mustacchi #include <sys/conf.h> 32f2f3bb8fSRobert Mustacchi #include <sys/debug.h> 33f2f3bb8fSRobert Mustacchi #include <sys/stropts.h> 34f2f3bb8fSRobert Mustacchi #include <sys/stream.h> 35f2f3bb8fSRobert Mustacchi #include <sys/strsun.h> 36f2f3bb8fSRobert Mustacchi #include <sys/strlog.h> 37f2f3bb8fSRobert Mustacchi #include <sys/kmem.h> 38f2f3bb8fSRobert Mustacchi #include <sys/stat.h> 39f2f3bb8fSRobert Mustacchi #include <sys/kstat.h> 40f2f3bb8fSRobert Mustacchi #include <sys/modctl.h> 41f2f3bb8fSRobert Mustacchi #include <sys/errno.h> 42f2f3bb8fSRobert Mustacchi #include <sys/dlpi.h> 43f2f3bb8fSRobert Mustacchi #include <sys/mac_provider.h> 44f2f3bb8fSRobert Mustacchi #include <sys/mac_ether.h> 45f2f3bb8fSRobert Mustacchi #include <sys/vlan.h> 46f2f3bb8fSRobert Mustacchi #include <sys/ddi.h> 47f2f3bb8fSRobert Mustacchi #include <sys/sunddi.h> 48f2f3bb8fSRobert Mustacchi #include <sys/pci.h> 49f2f3bb8fSRobert Mustacchi #include <sys/pcie.h> 50f2f3bb8fSRobert Mustacchi #include <sys/sdt.h> 51f2f3bb8fSRobert Mustacchi #include <sys/ethernet.h> 52f2f3bb8fSRobert Mustacchi #include <sys/pattr.h> 53f2f3bb8fSRobert Mustacchi #include <sys/strsubr.h> 54f2f3bb8fSRobert Mustacchi #include <sys/netlb.h> 55f2f3bb8fSRobert Mustacchi #include <sys/random.h> 56f2f3bb8fSRobert Mustacchi #include <inet/common.h> 57f2f3bb8fSRobert Mustacchi #include <inet/tcp.h> 58f2f3bb8fSRobert Mustacchi #include <inet/ip.h> 59f2f3bb8fSRobert Mustacchi #include <inet/mi.h> 60f2f3bb8fSRobert Mustacchi #include <inet/nd.h> 61f2f3bb8fSRobert Mustacchi #include <netinet/udp.h> 62f2f3bb8fSRobert Mustacchi #include <netinet/sctp.h> 63f2f3bb8fSRobert Mustacchi #include <sys/bitmap.h> 64f2f3bb8fSRobert Mustacchi #include <sys/cpuvar.h> 65f2f3bb8fSRobert Mustacchi #include <sys/ddifm.h> 66f2f3bb8fSRobert Mustacchi #include <sys/fm/protocol.h> 67f2f3bb8fSRobert Mustacchi #include <sys/fm/util.h> 68f2f3bb8fSRobert Mustacchi #include <sys/disp.h> 69f2f3bb8fSRobert Mustacchi #include <sys/fm/io/ddi.h> 70f2f3bb8fSRobert Mustacchi #include <sys/list.h> 71f2f3bb8fSRobert Mustacchi #include <sys/debug.h> 72f2f3bb8fSRobert Mustacchi #include <sys/sdt.h> 73f2f3bb8fSRobert Mustacchi #include "i40e_type.h" 74f2f3bb8fSRobert Mustacchi #include "i40e_osdep.h" 75f2f3bb8fSRobert Mustacchi #include "i40e_prototype.h" 76f2f3bb8fSRobert Mustacchi #include "i40e_xregs.h" 77f2f3bb8fSRobert Mustacchi 78f2f3bb8fSRobert Mustacchi #define I40E_MODULE_NAME "i40e" 79f2f3bb8fSRobert Mustacchi 80f2f3bb8fSRobert Mustacchi #define I40E_ADAPTER_REGSET 1 81f2f3bb8fSRobert Mustacchi 82f2f3bb8fSRobert Mustacchi /* 83f2f3bb8fSRobert Mustacchi * Configuration constants. Note that the hardware defines a minimum bound of 32 84f2f3bb8fSRobert Mustacchi * descriptors and requires that the programming of the descriptor lengths be 85f2f3bb8fSRobert Mustacchi * aligned in units of 32 descriptors. 86f2f3bb8fSRobert Mustacchi */ 87f2f3bb8fSRobert Mustacchi #define I40E_MIN_TX_RING_SIZE 64 88f2f3bb8fSRobert Mustacchi #define I40E_MAX_TX_RING_SIZE 4096 89f2f3bb8fSRobert Mustacchi #define I40E_DEF_TX_RING_SIZE 1024 90f2f3bb8fSRobert Mustacchi 91f2f3bb8fSRobert Mustacchi #define I40E_MIN_RX_RING_SIZE 64 92f2f3bb8fSRobert Mustacchi #define I40E_MAX_RX_RING_SIZE 4096 93f2f3bb8fSRobert Mustacchi #define I40E_DEF_RX_RING_SIZE 1024 94f2f3bb8fSRobert Mustacchi 95f2f3bb8fSRobert Mustacchi #define I40E_DESC_ALIGN 32 96f2f3bb8fSRobert Mustacchi 97f2f3bb8fSRobert Mustacchi /* 98f2f3bb8fSRobert Mustacchi * Sizes used for asynchronous processing of the adminq. We allocate a fixed 99f2f3bb8fSRobert Mustacchi * size buffer for each instance of the device during attach time, rather than 100f2f3bb8fSRobert Mustacchi * allocating and freeing one during interrupt processing. 101f2f3bb8fSRobert Mustacchi * 102f2f3bb8fSRobert Mustacchi * We also define the descriptor size of the admin queue here. 103f2f3bb8fSRobert Mustacchi */ 104f2f3bb8fSRobert Mustacchi #define I40E_ADMINQ_BUFSZ 4096 105f2f3bb8fSRobert Mustacchi #define I40E_MAX_ADMINQ_SIZE 1024 106f2f3bb8fSRobert Mustacchi #define I40E_DEF_ADMINQ_SIZE 256 107f2f3bb8fSRobert Mustacchi 108f2f3bb8fSRobert Mustacchi /* 109f2f3bb8fSRobert Mustacchi * Note, while the min and maximum values are based upon the sizing of the ring 110f2f3bb8fSRobert Mustacchi * itself, the default is taken from ixgbe without much thought. It's basically 111f2f3bb8fSRobert Mustacchi * been cargo culted. See i40e_transceiver.c for a bit more information. 112f2f3bb8fSRobert Mustacchi */ 113f2f3bb8fSRobert Mustacchi #define I40E_MIN_RX_LIMIT_PER_INTR 16 114f2f3bb8fSRobert Mustacchi #define I40E_MAX_RX_LIMIT_PER_INTR 4096 115f2f3bb8fSRobert Mustacchi #define I40E_DEF_RX_LIMIT_PER_INTR 256 116f2f3bb8fSRobert Mustacchi 117f2f3bb8fSRobert Mustacchi /* 118f2f3bb8fSRobert Mustacchi * Valid MTU ranges. Note that the XL710's maximum payload is actually 9728. 119f2f3bb8fSRobert Mustacchi * However, we need to adjust for the ETHERFCSL (4 bytes) and the Ethernet VLAN 120f2f3bb8fSRobert Mustacchi * header size (18 bytes) to get the actual maximum frame we can use. If 121f2f3bb8fSRobert Mustacchi * different adapters end up with different sizes, we should make this value a 122f2f3bb8fSRobert Mustacchi * bit more dynamic. 123f2f3bb8fSRobert Mustacchi */ 124f2f3bb8fSRobert Mustacchi #define I40E_MAX_MTU 9706 125f2f3bb8fSRobert Mustacchi #define I40E_MIN_MTU ETHERMIN 126f2f3bb8fSRobert Mustacchi #define I40E_DEF_MTU ETHERMTU 127f2f3bb8fSRobert Mustacchi 128f2f3bb8fSRobert Mustacchi /* 129f2f3bb8fSRobert Mustacchi * Interrupt throttling related values. Interrupt throttling values are defined 130f2f3bb8fSRobert Mustacchi * in two microsecond increments. Note that a value of zero basically says do no 131f2f3bb8fSRobert Mustacchi * ITR activity. A helpful way to think about these is that setting the ITR to a 132f2f3bb8fSRobert Mustacchi * value will allow a certain number of interrupts per second. 133f2f3bb8fSRobert Mustacchi * 134f2f3bb8fSRobert Mustacchi * Our default values for RX allow 20k interrupts per second while our default 135f2f3bb8fSRobert Mustacchi * values for TX allow for 5k interrupts per second. For other class interrupts, 136f2f3bb8fSRobert Mustacchi * we limit ourselves to a rate of 2k/s. 137f2f3bb8fSRobert Mustacchi */ 138f2f3bb8fSRobert Mustacchi #define I40E_MIN_ITR 0x0000 139f2f3bb8fSRobert Mustacchi #define I40E_MAX_ITR 0x0FF0 140f2f3bb8fSRobert Mustacchi #define I40E_DEF_RX_ITR 0x0019 141f2f3bb8fSRobert Mustacchi #define I40E_DEF_TX_ITR 0x0064 142f2f3bb8fSRobert Mustacchi #define I40E_DEF_OTHER_ITR 0x00FA 143f2f3bb8fSRobert Mustacchi 144f2f3bb8fSRobert Mustacchi /* 145f2f3bb8fSRobert Mustacchi * Indexes into the three ITR registers that we have. 146f2f3bb8fSRobert Mustacchi */ 147f2f3bb8fSRobert Mustacchi typedef enum i40e_itr_index { 148f2f3bb8fSRobert Mustacchi I40E_ITR_INDEX_RX = 0x0, 149f2f3bb8fSRobert Mustacchi I40E_ITR_INDEX_TX = 0x1, 150f2f3bb8fSRobert Mustacchi I40E_ITR_INDEX_OTHER = 0x2, 151f2f3bb8fSRobert Mustacchi I40E_ITR_INDEX_NONE = 0x3 152f2f3bb8fSRobert Mustacchi } i40e_itr_index_t; 153f2f3bb8fSRobert Mustacchi 154f2f3bb8fSRobert Mustacchi /* 155*5ca90d72SRyan Zezeski * The hardware claims to support LSO up to 256 KB, but due to the limitations 156*5ca90d72SRyan Zezeski * imposed by the IP header for non-jumbo frames, we cap it at 64 KB. 157f2f3bb8fSRobert Mustacchi */ 158*5ca90d72SRyan Zezeski #define I40E_LSO_MAXLEN (64 * 1024) 159f2f3bb8fSRobert Mustacchi 160f2f3bb8fSRobert Mustacchi #define I40E_CYCLIC_PERIOD NANOSEC /* 1 second */ 161f2f3bb8fSRobert Mustacchi #define I40E_DRAIN_RX_WAIT (500 * MILLISEC) /* In us */ 162f2f3bb8fSRobert Mustacchi 163f2f3bb8fSRobert Mustacchi /* 164f2f3bb8fSRobert Mustacchi * All the other queue types for are defined by the common code. However, this 165f2f3bb8fSRobert Mustacchi * is the constant to indicate that it's terminated. 166f2f3bb8fSRobert Mustacchi */ 167f2f3bb8fSRobert Mustacchi #define I40E_QUEUE_TYPE_EOL 0x7FF 168f2f3bb8fSRobert Mustacchi 169f2f3bb8fSRobert Mustacchi /* 170f2f3bb8fSRobert Mustacchi * See the comments in i40e_transceiver.c as to the purpose of this value and 171f2f3bb8fSRobert Mustacchi * how it's used to ensure that the IP header is eventually aligned when it's 172f2f3bb8fSRobert Mustacchi * received by the OS. 173f2f3bb8fSRobert Mustacchi */ 174f2f3bb8fSRobert Mustacchi #define I40E_BUF_IPHDR_ALIGNMENT 2 175f2f3bb8fSRobert Mustacchi 176f2f3bb8fSRobert Mustacchi /* 177*5ca90d72SRyan Zezeski * The XL710 controller has a total of eight buffers available for the 178*5ca90d72SRyan Zezeski * transmission of any single frame. This is defined in 8.4.1 - Transmit 179f2f3bb8fSRobert Mustacchi * Packet in System Memory. 180f2f3bb8fSRobert Mustacchi */ 181f2f3bb8fSRobert Mustacchi #define I40E_TX_MAX_COOKIE 8 182f2f3bb8fSRobert Mustacchi 183f2f3bb8fSRobert Mustacchi /* 184*5ca90d72SRyan Zezeski * An LSO frame can be as large as 64KB, so we allow a DMA bind to span more 185*5ca90d72SRyan Zezeski * cookies than a non-LSO frame. The key here to is to select a value such 186*5ca90d72SRyan Zezeski * that once the HW has chunked up the LSO frame into MSS-sized segments that no 187*5ca90d72SRyan Zezeski * single segment spans more than 8 cookies (see comments for 188*5ca90d72SRyan Zezeski * I40E_TX_MAX_COOKIE) 189*5ca90d72SRyan Zezeski */ 190*5ca90d72SRyan Zezeski #define I40E_TX_LSO_MAX_COOKIE 32 191*5ca90d72SRyan Zezeski 192*5ca90d72SRyan Zezeski /* 193f2f3bb8fSRobert Mustacchi * Sizing to determine the amount of available descriptors at which we'll 194f2f3bb8fSRobert Mustacchi * consider ourselves blocked. Also, when we have these available, we'll then 195f2f3bb8fSRobert Mustacchi * consider ourselves available to transmit to MAC again. Strictly speaking, the 196f2f3bb8fSRobert Mustacchi * MAX is based on the ring size. The default sizing is based on ixgbe. 197f2f3bb8fSRobert Mustacchi */ 198f2f3bb8fSRobert Mustacchi #define I40E_MIN_TX_BLOCK_THRESH I40E_TX_MAX_COOKIE 199f2f3bb8fSRobert Mustacchi #define I40E_DEF_TX_BLOCK_THRESH I40E_MIN_TX_BLOCK_THRESH 200f2f3bb8fSRobert Mustacchi 201f2f3bb8fSRobert Mustacchi /* 202f2f3bb8fSRobert Mustacchi * Sizing for DMA thresholds. These are used to indicate whether or not we 203f2f3bb8fSRobert Mustacchi * should perform a bcopy or a DMA binding of a given message block. The range 204f2f3bb8fSRobert Mustacchi * allows for setting things such that we'll always do a bcopy (a high value) or 205f2f3bb8fSRobert Mustacchi * always perform a DMA binding (a low value). 206f2f3bb8fSRobert Mustacchi */ 207f2f3bb8fSRobert Mustacchi #define I40E_MIN_RX_DMA_THRESH 0 208f2f3bb8fSRobert Mustacchi #define I40E_DEF_RX_DMA_THRESH 256 209f2f3bb8fSRobert Mustacchi #define I40E_MAX_RX_DMA_THRESH INT32_MAX 210f2f3bb8fSRobert Mustacchi 211f2f3bb8fSRobert Mustacchi #define I40E_MIN_TX_DMA_THRESH 0 212f2f3bb8fSRobert Mustacchi #define I40E_DEF_TX_DMA_THRESH 256 213f2f3bb8fSRobert Mustacchi #define I40E_MAX_TX_DMA_THRESH INT32_MAX 214f2f3bb8fSRobert Mustacchi 215f2f3bb8fSRobert Mustacchi /* 216*5ca90d72SRyan Zezeski * The max size of each individual tx buffer is 16KB - 1. 217*5ca90d72SRyan Zezeski * See table 8-17 218*5ca90d72SRyan Zezeski */ 219*5ca90d72SRyan Zezeski #define I40E_MAX_TX_BUFSZ 0x0000000000003FFFull 220*5ca90d72SRyan Zezeski 221*5ca90d72SRyan Zezeski /* 222f2f3bb8fSRobert Mustacchi * Resource sizing counts. There are various aspects of hardware where we may 223f2f3bb8fSRobert Mustacchi * have some variable number of elements that we need to handle. Such as the 224f2f3bb8fSRobert Mustacchi * hardware capabilities and switch capacities. We cannot know a priori how many 225f2f3bb8fSRobert Mustacchi * elements to do, so instead we take a starting guess and then will grow it up 226f2f3bb8fSRobert Mustacchi * to an upper bound on a number of elements, to limit memory consumption in 227f2f3bb8fSRobert Mustacchi * case of a hardware bug. 228f2f3bb8fSRobert Mustacchi */ 229f2f3bb8fSRobert Mustacchi #define I40E_HW_CAP_DEFAULT 40 230f2f3bb8fSRobert Mustacchi #define I40E_SWITCH_CAP_DEFAULT 25 231f2f3bb8fSRobert Mustacchi 232f2f3bb8fSRobert Mustacchi /* 233f2f3bb8fSRobert Mustacchi * Host Memory Context related constants. 234f2f3bb8fSRobert Mustacchi */ 235f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_CTX_UNIT 128 236f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_DBUFF_MIN 1024 237f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_DBUFF_MAX (16 * 1024 - 128) 238f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_DTYPE_NOSPLIT 0 239f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_DSIZE_32BYTE 1 240f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_CRCSTRIP_ENABLE 1 241f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_FC_DISABLE 0 242f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_L2TAGORDER 1 243f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_HDRSPLIT_DISABLE 0 244f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_INVLAN_DONTSTRIP 0 245f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_TPH_DISABLE 0 246f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_LOWRXQ_NOINTR 0 247f2f3bb8fSRobert Mustacchi #define I40E_HMC_RX_PREFENA 1 248f2f3bb8fSRobert Mustacchi 249f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_CTX_UNIT 128 250f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_NEW_CONTEXT 1 251f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_FC_DISABLE 0 252f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_TS_DISABLE 0 253f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_FD_DISABLE 0 254f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_ALT_VLAN_DISABLE 0 255f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_WB_ENABLE 1 256f2f3bb8fSRobert Mustacchi #define I40E_HMC_TX_TPH_DISABLE 0 257f2f3bb8fSRobert Mustacchi 258f2f3bb8fSRobert Mustacchi /* 259f2f3bb8fSRobert Mustacchi * This defines the error mask that we care about from rx descriptors. Currently 260f2f3bb8fSRobert Mustacchi * we're only concerned with the general errors and oversize errors. 261f2f3bb8fSRobert Mustacchi */ 262f2f3bb8fSRobert Mustacchi #define I40E_RX_ERR_BITS ((1 << I40E_RX_DESC_ERROR_RXE_SHIFT) | \ 263f2f3bb8fSRobert Mustacchi (1 << I40E_RX_DESC_ERROR_OVERSIZE_SHIFT)) 264f2f3bb8fSRobert Mustacchi 265f2f3bb8fSRobert Mustacchi /* 266f2f3bb8fSRobert Mustacchi * Property sizing macros for firmware versions, etc. They need to be large 267f2f3bb8fSRobert Mustacchi * enough to hold 32-bit quantities transformed to strings as %d.%d or %x. 268f2f3bb8fSRobert Mustacchi */ 269f2f3bb8fSRobert Mustacchi #define I40E_DDI_PROP_LEN 64 270f2f3bb8fSRobert Mustacchi 271f2f3bb8fSRobert Mustacchi /* 272*5ca90d72SRyan Zezeski * Place an artificial limit on the max number of groups. The X710 273*5ca90d72SRyan Zezeski * series supports up to 384 VSIs to be partitioned across PFs as the 274*5ca90d72SRyan Zezeski * driver sees fit. But until we support more interrupts this seems 275*5ca90d72SRyan Zezeski * like a good place to start. 276f2f3bb8fSRobert Mustacchi */ 277*5ca90d72SRyan Zezeski #define I40E_GROUP_MAX 32 278f2f3bb8fSRobert Mustacchi 279f2f3bb8fSRobert Mustacchi #define I40E_GROUP_NOMSIX 1 280f2f3bb8fSRobert Mustacchi #define I40E_TRQPAIR_NOMSIX 1 281f2f3bb8fSRobert Mustacchi 282f2f3bb8fSRobert Mustacchi /* 283f2f3bb8fSRobert Mustacchi * It seems reasonable to cast this to void because the only reason that we 284f2f3bb8fSRobert Mustacchi * should be getting a DDI_FAILURE is due to the fact that we specify addresses 285f2f3bb8fSRobert Mustacchi * out of range. Because we specify no offset or address, it shouldn't happen. 286f2f3bb8fSRobert Mustacchi */ 287f2f3bb8fSRobert Mustacchi #ifdef DEBUG 288f2f3bb8fSRobert Mustacchi #define I40E_DMA_SYNC(handle, flag) ASSERT0(ddi_dma_sync( \ 289f2f3bb8fSRobert Mustacchi (handle)->dmab_dma_handle, 0, 0, \ 290f2f3bb8fSRobert Mustacchi (flag))) 291f2f3bb8fSRobert Mustacchi #else /* !DEBUG */ 292f2f3bb8fSRobert Mustacchi #define I40E_DMA_SYNC(handle, flag) ((void) ddi_dma_sync( \ 293f2f3bb8fSRobert Mustacchi (handle)->dmab_dma_handle, 0, 0, \ 294f2f3bb8fSRobert Mustacchi (flag))) 295f2f3bb8fSRobert Mustacchi #endif /* DEBUG */ 296f2f3bb8fSRobert Mustacchi 297f2f3bb8fSRobert Mustacchi /* 298f2f3bb8fSRobert Mustacchi * Constants related to ring startup and teardown. These refer to the amount of 299f2f3bb8fSRobert Mustacchi * time that we're willing to wait for a ring to spin up and spin down. 300f2f3bb8fSRobert Mustacchi */ 301f2f3bb8fSRobert Mustacchi #define I40E_RING_WAIT_NTRIES 10 302f2f3bb8fSRobert Mustacchi #define I40E_RING_WAIT_PAUSE 10 /* ms */ 303f2f3bb8fSRobert Mustacchi 304f2f3bb8fSRobert Mustacchi /* 3058f179fb3SRobert Mustacchi * Printed Board Assembly (PBA) length. These are derived from Table 6-2. 3068f179fb3SRobert Mustacchi */ 3078f179fb3SRobert Mustacchi #define I40E_PBANUM_LENGTH 12 3088f179fb3SRobert Mustacchi #define I40E_PBANUM_STRLEN 13 3098f179fb3SRobert Mustacchi 3108f179fb3SRobert Mustacchi /* 311c411f4ddSRobert Mustacchi * Define the maximum number of queues for a traffic class. These values come 312c411f4ddSRobert Mustacchi * from the 'Number and offset of queue pairs per TCs' section of the 'Add VSI 313c411f4ddSRobert Mustacchi * Command Buffer' table. For the 710 controller family this is table 7-62 314c411f4ddSRobert Mustacchi * (r2.5) and for the 722 this is table 38-216 (r2.0). 3158f179fb3SRobert Mustacchi */ 316c411f4ddSRobert Mustacchi #define I40E_710_MAX_TC_QUEUES 64 317c411f4ddSRobert Mustacchi #define I40E_722_MAX_TC_QUEUES 128 318c411f4ddSRobert Mustacchi 319c411f4ddSRobert Mustacchi /* 320c411f4ddSRobert Mustacchi * Define the size of the HLUT table size. The HLUT table can either be 128 or 321c411f4ddSRobert Mustacchi * 512 bytes. We always set the table size to be 512 bytes in i40e_chip_start(). 322c411f4ddSRobert Mustacchi * Note, this should not be confused with the common code's macro 323c411f4ddSRobert Mustacchi * I40E_HASH_LUT_SIZE_512 which is the bit pattern needed to tell the card to 324c411f4ddSRobert Mustacchi * use a 512 byte HLUT. 325c411f4ddSRobert Mustacchi */ 326c411f4ddSRobert Mustacchi #define I40E_HLUT_TABLE_SIZE 512 3278f179fb3SRobert Mustacchi 3288f179fb3SRobert Mustacchi /* 329f2f3bb8fSRobert Mustacchi * Bit flags for attach_progress 330f2f3bb8fSRobert Mustacchi */ 331f2f3bb8fSRobert Mustacchi typedef enum i40e_attach_state { 332f2f3bb8fSRobert Mustacchi I40E_ATTACH_PCI_CONFIG = 0x0001, /* PCI config setup */ 333f2f3bb8fSRobert Mustacchi I40E_ATTACH_REGS_MAP = 0x0002, /* Registers mapped */ 334f2f3bb8fSRobert Mustacchi I40E_ATTACH_PROPS = 0x0004, /* Properties initialized */ 335f2f3bb8fSRobert Mustacchi I40E_ATTACH_ALLOC_INTR = 0x0008, /* Interrupts allocated */ 336f2f3bb8fSRobert Mustacchi I40E_ATTACH_ALLOC_RINGSLOCKS = 0x0010, /* Rings & locks allocated */ 337f2f3bb8fSRobert Mustacchi I40E_ATTACH_ADD_INTR = 0x0020, /* Intr handlers added */ 338f2f3bb8fSRobert Mustacchi I40E_ATTACH_COMMON_CODE = 0x0040, /* Intel code initialized */ 339f2f3bb8fSRobert Mustacchi I40E_ATTACH_INIT = 0x0080, /* Device initialized */ 340f2f3bb8fSRobert Mustacchi I40E_ATTACH_STATS = 0x0200, /* Kstats created */ 341f2f3bb8fSRobert Mustacchi I40E_ATTACH_MAC = 0x0800, /* MAC registered */ 342f2f3bb8fSRobert Mustacchi I40E_ATTACH_ENABLE_INTR = 0x1000, /* DDI interrupts enabled */ 343f2f3bb8fSRobert Mustacchi I40E_ATTACH_FM_INIT = 0x2000, /* FMA initialized */ 344f2f3bb8fSRobert Mustacchi I40E_ATTACH_LINK_TIMER = 0x4000, /* link check timer */ 345f2f3bb8fSRobert Mustacchi } i40e_attach_state_t; 346f2f3bb8fSRobert Mustacchi 347f2f3bb8fSRobert Mustacchi 348f2f3bb8fSRobert Mustacchi /* 349f2f3bb8fSRobert Mustacchi * State flags that what's going on in in the device. Some of these state flags 350f2f3bb8fSRobert Mustacchi * indicate some aspirational work that needs to happen in the driver. 351f2f3bb8fSRobert Mustacchi * 352f2f3bb8fSRobert Mustacchi * I40E_UNKNOWN: The device has yet to be started. 353f2f3bb8fSRobert Mustacchi * I40E_INITIALIZED: The device has been fully attached. 354f2f3bb8fSRobert Mustacchi * I40E_STARTED: The device has come out of the GLDV3 start routine. 355f2f3bb8fSRobert Mustacchi * I40E_SUSPENDED: The device is suspended and I/O among other things 356f2f3bb8fSRobert Mustacchi * should not occur. This happens because of an actual 357f2f3bb8fSRobert Mustacchi * DDI_SUSPEND or interrupt adjustments. 358f2f3bb8fSRobert Mustacchi * I40E_STALL: The tx stall detection logic has found a stall. 359f2f3bb8fSRobert Mustacchi * I40E_OVERTEMP: The device has encountered a temperature alarm. 360f2f3bb8fSRobert Mustacchi * I40E_INTR_ADJUST: Our interrupts are being manipulated and therefore we 361f2f3bb8fSRobert Mustacchi * shouldn't be manipulating their state. 362f2f3bb8fSRobert Mustacchi * I40E_ERROR: We've detected an FM error and degraded the device. 363f2f3bb8fSRobert Mustacchi */ 364f2f3bb8fSRobert Mustacchi typedef enum i40e_state { 365f2f3bb8fSRobert Mustacchi I40E_UNKNOWN = 0x00, 366f2f3bb8fSRobert Mustacchi I40E_INITIALIZED = 0x01, 367f2f3bb8fSRobert Mustacchi I40E_STARTED = 0x02, 368f2f3bb8fSRobert Mustacchi I40E_SUSPENDED = 0x04, 369f2f3bb8fSRobert Mustacchi I40E_STALL = 0x08, 370f2f3bb8fSRobert Mustacchi I40E_OVERTEMP = 0x20, 371f2f3bb8fSRobert Mustacchi I40E_INTR_ADJUST = 0x40, 372f2f3bb8fSRobert Mustacchi I40E_ERROR = 0x80 373f2f3bb8fSRobert Mustacchi } i40e_state_t; 374f2f3bb8fSRobert Mustacchi 375f2f3bb8fSRobert Mustacchi 376f2f3bb8fSRobert Mustacchi /* 377f2f3bb8fSRobert Mustacchi * Definitions for common Intel things that we use and some slightly more usable 378f2f3bb8fSRobert Mustacchi * names. 379f2f3bb8fSRobert Mustacchi */ 380f2f3bb8fSRobert Mustacchi typedef struct i40e_hw i40e_hw_t; 381f2f3bb8fSRobert Mustacchi typedef struct i40e_aqc_switch_resource_alloc_element_resp i40e_switch_rsrc_t; 382f2f3bb8fSRobert Mustacchi 383f2f3bb8fSRobert Mustacchi /* 384f2f3bb8fSRobert Mustacchi * Handles and addresses of DMA buffers. 385f2f3bb8fSRobert Mustacchi */ 386f2f3bb8fSRobert Mustacchi typedef struct i40e_dma_buffer { 387f2f3bb8fSRobert Mustacchi caddr_t dmab_address; /* Virtual address */ 388f2f3bb8fSRobert Mustacchi uint64_t dmab_dma_address; /* DMA (Hardware) address */ 389f2f3bb8fSRobert Mustacchi ddi_acc_handle_t dmab_acc_handle; /* Data access handle */ 390f2f3bb8fSRobert Mustacchi ddi_dma_handle_t dmab_dma_handle; /* DMA handle */ 391f2f3bb8fSRobert Mustacchi size_t dmab_size; /* Buffer size */ 392f2f3bb8fSRobert Mustacchi size_t dmab_len; /* Data length in the buffer */ 393f2f3bb8fSRobert Mustacchi } i40e_dma_buffer_t; 394f2f3bb8fSRobert Mustacchi 395f2f3bb8fSRobert Mustacchi /* 396f2f3bb8fSRobert Mustacchi * RX Control Block 397f2f3bb8fSRobert Mustacchi */ 398f2f3bb8fSRobert Mustacchi typedef struct i40e_rx_control_block { 399f2f3bb8fSRobert Mustacchi mblk_t *rcb_mp; 400f2f3bb8fSRobert Mustacchi uint32_t rcb_ref; 401f2f3bb8fSRobert Mustacchi i40e_dma_buffer_t rcb_dma; 402f2f3bb8fSRobert Mustacchi frtn_t rcb_free_rtn; 403f2f3bb8fSRobert Mustacchi struct i40e_rx_data *rcb_rxd; 404f2f3bb8fSRobert Mustacchi } i40e_rx_control_block_t; 405f2f3bb8fSRobert Mustacchi 406f2f3bb8fSRobert Mustacchi typedef enum { 407f2f3bb8fSRobert Mustacchi I40E_TX_NONE, 408f2f3bb8fSRobert Mustacchi I40E_TX_COPY, 409*5ca90d72SRyan Zezeski I40E_TX_DMA, 410*5ca90d72SRyan Zezeski I40E_TX_DESC, 411f2f3bb8fSRobert Mustacchi } i40e_tx_type_t; 412f2f3bb8fSRobert Mustacchi 413f2f3bb8fSRobert Mustacchi typedef struct i40e_tx_desc i40e_tx_desc_t; 414*5ca90d72SRyan Zezeski typedef struct i40e_tx_context_desc i40e_tx_context_desc_t; 415f2f3bb8fSRobert Mustacchi typedef union i40e_32byte_rx_desc i40e_rx_desc_t; 416f2f3bb8fSRobert Mustacchi 417*5ca90d72SRyan Zezeski struct i40e_dma_bind_info { 418*5ca90d72SRyan Zezeski caddr_t dbi_paddr; 419*5ca90d72SRyan Zezeski size_t dbi_len; 420*5ca90d72SRyan Zezeski }; 421*5ca90d72SRyan Zezeski 422f2f3bb8fSRobert Mustacchi typedef struct i40e_tx_control_block { 423f2f3bb8fSRobert Mustacchi struct i40e_tx_control_block *tcb_next; 424f2f3bb8fSRobert Mustacchi mblk_t *tcb_mp; 425f2f3bb8fSRobert Mustacchi i40e_tx_type_t tcb_type; 426f2f3bb8fSRobert Mustacchi ddi_dma_handle_t tcb_dma_handle; 427*5ca90d72SRyan Zezeski ddi_dma_handle_t tcb_lso_dma_handle; 428f2f3bb8fSRobert Mustacchi i40e_dma_buffer_t tcb_dma; 429*5ca90d72SRyan Zezeski struct i40e_dma_bind_info *tcb_bind_info; 430*5ca90d72SRyan Zezeski uint_t tcb_bind_ncookies; 431*5ca90d72SRyan Zezeski boolean_t tcb_used_lso; 432f2f3bb8fSRobert Mustacchi } i40e_tx_control_block_t; 433f2f3bb8fSRobert Mustacchi 434f2f3bb8fSRobert Mustacchi /* 435f2f3bb8fSRobert Mustacchi * Receive ring data (used below). 436f2f3bb8fSRobert Mustacchi */ 437f2f3bb8fSRobert Mustacchi typedef struct i40e_rx_data { 438f2f3bb8fSRobert Mustacchi struct i40e *rxd_i40e; 439f2f3bb8fSRobert Mustacchi 440f2f3bb8fSRobert Mustacchi /* 441f2f3bb8fSRobert Mustacchi * RX descriptor ring definitions 442f2f3bb8fSRobert Mustacchi */ 443f2f3bb8fSRobert Mustacchi i40e_dma_buffer_t rxd_desc_area; /* DMA buffer of rx desc ring */ 444f2f3bb8fSRobert Mustacchi i40e_rx_desc_t *rxd_desc_ring; /* Rx desc ring */ 445f2f3bb8fSRobert Mustacchi uint32_t rxd_desc_next; /* Index of next rx desc */ 446f2f3bb8fSRobert Mustacchi 447f2f3bb8fSRobert Mustacchi /* 448f2f3bb8fSRobert Mustacchi * RX control block list definitions 449f2f3bb8fSRobert Mustacchi */ 450f2f3bb8fSRobert Mustacchi kmutex_t rxd_free_lock; /* Lock to protect free data */ 451f2f3bb8fSRobert Mustacchi i40e_rx_control_block_t *rxd_rcb_area; /* Array of control blocks */ 452f2f3bb8fSRobert Mustacchi i40e_rx_control_block_t **rxd_work_list; /* Work list of rcbs */ 453f2f3bb8fSRobert Mustacchi i40e_rx_control_block_t **rxd_free_list; /* Free list of rcbs */ 454f2f3bb8fSRobert Mustacchi uint32_t rxd_rcb_free; /* Number of free rcbs */ 455f2f3bb8fSRobert Mustacchi 456f2f3bb8fSRobert Mustacchi /* 457f2f3bb8fSRobert Mustacchi * RX software ring settings 458f2f3bb8fSRobert Mustacchi */ 459f2f3bb8fSRobert Mustacchi uint32_t rxd_ring_size; /* Rx descriptor ring size */ 460f2f3bb8fSRobert Mustacchi uint32_t rxd_free_list_size; /* Rx free list size */ 461f2f3bb8fSRobert Mustacchi 462f2f3bb8fSRobert Mustacchi /* 463f2f3bb8fSRobert Mustacchi * RX outstanding data. This is used to keep track of outstanding loaned 464f2f3bb8fSRobert Mustacchi * descriptors after we've shut down receiving information. Note these 465f2f3bb8fSRobert Mustacchi * are protected by the i40e_t`i40e_rx_pending_lock. 466f2f3bb8fSRobert Mustacchi */ 467f2f3bb8fSRobert Mustacchi uint32_t rxd_rcb_pending; 468f2f3bb8fSRobert Mustacchi boolean_t rxd_shutdown; 469f2f3bb8fSRobert Mustacchi } i40e_rx_data_t; 470f2f3bb8fSRobert Mustacchi 471f2f3bb8fSRobert Mustacchi /* 472f2f3bb8fSRobert Mustacchi * Structures for unicast and multicast addresses. Note that we keep the VSI id 473f2f3bb8fSRobert Mustacchi * around for unicast addresses, since they may belong to different VSIs. 474f2f3bb8fSRobert Mustacchi * However, since all multicast addresses belong to the default VSI, we don't 475f2f3bb8fSRobert Mustacchi * duplicate that information. 476f2f3bb8fSRobert Mustacchi */ 477f2f3bb8fSRobert Mustacchi typedef struct i40e_uaddr { 478f2f3bb8fSRobert Mustacchi uint8_t iua_mac[ETHERADDRL]; 479f2f3bb8fSRobert Mustacchi int iua_vsi; 480f2f3bb8fSRobert Mustacchi } i40e_uaddr_t; 481f2f3bb8fSRobert Mustacchi 482f2f3bb8fSRobert Mustacchi typedef struct i40e_maddr { 483f2f3bb8fSRobert Mustacchi uint8_t ima_mac[ETHERADDRL]; 484f2f3bb8fSRobert Mustacchi } i40e_maddr_t; 485f2f3bb8fSRobert Mustacchi 486f2f3bb8fSRobert Mustacchi /* 487f2f3bb8fSRobert Mustacchi * Collection of RX statistics on a given queue. 488f2f3bb8fSRobert Mustacchi */ 489f2f3bb8fSRobert Mustacchi typedef struct i40e_rxq_stat { 490f2f3bb8fSRobert Mustacchi /* 491f2f3bb8fSRobert Mustacchi * The i40e hardware does not maintain statistics on a per-ring basis, 492f2f3bb8fSRobert Mustacchi * only on a per-PF and per-VSI level. As such, to satisfy the GLDv3, we 493f2f3bb8fSRobert Mustacchi * need to maintain our own stats for packets and bytes. 494f2f3bb8fSRobert Mustacchi */ 495f2f3bb8fSRobert Mustacchi kstat_named_t irxs_bytes; /* Bytes in on queue */ 496f2f3bb8fSRobert Mustacchi kstat_named_t irxs_packets; /* Packets in on queue */ 497f2f3bb8fSRobert Mustacchi 498f2f3bb8fSRobert Mustacchi /* 499f2f3bb8fSRobert Mustacchi * The following set of stats cover non-checksum data path issues. 500f2f3bb8fSRobert Mustacchi */ 501f2f3bb8fSRobert Mustacchi kstat_named_t irxs_rx_desc_error; /* Error bit set on desc */ 502f2f3bb8fSRobert Mustacchi kstat_named_t irxs_rx_copy_nomem; /* allocb failure for copy */ 503f2f3bb8fSRobert Mustacchi kstat_named_t irxs_rx_intr_limit; /* Hit i40e_rx_limit_per_intr */ 504f2f3bb8fSRobert Mustacchi kstat_named_t irxs_rx_bind_norcb; /* No replacement rcb free */ 505f2f3bb8fSRobert Mustacchi kstat_named_t irxs_rx_bind_nomp; /* No mblk_t in bind rcb */ 506f2f3bb8fSRobert Mustacchi 507f2f3bb8fSRobert Mustacchi /* 508f2f3bb8fSRobert Mustacchi * The following set of statistics covers rx checksum related activity. 509f2f3bb8fSRobert Mustacchi * These are all primarily set in i40e_rx_hcksum. If rx checksum 510f2f3bb8fSRobert Mustacchi * activity is disabled, then these should all be zero. 511f2f3bb8fSRobert Mustacchi */ 512f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_v4hdrok; /* Valid IPv4 Header */ 513f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_l4hdrok; /* Valid L4 Header */ 514f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_unknown; /* !pinfo.known */ 515f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_nol3l4p; /* Missing L3L4P bit in desc */ 516f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_iperr; /* IPE error bit set */ 517f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_eiperr; /* EIPE error bit set */ 518f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_l4err; /* L4E error bit set */ 519f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_v6skip; /* IPv6 case hw fails on */ 520f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_set; /* Total times we set cksum */ 521f2f3bb8fSRobert Mustacchi kstat_named_t irxs_hck_miss; /* Times with zero cksum bits */ 522f2f3bb8fSRobert Mustacchi } i40e_rxq_stat_t; 523f2f3bb8fSRobert Mustacchi 524f2f3bb8fSRobert Mustacchi /* 525f2f3bb8fSRobert Mustacchi * Collection of TX Statistics on a given queue 526f2f3bb8fSRobert Mustacchi */ 527f2f3bb8fSRobert Mustacchi typedef struct i40e_txq_stat { 528f2f3bb8fSRobert Mustacchi kstat_named_t itxs_bytes; /* Bytes out on queue */ 529f2f3bb8fSRobert Mustacchi kstat_named_t itxs_packets; /* Packets out on queue */ 530f2f3bb8fSRobert Mustacchi kstat_named_t itxs_descriptors; /* Descriptors issued */ 531f2f3bb8fSRobert Mustacchi kstat_named_t itxs_recycled; /* Descriptors reclaimed */ 532*5ca90d72SRyan Zezeski kstat_named_t itxs_force_copy; /* non-TSO force copy */ 533*5ca90d72SRyan Zezeski kstat_named_t itxs_tso_force_copy; /* TSO force copy */ 534f2f3bb8fSRobert Mustacchi /* 535f2f3bb8fSRobert Mustacchi * Various failure conditions. 536f2f3bb8fSRobert Mustacchi */ 537f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_meoifail; /* ether offload failures */ 538f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_nol2info; /* Missing l2 info */ 539f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_nol3info; /* Missing l3 info */ 540f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_nol4info; /* Missing l4 info */ 541f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_badl3; /* Not IPv4/IPv6 */ 542f2f3bb8fSRobert Mustacchi kstat_named_t itxs_hck_badl4; /* Bad L4 Paylaod */ 543*5ca90d72SRyan Zezeski kstat_named_t itxs_lso_nohck; /* Missing offloads for LSO */ 544*5ca90d72SRyan Zezeski kstat_named_t itxs_bind_fails; /* DMA bind failures */ 545*5ca90d72SRyan Zezeski kstat_named_t itxs_tx_short; /* Tx chain too short */ 546f2f3bb8fSRobert Mustacchi 547f2f3bb8fSRobert Mustacchi kstat_named_t itxs_err_notcb; /* No tcb's available */ 548f2f3bb8fSRobert Mustacchi kstat_named_t itxs_err_nodescs; /* No tcb's available */ 549f2f3bb8fSRobert Mustacchi kstat_named_t itxs_err_context; /* Total context failures */ 550f2f3bb8fSRobert Mustacchi 551f2f3bb8fSRobert Mustacchi kstat_named_t itxs_num_unblocked; /* Number of MAC unblocks */ 552f2f3bb8fSRobert Mustacchi } i40e_txq_stat_t; 553f2f3bb8fSRobert Mustacchi 554f2f3bb8fSRobert Mustacchi /* 555f2f3bb8fSRobert Mustacchi * An instance of an XL710 transmit/receive queue pair. This currently 556f2f3bb8fSRobert Mustacchi * represents a combination of both a transmit and receive ring, though they 557f2f3bb8fSRobert Mustacchi * should really be split apart into separate logical structures. Unfortunately, 558f2f3bb8fSRobert Mustacchi * during initial work we mistakenly joined them together. 559f2f3bb8fSRobert Mustacchi */ 560f2f3bb8fSRobert Mustacchi typedef struct i40e_trqpair { 561f2f3bb8fSRobert Mustacchi struct i40e *itrq_i40e; 562f2f3bb8fSRobert Mustacchi 563f2f3bb8fSRobert Mustacchi /* Receive-side structures. */ 564f2f3bb8fSRobert Mustacchi kmutex_t itrq_rx_lock; 565f2f3bb8fSRobert Mustacchi mac_ring_handle_t itrq_macrxring; /* Receive ring handle. */ 566f2f3bb8fSRobert Mustacchi i40e_rx_data_t *itrq_rxdata; /* Receive ring rx data. */ 567f2f3bb8fSRobert Mustacchi uint64_t itrq_rxgen; /* Generation number for mac/GLDv3. */ 568f2f3bb8fSRobert Mustacchi uint32_t itrq_index; /* Queue index in the PF */ 569f2f3bb8fSRobert Mustacchi uint32_t itrq_rx_intrvec; /* Receive interrupt vector. */ 57047fdb1a2SPaul Winder boolean_t itrq_intr_poll; /* True when polling */ 571f2f3bb8fSRobert Mustacchi 572f2f3bb8fSRobert Mustacchi /* Receive-side stats. */ 573f2f3bb8fSRobert Mustacchi i40e_rxq_stat_t itrq_rxstat; 574f2f3bb8fSRobert Mustacchi kstat_t *itrq_rxkstat; 575f2f3bb8fSRobert Mustacchi 576f2f3bb8fSRobert Mustacchi /* Transmit-side structures. */ 577f2f3bb8fSRobert Mustacchi kmutex_t itrq_tx_lock; 578f2f3bb8fSRobert Mustacchi mac_ring_handle_t itrq_mactxring; /* Transmit ring handle. */ 579f2f3bb8fSRobert Mustacchi uint32_t itrq_tx_intrvec; /* Transmit interrupt vector. */ 580f2f3bb8fSRobert Mustacchi boolean_t itrq_tx_blocked; /* Does MAC think we're blocked? */ 581f2f3bb8fSRobert Mustacchi 582f2f3bb8fSRobert Mustacchi /* 583f2f3bb8fSRobert Mustacchi * TX data sizing 584f2f3bb8fSRobert Mustacchi */ 585f2f3bb8fSRobert Mustacchi uint32_t itrq_tx_ring_size; 586f2f3bb8fSRobert Mustacchi uint32_t itrq_tx_free_list_size; 587f2f3bb8fSRobert Mustacchi 588f2f3bb8fSRobert Mustacchi /* 589f2f3bb8fSRobert Mustacchi * TX descriptor ring data 590f2f3bb8fSRobert Mustacchi */ 591f2f3bb8fSRobert Mustacchi i40e_dma_buffer_t itrq_desc_area; /* DMA buffer of tx desc ring */ 592f2f3bb8fSRobert Mustacchi i40e_tx_desc_t *itrq_desc_ring; /* TX Desc ring */ 593f2f3bb8fSRobert Mustacchi volatile uint32_t *itrq_desc_wbhead; /* TX write-back index */ 594f2f3bb8fSRobert Mustacchi uint32_t itrq_desc_head; /* Last index hw freed */ 595f2f3bb8fSRobert Mustacchi uint32_t itrq_desc_tail; /* Index of next free desc */ 596f2f3bb8fSRobert Mustacchi uint32_t itrq_desc_free; /* Number of free descriptors */ 597f2f3bb8fSRobert Mustacchi 598f2f3bb8fSRobert Mustacchi /* 599f2f3bb8fSRobert Mustacchi * TX control block (tcb) data 600f2f3bb8fSRobert Mustacchi */ 601f2f3bb8fSRobert Mustacchi kmutex_t itrq_tcb_lock; 602f2f3bb8fSRobert Mustacchi i40e_tx_control_block_t *itrq_tcb_area; /* Array of control blocks */ 603f2f3bb8fSRobert Mustacchi i40e_tx_control_block_t **itrq_tcb_work_list; /* In use tcb */ 604f2f3bb8fSRobert Mustacchi i40e_tx_control_block_t **itrq_tcb_free_list; /* Available tcb */ 605f2f3bb8fSRobert Mustacchi uint32_t itrq_tcb_free; /* Count of free tcb */ 606f2f3bb8fSRobert Mustacchi 607f2f3bb8fSRobert Mustacchi /* Transmit-side stats. */ 608f2f3bb8fSRobert Mustacchi i40e_txq_stat_t itrq_txstat; 609f2f3bb8fSRobert Mustacchi kstat_t *itrq_txkstat; 610f2f3bb8fSRobert Mustacchi 611f2f3bb8fSRobert Mustacchi } i40e_trqpair_t; 612f2f3bb8fSRobert Mustacchi 613f2f3bb8fSRobert Mustacchi /* 614f2f3bb8fSRobert Mustacchi * VSI statistics. 615f2f3bb8fSRobert Mustacchi * 616f2f3bb8fSRobert Mustacchi * This mirrors the i40e_eth_stats structure but transforms it into a kstat. 617f2f3bb8fSRobert Mustacchi * Note that the stock statistic structure also includes entries for tx 618f2f3bb8fSRobert Mustacchi * discards. However, this is not actually implemented for the VSI (see Table 619f2f3bb8fSRobert Mustacchi * 7-221), hence why we don't include the member which would always have a value 620f2f3bb8fSRobert Mustacchi * of zero. This choice was made to minimize confusion to someone looking at 621f2f3bb8fSRobert Mustacchi * these, as a value of zero does not necessarily equate to the fact that it's 622f2f3bb8fSRobert Mustacchi * not implemented. 623f2f3bb8fSRobert Mustacchi */ 624f2f3bb8fSRobert Mustacchi typedef struct i40e_vsi_stats { 625f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_bytes; /* gorc */ 626f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_unicast; /* uprc */ 627f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_multicast; /* mprc */ 628f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_broadcast; /* bprc */ 629f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_discards; /* rdpc */ 630f2f3bb8fSRobert Mustacchi uint64_t ivs_rx_unknown_protocol; /* rupp */ 631f2f3bb8fSRobert Mustacchi uint64_t ivs_tx_bytes; /* gotc */ 632f2f3bb8fSRobert Mustacchi uint64_t ivs_tx_unicast; /* uptc */ 633f2f3bb8fSRobert Mustacchi uint64_t ivs_tx_multicast; /* mptc */ 634f2f3bb8fSRobert Mustacchi uint64_t ivs_tx_broadcast; /* bptc */ 635f2f3bb8fSRobert Mustacchi uint64_t ivs_tx_errors; /* tepc */ 636f2f3bb8fSRobert Mustacchi } i40e_vsi_stats_t; 637f2f3bb8fSRobert Mustacchi 638f2f3bb8fSRobert Mustacchi typedef struct i40e_vsi_kstats { 639f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_bytes; 640f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_unicast; 641f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_multicast; 642f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_broadcast; 643f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_discards; 644f2f3bb8fSRobert Mustacchi kstat_named_t ivk_rx_unknown_protocol; 645f2f3bb8fSRobert Mustacchi kstat_named_t ivk_tx_bytes; 646f2f3bb8fSRobert Mustacchi kstat_named_t ivk_tx_unicast; 647f2f3bb8fSRobert Mustacchi kstat_named_t ivk_tx_multicast; 648f2f3bb8fSRobert Mustacchi kstat_named_t ivk_tx_broadcast; 649f2f3bb8fSRobert Mustacchi kstat_named_t ivk_tx_errors; 650f2f3bb8fSRobert Mustacchi } i40e_vsi_kstats_t; 651f2f3bb8fSRobert Mustacchi 652f2f3bb8fSRobert Mustacchi /* 653f2f3bb8fSRobert Mustacchi * For pf statistics, we opt not to use the standard statistics as defined by 654f2f3bb8fSRobert Mustacchi * the Intel common code. This also currently combines statistics that are 655f2f3bb8fSRobert Mustacchi * global across the entire device. 656f2f3bb8fSRobert Mustacchi */ 657f2f3bb8fSRobert Mustacchi typedef struct i40e_pf_stats { 658f2f3bb8fSRobert Mustacchi uint64_t ips_rx_bytes; /* gorc */ 659f2f3bb8fSRobert Mustacchi uint64_t ips_rx_unicast; /* uprc */ 660f2f3bb8fSRobert Mustacchi uint64_t ips_rx_multicast; /* mprc */ 661f2f3bb8fSRobert Mustacchi uint64_t ips_rx_broadcast; /* bprc */ 662f2f3bb8fSRobert Mustacchi uint64_t ips_tx_bytes; /* gotc */ 663f2f3bb8fSRobert Mustacchi uint64_t ips_tx_unicast; /* uptc */ 664f2f3bb8fSRobert Mustacchi uint64_t ips_tx_multicast; /* mptc */ 665f2f3bb8fSRobert Mustacchi uint64_t ips_tx_broadcast; /* bptc */ 666f2f3bb8fSRobert Mustacchi 667f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_64; /* prc64 */ 668f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_127; /* prc127 */ 669f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_255; /* prc255 */ 670f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_511; /* prc511 */ 671f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_1023; /* prc1023 */ 672f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_1522; /* prc1522 */ 673f2f3bb8fSRobert Mustacchi uint64_t ips_rx_size_9522; /* prc9522 */ 674f2f3bb8fSRobert Mustacchi 675f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_64; /* ptc64 */ 676f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_127; /* ptc127 */ 677f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_255; /* ptc255 */ 678f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_511; /* ptc511 */ 679f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_1023; /* ptc1023 */ 680f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_1522; /* ptc1522 */ 681f2f3bb8fSRobert Mustacchi uint64_t ips_tx_size_9522; /* ptc9522 */ 682f2f3bb8fSRobert Mustacchi 683f2f3bb8fSRobert Mustacchi uint64_t ips_link_xon_rx; /* lxonrxc */ 684f2f3bb8fSRobert Mustacchi uint64_t ips_link_xoff_rx; /* lxoffrxc */ 685f2f3bb8fSRobert Mustacchi uint64_t ips_link_xon_tx; /* lxontxc */ 686f2f3bb8fSRobert Mustacchi uint64_t ips_link_xoff_tx; /* lxofftxc */ 687f2f3bb8fSRobert Mustacchi uint64_t ips_priority_xon_rx[8]; /* pxonrxc[8] */ 688f2f3bb8fSRobert Mustacchi uint64_t ips_priority_xoff_rx[8]; /* pxoffrxc[8] */ 689f2f3bb8fSRobert Mustacchi uint64_t ips_priority_xon_tx[8]; /* pxontxc[8] */ 690f2f3bb8fSRobert Mustacchi uint64_t ips_priority_xoff_tx[8]; /* pxofftxc[8] */ 691f2f3bb8fSRobert Mustacchi uint64_t ips_priority_xon_2_xoff[8]; /* rxon2offcnt[8] */ 692f2f3bb8fSRobert Mustacchi 693f2f3bb8fSRobert Mustacchi uint64_t ips_crc_errors; /* crcerrs */ 694f2f3bb8fSRobert Mustacchi uint64_t ips_illegal_bytes; /* illerrc */ 695f2f3bb8fSRobert Mustacchi uint64_t ips_mac_local_faults; /* mlfc */ 696f2f3bb8fSRobert Mustacchi uint64_t ips_mac_remote_faults; /* mrfc */ 697f2f3bb8fSRobert Mustacchi uint64_t ips_rx_length_errors; /* rlec */ 698f2f3bb8fSRobert Mustacchi uint64_t ips_rx_undersize; /* ruc */ 699f2f3bb8fSRobert Mustacchi uint64_t ips_rx_fragments; /* rfc */ 700f2f3bb8fSRobert Mustacchi uint64_t ips_rx_oversize; /* roc */ 701f2f3bb8fSRobert Mustacchi uint64_t ips_rx_jabber; /* rjc */ 702f2f3bb8fSRobert Mustacchi uint64_t ips_rx_discards; /* rdpc */ 703f2f3bb8fSRobert Mustacchi uint64_t ips_rx_vm_discards; /* ldpc */ 704f2f3bb8fSRobert Mustacchi uint64_t ips_rx_short_discards; /* mspdc */ 705f2f3bb8fSRobert Mustacchi uint64_t ips_tx_dropped_link_down; /* tdold */ 706f2f3bb8fSRobert Mustacchi uint64_t ips_rx_unknown_protocol; /* rupp */ 707f2f3bb8fSRobert Mustacchi uint64_t ips_rx_err1; /* rxerr1 */ 708f2f3bb8fSRobert Mustacchi uint64_t ips_rx_err2; /* rxerr2 */ 709f2f3bb8fSRobert Mustacchi } i40e_pf_stats_t; 710f2f3bb8fSRobert Mustacchi 711f2f3bb8fSRobert Mustacchi typedef struct i40e_pf_kstats { 712f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_bytes; /* gorc */ 713f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_unicast; /* uprc */ 714f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_multicast; /* mprc */ 715f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_broadcast; /* bprc */ 716f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_bytes; /* gotc */ 717f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_unicast; /* uptc */ 718f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_multicast; /* mptc */ 719f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_broadcast; /* bptc */ 720f2f3bb8fSRobert Mustacchi 721f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_64; /* prc64 */ 722f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_127; /* prc127 */ 723f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_255; /* prc255 */ 724f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_511; /* prc511 */ 725f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_1023; /* prc1023 */ 726f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_1522; /* prc1522 */ 727f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_size_9522; /* prc9522 */ 728f2f3bb8fSRobert Mustacchi 729f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_64; /* ptc64 */ 730f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_127; /* ptc127 */ 731f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_255; /* ptc255 */ 732f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_511; /* ptc511 */ 733f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_1023; /* ptc1023 */ 734f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_1522; /* ptc1522 */ 735f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_size_9522; /* ptc9522 */ 736f2f3bb8fSRobert Mustacchi 737f2f3bb8fSRobert Mustacchi kstat_named_t ipk_link_xon_rx; /* lxonrxc */ 738f2f3bb8fSRobert Mustacchi kstat_named_t ipk_link_xoff_rx; /* lxoffrxc */ 739f2f3bb8fSRobert Mustacchi kstat_named_t ipk_link_xon_tx; /* lxontxc */ 740f2f3bb8fSRobert Mustacchi kstat_named_t ipk_link_xoff_tx; /* lxofftxc */ 741f2f3bb8fSRobert Mustacchi kstat_named_t ipk_priority_xon_rx[8]; /* pxonrxc[8] */ 742f2f3bb8fSRobert Mustacchi kstat_named_t ipk_priority_xoff_rx[8]; /* pxoffrxc[8] */ 743f2f3bb8fSRobert Mustacchi kstat_named_t ipk_priority_xon_tx[8]; /* pxontxc[8] */ 744f2f3bb8fSRobert Mustacchi kstat_named_t ipk_priority_xoff_tx[8]; /* pxofftxc[8] */ 745f2f3bb8fSRobert Mustacchi kstat_named_t ipk_priority_xon_2_xoff[8]; /* rxon2offcnt[8] */ 746f2f3bb8fSRobert Mustacchi 747f2f3bb8fSRobert Mustacchi kstat_named_t ipk_crc_errors; /* crcerrs */ 748f2f3bb8fSRobert Mustacchi kstat_named_t ipk_illegal_bytes; /* illerrc */ 749f2f3bb8fSRobert Mustacchi kstat_named_t ipk_mac_local_faults; /* mlfc */ 750f2f3bb8fSRobert Mustacchi kstat_named_t ipk_mac_remote_faults; /* mrfc */ 751f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_length_errors; /* rlec */ 752f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_undersize; /* ruc */ 753f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_fragments; /* rfc */ 754f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_oversize; /* roc */ 755f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_jabber; /* rjc */ 756f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_discards; /* rdpc */ 757f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_vm_discards; /* ldpc */ 758f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_short_discards; /* mspdc */ 759f2f3bb8fSRobert Mustacchi kstat_named_t ipk_tx_dropped_link_down; /* tdold */ 760f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_unknown_protocol; /* rupp */ 761f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_err1; /* rxerr1 */ 762f2f3bb8fSRobert Mustacchi kstat_named_t ipk_rx_err2; /* rxerr2 */ 763f2f3bb8fSRobert Mustacchi } i40e_pf_kstats_t; 764f2f3bb8fSRobert Mustacchi 765f2f3bb8fSRobert Mustacchi /* 766f2f3bb8fSRobert Mustacchi * Resources that are pooled and specific to a given i40e_t. 767f2f3bb8fSRobert Mustacchi */ 768f2f3bb8fSRobert Mustacchi typedef struct i40e_func_rsrc { 769f2f3bb8fSRobert Mustacchi uint_t ifr_nrx_queue; 770f2f3bb8fSRobert Mustacchi uint_t ifr_nrx_queue_used; 771f2f3bb8fSRobert Mustacchi uint_t ifr_ntx_queue; 772f2f3bb8fSRobert Mustacchi uint_t ifr_trx_queue_used; 773f2f3bb8fSRobert Mustacchi uint_t ifr_nvsis; 774f2f3bb8fSRobert Mustacchi uint_t ifr_nvsis_used; 775f2f3bb8fSRobert Mustacchi uint_t ifr_nmacfilt; 776f2f3bb8fSRobert Mustacchi uint_t ifr_nmacfilt_used; 777f2f3bb8fSRobert Mustacchi uint_t ifr_nmcastfilt; 778f2f3bb8fSRobert Mustacchi uint_t ifr_nmcastfilt_used; 779f2f3bb8fSRobert Mustacchi } i40e_func_rsrc_t; 780f2f3bb8fSRobert Mustacchi 781*5ca90d72SRyan Zezeski typedef struct i40e_vsi { 782*5ca90d72SRyan Zezeski uint16_t iv_seid; 783*5ca90d72SRyan Zezeski uint16_t iv_number; 784*5ca90d72SRyan Zezeski kstat_t *iv_kstats; 785*5ca90d72SRyan Zezeski i40e_vsi_stats_t iv_stats; 786*5ca90d72SRyan Zezeski uint16_t iv_stats_id; 787*5ca90d72SRyan Zezeski } i40e_vsi_t; 788*5ca90d72SRyan Zezeski 789*5ca90d72SRyan Zezeski /* 790*5ca90d72SRyan Zezeski * While irg_index and irg_grp_hdl aren't used anywhere, they are 791*5ca90d72SRyan Zezeski * still useful for debugging. 792*5ca90d72SRyan Zezeski */ 793*5ca90d72SRyan Zezeski typedef struct i40e_rx_group { 794*5ca90d72SRyan Zezeski uint32_t irg_index; /* index in i40e_rx_groups[] */ 795*5ca90d72SRyan Zezeski uint16_t irg_vsi_seid; /* SEID of VSI for this group */ 796*5ca90d72SRyan Zezeski mac_group_handle_t irg_grp_hdl; /* handle to mac_group_t */ 797*5ca90d72SRyan Zezeski struct i40e *irg_i40e; /* ref to i40e_t */ 798*5ca90d72SRyan Zezeski } i40e_rx_group_t; 799*5ca90d72SRyan Zezeski 800f2f3bb8fSRobert Mustacchi /* 801f2f3bb8fSRobert Mustacchi * Main i40e per-instance state. 802f2f3bb8fSRobert Mustacchi */ 803f2f3bb8fSRobert Mustacchi typedef struct i40e { 804f2f3bb8fSRobert Mustacchi list_node_t i40e_glink; /* Global list link */ 805f2f3bb8fSRobert Mustacchi list_node_t i40e_dlink; /* Device list link */ 806f2f3bb8fSRobert Mustacchi kmutex_t i40e_general_lock; /* General device lock */ 807f2f3bb8fSRobert Mustacchi 808f2f3bb8fSRobert Mustacchi /* 809f2f3bb8fSRobert Mustacchi * General Data and management 810f2f3bb8fSRobert Mustacchi */ 811f2f3bb8fSRobert Mustacchi dev_info_t *i40e_dip; 812f2f3bb8fSRobert Mustacchi int i40e_instance; 813f2f3bb8fSRobert Mustacchi int i40e_fm_capabilities; 814f2f3bb8fSRobert Mustacchi uint_t i40e_state; 815f2f3bb8fSRobert Mustacchi i40e_attach_state_t i40e_attach_progress; 816f2f3bb8fSRobert Mustacchi mac_handle_t i40e_mac_hdl; 817f2f3bb8fSRobert Mustacchi ddi_periodic_t i40e_periodic_id; 818f2f3bb8fSRobert Mustacchi 819f2f3bb8fSRobert Mustacchi /* 820f2f3bb8fSRobert Mustacchi * Pointers to common code data structures and memory for the common 821f2f3bb8fSRobert Mustacchi * code. 822f2f3bb8fSRobert Mustacchi */ 823f2f3bb8fSRobert Mustacchi struct i40e_hw i40e_hw_space; 824f2f3bb8fSRobert Mustacchi struct i40e_osdep i40e_osdep_space; 825f2f3bb8fSRobert Mustacchi struct i40e_aq_get_phy_abilities_resp i40e_phy; 826f2f3bb8fSRobert Mustacchi void *i40e_aqbuf; 827f2f3bb8fSRobert Mustacchi 828*5ca90d72SRyan Zezeski #define I40E_DEF_VSI_IDX 0 829*5ca90d72SRyan Zezeski #define I40E_DEF_VSI(i40e) ((i40e)->i40e_vsis[I40E_DEF_VSI_IDX]) 830*5ca90d72SRyan Zezeski #define I40E_DEF_VSI_SEID(i40e) (I40E_DEF_VSI(i40e).iv_seid) 831*5ca90d72SRyan Zezeski 832f2f3bb8fSRobert Mustacchi /* 833f2f3bb8fSRobert Mustacchi * Device state, switch information, and resources. 834f2f3bb8fSRobert Mustacchi */ 835*5ca90d72SRyan Zezeski i40e_vsi_t i40e_vsis[I40E_GROUP_MAX]; 836*5ca90d72SRyan Zezeski uint16_t i40e_mac_seid; /* SEID of physical MAC */ 837*5ca90d72SRyan Zezeski uint16_t i40e_veb_seid; /* switch atop MAC (SEID) */ 838*5ca90d72SRyan Zezeski uint16_t i40e_vsi_avail; /* VSIs avail to this PF */ 839*5ca90d72SRyan Zezeski uint16_t i40e_vsi_used; /* VSIs used by this PF */ 840f2f3bb8fSRobert Mustacchi struct i40e_device *i40e_device; 841f2f3bb8fSRobert Mustacchi i40e_func_rsrc_t i40e_resources; 842f2f3bb8fSRobert Mustacchi uint16_t i40e_switch_rsrc_alloc; 843f2f3bb8fSRobert Mustacchi uint16_t i40e_switch_rsrc_actual; 844f2f3bb8fSRobert Mustacchi i40e_switch_rsrc_t *i40e_switch_rsrcs; 845f2f3bb8fSRobert Mustacchi i40e_uaddr_t *i40e_uaddrs; 846f2f3bb8fSRobert Mustacchi i40e_maddr_t *i40e_maddrs; 847f2f3bb8fSRobert Mustacchi int i40e_mcast_promisc_count; 848f2f3bb8fSRobert Mustacchi boolean_t i40e_promisc_on; 849f2f3bb8fSRobert Mustacchi link_state_t i40e_link_state; 850f2f3bb8fSRobert Mustacchi uint32_t i40e_link_speed; /* In Mbps */ 851f2f3bb8fSRobert Mustacchi link_duplex_t i40e_link_duplex; 852f2f3bb8fSRobert Mustacchi uint_t i40e_sdu; 853f2f3bb8fSRobert Mustacchi uint_t i40e_frame_max; 854f2f3bb8fSRobert Mustacchi 855f2f3bb8fSRobert Mustacchi /* 856f2f3bb8fSRobert Mustacchi * Transmit and receive information, tunables, and MAC info. 857f2f3bb8fSRobert Mustacchi */ 858f2f3bb8fSRobert Mustacchi i40e_trqpair_t *i40e_trqpairs; 859f2f3bb8fSRobert Mustacchi boolean_t i40e_mr_enable; 860*5ca90d72SRyan Zezeski uint_t i40e_num_trqpairs; /* total TRQPs (per PF) */ 861*5ca90d72SRyan Zezeski uint_t i40e_num_trqpairs_per_vsi; /* TRQPs per VSI */ 862f2f3bb8fSRobert Mustacchi uint_t i40e_other_itr; 863f2f3bb8fSRobert Mustacchi 864*5ca90d72SRyan Zezeski i40e_rx_group_t *i40e_rx_groups; 865*5ca90d72SRyan Zezeski uint_t i40e_num_rx_groups; 866f2f3bb8fSRobert Mustacchi int i40e_num_rx_descs; 867f2f3bb8fSRobert Mustacchi uint32_t i40e_rx_ring_size; 868f2f3bb8fSRobert Mustacchi uint32_t i40e_rx_buf_size; 869f2f3bb8fSRobert Mustacchi boolean_t i40e_rx_hcksum_enable; 870f2f3bb8fSRobert Mustacchi uint32_t i40e_rx_dma_min; 871f2f3bb8fSRobert Mustacchi uint32_t i40e_rx_limit_per_intr; 872f2f3bb8fSRobert Mustacchi uint_t i40e_rx_itr; 873f2f3bb8fSRobert Mustacchi 874f2f3bb8fSRobert Mustacchi int i40e_num_tx_descs; 875f2f3bb8fSRobert Mustacchi uint32_t i40e_tx_ring_size; 876f2f3bb8fSRobert Mustacchi uint32_t i40e_tx_buf_size; 877f2f3bb8fSRobert Mustacchi uint32_t i40e_tx_block_thresh; 878f2f3bb8fSRobert Mustacchi boolean_t i40e_tx_hcksum_enable; 879*5ca90d72SRyan Zezeski boolean_t i40e_tx_lso_enable; 880f2f3bb8fSRobert Mustacchi uint32_t i40e_tx_dma_min; 881f2f3bb8fSRobert Mustacchi uint_t i40e_tx_itr; 882f2f3bb8fSRobert Mustacchi 883f2f3bb8fSRobert Mustacchi /* 884f2f3bb8fSRobert Mustacchi * Interrupt state 885f2f3bb8fSRobert Mustacchi */ 886f2f3bb8fSRobert Mustacchi uint_t i40e_intr_pri; 887f2f3bb8fSRobert Mustacchi uint_t i40e_intr_force; 888f2f3bb8fSRobert Mustacchi uint_t i40e_intr_type; 889f2f3bb8fSRobert Mustacchi int i40e_intr_cap; 890f2f3bb8fSRobert Mustacchi uint32_t i40e_intr_count; 891f2f3bb8fSRobert Mustacchi uint32_t i40e_intr_count_max; 892f2f3bb8fSRobert Mustacchi uint32_t i40e_intr_count_min; 893f2f3bb8fSRobert Mustacchi size_t i40e_intr_size; 894f2f3bb8fSRobert Mustacchi ddi_intr_handle_t *i40e_intr_handles; 895f2f3bb8fSRobert Mustacchi ddi_cb_handle_t i40e_callback_handle; 896f2f3bb8fSRobert Mustacchi 897f2f3bb8fSRobert Mustacchi /* 898f2f3bb8fSRobert Mustacchi * DMA attributes. See i40e_transceiver.c for why we have copies of them 899f2f3bb8fSRobert Mustacchi * in the i40e_t. 900f2f3bb8fSRobert Mustacchi */ 901f2f3bb8fSRobert Mustacchi ddi_dma_attr_t i40e_static_dma_attr; 902f2f3bb8fSRobert Mustacchi ddi_dma_attr_t i40e_txbind_dma_attr; 903*5ca90d72SRyan Zezeski ddi_dma_attr_t i40e_txbind_lso_dma_attr; 904f2f3bb8fSRobert Mustacchi ddi_device_acc_attr_t i40e_desc_acc_attr; 905f2f3bb8fSRobert Mustacchi ddi_device_acc_attr_t i40e_buf_acc_attr; 906f2f3bb8fSRobert Mustacchi 907f2f3bb8fSRobert Mustacchi /* 908f2f3bb8fSRobert Mustacchi * The following two fields are used to protect and keep track of 909f2f3bb8fSRobert Mustacchi * outstanding, loaned buffers to MAC. If we have these, we can't 910f2f3bb8fSRobert Mustacchi * detach as we have active DMA memory outstanding. 911f2f3bb8fSRobert Mustacchi */ 912f2f3bb8fSRobert Mustacchi kmutex_t i40e_rx_pending_lock; 913f2f3bb8fSRobert Mustacchi kcondvar_t i40e_rx_pending_cv; 914f2f3bb8fSRobert Mustacchi uint32_t i40e_rx_pending; 915f2f3bb8fSRobert Mustacchi 916f2f3bb8fSRobert Mustacchi /* 917f2f3bb8fSRobert Mustacchi * PF statistics and VSI statistics. 918f2f3bb8fSRobert Mustacchi */ 919f2f3bb8fSRobert Mustacchi kmutex_t i40e_stat_lock; 920f2f3bb8fSRobert Mustacchi kstat_t *i40e_pf_kstat; 921f2f3bb8fSRobert Mustacchi i40e_pf_stats_t i40e_pf_stat; 922f2f3bb8fSRobert Mustacchi 923f2f3bb8fSRobert Mustacchi /* 924f2f3bb8fSRobert Mustacchi * Misc. stats and counters that should maybe one day be kstats. 925f2f3bb8fSRobert Mustacchi */ 926f2f3bb8fSRobert Mustacchi uint64_t i40e_s_link_status_errs; 927f2f3bb8fSRobert Mustacchi uint32_t i40e_s_link_status_lasterr; 9284d210590SRobert Mustacchi 9294d210590SRobert Mustacchi /* 9304d210590SRobert Mustacchi * LED information. Note this state is only modified in 9314d210590SRobert Mustacchi * i40e_gld_set_led() which is protected by MAC's serializer lock. 9324d210590SRobert Mustacchi */ 9334d210590SRobert Mustacchi uint32_t i40e_led_status; 9344d210590SRobert Mustacchi boolean_t i40e_led_saved; 935f2f3bb8fSRobert Mustacchi } i40e_t; 936f2f3bb8fSRobert Mustacchi 937f2f3bb8fSRobert Mustacchi /* 938f2f3bb8fSRobert Mustacchi * The i40e_device represents a PCI device which encapsulates multiple physical 939f2f3bb8fSRobert Mustacchi * functions which are represented as an i40e_t. This is used to track the use 940f2f3bb8fSRobert Mustacchi * of pooled resources throughout all of the various devices. 941f2f3bb8fSRobert Mustacchi */ 942f2f3bb8fSRobert Mustacchi typedef struct i40e_device { 943f2f3bb8fSRobert Mustacchi list_node_t id_link; 944f2f3bb8fSRobert Mustacchi dev_info_t *id_parent; 945f2f3bb8fSRobert Mustacchi uint_t id_pci_bus; 946f2f3bb8fSRobert Mustacchi uint_t id_pci_device; 947f2f3bb8fSRobert Mustacchi uint_t id_nfuncs; /* Total number of functions */ 948f2f3bb8fSRobert Mustacchi uint_t id_nreg; /* Total number present */ 949f2f3bb8fSRobert Mustacchi list_t id_i40e_list; /* List of i40e_t's registered */ 950f2f3bb8fSRobert Mustacchi i40e_switch_rsrc_t *id_rsrcs; /* Switch resources for this PF */ 951f2f3bb8fSRobert Mustacchi uint_t id_rsrcs_alloc; /* Total allocated resources */ 952f2f3bb8fSRobert Mustacchi uint_t id_rsrcs_act; /* Actual number of resources */ 953f2f3bb8fSRobert Mustacchi } i40e_device_t; 954f2f3bb8fSRobert Mustacchi 955f2f3bb8fSRobert Mustacchi /* Values for the interrupt forcing on the NIC. */ 956f2f3bb8fSRobert Mustacchi #define I40E_INTR_NONE 0 957f2f3bb8fSRobert Mustacchi #define I40E_INTR_MSIX 1 958f2f3bb8fSRobert Mustacchi #define I40E_INTR_MSI 2 959f2f3bb8fSRobert Mustacchi #define I40E_INTR_LEGACY 3 960f2f3bb8fSRobert Mustacchi 961f2f3bb8fSRobert Mustacchi /* Hint that we don't want to do any polling... */ 962f2f3bb8fSRobert Mustacchi #define I40E_POLL_NULL -1 963f2f3bb8fSRobert Mustacchi 964f2f3bb8fSRobert Mustacchi /* 965f2f3bb8fSRobert Mustacchi * Logging functions. 966f2f3bb8fSRobert Mustacchi */ 967f2f3bb8fSRobert Mustacchi /*PRINTFLIKE2*/ 968f2f3bb8fSRobert Mustacchi extern void i40e_error(i40e_t *, const char *, ...) __KPRINTFLIKE(2); 969f2f3bb8fSRobert Mustacchi /*PRINTFLIKE2*/ 970f2f3bb8fSRobert Mustacchi extern void i40e_notice(i40e_t *, const char *, ...) __KPRINTFLIKE(2); 971f2f3bb8fSRobert Mustacchi /*PRINTFLIKE2*/ 972f2f3bb8fSRobert Mustacchi extern void i40e_log(i40e_t *, const char *, ...) __KPRINTFLIKE(2); 973f2f3bb8fSRobert Mustacchi 974f2f3bb8fSRobert Mustacchi /* 975f2f3bb8fSRobert Mustacchi * General link handling functions. 976f2f3bb8fSRobert Mustacchi */ 977f2f3bb8fSRobert Mustacchi extern void i40e_link_check(i40e_t *); 978f2f3bb8fSRobert Mustacchi extern void i40e_update_mtu(i40e_t *); 979f2f3bb8fSRobert Mustacchi 980f2f3bb8fSRobert Mustacchi /* 981f2f3bb8fSRobert Mustacchi * FMA functions. 982f2f3bb8fSRobert Mustacchi */ 983f2f3bb8fSRobert Mustacchi extern int i40e_check_acc_handle(ddi_acc_handle_t); 984f2f3bb8fSRobert Mustacchi extern int i40e_check_dma_handle(ddi_dma_handle_t); 985f2f3bb8fSRobert Mustacchi extern void i40e_fm_ereport(i40e_t *, char *); 986f2f3bb8fSRobert Mustacchi 987f2f3bb8fSRobert Mustacchi /* 988f2f3bb8fSRobert Mustacchi * Interrupt handlers and interrupt handler setup. 989f2f3bb8fSRobert Mustacchi */ 990f2f3bb8fSRobert Mustacchi extern void i40e_intr_chip_init(i40e_t *); 991f2f3bb8fSRobert Mustacchi extern void i40e_intr_chip_fini(i40e_t *); 992f2f3bb8fSRobert Mustacchi extern uint_t i40e_intr_msix(void *, void *); 993f2f3bb8fSRobert Mustacchi extern uint_t i40e_intr_msi(void *, void *); 994f2f3bb8fSRobert Mustacchi extern uint_t i40e_intr_legacy(void *, void *); 995f2f3bb8fSRobert Mustacchi extern void i40e_intr_io_enable_all(i40e_t *); 996f2f3bb8fSRobert Mustacchi extern void i40e_intr_io_disable_all(i40e_t *); 997f2f3bb8fSRobert Mustacchi extern void i40e_intr_io_clear_cause(i40e_t *); 9985b7cbeceSRobert Mustacchi extern void i40e_intr_rx_queue_disable(i40e_trqpair_t *); 9995b7cbeceSRobert Mustacchi extern void i40e_intr_rx_queue_enable(i40e_trqpair_t *); 1000f2f3bb8fSRobert Mustacchi extern void i40e_intr_set_itr(i40e_t *, i40e_itr_index_t, uint_t); 1001f2f3bb8fSRobert Mustacchi 1002f2f3bb8fSRobert Mustacchi /* 1003f2f3bb8fSRobert Mustacchi * Receive-side functions 1004f2f3bb8fSRobert Mustacchi */ 1005f2f3bb8fSRobert Mustacchi extern mblk_t *i40e_ring_rx(i40e_trqpair_t *, int); 1006f2f3bb8fSRobert Mustacchi extern mblk_t *i40e_ring_rx_poll(void *, int); 1007f2f3bb8fSRobert Mustacchi extern void i40e_rx_recycle(caddr_t); 1008f2f3bb8fSRobert Mustacchi 1009f2f3bb8fSRobert Mustacchi /* 1010f2f3bb8fSRobert Mustacchi * Transmit-side functions 1011f2f3bb8fSRobert Mustacchi */ 1012f2f3bb8fSRobert Mustacchi mblk_t *i40e_ring_tx(void *, mblk_t *); 1013f2f3bb8fSRobert Mustacchi extern void i40e_tx_recycle_ring(i40e_trqpair_t *); 1014f2f3bb8fSRobert Mustacchi extern void i40e_tx_cleanup_ring(i40e_trqpair_t *); 1015f2f3bb8fSRobert Mustacchi 1016f2f3bb8fSRobert Mustacchi /* 1017f2f3bb8fSRobert Mustacchi * Statistics functions. 1018f2f3bb8fSRobert Mustacchi */ 1019f2f3bb8fSRobert Mustacchi extern boolean_t i40e_stats_init(i40e_t *); 1020f2f3bb8fSRobert Mustacchi extern void i40e_stats_fini(i40e_t *); 1021*5ca90d72SRyan Zezeski extern boolean_t i40e_stat_vsi_init(i40e_t *, uint_t); 1022*5ca90d72SRyan Zezeski extern void i40e_stat_vsi_fini(i40e_t *, uint_t); 1023f2f3bb8fSRobert Mustacchi extern boolean_t i40e_stats_trqpair_init(i40e_trqpair_t *); 1024f2f3bb8fSRobert Mustacchi extern void i40e_stats_trqpair_fini(i40e_trqpair_t *); 1025f2f3bb8fSRobert Mustacchi extern int i40e_m_stat(void *, uint_t, uint64_t *); 1026f2f3bb8fSRobert Mustacchi extern int i40e_rx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *); 1027f2f3bb8fSRobert Mustacchi extern int i40e_tx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *); 1028f2f3bb8fSRobert Mustacchi 1029f2f3bb8fSRobert Mustacchi /* 1030f2f3bb8fSRobert Mustacchi * MAC/GLDv3 functions, and functions called by MAC/GLDv3 support code. 1031f2f3bb8fSRobert Mustacchi */ 1032f2f3bb8fSRobert Mustacchi extern boolean_t i40e_register_mac(i40e_t *); 1033f2f3bb8fSRobert Mustacchi extern boolean_t i40e_start(i40e_t *, boolean_t); 1034f2f3bb8fSRobert Mustacchi extern void i40e_stop(i40e_t *, boolean_t); 1035f2f3bb8fSRobert Mustacchi 1036f2f3bb8fSRobert Mustacchi /* 1037f2f3bb8fSRobert Mustacchi * DMA & buffer functions and attributes 1038f2f3bb8fSRobert Mustacchi */ 1039f2f3bb8fSRobert Mustacchi extern void i40e_init_dma_attrs(i40e_t *, boolean_t); 1040f2f3bb8fSRobert Mustacchi extern boolean_t i40e_alloc_ring_mem(i40e_t *); 1041f2f3bb8fSRobert Mustacchi extern void i40e_free_ring_mem(i40e_t *, boolean_t); 1042f2f3bb8fSRobert Mustacchi 1043f2f3bb8fSRobert Mustacchi #ifdef __cplusplus 1044f2f3bb8fSRobert Mustacchi } 1045f2f3bb8fSRobert Mustacchi #endif 1046f2f3bb8fSRobert Mustacchi 1047f2f3bb8fSRobert Mustacchi #endif /* _I40E_SW_H */ 1048