xref: /titanic_44/usr/src/uts/common/io/i40e/i40e_sw.h (revision 5ca90d72bb15ab4b88b7497504cdd4408d82faab)
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