xref: /illumos-gate/usr/src/uts/common/io/i40e/i40e_sw.h (revision 11a00484)
19d26e4fcSRobert Mustacchi /*
29d26e4fcSRobert Mustacchi  * This file and its contents are supplied under the terms of the
39d26e4fcSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
49d26e4fcSRobert Mustacchi  * You may only use this file in accordance with the terms of version
59d26e4fcSRobert Mustacchi  * 1.0 of the CDDL.
69d26e4fcSRobert Mustacchi  *
79d26e4fcSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
89d26e4fcSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
99d26e4fcSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
109d26e4fcSRobert Mustacchi  */
119d26e4fcSRobert Mustacchi 
129d26e4fcSRobert Mustacchi /*
139d26e4fcSRobert Mustacchi  * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
1409aee612SRyan Zezeski  * Copyright 2019 Joyent, Inc.
15396505afSPaul Winder  * Copyright 2017 Tegile Systems, Inc.  All rights reserved.
1688628b1bSRyan Zezeski  * Copyright 2020 Ryan Zezeski
17aa2a44afSPaul Winder  * Copyright 2020 RackTop Systems, Inc.
189d26e4fcSRobert Mustacchi  */
199d26e4fcSRobert Mustacchi 
209d26e4fcSRobert Mustacchi /*
219d26e4fcSRobert Mustacchi  * Please see i40e_main.c for an introduction to the device driver, its layout,
229d26e4fcSRobert Mustacchi  * and more.
239d26e4fcSRobert Mustacchi  */
249d26e4fcSRobert Mustacchi 
259d26e4fcSRobert Mustacchi #ifndef	_I40E_SW_H
269d26e4fcSRobert Mustacchi #define	_I40E_SW_H
279d26e4fcSRobert Mustacchi 
289d26e4fcSRobert Mustacchi #ifdef __cplusplus
299d26e4fcSRobert Mustacchi extern "C" {
309d26e4fcSRobert Mustacchi #endif
319d26e4fcSRobert Mustacchi 
329d26e4fcSRobert Mustacchi #include <sys/types.h>
339d26e4fcSRobert Mustacchi #include <sys/conf.h>
349d26e4fcSRobert Mustacchi #include <sys/debug.h>
359d26e4fcSRobert Mustacchi #include <sys/stropts.h>
369d26e4fcSRobert Mustacchi #include <sys/stream.h>
379d26e4fcSRobert Mustacchi #include <sys/strsun.h>
389d26e4fcSRobert Mustacchi #include <sys/strlog.h>
399d26e4fcSRobert Mustacchi #include <sys/kmem.h>
409d26e4fcSRobert Mustacchi #include <sys/stat.h>
419d26e4fcSRobert Mustacchi #include <sys/kstat.h>
429d26e4fcSRobert Mustacchi #include <sys/modctl.h>
439d26e4fcSRobert Mustacchi #include <sys/errno.h>
449d26e4fcSRobert Mustacchi #include <sys/dlpi.h>
459d26e4fcSRobert Mustacchi #include <sys/mac_provider.h>
469d26e4fcSRobert Mustacchi #include <sys/mac_ether.h>
479d26e4fcSRobert Mustacchi #include <sys/vlan.h>
489d26e4fcSRobert Mustacchi #include <sys/ddi.h>
499d26e4fcSRobert Mustacchi #include <sys/sunddi.h>
509d26e4fcSRobert Mustacchi #include <sys/pci.h>
519d26e4fcSRobert Mustacchi #include <sys/pcie.h>
529d26e4fcSRobert Mustacchi #include <sys/sdt.h>
539d26e4fcSRobert Mustacchi #include <sys/ethernet.h>
549d26e4fcSRobert Mustacchi #include <sys/pattr.h>
559d26e4fcSRobert Mustacchi #include <sys/strsubr.h>
569d26e4fcSRobert Mustacchi #include <sys/netlb.h>
579d26e4fcSRobert Mustacchi #include <sys/random.h>
589d26e4fcSRobert Mustacchi #include <inet/common.h>
599d26e4fcSRobert Mustacchi #include <inet/tcp.h>
609d26e4fcSRobert Mustacchi #include <inet/ip.h>
619d26e4fcSRobert Mustacchi #include <inet/mi.h>
629d26e4fcSRobert Mustacchi #include <inet/nd.h>
639d26e4fcSRobert Mustacchi #include <netinet/udp.h>
649d26e4fcSRobert Mustacchi #include <netinet/sctp.h>
659d26e4fcSRobert Mustacchi #include <sys/bitmap.h>
669d26e4fcSRobert Mustacchi #include <sys/cpuvar.h>
679d26e4fcSRobert Mustacchi #include <sys/ddifm.h>
689d26e4fcSRobert Mustacchi #include <sys/fm/protocol.h>
699d26e4fcSRobert Mustacchi #include <sys/fm/util.h>
709d26e4fcSRobert Mustacchi #include <sys/disp.h>
719d26e4fcSRobert Mustacchi #include <sys/fm/io/ddi.h>
729d26e4fcSRobert Mustacchi #include <sys/list.h>
739d26e4fcSRobert Mustacchi #include <sys/debug.h>
749d26e4fcSRobert Mustacchi #include <sys/sdt.h>
75508a0e8cSRob Johnston #include <sys/ddi_ufm.h>
769d26e4fcSRobert Mustacchi #include "i40e_type.h"
779d26e4fcSRobert Mustacchi #include "i40e_osdep.h"
789d26e4fcSRobert Mustacchi #include "i40e_prototype.h"
799d26e4fcSRobert Mustacchi #include "i40e_xregs.h"
809d26e4fcSRobert Mustacchi 
819d26e4fcSRobert Mustacchi #define	I40E_MODULE_NAME "i40e"
829d26e4fcSRobert Mustacchi 
839d26e4fcSRobert Mustacchi #define	I40E_ADAPTER_REGSET	1
849d26e4fcSRobert Mustacchi 
859d26e4fcSRobert Mustacchi /*
869d26e4fcSRobert Mustacchi  * Configuration constants. Note that the hardware defines a minimum bound of 32
879d26e4fcSRobert Mustacchi  * descriptors and requires that the programming of the descriptor lengths be
889d26e4fcSRobert Mustacchi  * aligned in units of 32 descriptors.
899d26e4fcSRobert Mustacchi  */
909d26e4fcSRobert Mustacchi #define	I40E_MIN_TX_RING_SIZE	64
919d26e4fcSRobert Mustacchi #define	I40E_MAX_TX_RING_SIZE	4096
929d26e4fcSRobert Mustacchi #define	I40E_DEF_TX_RING_SIZE	1024
939d26e4fcSRobert Mustacchi 
9488628b1bSRyan Zezeski /*
9588628b1bSRyan Zezeski  * Place an artificial limit on the max number of groups. The X710
9688628b1bSRyan Zezeski  * series supports up to 384 VSIs to be partitioned across PFs as the
9788628b1bSRyan Zezeski  * driver sees fit. But until we support more interrupts this seems
9888628b1bSRyan Zezeski  * like a good place to start.
9988628b1bSRyan Zezeski  */
10088628b1bSRyan Zezeski #define	I40E_MIN_NUM_RX_GROUPS	1
10188628b1bSRyan Zezeski #define	I40E_MAX_NUM_RX_GROUPS	32
10288628b1bSRyan Zezeski #define	I40E_DEF_NUM_RX_GROUPS	16
10388628b1bSRyan Zezeski 
1049d26e4fcSRobert Mustacchi #define	I40E_MIN_RX_RING_SIZE	64
1059d26e4fcSRobert Mustacchi #define	I40E_MAX_RX_RING_SIZE	4096
1069d26e4fcSRobert Mustacchi #define	I40E_DEF_RX_RING_SIZE	1024
1079d26e4fcSRobert Mustacchi 
1089d26e4fcSRobert Mustacchi #define	I40E_DESC_ALIGN		32
1099d26e4fcSRobert Mustacchi 
1109d26e4fcSRobert Mustacchi /*
1119d26e4fcSRobert Mustacchi  * Sizes used for asynchronous processing of the adminq. We allocate a fixed
1129d26e4fcSRobert Mustacchi  * size buffer for each instance of the device during attach time, rather than
1139d26e4fcSRobert Mustacchi  * allocating and freeing one during interrupt processing.
1149d26e4fcSRobert Mustacchi  *
1159d26e4fcSRobert Mustacchi  * We also define the descriptor size of the admin queue here.
1169d26e4fcSRobert Mustacchi  */
1179d26e4fcSRobert Mustacchi #define	I40E_ADMINQ_BUFSZ	4096
1189d26e4fcSRobert Mustacchi #define	I40E_MAX_ADMINQ_SIZE	1024
1199d26e4fcSRobert Mustacchi #define	I40E_DEF_ADMINQ_SIZE	256
1209d26e4fcSRobert Mustacchi 
1219d26e4fcSRobert Mustacchi /*
1229d26e4fcSRobert Mustacchi  * Note, while the min and maximum values are based upon the sizing of the ring
1239d26e4fcSRobert Mustacchi  * itself, the default is taken from ixgbe without much thought. It's basically
1249d26e4fcSRobert Mustacchi  * been cargo culted. See i40e_transceiver.c for a bit more information.
1259d26e4fcSRobert Mustacchi  */
1269d26e4fcSRobert Mustacchi #define	I40E_MIN_RX_LIMIT_PER_INTR	16
1279d26e4fcSRobert Mustacchi #define	I40E_MAX_RX_LIMIT_PER_INTR	4096
1289d26e4fcSRobert Mustacchi #define	I40E_DEF_RX_LIMIT_PER_INTR	256
1299d26e4fcSRobert Mustacchi 
1309d26e4fcSRobert Mustacchi /*
1319d26e4fcSRobert Mustacchi  * Valid MTU ranges. Note that the XL710's maximum payload is actually 9728.
1329d26e4fcSRobert Mustacchi  * However, we need to adjust for the ETHERFCSL (4 bytes) and the Ethernet VLAN
1339d26e4fcSRobert Mustacchi  * header size (18 bytes) to get the actual maximum frame we can use. If
1349d26e4fcSRobert Mustacchi  * different adapters end up with different sizes, we should make this value a
1359d26e4fcSRobert Mustacchi  * bit more dynamic.
1369d26e4fcSRobert Mustacchi  */
1379d26e4fcSRobert Mustacchi #define	I40E_MAX_MTU	9706
1389d26e4fcSRobert Mustacchi #define	I40E_MIN_MTU	ETHERMIN
1399d26e4fcSRobert Mustacchi #define	I40E_DEF_MTU	ETHERMTU
1409d26e4fcSRobert Mustacchi 
1419d26e4fcSRobert Mustacchi /*
1429d26e4fcSRobert Mustacchi  * Interrupt throttling related values. Interrupt throttling values are defined
1439d26e4fcSRobert Mustacchi  * in two microsecond increments. Note that a value of zero basically says do no
1449d26e4fcSRobert Mustacchi  * ITR activity. A helpful way to think about these is that setting the ITR to a
1459d26e4fcSRobert Mustacchi  * value will allow a certain number of interrupts per second.
1469d26e4fcSRobert Mustacchi  *
1479d26e4fcSRobert Mustacchi  * Our default values for RX allow 20k interrupts per second while our default
1489d26e4fcSRobert Mustacchi  * values for TX allow for 5k interrupts per second. For other class interrupts,
1499d26e4fcSRobert Mustacchi  * we limit ourselves to a rate of 2k/s.
1509d26e4fcSRobert Mustacchi  */
1519d26e4fcSRobert Mustacchi #define	I40E_MIN_ITR		0x0000
1529d26e4fcSRobert Mustacchi #define	I40E_MAX_ITR		0x0FF0
1539d26e4fcSRobert Mustacchi #define	I40E_DEF_RX_ITR		0x0019
1549d26e4fcSRobert Mustacchi #define	I40E_DEF_TX_ITR		0x0064
1559d26e4fcSRobert Mustacchi #define	I40E_DEF_OTHER_ITR	0x00FA
1569d26e4fcSRobert Mustacchi 
1579d26e4fcSRobert Mustacchi /*
1589d26e4fcSRobert Mustacchi  * Indexes into the three ITR registers that we have.
1599d26e4fcSRobert Mustacchi  */
1609d26e4fcSRobert Mustacchi typedef enum i40e_itr_index {
1619d26e4fcSRobert Mustacchi 	I40E_ITR_INDEX_RX	= 0x0,
1629d26e4fcSRobert Mustacchi 	I40E_ITR_INDEX_TX	= 0x1,
1639d26e4fcSRobert Mustacchi 	I40E_ITR_INDEX_OTHER	= 0x2,
164508a0e8cSRob Johnston 	I40E_ITR_INDEX_NONE	= 0x3
1659d26e4fcSRobert Mustacchi } i40e_itr_index_t;
1669d26e4fcSRobert Mustacchi 
1679d26e4fcSRobert Mustacchi /*
16809aee612SRyan Zezeski  * The hardware claims to support LSO up to 256 KB, but due to the limitations
16909aee612SRyan Zezeski  * imposed by the IP header for non-jumbo frames, we cap it at 64 KB.
1709d26e4fcSRobert Mustacchi  */
17109aee612SRyan Zezeski #define	I40E_LSO_MAXLEN	(64 * 1024)
1729d26e4fcSRobert Mustacchi 
1739d26e4fcSRobert Mustacchi #define	I40E_CYCLIC_PERIOD NANOSEC	/* 1 second */
1749d26e4fcSRobert Mustacchi #define	I40E_DRAIN_RX_WAIT	(500 * MILLISEC)	/* In us */
1759d26e4fcSRobert Mustacchi 
1769d26e4fcSRobert Mustacchi /*
1779d26e4fcSRobert Mustacchi  * All the other queue types for are defined by the common code. However, this
1789d26e4fcSRobert Mustacchi  * is the constant to indicate that it's terminated.
1799d26e4fcSRobert Mustacchi  */
1809d26e4fcSRobert Mustacchi #define	I40E_QUEUE_TYPE_EOL	0x7FF
1819d26e4fcSRobert Mustacchi 
1829d26e4fcSRobert Mustacchi /*
1839d26e4fcSRobert Mustacchi  * See the comments in i40e_transceiver.c as to the purpose of this value and
1849d26e4fcSRobert Mustacchi  * how it's used to ensure that the IP header is eventually aligned when it's
1859d26e4fcSRobert Mustacchi  * received by the OS.
1869d26e4fcSRobert Mustacchi  */
1879d26e4fcSRobert Mustacchi #define	I40E_BUF_IPHDR_ALIGNMENT	2
1889d26e4fcSRobert Mustacchi 
1899d26e4fcSRobert Mustacchi /*
19009aee612SRyan Zezeski  * The XL710 controller has a total of eight buffers available for the
19109aee612SRyan Zezeski  * transmission of any single frame. This is defined in 8.4.1 - Transmit
1929d26e4fcSRobert Mustacchi  * Packet in System Memory.
1939d26e4fcSRobert Mustacchi  */
1949d26e4fcSRobert Mustacchi #define	I40E_TX_MAX_COOKIE	8
1959d26e4fcSRobert Mustacchi 
19609aee612SRyan Zezeski /*
19709aee612SRyan Zezeski  * An LSO frame can be as large as 64KB, so we allow a DMA bind to span more
19809aee612SRyan Zezeski  * cookies than a non-LSO frame.  The key here to is to select a value such
19909aee612SRyan Zezeski  * that once the HW has chunked up the LSO frame into MSS-sized segments that no
20009aee612SRyan Zezeski  * single segment spans more than 8 cookies (see comments for
20109aee612SRyan Zezeski  * I40E_TX_MAX_COOKIE)
20209aee612SRyan Zezeski  */
20309aee612SRyan Zezeski #define	I40E_TX_LSO_MAX_COOKIE	32
20409aee612SRyan Zezeski 
2059d26e4fcSRobert Mustacchi /*
2069d26e4fcSRobert Mustacchi  * Sizing to determine the amount of available descriptors at which we'll
2079d26e4fcSRobert Mustacchi  * consider ourselves blocked. Also, when we have these available, we'll then
2089d26e4fcSRobert Mustacchi  * consider ourselves available to transmit to MAC again. Strictly speaking, the
2099d26e4fcSRobert Mustacchi  * MAX is based on the ring size. The default sizing is based on ixgbe.
2109d26e4fcSRobert Mustacchi  */
2119d26e4fcSRobert Mustacchi #define	I40E_MIN_TX_BLOCK_THRESH	I40E_TX_MAX_COOKIE
2129d26e4fcSRobert Mustacchi #define	I40E_DEF_TX_BLOCK_THRESH	I40E_MIN_TX_BLOCK_THRESH
2139d26e4fcSRobert Mustacchi 
2149d26e4fcSRobert Mustacchi /*
2159d26e4fcSRobert Mustacchi  * Sizing for DMA thresholds. These are used to indicate whether or not we
2169d26e4fcSRobert Mustacchi  * should perform a bcopy or a DMA binding of a given message block. The range
2179d26e4fcSRobert Mustacchi  * allows for setting things such that we'll always do a bcopy (a high value) or
2189d26e4fcSRobert Mustacchi  * always perform a DMA binding (a low value).
2199d26e4fcSRobert Mustacchi  */
2209d26e4fcSRobert Mustacchi #define	I40E_MIN_RX_DMA_THRESH		0
2219d26e4fcSRobert Mustacchi #define	I40E_DEF_RX_DMA_THRESH		256
2229d26e4fcSRobert Mustacchi #define	I40E_MAX_RX_DMA_THRESH		INT32_MAX
2239d26e4fcSRobert Mustacchi 
2249d26e4fcSRobert Mustacchi #define	I40E_MIN_TX_DMA_THRESH		0
2259d26e4fcSRobert Mustacchi #define	I40E_DEF_TX_DMA_THRESH		256
2269d26e4fcSRobert Mustacchi #define	I40E_MAX_TX_DMA_THRESH		INT32_MAX
2279d26e4fcSRobert Mustacchi 
22809aee612SRyan Zezeski /*
22909aee612SRyan Zezeski  * The max size of each individual tx buffer is 16KB - 1.
23009aee612SRyan Zezeski  * See table 8-17
23109aee612SRyan Zezeski  */
23209aee612SRyan Zezeski #define	I40E_MAX_TX_BUFSZ		0x0000000000003FFFull
23309aee612SRyan Zezeski 
2349d26e4fcSRobert Mustacchi /*
2359d26e4fcSRobert Mustacchi  * Resource sizing counts. There are various aspects of hardware where we may
2369d26e4fcSRobert Mustacchi  * have some variable number of elements that we need to handle. Such as the
2379d26e4fcSRobert Mustacchi  * hardware capabilities and switch capacities. We cannot know a priori how many
2389d26e4fcSRobert Mustacchi  * elements to do, so instead we take a starting guess and then will grow it up
2399d26e4fcSRobert Mustacchi  * to an upper bound on a number of elements, to limit memory consumption in
2409d26e4fcSRobert Mustacchi  * case of a hardware bug.
2419d26e4fcSRobert Mustacchi  */
2429d26e4fcSRobert Mustacchi #define	I40E_HW_CAP_DEFAULT	40
2439d26e4fcSRobert Mustacchi #define	I40E_SWITCH_CAP_DEFAULT	25
2449d26e4fcSRobert Mustacchi 
2459d26e4fcSRobert Mustacchi /*
2469d26e4fcSRobert Mustacchi  * Host Memory Context related constants.
2479d26e4fcSRobert Mustacchi  */
2489d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_CTX_UNIT		128
2499d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_DBUFF_MIN		1024
2509d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_DBUFF_MAX		(16 * 1024 - 128)
2519d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_DTYPE_NOSPLIT	0
2529d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_DSIZE_32BYTE	1
2539d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_CRCSTRIP_ENABLE	1
2549d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_FC_DISABLE		0
2559d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_L2TAGORDER		1
2569d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_HDRSPLIT_DISABLE	0
2579d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_INVLAN_DONTSTRIP	0
2589d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_TPH_DISABLE		0
2599d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_LOWRXQ_NOINTR	0
2609d26e4fcSRobert Mustacchi #define	I40E_HMC_RX_PREFENA		1
2619d26e4fcSRobert Mustacchi 
2629d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_CTX_UNIT		128
2639d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_NEW_CONTEXT		1
2649d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_FC_DISABLE		0
2659d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_TS_DISABLE		0
2669d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_FD_DISABLE		0
2679d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_ALT_VLAN_DISABLE	0
2689d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_WB_ENABLE		1
2699d26e4fcSRobert Mustacchi #define	I40E_HMC_TX_TPH_DISABLE		0
2709d26e4fcSRobert Mustacchi 
2719d26e4fcSRobert Mustacchi /*
2729d26e4fcSRobert Mustacchi  * This defines the error mask that we care about from rx descriptors. Currently
2739d26e4fcSRobert Mustacchi  * we're only concerned with the general errors and oversize errors.
2749d26e4fcSRobert Mustacchi  */
2759d26e4fcSRobert Mustacchi #define	I40E_RX_ERR_BITS	((1 << I40E_RX_DESC_ERROR_RXE_SHIFT) | \
2769d26e4fcSRobert Mustacchi 	(1 << I40E_RX_DESC_ERROR_OVERSIZE_SHIFT))
2779d26e4fcSRobert Mustacchi 
2789d26e4fcSRobert Mustacchi /*
2799d26e4fcSRobert Mustacchi  * Property sizing macros for firmware versions, etc. They need to be large
2809d26e4fcSRobert Mustacchi  * enough to hold 32-bit quantities transformed to strings as %d.%d or %x.
2819d26e4fcSRobert Mustacchi  */
2829d26e4fcSRobert Mustacchi #define	I40E_DDI_PROP_LEN	64
2839d26e4fcSRobert Mustacchi 
2849d26e4fcSRobert Mustacchi #define	I40E_GROUP_NOMSIX	1
2859d26e4fcSRobert Mustacchi #define	I40E_TRQPAIR_NOMSIX	1
2869d26e4fcSRobert Mustacchi 
2879d26e4fcSRobert Mustacchi /*
2889d26e4fcSRobert Mustacchi  * It seems reasonable to cast this to void because the only reason that we
2899d26e4fcSRobert Mustacchi  * should be getting a DDI_FAILURE is due to the fact that we specify addresses
2909d26e4fcSRobert Mustacchi  * out of range. Because we specify no offset or address, it shouldn't happen.
2919d26e4fcSRobert Mustacchi  */
2929d26e4fcSRobert Mustacchi #ifdef	DEBUG
2939d26e4fcSRobert Mustacchi #define	I40E_DMA_SYNC(handle, flag)	ASSERT0(ddi_dma_sync( \
2949d26e4fcSRobert Mustacchi 					    (handle)->dmab_dma_handle, 0, 0, \
2959d26e4fcSRobert Mustacchi 					    (flag)))
2969d26e4fcSRobert Mustacchi #else	/* !DEBUG */
2979d26e4fcSRobert Mustacchi #define	I40E_DMA_SYNC(handle, flag)	((void) ddi_dma_sync( \
2989d26e4fcSRobert Mustacchi 					    (handle)->dmab_dma_handle, 0, 0, \
2999d26e4fcSRobert Mustacchi 					    (flag)))
3009d26e4fcSRobert Mustacchi #endif	/* DEBUG */
3019d26e4fcSRobert Mustacchi 
3029d26e4fcSRobert Mustacchi /*
3039d26e4fcSRobert Mustacchi  * Constants related to ring startup and teardown. These refer to the amount of
3049d26e4fcSRobert Mustacchi  * time that we're willing to wait for a ring to spin up and spin down.
3059d26e4fcSRobert Mustacchi  */
3069d26e4fcSRobert Mustacchi #define	I40E_RING_WAIT_NTRIES	10
3079d26e4fcSRobert Mustacchi #define	I40E_RING_WAIT_PAUSE	10	/* ms */
308aa2a44afSPaul Winder #define	I40E_RING_ENABLE_GAP	50	/* ms */
3099d26e4fcSRobert Mustacchi 
3103d75a287SRobert Mustacchi /*
3113d75a287SRobert Mustacchi  * Printed Board Assembly (PBA) length. These are derived from Table 6-2.
3123d75a287SRobert Mustacchi  */
3133d75a287SRobert Mustacchi #define	I40E_PBANUM_LENGTH	12
3143d75a287SRobert Mustacchi #define	I40E_PBANUM_STRLEN	13
3153d75a287SRobert Mustacchi 
3163d75a287SRobert Mustacchi /*
317b9d34b9dSRobert Mustacchi  * Define the maximum number of queues for a traffic class. These values come
318b9d34b9dSRobert Mustacchi  * from the 'Number and offset of queue pairs per TCs' section of the 'Add VSI
319b9d34b9dSRobert Mustacchi  * Command Buffer' table. For the 710 controller family this is table 7-62
320b9d34b9dSRobert Mustacchi  * (r2.5) and for the 722 this is table 38-216 (r2.0).
321b9d34b9dSRobert Mustacchi  */
322b9d34b9dSRobert Mustacchi #define	I40E_710_MAX_TC_QUEUES	64
323b9d34b9dSRobert Mustacchi #define	I40E_722_MAX_TC_QUEUES	128
324b9d34b9dSRobert Mustacchi 
325b9d34b9dSRobert Mustacchi /*
326b9d34b9dSRobert Mustacchi  * Define the size of the HLUT table size. The HLUT table can either be 128 or
327b9d34b9dSRobert Mustacchi  * 512 bytes. We always set the table size to be 512 bytes in i40e_chip_start().
328b9d34b9dSRobert Mustacchi  * Note, this should not be confused with the common code's macro
329b9d34b9dSRobert Mustacchi  * I40E_HASH_LUT_SIZE_512 which is the bit pattern needed to tell the card to
330b9d34b9dSRobert Mustacchi  * use a 512 byte HLUT.
3313d75a287SRobert Mustacchi  */
332b9d34b9dSRobert Mustacchi #define	I40E_HLUT_TABLE_SIZE	512
3333d75a287SRobert Mustacchi 
3349d26e4fcSRobert Mustacchi /*
3359d26e4fcSRobert Mustacchi  * Bit flags for attach_progress
3369d26e4fcSRobert Mustacchi  */
3379d26e4fcSRobert Mustacchi typedef enum i40e_attach_state {
3389d26e4fcSRobert Mustacchi 	I40E_ATTACH_PCI_CONFIG	= 0x0001,	/* PCI config setup */
3399d26e4fcSRobert Mustacchi 	I40E_ATTACH_REGS_MAP	= 0x0002,	/* Registers mapped */
3409d26e4fcSRobert Mustacchi 	I40E_ATTACH_PROPS	= 0x0004,	/* Properties initialized */
3419d26e4fcSRobert Mustacchi 	I40E_ATTACH_ALLOC_INTR	= 0x0008,	/* Interrupts allocated */
3429d26e4fcSRobert Mustacchi 	I40E_ATTACH_ALLOC_RINGSLOCKS	= 0x0010, /* Rings & locks allocated */
3439d26e4fcSRobert Mustacchi 	I40E_ATTACH_ADD_INTR	= 0x0020,	/* Intr handlers added */
344508a0e8cSRob Johnston 	I40E_ATTACH_COMMON_CODE	= 0x0040,	/* Intel code initialized */
3459d26e4fcSRobert Mustacchi 	I40E_ATTACH_INIT	= 0x0080,	/* Device initialized */
3469d26e4fcSRobert Mustacchi 	I40E_ATTACH_STATS	= 0x0200,	/* Kstats created */
3479d26e4fcSRobert Mustacchi 	I40E_ATTACH_MAC		= 0x0800,	/* MAC registered */
3489d26e4fcSRobert Mustacchi 	I40E_ATTACH_ENABLE_INTR	= 0x1000,	/* DDI interrupts enabled */
3499d26e4fcSRobert Mustacchi 	I40E_ATTACH_FM_INIT	= 0x2000,	/* FMA initialized */
3509d26e4fcSRobert Mustacchi 	I40E_ATTACH_LINK_TIMER	= 0x4000,	/* link check timer */
351508a0e8cSRob Johnston 	I40E_ATTACH_UFM_INIT	= 0x8000,	/* DDI UFM initialized */
3529d26e4fcSRobert Mustacchi } i40e_attach_state_t;
3539d26e4fcSRobert Mustacchi 
3549d26e4fcSRobert Mustacchi 
3559d26e4fcSRobert Mustacchi /*
3569d26e4fcSRobert Mustacchi  * State flags that what's going on in in the device. Some of these state flags
3579d26e4fcSRobert Mustacchi  * indicate some aspirational work that needs to happen in the driver.
3589d26e4fcSRobert Mustacchi  *
3599d26e4fcSRobert Mustacchi  * I40E_UNKNOWN:	The device has yet to be started.
3609d26e4fcSRobert Mustacchi  * I40E_INITIALIZED:	The device has been fully attached.
3619d26e4fcSRobert Mustacchi  * I40E_STARTED:	The device has come out of the GLDV3 start routine.
3629d26e4fcSRobert Mustacchi  * I40E_SUSPENDED:	The device is suspended and I/O among other things
363508a0e8cSRob Johnston  *			should not occur. This happens because of an actual
364508a0e8cSRob Johnston  *			DDI_SUSPEND or interrupt adjustments.
3659d26e4fcSRobert Mustacchi  * I40E_STALL:		The tx stall detection logic has found a stall.
3669d26e4fcSRobert Mustacchi  * I40E_OVERTEMP:	The device has encountered a temperature alarm.
3679d26e4fcSRobert Mustacchi  * I40E_INTR_ADJUST:	Our interrupts are being manipulated and therefore we
368508a0e8cSRob Johnston  *			shouldn't be manipulating their state.
3699d26e4fcSRobert Mustacchi  * I40E_ERROR:		We've detected an FM error and degraded the device.
3709d26e4fcSRobert Mustacchi  */
3719d26e4fcSRobert Mustacchi typedef enum i40e_state {
3729d26e4fcSRobert Mustacchi 	I40E_UNKNOWN		= 0x00,
3739d26e4fcSRobert Mustacchi 	I40E_INITIALIZED	= 0x01,
3749d26e4fcSRobert Mustacchi 	I40E_STARTED		= 0x02,
3759d26e4fcSRobert Mustacchi 	I40E_SUSPENDED		= 0x04,
3769d26e4fcSRobert Mustacchi 	I40E_STALL		= 0x08,
3779d26e4fcSRobert Mustacchi 	I40E_OVERTEMP		= 0x20,
3789d26e4fcSRobert Mustacchi 	I40E_INTR_ADJUST	= 0x40,
3799d26e4fcSRobert Mustacchi 	I40E_ERROR		= 0x80
3809d26e4fcSRobert Mustacchi } i40e_state_t;
3819d26e4fcSRobert Mustacchi 
3829d26e4fcSRobert Mustacchi 
3839d26e4fcSRobert Mustacchi /*
3849d26e4fcSRobert Mustacchi  * Definitions for common Intel things that we use and some slightly more usable
3859d26e4fcSRobert Mustacchi  * names.
3869d26e4fcSRobert Mustacchi  */
3879d26e4fcSRobert Mustacchi typedef struct i40e_hw i40e_hw_t;
3889d26e4fcSRobert Mustacchi typedef struct i40e_aqc_switch_resource_alloc_element_resp i40e_switch_rsrc_t;
3899d26e4fcSRobert Mustacchi 
3909d26e4fcSRobert Mustacchi /*
3919d26e4fcSRobert Mustacchi  * Handles and addresses of DMA buffers.
3929d26e4fcSRobert Mustacchi  */
3939d26e4fcSRobert Mustacchi typedef struct i40e_dma_buffer {
3949d26e4fcSRobert Mustacchi 	caddr_t		dmab_address;		/* Virtual address */
3959d26e4fcSRobert Mustacchi 	uint64_t	dmab_dma_address;	/* DMA (Hardware) address */
3969d26e4fcSRobert Mustacchi 	ddi_acc_handle_t dmab_acc_handle;	/* Data access handle */
3979d26e4fcSRobert Mustacchi 	ddi_dma_handle_t dmab_dma_handle;	/* DMA handle */
3989d26e4fcSRobert Mustacchi 	size_t		dmab_size;		/* Buffer size */
3999d26e4fcSRobert Mustacchi 	size_t		dmab_len;		/* Data length in the buffer */
4009d26e4fcSRobert Mustacchi } i40e_dma_buffer_t;
4019d26e4fcSRobert Mustacchi 
4029d26e4fcSRobert Mustacchi /*
4039d26e4fcSRobert Mustacchi  * RX Control Block
4049d26e4fcSRobert Mustacchi  */
4059d26e4fcSRobert Mustacchi typedef struct i40e_rx_control_block {
4069d26e4fcSRobert Mustacchi 	mblk_t			*rcb_mp;
4079d26e4fcSRobert Mustacchi 	uint32_t		rcb_ref;
4089d26e4fcSRobert Mustacchi 	i40e_dma_buffer_t	rcb_dma;
4099d26e4fcSRobert Mustacchi 	frtn_t			rcb_free_rtn;
4109d26e4fcSRobert Mustacchi 	struct i40e_rx_data	*rcb_rxd;
4119d26e4fcSRobert Mustacchi } i40e_rx_control_block_t;
4129d26e4fcSRobert Mustacchi 
4139d26e4fcSRobert Mustacchi typedef enum {
4149d26e4fcSRobert Mustacchi 	I40E_TX_NONE,
4159d26e4fcSRobert Mustacchi 	I40E_TX_COPY,
41609aee612SRyan Zezeski 	I40E_TX_DMA,
41709aee612SRyan Zezeski 	I40E_TX_DESC,
4189d26e4fcSRobert Mustacchi } i40e_tx_type_t;
4199d26e4fcSRobert Mustacchi 
4209d26e4fcSRobert Mustacchi typedef struct i40e_tx_desc i40e_tx_desc_t;
42109aee612SRyan Zezeski typedef struct i40e_tx_context_desc i40e_tx_context_desc_t;
4229d26e4fcSRobert Mustacchi typedef union i40e_32byte_rx_desc i40e_rx_desc_t;
4239d26e4fcSRobert Mustacchi 
42409aee612SRyan Zezeski struct i40e_dma_bind_info {
42509aee612SRyan Zezeski 	caddr_t dbi_paddr;
42609aee612SRyan Zezeski 	size_t dbi_len;
42709aee612SRyan Zezeski };
42809aee612SRyan Zezeski 
4299d26e4fcSRobert Mustacchi typedef struct i40e_tx_control_block {
4309d26e4fcSRobert Mustacchi 	struct i40e_tx_control_block	*tcb_next;
4319d26e4fcSRobert Mustacchi 	mblk_t				*tcb_mp;
4329d26e4fcSRobert Mustacchi 	i40e_tx_type_t			tcb_type;
4339d26e4fcSRobert Mustacchi 	ddi_dma_handle_t		tcb_dma_handle;
43409aee612SRyan Zezeski 	ddi_dma_handle_t		tcb_lso_dma_handle;
4359d26e4fcSRobert Mustacchi 	i40e_dma_buffer_t		tcb_dma;
43609aee612SRyan Zezeski 	struct i40e_dma_bind_info	*tcb_bind_info;
43709aee612SRyan Zezeski 	uint_t				tcb_bind_ncookies;
43809aee612SRyan Zezeski 	boolean_t			tcb_used_lso;
4399d26e4fcSRobert Mustacchi } i40e_tx_control_block_t;
4409d26e4fcSRobert Mustacchi 
4419d26e4fcSRobert Mustacchi /*
4429d26e4fcSRobert Mustacchi  * Receive ring data (used below).
4439d26e4fcSRobert Mustacchi  */
4449d26e4fcSRobert Mustacchi typedef struct i40e_rx_data {
4459d26e4fcSRobert Mustacchi 	struct i40e	*rxd_i40e;
4469d26e4fcSRobert Mustacchi 
4479d26e4fcSRobert Mustacchi 	/*
4489d26e4fcSRobert Mustacchi 	 * RX descriptor ring definitions
4499d26e4fcSRobert Mustacchi 	 */
4509d26e4fcSRobert Mustacchi 	i40e_dma_buffer_t rxd_desc_area;	/* DMA buffer of rx desc ring */
4519d26e4fcSRobert Mustacchi 	i40e_rx_desc_t *rxd_desc_ring;		/* Rx desc ring */
4529d26e4fcSRobert Mustacchi 	uint32_t rxd_desc_next;			/* Index of next rx desc */
4539d26e4fcSRobert Mustacchi 
4549d26e4fcSRobert Mustacchi 	/*
4559d26e4fcSRobert Mustacchi 	 * RX control block list definitions
4569d26e4fcSRobert Mustacchi 	 */
4579d26e4fcSRobert Mustacchi 	kmutex_t		rxd_free_lock;	/* Lock to protect free data */
4589d26e4fcSRobert Mustacchi 	i40e_rx_control_block_t	*rxd_rcb_area;	/* Array of control blocks */
4599d26e4fcSRobert Mustacchi 	i40e_rx_control_block_t	**rxd_work_list; /* Work list of rcbs */
4609d26e4fcSRobert Mustacchi 	i40e_rx_control_block_t	**rxd_free_list; /* Free list of rcbs */
4619d26e4fcSRobert Mustacchi 	uint32_t		rxd_rcb_free;	/* Number of free rcbs */
4629d26e4fcSRobert Mustacchi 
4639d26e4fcSRobert Mustacchi 	/*
4649d26e4fcSRobert Mustacchi 	 * RX software ring settings
4659d26e4fcSRobert Mustacchi 	 */
4669d26e4fcSRobert Mustacchi 	uint32_t	rxd_ring_size;		/* Rx descriptor ring size */
4679d26e4fcSRobert Mustacchi 	uint32_t	rxd_free_list_size;	/* Rx free list size */
4689d26e4fcSRobert Mustacchi 
4699d26e4fcSRobert Mustacchi 	/*
4709d26e4fcSRobert Mustacchi 	 * RX outstanding data. This is used to keep track of outstanding loaned
4719d26e4fcSRobert Mustacchi 	 * descriptors after we've shut down receiving information. Note these
4729d26e4fcSRobert Mustacchi 	 * are protected by the i40e_t`i40e_rx_pending_lock.
4739d26e4fcSRobert Mustacchi 	 */
4749d26e4fcSRobert Mustacchi 	uint32_t	rxd_rcb_pending;
4759d26e4fcSRobert Mustacchi 	boolean_t	rxd_shutdown;
4769d26e4fcSRobert Mustacchi } i40e_rx_data_t;
4779d26e4fcSRobert Mustacchi 
4789d26e4fcSRobert Mustacchi /*
4799d26e4fcSRobert Mustacchi  * Structures for unicast and multicast addresses. Note that we keep the VSI id
4809d26e4fcSRobert Mustacchi  * around for unicast addresses, since they may belong to different VSIs.
4819d26e4fcSRobert Mustacchi  * However, since all multicast addresses belong to the default VSI, we don't
4829d26e4fcSRobert Mustacchi  * duplicate that information.
4839d26e4fcSRobert Mustacchi  */
4849d26e4fcSRobert Mustacchi typedef struct i40e_uaddr {
4859d26e4fcSRobert Mustacchi 	uint8_t iua_mac[ETHERADDRL];
4869d26e4fcSRobert Mustacchi 	int	iua_vsi;
4879d26e4fcSRobert Mustacchi } i40e_uaddr_t;
4889d26e4fcSRobert Mustacchi 
4899d26e4fcSRobert Mustacchi typedef struct i40e_maddr {
4909d26e4fcSRobert Mustacchi 	uint8_t ima_mac[ETHERADDRL];
4919d26e4fcSRobert Mustacchi } i40e_maddr_t;
4929d26e4fcSRobert Mustacchi 
4939d26e4fcSRobert Mustacchi /*
4949d26e4fcSRobert Mustacchi  * Collection of RX statistics on a given queue.
4959d26e4fcSRobert Mustacchi  */
4969d26e4fcSRobert Mustacchi typedef struct i40e_rxq_stat {
4979d26e4fcSRobert Mustacchi 	/*
4989d26e4fcSRobert Mustacchi 	 * The i40e hardware does not maintain statistics on a per-ring basis,
4999d26e4fcSRobert Mustacchi 	 * only on a per-PF and per-VSI level. As such, to satisfy the GLDv3, we
5009d26e4fcSRobert Mustacchi 	 * need to maintain our own stats for packets and bytes.
5019d26e4fcSRobert Mustacchi 	 */
5029d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_bytes;	/* Bytes in on queue */
5039d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_packets;	/* Packets in on queue */
5049d26e4fcSRobert Mustacchi 
5059d26e4fcSRobert Mustacchi 	/*
5069d26e4fcSRobert Mustacchi 	 * The following set of stats cover non-checksum data path issues.
5079d26e4fcSRobert Mustacchi 	 */
5089d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_rx_desc_error;	/* Error bit set on desc */
5099d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_rx_copy_nomem;	/* allocb failure for copy */
5109d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_rx_intr_limit;	/* Hit i40e_rx_limit_per_intr */
5119d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_rx_bind_norcb;	/* No replacement rcb free */
5129d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_rx_bind_nomp;	/* No mblk_t in bind rcb */
5139d26e4fcSRobert Mustacchi 
5149d26e4fcSRobert Mustacchi 	/*
5159d26e4fcSRobert Mustacchi 	 * The following set of statistics covers rx checksum related activity.
5169d26e4fcSRobert Mustacchi 	 * These are all primarily set in i40e_rx_hcksum. If rx checksum
5179d26e4fcSRobert Mustacchi 	 * activity is disabled, then these should all be zero.
5189d26e4fcSRobert Mustacchi 	 */
5199d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_v4hdrok;	/* Valid IPv4 Header */
5209d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_l4hdrok;	/* Valid L4 Header */
5219d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_unknown;	/* !pinfo.known */
5229d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_nol3l4p;	/* Missing L3L4P bit in desc */
5239d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_iperr;		/* IPE error bit set */
5249d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_eiperr;	/* EIPE error bit set */
5259d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_l4err;		/* L4E error bit set */
5269d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_v6skip;	/* IPv6 case hw fails on */
5279d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_set;		/* Total times we set cksum */
5289d26e4fcSRobert Mustacchi 	kstat_named_t	irxs_hck_miss;		/* Times with zero cksum bits */
5299d26e4fcSRobert Mustacchi } i40e_rxq_stat_t;
5309d26e4fcSRobert Mustacchi 
5319d26e4fcSRobert Mustacchi /*
5329d26e4fcSRobert Mustacchi  * Collection of TX Statistics on a given queue
5339d26e4fcSRobert Mustacchi  */
5349d26e4fcSRobert Mustacchi typedef struct i40e_txq_stat {
5359d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_bytes;		/* Bytes out on queue */
5369d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_packets;		/* Packets out on queue */
5379d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_descriptors;	/* Descriptors issued */
5389d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_recycled;		/* Descriptors reclaimed */
53909aee612SRyan Zezeski 	kstat_named_t	itxs_force_copy;	/* non-TSO force copy */
54009aee612SRyan Zezeski 	kstat_named_t	itxs_tso_force_copy;	/* TSO force copy */
5419d26e4fcSRobert Mustacchi 	/*
5429d26e4fcSRobert Mustacchi 	 * Various failure conditions.
5439d26e4fcSRobert Mustacchi 	 */
5449d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_meoifail;	/* ether offload failures */
5459d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_nol2info;	/* Missing l2 info */
5469d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_nol3info;	/* Missing l3 info */
5479d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_nol4info;	/* Missing l4 info */
5489d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_badl3;		/* Not IPv4/IPv6 */
5499d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_hck_badl4;		/* Bad L4 Paylaod */
55009aee612SRyan Zezeski 	kstat_named_t	itxs_lso_nohck;		/* Missing offloads for LSO */
55109aee612SRyan Zezeski 	kstat_named_t	itxs_bind_fails;	/* DMA bind failures */
55209aee612SRyan Zezeski 	kstat_named_t	itxs_tx_short;		/* Tx chain too short */
5539d26e4fcSRobert Mustacchi 
5549d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_err_notcb;		/* No tcb's available */
5559d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_err_nodescs;	/* No tcb's available */
5569d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_err_context;	/* Total context failures */
5579d26e4fcSRobert Mustacchi 
5589d26e4fcSRobert Mustacchi 	kstat_named_t	itxs_num_unblocked;	/* Number of MAC unblocks */
5599d26e4fcSRobert Mustacchi } i40e_txq_stat_t;
5609d26e4fcSRobert Mustacchi 
5619d26e4fcSRobert Mustacchi /*
5629d26e4fcSRobert Mustacchi  * An instance of an XL710 transmit/receive queue pair. This currently
5639d26e4fcSRobert Mustacchi  * represents a combination of both a transmit and receive ring, though they
5649d26e4fcSRobert Mustacchi  * should really be split apart into separate logical structures. Unfortunately,
5659d26e4fcSRobert Mustacchi  * during initial work we mistakenly joined them together.
5669d26e4fcSRobert Mustacchi  */
5679d26e4fcSRobert Mustacchi typedef struct i40e_trqpair {
5689d26e4fcSRobert Mustacchi 	struct i40e *itrq_i40e;
5699d26e4fcSRobert Mustacchi 
570aa2a44afSPaul Winder 	/* interrupt control structures */
571aa2a44afSPaul Winder 	kmutex_t itrq_intr_lock;
572aa2a44afSPaul Winder 	kcondvar_t itrq_intr_cv;
573aa2a44afSPaul Winder 	boolean_t itrq_intr_busy;	/* Busy processing interrupt */
574aa2a44afSPaul Winder 	boolean_t itrq_intr_quiesce;	/* Interrupt quiesced */
575aa2a44afSPaul Winder 
576aa2a44afSPaul Winder 	hrtime_t irtq_time_stopped;	/* Time when ring was stopped */
577aa2a44afSPaul Winder 
5789d26e4fcSRobert Mustacchi 	/* Receive-side structures. */
5799d26e4fcSRobert Mustacchi 	kmutex_t itrq_rx_lock;
5809d26e4fcSRobert Mustacchi 	mac_ring_handle_t itrq_macrxring; /* Receive ring handle. */
5819d26e4fcSRobert Mustacchi 	i40e_rx_data_t *itrq_rxdata;	/* Receive ring rx data. */
5829d26e4fcSRobert Mustacchi 	uint64_t itrq_rxgen;		/* Generation number for mac/GLDv3. */
5839d26e4fcSRobert Mustacchi 	uint32_t itrq_index;		/* Queue index in the PF */
5849d26e4fcSRobert Mustacchi 	uint32_t itrq_rx_intrvec;	/* Receive interrupt vector. */
585396505afSPaul Winder 	boolean_t itrq_intr_poll;	/* True when polling */
5869d26e4fcSRobert Mustacchi 
5879d26e4fcSRobert Mustacchi 	/* Receive-side stats. */
5889d26e4fcSRobert Mustacchi 	i40e_rxq_stat_t	itrq_rxstat;
5899d26e4fcSRobert Mustacchi 	kstat_t	*itrq_rxkstat;
5909d26e4fcSRobert Mustacchi 
5919d26e4fcSRobert Mustacchi 	/* Transmit-side structures. */
5929d26e4fcSRobert Mustacchi 	kmutex_t itrq_tx_lock;
593aa2a44afSPaul Winder 	kcondvar_t itrq_tx_cv;
594aa2a44afSPaul Winder 	uint_t itrq_tx_active;		/* No. of active i40e_ring_tx()'s */
595aa2a44afSPaul Winder 	boolean_t itrq_tx_quiesce;	/* Tx is quiesced */
5969d26e4fcSRobert Mustacchi 	mac_ring_handle_t itrq_mactxring; /* Transmit ring handle. */
5979d26e4fcSRobert Mustacchi 	uint32_t itrq_tx_intrvec;	/* Transmit interrupt vector. */
5989d26e4fcSRobert Mustacchi 	boolean_t itrq_tx_blocked;	/* Does MAC think we're blocked? */
5999d26e4fcSRobert Mustacchi 
6009d26e4fcSRobert Mustacchi 	/*
6019d26e4fcSRobert Mustacchi 	 * TX data sizing
6029d26e4fcSRobert Mustacchi 	 */
6039d26e4fcSRobert Mustacchi 	uint32_t		itrq_tx_ring_size;
6049d26e4fcSRobert Mustacchi 	uint32_t		itrq_tx_free_list_size;
6059d26e4fcSRobert Mustacchi 
6069d26e4fcSRobert Mustacchi 	/*
6079d26e4fcSRobert Mustacchi 	 * TX descriptor ring data
6089d26e4fcSRobert Mustacchi 	 */
6099d26e4fcSRobert Mustacchi 	i40e_dma_buffer_t	itrq_desc_area;	/* DMA buffer of tx desc ring */
6109d26e4fcSRobert Mustacchi 	i40e_tx_desc_t		*itrq_desc_ring; /* TX Desc ring */
611508a0e8cSRob Johnston 	volatile uint32_t	*itrq_desc_wbhead; /* TX write-back index */
6129d26e4fcSRobert Mustacchi 	uint32_t		itrq_desc_head;	/* Last index hw freed */
6139d26e4fcSRobert Mustacchi 	uint32_t		itrq_desc_tail;	/* Index of next free desc */
6149d26e4fcSRobert Mustacchi 	uint32_t		itrq_desc_free;	/* Number of free descriptors */
6159d26e4fcSRobert Mustacchi 
6169d26e4fcSRobert Mustacchi 	/*
6179d26e4fcSRobert Mustacchi 	 * TX control block (tcb) data
6189d26e4fcSRobert Mustacchi 	 */
6199d26e4fcSRobert Mustacchi 	kmutex_t		itrq_tcb_lock;
6209d26e4fcSRobert Mustacchi 	i40e_tx_control_block_t	*itrq_tcb_area;	/* Array of control blocks */
6219d26e4fcSRobert Mustacchi 	i40e_tx_control_block_t	**itrq_tcb_work_list;	/* In use tcb */
6229d26e4fcSRobert Mustacchi 	i40e_tx_control_block_t	**itrq_tcb_free_list;	/* Available tcb */
6239d26e4fcSRobert Mustacchi 	uint32_t		itrq_tcb_free;	/* Count of free tcb */
6249d26e4fcSRobert Mustacchi 
6259d26e4fcSRobert Mustacchi 	/* Transmit-side stats. */
6269d26e4fcSRobert Mustacchi 	i40e_txq_stat_t		itrq_txstat;
6279d26e4fcSRobert Mustacchi 	kstat_t			*itrq_txkstat;
6289d26e4fcSRobert Mustacchi 
6299d26e4fcSRobert Mustacchi } i40e_trqpair_t;
6309d26e4fcSRobert Mustacchi 
6319d26e4fcSRobert Mustacchi /*
6329d26e4fcSRobert Mustacchi  * VSI statistics.
6339d26e4fcSRobert Mustacchi  *
6349d26e4fcSRobert Mustacchi  * This mirrors the i40e_eth_stats structure but transforms it into a kstat.
6359d26e4fcSRobert Mustacchi  * Note that the stock statistic structure also includes entries for tx
6369d26e4fcSRobert Mustacchi  * discards. However, this is not actually implemented for the VSI (see Table
6379d26e4fcSRobert Mustacchi  * 7-221), hence why we don't include the member which would always have a value
6389d26e4fcSRobert Mustacchi  * of zero. This choice was made to minimize confusion to someone looking at
6399d26e4fcSRobert Mustacchi  * these, as a value of zero does not necessarily equate to the fact that it's
6409d26e4fcSRobert Mustacchi  * not implemented.
6419d26e4fcSRobert Mustacchi  */
6429d26e4fcSRobert Mustacchi typedef struct i40e_vsi_stats {
6439d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_bytes;			/* gorc */
6449d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_unicast;		/* uprc */
6459d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_multicast;		/* mprc */
6469d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_broadcast;		/* bprc */
6479d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_discards;		/* rdpc */
6489d26e4fcSRobert Mustacchi 	uint64_t ivs_rx_unknown_protocol;	/* rupp */
6499d26e4fcSRobert Mustacchi 	uint64_t ivs_tx_bytes;			/* gotc */
6509d26e4fcSRobert Mustacchi 	uint64_t ivs_tx_unicast;		/* uptc */
6519d26e4fcSRobert Mustacchi 	uint64_t ivs_tx_multicast;		/* mptc */
6529d26e4fcSRobert Mustacchi 	uint64_t ivs_tx_broadcast;		/* bptc */
6539d26e4fcSRobert Mustacchi 	uint64_t ivs_tx_errors;			/* tepc */
6549d26e4fcSRobert Mustacchi } i40e_vsi_stats_t;
6559d26e4fcSRobert Mustacchi 
6569d26e4fcSRobert Mustacchi typedef struct i40e_vsi_kstats {
6579d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_bytes;
6589d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_unicast;
6599d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_multicast;
6609d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_broadcast;
6619d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_discards;
6629d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_rx_unknown_protocol;
6639d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_tx_bytes;
6649d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_tx_unicast;
6659d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_tx_multicast;
6669d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_tx_broadcast;
6679d26e4fcSRobert Mustacchi 	kstat_named_t	ivk_tx_errors;
6689d26e4fcSRobert Mustacchi } i40e_vsi_kstats_t;
6699d26e4fcSRobert Mustacchi 
6709d26e4fcSRobert Mustacchi /*
6719d26e4fcSRobert Mustacchi  * For pf statistics, we opt not to use the standard statistics as defined by
6729d26e4fcSRobert Mustacchi  * the Intel common code. This also currently combines statistics that are
6739d26e4fcSRobert Mustacchi  * global across the entire device.
6749d26e4fcSRobert Mustacchi  */
6759d26e4fcSRobert Mustacchi typedef struct i40e_pf_stats {
6769d26e4fcSRobert Mustacchi 	uint64_t ips_rx_bytes;			/* gorc */
6779d26e4fcSRobert Mustacchi 	uint64_t ips_rx_unicast;		/* uprc */
6789d26e4fcSRobert Mustacchi 	uint64_t ips_rx_multicast;		/* mprc */
6799d26e4fcSRobert Mustacchi 	uint64_t ips_rx_broadcast;		/* bprc */
6809d26e4fcSRobert Mustacchi 	uint64_t ips_tx_bytes;			/* gotc */
6819d26e4fcSRobert Mustacchi 	uint64_t ips_tx_unicast;		/* uptc */
6829d26e4fcSRobert Mustacchi 	uint64_t ips_tx_multicast;		/* mptc */
6839d26e4fcSRobert Mustacchi 	uint64_t ips_tx_broadcast;		/* bptc */
6849d26e4fcSRobert Mustacchi 
6859d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_64;		/* prc64 */
6869d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_127;		/* prc127 */
6879d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_255;		/* prc255 */
6889d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_511;		/* prc511 */
6899d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_1023;		/* prc1023 */
6909d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_1522;		/* prc1522 */
6919d26e4fcSRobert Mustacchi 	uint64_t ips_rx_size_9522;		/* prc9522 */
6929d26e4fcSRobert Mustacchi 
6939d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_64;		/* ptc64 */
6949d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_127;		/* ptc127 */
6959d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_255;		/* ptc255 */
6969d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_511;		/* ptc511 */
6979d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_1023;		/* ptc1023 */
6989d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_1522;		/* ptc1522 */
6999d26e4fcSRobert Mustacchi 	uint64_t ips_tx_size_9522;		/* ptc9522 */
7009d26e4fcSRobert Mustacchi 
7019d26e4fcSRobert Mustacchi 	uint64_t ips_link_xon_rx;		/* lxonrxc */
7029d26e4fcSRobert Mustacchi 	uint64_t ips_link_xoff_rx;		/* lxoffrxc */
7039d26e4fcSRobert Mustacchi 	uint64_t ips_link_xon_tx;		/* lxontxc */
7049d26e4fcSRobert Mustacchi 	uint64_t ips_link_xoff_tx;		/* lxofftxc */
7059d26e4fcSRobert Mustacchi 	uint64_t ips_priority_xon_rx[8];	/* pxonrxc[8] */
7069d26e4fcSRobert Mustacchi 	uint64_t ips_priority_xoff_rx[8];	/* pxoffrxc[8] */
7079d26e4fcSRobert Mustacchi 	uint64_t ips_priority_xon_tx[8];	/* pxontxc[8] */
7089d26e4fcSRobert Mustacchi 	uint64_t ips_priority_xoff_tx[8];	/* pxofftxc[8] */
7099d26e4fcSRobert Mustacchi 	uint64_t ips_priority_xon_2_xoff[8];	/* rxon2offcnt[8] */
7109d26e4fcSRobert Mustacchi 
7119d26e4fcSRobert Mustacchi 	uint64_t ips_crc_errors;		/* crcerrs */
7129d26e4fcSRobert Mustacchi 	uint64_t ips_illegal_bytes;		/* illerrc */
7139d26e4fcSRobert Mustacchi 	uint64_t ips_mac_local_faults;		/* mlfc */
7149d26e4fcSRobert Mustacchi 	uint64_t ips_mac_remote_faults;		/* mrfc */
7159d26e4fcSRobert Mustacchi 	uint64_t ips_rx_length_errors;		/* rlec */
7169d26e4fcSRobert Mustacchi 	uint64_t ips_rx_undersize;		/* ruc */
7179d26e4fcSRobert Mustacchi 	uint64_t ips_rx_fragments;		/* rfc */
7189d26e4fcSRobert Mustacchi 	uint64_t ips_rx_oversize;		/* roc */
7199d26e4fcSRobert Mustacchi 	uint64_t ips_rx_jabber;			/* rjc */
7209d26e4fcSRobert Mustacchi 	uint64_t ips_rx_discards;		/* rdpc */
7219d26e4fcSRobert Mustacchi 	uint64_t ips_rx_vm_discards;		/* ldpc */
7229d26e4fcSRobert Mustacchi 	uint64_t ips_rx_short_discards;		/* mspdc */
7239d26e4fcSRobert Mustacchi 	uint64_t ips_tx_dropped_link_down;	/* tdold */
7249d26e4fcSRobert Mustacchi 	uint64_t ips_rx_unknown_protocol;	/* rupp */
7259d26e4fcSRobert Mustacchi 	uint64_t ips_rx_err1;			/* rxerr1 */
7269d26e4fcSRobert Mustacchi 	uint64_t ips_rx_err2;			/* rxerr2 */
7279d26e4fcSRobert Mustacchi } i40e_pf_stats_t;
7289d26e4fcSRobert Mustacchi 
7299d26e4fcSRobert Mustacchi typedef struct i40e_pf_kstats {
7309d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_bytes;		/* gorc */
7319d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_unicast;		/* uprc */
7329d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_multicast;		/* mprc */
7339d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_broadcast;		/* bprc */
7349d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_bytes;		/* gotc */
7359d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_unicast;		/* uptc */
7369d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_multicast;		/* mptc */
7379d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_broadcast;		/* bptc */
7389d26e4fcSRobert Mustacchi 
7399d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_64;		/* prc64 */
7409d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_127;		/* prc127 */
7419d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_255;		/* prc255 */
7429d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_511;		/* prc511 */
7439d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_1023;		/* prc1023 */
7449d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_1522;		/* prc1522 */
7459d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_size_9522;		/* prc9522 */
7469d26e4fcSRobert Mustacchi 
7479d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_64;		/* ptc64 */
7489d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_127;		/* ptc127 */
7499d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_255;		/* ptc255 */
7509d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_511;		/* ptc511 */
7519d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_1023;		/* ptc1023 */
7529d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_1522;		/* ptc1522 */
7539d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_size_9522;		/* ptc9522 */
7549d26e4fcSRobert Mustacchi 
7559d26e4fcSRobert Mustacchi 	kstat_named_t ipk_link_xon_rx;		/* lxonrxc */
7569d26e4fcSRobert Mustacchi 	kstat_named_t ipk_link_xoff_rx;		/* lxoffrxc */
7579d26e4fcSRobert Mustacchi 	kstat_named_t ipk_link_xon_tx;		/* lxontxc */
7589d26e4fcSRobert Mustacchi 	kstat_named_t ipk_link_xoff_tx;		/* lxofftxc */
7599d26e4fcSRobert Mustacchi 	kstat_named_t ipk_priority_xon_rx[8];	/* pxonrxc[8] */
7609d26e4fcSRobert Mustacchi 	kstat_named_t ipk_priority_xoff_rx[8];	/* pxoffrxc[8] */
7619d26e4fcSRobert Mustacchi 	kstat_named_t ipk_priority_xon_tx[8];	/* pxontxc[8] */
7629d26e4fcSRobert Mustacchi 	kstat_named_t ipk_priority_xoff_tx[8];	/* pxofftxc[8] */
7639d26e4fcSRobert Mustacchi 	kstat_named_t ipk_priority_xon_2_xoff[8];	/* rxon2offcnt[8] */
7649d26e4fcSRobert Mustacchi 
7659d26e4fcSRobert Mustacchi 	kstat_named_t ipk_crc_errors;		/* crcerrs */
7669d26e4fcSRobert Mustacchi 	kstat_named_t ipk_illegal_bytes;	/* illerrc */
7679d26e4fcSRobert Mustacchi 	kstat_named_t ipk_mac_local_faults;	/* mlfc */
7689d26e4fcSRobert Mustacchi 	kstat_named_t ipk_mac_remote_faults;	/* mrfc */
7699d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_length_errors;	/* rlec */
7709d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_undersize;		/* ruc */
7719d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_fragments;		/* rfc */
7729d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_oversize;		/* roc */
7739d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_jabber;		/* rjc */
7749d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_discards;		/* rdpc */
7759d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_vm_discards;	/* ldpc */
7769d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_short_discards;	/* mspdc */
7779d26e4fcSRobert Mustacchi 	kstat_named_t ipk_tx_dropped_link_down;	/* tdold */
7789d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_unknown_protocol;	/* rupp */
7799d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_err1;		/* rxerr1 */
7809d26e4fcSRobert Mustacchi 	kstat_named_t ipk_rx_err2;		/* rxerr2 */
7819d26e4fcSRobert Mustacchi } i40e_pf_kstats_t;
7829d26e4fcSRobert Mustacchi 
7839d26e4fcSRobert Mustacchi /*
7849d26e4fcSRobert Mustacchi  * Resources that are pooled and specific to a given i40e_t.
7859d26e4fcSRobert Mustacchi  */
7869d26e4fcSRobert Mustacchi typedef struct i40e_func_rsrc {
7879d26e4fcSRobert Mustacchi 	uint_t	ifr_nrx_queue;
7889d26e4fcSRobert Mustacchi 	uint_t	ifr_nrx_queue_used;
7899d26e4fcSRobert Mustacchi 	uint_t	ifr_ntx_queue;
7909d26e4fcSRobert Mustacchi 	uint_t	ifr_trx_queue_used;
7919d26e4fcSRobert Mustacchi 	uint_t	ifr_nvsis;
7929d26e4fcSRobert Mustacchi 	uint_t	ifr_nvsis_used;
7939d26e4fcSRobert Mustacchi 	uint_t	ifr_nmacfilt;
7949d26e4fcSRobert Mustacchi 	uint_t	ifr_nmacfilt_used;
7959d26e4fcSRobert Mustacchi 	uint_t	ifr_nmcastfilt;
7969d26e4fcSRobert Mustacchi 	uint_t	ifr_nmcastfilt_used;
7979d26e4fcSRobert Mustacchi } i40e_func_rsrc_t;
7989d26e4fcSRobert Mustacchi 
79909aee612SRyan Zezeski typedef struct i40e_vsi {
80009aee612SRyan Zezeski 	uint16_t		iv_seid;
80109aee612SRyan Zezeski 	uint16_t		iv_number;
80209aee612SRyan Zezeski 	kstat_t			*iv_kstats;
80309aee612SRyan Zezeski 	i40e_vsi_stats_t	iv_stats;
80409aee612SRyan Zezeski 	uint16_t		iv_stats_id;
80509aee612SRyan Zezeski } i40e_vsi_t;
80609aee612SRyan Zezeski 
80709aee612SRyan Zezeski /*
80809aee612SRyan Zezeski  * While irg_index and irg_grp_hdl aren't used anywhere, they are
80909aee612SRyan Zezeski  * still useful for debugging.
81009aee612SRyan Zezeski  */
81109aee612SRyan Zezeski typedef struct i40e_rx_group {
81209aee612SRyan Zezeski 	uint32_t		irg_index;    /* index in i40e_rx_groups[] */
81309aee612SRyan Zezeski 	uint16_t		irg_vsi_seid; /* SEID of VSI for this group */
81409aee612SRyan Zezeski 	mac_group_handle_t	irg_grp_hdl;  /* handle to mac_group_t */
81509aee612SRyan Zezeski 	struct i40e		*irg_i40e;    /* ref to i40e_t */
81609aee612SRyan Zezeski } i40e_rx_group_t;
81709aee612SRyan Zezeski 
8189d26e4fcSRobert Mustacchi /*
8199d26e4fcSRobert Mustacchi  * Main i40e per-instance state.
8209d26e4fcSRobert Mustacchi  */
8219d26e4fcSRobert Mustacchi typedef struct i40e {
8229d26e4fcSRobert Mustacchi 	list_node_t	i40e_glink;		/* Global list link */
8239d26e4fcSRobert Mustacchi 	list_node_t	i40e_dlink;		/* Device list link */
8249d26e4fcSRobert Mustacchi 	kmutex_t	i40e_general_lock;	/* General device lock */
8259d26e4fcSRobert Mustacchi 
8269d26e4fcSRobert Mustacchi 	/*
8279d26e4fcSRobert Mustacchi 	 * General Data and management
8289d26e4fcSRobert Mustacchi 	 */
8299d26e4fcSRobert Mustacchi 	dev_info_t	*i40e_dip;
8309d26e4fcSRobert Mustacchi 	int		i40e_instance;
8319d26e4fcSRobert Mustacchi 	int		i40e_fm_capabilities;
8329d26e4fcSRobert Mustacchi 	uint_t		i40e_state;
8339d26e4fcSRobert Mustacchi 	i40e_attach_state_t i40e_attach_progress;
8349d26e4fcSRobert Mustacchi 	mac_handle_t	i40e_mac_hdl;
8359d26e4fcSRobert Mustacchi 	ddi_periodic_t	i40e_periodic_id;
8369d26e4fcSRobert Mustacchi 
8379d26e4fcSRobert Mustacchi 	/*
8389d26e4fcSRobert Mustacchi 	 * Pointers to common code data structures and memory for the common
8399d26e4fcSRobert Mustacchi 	 * code.
8409d26e4fcSRobert Mustacchi 	 */
8419d26e4fcSRobert Mustacchi 	struct i40e_hw				i40e_hw_space;
8429d26e4fcSRobert Mustacchi 	struct i40e_osdep			i40e_osdep_space;
8439d26e4fcSRobert Mustacchi 	struct i40e_aq_get_phy_abilities_resp	i40e_phy;
844508a0e8cSRob Johnston 	void					*i40e_aqbuf;
8459d26e4fcSRobert Mustacchi 
84609aee612SRyan Zezeski #define	I40E_DEF_VSI_IDX	0
84709aee612SRyan Zezeski #define	I40E_DEF_VSI(i40e)	((i40e)->i40e_vsis[I40E_DEF_VSI_IDX])
84809aee612SRyan Zezeski #define	I40E_DEF_VSI_SEID(i40e)	(I40E_DEF_VSI(i40e).iv_seid)
84909aee612SRyan Zezeski 
8509d26e4fcSRobert Mustacchi 	/*
8519d26e4fcSRobert Mustacchi 	 * Device state, switch information, and resources.
8529d26e4fcSRobert Mustacchi 	 */
85388628b1bSRyan Zezeski 	i40e_vsi_t		i40e_vsis[I40E_MAX_NUM_RX_GROUPS];
85409aee612SRyan Zezeski 	uint16_t		i40e_mac_seid;	 /* SEID of physical MAC */
85509aee612SRyan Zezeski 	uint16_t		i40e_veb_seid;	 /* switch atop MAC (SEID) */
85609aee612SRyan Zezeski 	uint16_t		i40e_vsi_avail;	 /* VSIs avail to this PF */
85709aee612SRyan Zezeski 	uint16_t		i40e_vsi_used;	 /* VSIs used by this PF */
8589d26e4fcSRobert Mustacchi 	struct i40e_device	*i40e_device;
8599d26e4fcSRobert Mustacchi 	i40e_func_rsrc_t	i40e_resources;
8609d26e4fcSRobert Mustacchi 	uint16_t		i40e_switch_rsrc_alloc;
8619d26e4fcSRobert Mustacchi 	uint16_t		i40e_switch_rsrc_actual;
8629d26e4fcSRobert Mustacchi 	i40e_switch_rsrc_t	*i40e_switch_rsrcs;
8639d26e4fcSRobert Mustacchi 	i40e_uaddr_t		*i40e_uaddrs;
8649d26e4fcSRobert Mustacchi 	i40e_maddr_t		*i40e_maddrs;
8659d26e4fcSRobert Mustacchi 	int			i40e_mcast_promisc_count;
8669d26e4fcSRobert Mustacchi 	boolean_t		i40e_promisc_on;
8679d26e4fcSRobert Mustacchi 	link_state_t		i40e_link_state;
8689d26e4fcSRobert Mustacchi 	uint32_t		i40e_link_speed;	/* In Mbps */
8699d26e4fcSRobert Mustacchi 	link_duplex_t		i40e_link_duplex;
870*11a00484SPaul Winder 	link_fec_t		i40e_fec_requested;
8719d26e4fcSRobert Mustacchi 	uint_t			i40e_sdu;
8729d26e4fcSRobert Mustacchi 	uint_t			i40e_frame_max;
8739d26e4fcSRobert Mustacchi 
8749d26e4fcSRobert Mustacchi 	/*
8759d26e4fcSRobert Mustacchi 	 * Transmit and receive information, tunables, and MAC info.
8769d26e4fcSRobert Mustacchi 	 */
8779d26e4fcSRobert Mustacchi 	i40e_trqpair_t	*i40e_trqpairs;
878508a0e8cSRob Johnston 	boolean_t	i40e_mr_enable;
87909aee612SRyan Zezeski 	uint_t		i40e_num_trqpairs; /* total TRQPs (per PF) */
88009aee612SRyan Zezeski 	uint_t		i40e_num_trqpairs_per_vsi; /* TRQPs per VSI */
8819d26e4fcSRobert Mustacchi 	uint_t		i40e_other_itr;
8829d26e4fcSRobert Mustacchi 
88309aee612SRyan Zezeski 	i40e_rx_group_t	*i40e_rx_groups;
88409aee612SRyan Zezeski 	uint_t		i40e_num_rx_groups;
8859d26e4fcSRobert Mustacchi 	int		i40e_num_rx_descs;
8869d26e4fcSRobert Mustacchi 	uint32_t	i40e_rx_ring_size;
8879d26e4fcSRobert Mustacchi 	uint32_t	i40e_rx_buf_size;
8889d26e4fcSRobert Mustacchi 	boolean_t	i40e_rx_hcksum_enable;
8899d26e4fcSRobert Mustacchi 	uint32_t	i40e_rx_dma_min;
8909d26e4fcSRobert Mustacchi 	uint32_t	i40e_rx_limit_per_intr;
8919d26e4fcSRobert Mustacchi 	uint_t		i40e_rx_itr;
8929d26e4fcSRobert Mustacchi 
8939d26e4fcSRobert Mustacchi 	int		i40e_num_tx_descs;
8949d26e4fcSRobert Mustacchi 	uint32_t	i40e_tx_ring_size;
8959d26e4fcSRobert Mustacchi 	uint32_t	i40e_tx_buf_size;
8969d26e4fcSRobert Mustacchi 	uint32_t	i40e_tx_block_thresh;
8979d26e4fcSRobert Mustacchi 	boolean_t	i40e_tx_hcksum_enable;
89809aee612SRyan Zezeski 	boolean_t	i40e_tx_lso_enable;
8999d26e4fcSRobert Mustacchi 	uint32_t	i40e_tx_dma_min;
9009d26e4fcSRobert Mustacchi 	uint_t		i40e_tx_itr;
9019d26e4fcSRobert Mustacchi 
9029d26e4fcSRobert Mustacchi 	/*
9039d26e4fcSRobert Mustacchi 	 * Interrupt state
9049d26e4fcSRobert Mustacchi 	 */
9059d26e4fcSRobert Mustacchi 	uint_t		i40e_intr_pri;
9069d26e4fcSRobert Mustacchi 	uint_t		i40e_intr_force;
9079d26e4fcSRobert Mustacchi 	uint_t		i40e_intr_type;
9089d26e4fcSRobert Mustacchi 	int		i40e_intr_cap;
9099d26e4fcSRobert Mustacchi 	uint32_t	i40e_intr_count;
9109d26e4fcSRobert Mustacchi 	uint32_t	i40e_intr_count_max;
9119d26e4fcSRobert Mustacchi 	uint32_t	i40e_intr_count_min;
9129d26e4fcSRobert Mustacchi 	size_t		i40e_intr_size;
9139d26e4fcSRobert Mustacchi 	ddi_intr_handle_t *i40e_intr_handles;
9149d26e4fcSRobert Mustacchi 	ddi_cb_handle_t	i40e_callback_handle;
9159d26e4fcSRobert Mustacchi 
9169d26e4fcSRobert Mustacchi 	/*
9179d26e4fcSRobert Mustacchi 	 * DMA attributes. See i40e_transceiver.c for why we have copies of them
9189d26e4fcSRobert Mustacchi 	 * in the i40e_t.
9199d26e4fcSRobert Mustacchi 	 */
9209d26e4fcSRobert Mustacchi 	ddi_dma_attr_t		i40e_static_dma_attr;
9219d26e4fcSRobert Mustacchi 	ddi_dma_attr_t		i40e_txbind_dma_attr;
92209aee612SRyan Zezeski 	ddi_dma_attr_t		i40e_txbind_lso_dma_attr;
9239d26e4fcSRobert Mustacchi 	ddi_device_acc_attr_t	i40e_desc_acc_attr;
9249d26e4fcSRobert Mustacchi 	ddi_device_acc_attr_t	i40e_buf_acc_attr;
9259d26e4fcSRobert Mustacchi 
9269d26e4fcSRobert Mustacchi 	/*
9279d26e4fcSRobert Mustacchi 	 * The following two fields are used to protect and keep track of
9289d26e4fcSRobert Mustacchi 	 * outstanding, loaned buffers to MAC. If we have these, we can't
9299d26e4fcSRobert Mustacchi 	 * detach as we have active DMA memory outstanding.
9309d26e4fcSRobert Mustacchi 	 */
9319d26e4fcSRobert Mustacchi 	kmutex_t	i40e_rx_pending_lock;
9329d26e4fcSRobert Mustacchi 	kcondvar_t	i40e_rx_pending_cv;
9339d26e4fcSRobert Mustacchi 	uint32_t	i40e_rx_pending;
9349d26e4fcSRobert Mustacchi 
9359d26e4fcSRobert Mustacchi 	/*
9369d26e4fcSRobert Mustacchi 	 * PF statistics and VSI statistics.
9379d26e4fcSRobert Mustacchi 	 */
9389d26e4fcSRobert Mustacchi 	kmutex_t		i40e_stat_lock;
9399d26e4fcSRobert Mustacchi 	kstat_t			*i40e_pf_kstat;
9409d26e4fcSRobert Mustacchi 	i40e_pf_stats_t		i40e_pf_stat;
9419d26e4fcSRobert Mustacchi 
9429d26e4fcSRobert Mustacchi 	/*
9439d26e4fcSRobert Mustacchi 	 * Misc. stats and counters that should maybe one day be kstats.
9449d26e4fcSRobert Mustacchi 	 */
9459d26e4fcSRobert Mustacchi 	uint64_t	i40e_s_link_status_errs;
9469d26e4fcSRobert Mustacchi 	uint32_t	i40e_s_link_status_lasterr;
947c1e9c696SRobert Mustacchi 
948c1e9c696SRobert Mustacchi 	/*
949c1e9c696SRobert Mustacchi 	 * LED information. Note this state is only modified in
950c1e9c696SRobert Mustacchi 	 * i40e_gld_set_led() which is protected by MAC's serializer lock.
951c1e9c696SRobert Mustacchi 	 */
952c1e9c696SRobert Mustacchi 	uint32_t	i40e_led_status;
953c1e9c696SRobert Mustacchi 	boolean_t	i40e_led_saved;
954508a0e8cSRob Johnston 
955508a0e8cSRob Johnston 	/* DDI UFM handle */
956508a0e8cSRob Johnston 	ddi_ufm_handle_t	*i40e_ufmh;
9579d26e4fcSRobert Mustacchi } i40e_t;
9589d26e4fcSRobert Mustacchi 
9599d26e4fcSRobert Mustacchi /*
9609d26e4fcSRobert Mustacchi  * The i40e_device represents a PCI device which encapsulates multiple physical
9619d26e4fcSRobert Mustacchi  * functions which are represented as an i40e_t. This is used to track the use
9629d26e4fcSRobert Mustacchi  * of pooled resources throughout all of the various devices.
9639d26e4fcSRobert Mustacchi  */
9649d26e4fcSRobert Mustacchi typedef struct i40e_device {
9659d26e4fcSRobert Mustacchi 	list_node_t	id_link;
9669d26e4fcSRobert Mustacchi 	dev_info_t	*id_parent;
9679d26e4fcSRobert Mustacchi 	uint_t		id_pci_bus;
9689d26e4fcSRobert Mustacchi 	uint_t		id_pci_device;
9699d26e4fcSRobert Mustacchi 	uint_t		id_nfuncs;	/* Total number of functions */
9709d26e4fcSRobert Mustacchi 	uint_t		id_nreg;	/* Total number present */
9719d26e4fcSRobert Mustacchi 	list_t		id_i40e_list;	/* List of i40e_t's registered */
9729d26e4fcSRobert Mustacchi 	i40e_switch_rsrc_t	*id_rsrcs; /* Switch resources for this PF */
9739d26e4fcSRobert Mustacchi 	uint_t		id_rsrcs_alloc;	/* Total allocated resources */
9749d26e4fcSRobert Mustacchi 	uint_t		id_rsrcs_act;	/* Actual number of resources */
9759d26e4fcSRobert Mustacchi } i40e_device_t;
9769d26e4fcSRobert Mustacchi 
9779d26e4fcSRobert Mustacchi /* Values for the interrupt forcing on the NIC. */
9789d26e4fcSRobert Mustacchi #define	I40E_INTR_NONE			0
9799d26e4fcSRobert Mustacchi #define	I40E_INTR_MSIX			1
9809d26e4fcSRobert Mustacchi #define	I40E_INTR_MSI			2
9819d26e4fcSRobert Mustacchi #define	I40E_INTR_LEGACY		3
9829d26e4fcSRobert Mustacchi 
9839d26e4fcSRobert Mustacchi /* Hint that we don't want to do any polling... */
9849d26e4fcSRobert Mustacchi #define	I40E_POLL_NULL			-1
9859d26e4fcSRobert Mustacchi 
9869d26e4fcSRobert Mustacchi /*
9879d26e4fcSRobert Mustacchi  * Logging functions.
9889d26e4fcSRobert Mustacchi  */
9899d26e4fcSRobert Mustacchi /*PRINTFLIKE2*/
9909d26e4fcSRobert Mustacchi extern void i40e_error(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
9919d26e4fcSRobert Mustacchi /*PRINTFLIKE2*/
9929d26e4fcSRobert Mustacchi extern void i40e_notice(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
9939d26e4fcSRobert Mustacchi /*PRINTFLIKE2*/
9949d26e4fcSRobert Mustacchi extern void i40e_log(i40e_t *, const char *, ...) __KPRINTFLIKE(2);
9959d26e4fcSRobert Mustacchi 
9969d26e4fcSRobert Mustacchi /*
9979d26e4fcSRobert Mustacchi  * General link handling functions.
9989d26e4fcSRobert Mustacchi  */
9999d26e4fcSRobert Mustacchi extern void i40e_link_check(i40e_t *);
10009d26e4fcSRobert Mustacchi extern void i40e_update_mtu(i40e_t *);
10019d26e4fcSRobert Mustacchi 
10029d26e4fcSRobert Mustacchi /*
10039d26e4fcSRobert Mustacchi  * FMA functions.
10049d26e4fcSRobert Mustacchi  */
10059d26e4fcSRobert Mustacchi extern int i40e_check_acc_handle(ddi_acc_handle_t);
10069d26e4fcSRobert Mustacchi extern int i40e_check_dma_handle(ddi_dma_handle_t);
10079d26e4fcSRobert Mustacchi extern void i40e_fm_ereport(i40e_t *, char *);
10089d26e4fcSRobert Mustacchi 
10099d26e4fcSRobert Mustacchi /*
10109d26e4fcSRobert Mustacchi  * Interrupt handlers and interrupt handler setup.
10119d26e4fcSRobert Mustacchi  */
10129d26e4fcSRobert Mustacchi extern void i40e_intr_chip_init(i40e_t *);
10139d26e4fcSRobert Mustacchi extern void i40e_intr_chip_fini(i40e_t *);
10149d26e4fcSRobert Mustacchi extern uint_t i40e_intr_msix(void *, void *);
10159d26e4fcSRobert Mustacchi extern uint_t i40e_intr_msi(void *, void *);
10169d26e4fcSRobert Mustacchi extern uint_t i40e_intr_legacy(void *, void *);
10179d26e4fcSRobert Mustacchi extern void i40e_intr_io_enable_all(i40e_t *);
10189d26e4fcSRobert Mustacchi extern void i40e_intr_io_disable_all(i40e_t *);
10199d26e4fcSRobert Mustacchi extern void i40e_intr_io_clear_cause(i40e_t *);
1020338749cbSRobert Mustacchi extern void i40e_intr_rx_queue_disable(i40e_trqpair_t *);
1021338749cbSRobert Mustacchi extern void i40e_intr_rx_queue_enable(i40e_trqpair_t *);
10229d26e4fcSRobert Mustacchi extern void i40e_intr_set_itr(i40e_t *, i40e_itr_index_t, uint_t);
1023aa2a44afSPaul Winder extern void i40e_intr_quiesce(i40e_trqpair_t *);
10249d26e4fcSRobert Mustacchi 
10259d26e4fcSRobert Mustacchi /*
10269d26e4fcSRobert Mustacchi  * Receive-side functions
10279d26e4fcSRobert Mustacchi  */
10289d26e4fcSRobert Mustacchi extern mblk_t *i40e_ring_rx(i40e_trqpair_t *, int);
10299d26e4fcSRobert Mustacchi extern mblk_t *i40e_ring_rx_poll(void *, int);
10309d26e4fcSRobert Mustacchi extern void i40e_rx_recycle(caddr_t);
1031aa2a44afSPaul Winder extern boolean_t i40e_ring_tx_quiesce(i40e_trqpair_t *);
10329d26e4fcSRobert Mustacchi 
10339d26e4fcSRobert Mustacchi /*
10349d26e4fcSRobert Mustacchi  * Transmit-side functions
10359d26e4fcSRobert Mustacchi  */
10369d26e4fcSRobert Mustacchi mblk_t *i40e_ring_tx(void *, mblk_t *);
10379d26e4fcSRobert Mustacchi extern void i40e_tx_recycle_ring(i40e_trqpair_t *);
10389d26e4fcSRobert Mustacchi extern void i40e_tx_cleanup_ring(i40e_trqpair_t *);
10399d26e4fcSRobert Mustacchi 
10409d26e4fcSRobert Mustacchi /*
10419d26e4fcSRobert Mustacchi  * Statistics functions.
10429d26e4fcSRobert Mustacchi  */
10439d26e4fcSRobert Mustacchi extern boolean_t i40e_stats_init(i40e_t *);
10449d26e4fcSRobert Mustacchi extern void i40e_stats_fini(i40e_t *);
104509aee612SRyan Zezeski extern boolean_t i40e_stat_vsi_init(i40e_t *, uint_t);
104609aee612SRyan Zezeski extern void i40e_stat_vsi_fini(i40e_t *, uint_t);
10479d26e4fcSRobert Mustacchi extern boolean_t i40e_stats_trqpair_init(i40e_trqpair_t *);
10489d26e4fcSRobert Mustacchi extern void i40e_stats_trqpair_fini(i40e_trqpair_t *);
10499d26e4fcSRobert Mustacchi extern int i40e_m_stat(void *, uint_t, uint64_t *);
10509d26e4fcSRobert Mustacchi extern int i40e_rx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
10519d26e4fcSRobert Mustacchi extern int i40e_tx_ring_stat(mac_ring_driver_t, uint_t, uint64_t *);
10529d26e4fcSRobert Mustacchi 
10539d26e4fcSRobert Mustacchi /*
10549d26e4fcSRobert Mustacchi  * MAC/GLDv3 functions, and functions called by MAC/GLDv3 support code.
10559d26e4fcSRobert Mustacchi  */
10569d26e4fcSRobert Mustacchi extern boolean_t i40e_register_mac(i40e_t *);
1057aa2a44afSPaul Winder extern boolean_t i40e_start(i40e_t *);
1058aa2a44afSPaul Winder extern void i40e_stop(i40e_t *);
1059aa2a44afSPaul Winder extern int i40e_setup_ring(i40e_trqpair_t *);
1060aa2a44afSPaul Winder extern boolean_t i40e_shutdown_ring(i40e_trqpair_t *);
10619d26e4fcSRobert Mustacchi 
10629d26e4fcSRobert Mustacchi /*
10639d26e4fcSRobert Mustacchi  * DMA & buffer functions and attributes
10649d26e4fcSRobert Mustacchi  */
10659d26e4fcSRobert Mustacchi extern void i40e_init_dma_attrs(i40e_t *, boolean_t);
1066aa2a44afSPaul Winder extern boolean_t i40e_alloc_ring_mem(i40e_trqpair_t *);
1067aa2a44afSPaul Winder extern void i40e_free_ring_mem(i40e_trqpair_t *, boolean_t);
10689d26e4fcSRobert Mustacchi 
10699d26e4fcSRobert Mustacchi #ifdef __cplusplus
10709d26e4fcSRobert Mustacchi }
10719d26e4fcSRobert Mustacchi #endif
10729d26e4fcSRobert Mustacchi 
10739d26e4fcSRobert Mustacchi #endif /* _I40E_SW_H */
1074