xref: /illumos-gate/usr/src/uts/common/io/qede/qede.h (revision 14b24e2b)
1*14b24e2bSVaishali Kulkarni /*
2*14b24e2bSVaishali Kulkarni * CDDL HEADER START
3*14b24e2bSVaishali Kulkarni *
4*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
5*14b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
6*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
7*14b24e2bSVaishali Kulkarni *
8*14b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*14b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
10*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
11*14b24e2bSVaishali Kulkarni * and limitations under the License.
12*14b24e2bSVaishali Kulkarni *
13*14b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
14*14b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*14b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
16*14b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
17*14b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
18*14b24e2bSVaishali Kulkarni *
19*14b24e2bSVaishali Kulkarni * CDDL HEADER END
20*14b24e2bSVaishali Kulkarni */
21*14b24e2bSVaishali Kulkarni 
22*14b24e2bSVaishali Kulkarni /*
23*14b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
24*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
25*14b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
26*14b24e2bSVaishali Kulkarni 
27*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
28*14b24e2bSVaishali Kulkarni 
29*14b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
30*14b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
31*14b24e2bSVaishali Kulkarni 
32*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
33*14b24e2bSVaishali Kulkarni * limitations under the License.
34*14b24e2bSVaishali Kulkarni */
35*14b24e2bSVaishali Kulkarni 
36*14b24e2bSVaishali Kulkarni #ifndef	_QEDE_H
37*14b24e2bSVaishali Kulkarni #define	_QEDE_H
38*14b24e2bSVaishali Kulkarni 
39*14b24e2bSVaishali Kulkarni #include <sys/stream.h>
40*14b24e2bSVaishali Kulkarni 
41*14b24e2bSVaishali Kulkarni #include <sys/ddi.h>
42*14b24e2bSVaishali Kulkarni #include <sys/ddifm.h>
43*14b24e2bSVaishali Kulkarni #include <sys/dditypes.h>
44*14b24e2bSVaishali Kulkarni #include <sys/sunddi.h>
45*14b24e2bSVaishali Kulkarni #include <sys/fm/io/ddi.h>
46*14b24e2bSVaishali Kulkarni #include <sys/mac_provider.h>
47*14b24e2bSVaishali Kulkarni #include <sys/mac_ether.h>
48*14b24e2bSVaishali Kulkarni #include <sys/kobj.h>
49*14b24e2bSVaishali Kulkarni #include <sys/mac.h>
50*14b24e2bSVaishali Kulkarni #include <sys/dlpi.h>
51*14b24e2bSVaishali Kulkarni #include <sys/pattr.h>
52*14b24e2bSVaishali Kulkarni #include <sys/gld.h>
53*14b24e2bSVaishali Kulkarni #include <inet/ip.h>
54*14b24e2bSVaishali Kulkarni #include <inet/tcp.h>
55*14b24e2bSVaishali Kulkarni #include <netinet/udp.h>
56*14b24e2bSVaishali Kulkarni #include <sys/ethernet.h>
57*14b24e2bSVaishali Kulkarni #include <sys/pci.h>
58*14b24e2bSVaishali Kulkarni #include <sys/netlb.h>
59*14b24e2bSVaishali Kulkarni #include <sys/strsun.h>
60*14b24e2bSVaishali Kulkarni #include <sys/strsubr.h>
61*14b24e2bSVaishali Kulkarni #include <sys/policy.h>
62*14b24e2bSVaishali Kulkarni 
63*14b24e2bSVaishali Kulkarni #include "qede_version.h"
64*14b24e2bSVaishali Kulkarni #include "bcm_osal.h"
65*14b24e2bSVaishali Kulkarni #include "qede_fp.h"
66*14b24e2bSVaishali Kulkarni 
67*14b24e2bSVaishali Kulkarni #if 1
68*14b24e2bSVaishali Kulkarni #include "ecore.h"
69*14b24e2bSVaishali Kulkarni #include "ecore_status.h"
70*14b24e2bSVaishali Kulkarni #include "ecore_utils.h"
71*14b24e2bSVaishali Kulkarni #include "ecore_chain.h"
72*14b24e2bSVaishali Kulkarni #include "ecore_hsi_common.h"
73*14b24e2bSVaishali Kulkarni #include "ecore_hsi_eth.h"
74*14b24e2bSVaishali Kulkarni #include "ecore_proto_if.h"
75*14b24e2bSVaishali Kulkarni #include "ecore_iov_api.h"
76*14b24e2bSVaishali Kulkarni #include "ecore_int_api.h"
77*14b24e2bSVaishali Kulkarni #include "ecore_dev_api.h"
78*14b24e2bSVaishali Kulkarni #include "ecore_l2_api.h"
79*14b24e2bSVaishali Kulkarni #include "ecore_hw.h"
80*14b24e2bSVaishali Kulkarni #include "nvm_cfg.h"
81*14b24e2bSVaishali Kulkarni #include "ecore_mcp.h"
82*14b24e2bSVaishali Kulkarni #include "ecore_dbg_fw_funcs.h"
83*14b24e2bSVaishali Kulkarni #include <sys/pcie.h>
84*14b24e2bSVaishali Kulkarni #include <sys/time.h>
85*14b24e2bSVaishali Kulkarni #else
86*14b24e2bSVaishali Kulkarni #include <ecore.h>
87*14b24e2bSVaishali Kulkarni #include <ecore_status.h>
88*14b24e2bSVaishali Kulkarni #include <ecore_utils.h>
89*14b24e2bSVaishali Kulkarni #include <ecore_hsi_common.h>
90*14b24e2bSVaishali Kulkarni #include <ecore_hsi_eth.h>
91*14b24e2bSVaishali Kulkarni #include <ecore_proto_if.h>
92*14b24e2bSVaishali Kulkarni #include <ecore_chain.h>
93*14b24e2bSVaishali Kulkarni #include <ecore_iov_api.h>
94*14b24e2bSVaishali Kulkarni #include <ecore_int_api.h>
95*14b24e2bSVaishali Kulkarni #include <ecore_dev_api.h>
96*14b24e2bSVaishali Kulkarni #include <ecore_ll2_api.h>
97*14b24e2bSVaishali Kulkarni #include <ecore_l2_api.h>
98*14b24e2bSVaishali Kulkarni #include <ecore_mcp.h>
99*14b24e2bSVaishali Kulkarni #endif
100*14b24e2bSVaishali Kulkarni 
101*14b24e2bSVaishali Kulkarni 
102*14b24e2bSVaishali Kulkarni 
103*14b24e2bSVaishali Kulkarni #ifndef	STRINGIFY
104*14b24e2bSVaishali Kulkarni #define	XSTRINGIFY(x)	#x
105*14b24e2bSVaishali Kulkarni #define	STRINGIFY(x)	XSTRINGIFY(x)
106*14b24e2bSVaishali Kulkarni #endif
107*14b24e2bSVaishali Kulkarni #define QEDE_STR_SIZE   32
108*14b24e2bSVaishali Kulkarni /* Product Identification Banner */
109*14b24e2bSVaishali Kulkarni #define	QEDE_PRODUCT_INFO\
110*14b24e2bSVaishali Kulkarni 	"QLogic FastLinQ QL45xxx " STRINGIFY(MAJVERSION) \
111*14b24e2bSVaishali Kulkarni 	"." STRINGIFY(MINVERSION) "." STRINGIFY(REVVERSION)
112*14b24e2bSVaishali Kulkarni 
113*14b24e2bSVaishali Kulkarni /*
114*14b24e2bSVaishali Kulkarni  * Debug Infrastructure
115*14b24e2bSVaishali Kulkarni  */
116*14b24e2bSVaishali Kulkarni #define	DEBUG_NONE	0x0
117*14b24e2bSVaishali Kulkarni #define	DEBUG_ATTACH	0x1
118*14b24e2bSVaishali Kulkarni 
119*14b24e2bSVaishali Kulkarni #ifndef	DEBUG_LEVEL
120*14b24e2bSVaishali Kulkarni #define	DEBUG_LEVEL	DEBUG_NONE
121*14b24e2bSVaishali Kulkarni #endif
122*14b24e2bSVaishali Kulkarni 
123*14b24e2bSVaishali Kulkarni #define	qede_dbg(MASK, ptr, fmt, ...) \
124*14b24e2bSVaishali Kulkarni do { \
125*14b24e2bSVaishali Kulkarni 	if (DEBUG_LEVEL & (MASK)) { \
126*14b24e2bSVaishali Kulkarni 		qede_print("!%s(%d) STRINGIFY(MASK):" fmt, __func__, \
127*14b24e2bSVaishali Kulkarni 		    (ptr)->instance, \
128*14b24e2bSVaishali Kulkarni ##__VA_ARGS__);\
129*14b24e2bSVaishali Kulkarni 	} \
130*14b24e2bSVaishali Kulkarni } while (0);
131*14b24e2bSVaishali Kulkarni 
132*14b24e2bSVaishali Kulkarni #define	qede_info(ptr, fmt, ...) \
133*14b24e2bSVaishali Kulkarni do { \
134*14b24e2bSVaishali Kulkarni 	qede_print("!%s(%d):" fmt, __func__, (ptr)->instance, \
135*14b24e2bSVaishali Kulkarni ##__VA_ARGS__); \
136*14b24e2bSVaishali Kulkarni } while (0);
137*14b24e2bSVaishali Kulkarni 
138*14b24e2bSVaishali Kulkarni #define	qede_warn(ptr, fmt, ...) \
139*14b24e2bSVaishali Kulkarni do { \
140*14b24e2bSVaishali Kulkarni 	qede_print_err("!%s(%d):" fmt, __func__, (ptr)->instance, \
141*14b24e2bSVaishali Kulkarni ##__VA_ARGS__); \
142*14b24e2bSVaishali Kulkarni } while (0);
143*14b24e2bSVaishali Kulkarni 
144*14b24e2bSVaishali Kulkarni #ifdef __sparc
145*14b24e2bSVaishali Kulkarni #define	QEDE_PAGE_ALIGNMENT	0x0000000000002000ull
146*14b24e2bSVaishali Kulkarni #define	QEDE_PAGE_SIZE	0x0000000000002000ull
147*14b24e2bSVaishali Kulkarni #else
148*14b24e2bSVaishali Kulkarni #define	QEDE_PAGE_ALIGNMENT	0x0000000000001000ull
149*14b24e2bSVaishali Kulkarni #define	QEDE_PAGE_SIZE	0x0000000000001000ull
150*14b24e2bSVaishali Kulkarni #endif
151*14b24e2bSVaishali Kulkarni 
152*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_64                   LE_64
153*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_64                   LE_64
154*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_32                   LE_32
155*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_32                   LE_32
156*14b24e2bSVaishali Kulkarni #define HOST_TO_LE_16                   LE_16
157*14b24e2bSVaishali Kulkarni #define LE_TO_HOST_16                   LE_16
158*14b24e2bSVaishali Kulkarni 
159*14b24e2bSVaishali Kulkarni 
160*14b24e2bSVaishali Kulkarni 
161*14b24e2bSVaishali Kulkarni #define QEDE_LSO_MAXLEN                 65535
162*14b24e2bSVaishali Kulkarni 
163*14b24e2bSVaishali Kulkarni #define	BUF_2K_SIZE			2048
164*14b24e2bSVaishali Kulkarni #define	BUF_2K_ALIGNMENT		BUF_2K_SIZE
165*14b24e2bSVaishali Kulkarni 
166*14b24e2bSVaishali Kulkarni #define	MIN_TX_RING_COUNT		1
167*14b24e2bSVaishali Kulkarni #define	MAX_TX_RING_COUNT		1
168*14b24e2bSVaishali Kulkarni #define	DEFAULT_TX_RING_COUNT		1
169*14b24e2bSVaishali Kulkarni #define	MAX_TC_COUNT			1
170*14b24e2bSVaishali Kulkarni #define	DEFAULT_TRFK_CLASS_COUNT	1
171*14b24e2bSVaishali Kulkarni 
172*14b24e2bSVaishali Kulkarni #define	MIN_TX_RING_SIZE		1024
173*14b24e2bSVaishali Kulkarni #define	DEFAULT_TX_RING_SIZE	       	8192
174*14b24e2bSVaishali Kulkarni 
175*14b24e2bSVaishali Kulkarni #define	DEFAULT_TX_COPY_THRESHOLD	256
176*14b24e2bSVaishali Kulkarni #define	DEFAULT_TX_RECYCLE_THRESHOLD	128
177*14b24e2bSVaishali Kulkarni 
178*14b24e2bSVaishali Kulkarni #define	TX_RING_MASK			(tx_ring->tx_ring_size - 1)
179*14b24e2bSVaishali Kulkarni 
180*14b24e2bSVaishali Kulkarni #define	IP_ALIGNMENT_BYTES		2
181*14b24e2bSVaishali Kulkarni #define	QEDE_MAX_ETHER_HDR		18
182*14b24e2bSVaishali Kulkarni 
183*14b24e2bSVaishali Kulkarni #define	MIN_FASTPATH_COUNT		1
184*14b24e2bSVaishali Kulkarni #define	MAX_FASTPATH_COUNT		6
185*14b24e2bSVaishali Kulkarni #define	DEFAULT_FASTPATH_COUNT		4
186*14b24e2bSVaishali Kulkarni 
187*14b24e2bSVaishali Kulkarni #define	MIN_RX_RING_SIZE	        1024
188*14b24e2bSVaishali Kulkarni #define	DEFAULT_RX_RING_SIZE	        8192
189*14b24e2bSVaishali Kulkarni #define	MAX_RX_RING_SIZE		DEFAULT_RX_RING_SIZE
190*14b24e2bSVaishali Kulkarni 
191*14b24e2bSVaishali Kulkarni #define	MIN_RX_BUF_SIZE			2048
192*14b24e2bSVaishali Kulkarni #define	MAX_RX_BUF_SIZE			2048
193*14b24e2bSVaishali Kulkarni #define	DEFAULT_RX_BUF_SIZE		2048
194*14b24e2bSVaishali Kulkarni 
195*14b24e2bSVaishali Kulkarni #define	DEFAULT_RX_COPY_THRESHOLD	128
196*14b24e2bSVaishali Kulkarni #define	RX_RING_MASK			(rx_ring->rx_buf_count - 1)
197*14b24e2bSVaishali Kulkarni #define	MIN_RX_BUF_COUNT		MIN_RX_RING_SIZE
198*14b24e2bSVaishali Kulkarni #define	MAX_RX_BUF_COUNT		MAX_RX_RING_SIZE
199*14b24e2bSVaishali Kulkarni #define	DEFAULT_RX_BUF_COUNT		DEFAULT_RX_RING_SIZE
200*14b24e2bSVaishali Kulkarni #define	RX_LOW_BUFFER_THRESHOLD	128
201*14b24e2bSVaishali Kulkarni 
202*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_NONE     0x0
203*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_L3       0x1
204*14b24e2bSVaishali Kulkarni #define USER_OPTION_CKSUM_L3_L4    0x2
205*14b24e2bSVaishali Kulkarni #define DEFAULT_CKSUM_OFFLOAD      USER_OPTION_CKSUM_L3_L4
206*14b24e2bSVaishali Kulkarni 
207*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_NONE          0x00000000
208*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_IP_CKSUM   0x00000001
209*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_IP_CKSUM   0x00000002
210*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_TCP_CKSUM  0x00000004
211*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_TCP_CKSUM  0x00000008
212*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_TX_UDP_CKSUM  0x00000010
213*14b24e2bSVaishali Kulkarni #define QEDE_OFFLOAD_RX_UDP_CKSUM  0x00000020
214*14b24e2bSVaishali Kulkarni 
215*14b24e2bSVaishali Kulkarni #define	DEFAULT_JUMBO_MTU	9000
216*14b24e2bSVaishali Kulkarni #define	MIN_MTU			ETHERMTU
217*14b24e2bSVaishali Kulkarni #define	MAX_MTU		        DEFAULT_JUMBO_MTU
218*14b24e2bSVaishali Kulkarni #define	DEFAULT_MTU		ETHERMTU
219*14b24e2bSVaishali Kulkarni 
220*14b24e2bSVaishali Kulkarni #define DEFAULT_ECORE_DEBUG_LEVEL	ECORE_LEVEL_VERBOSE
221*14b24e2bSVaishali Kulkarni 
222*14b24e2bSVaishali Kulkarni 
223*14b24e2bSVaishali Kulkarni #define	DEFAULT_ECORE_DEBUG_MODULE	ECORE_MSG_DRV
224*14b24e2bSVaishali Kulkarni 
225*14b24e2bSVaishali Kulkarni #define VLAN_TAGSZ              0x4
226*14b24e2bSVaishali Kulkarni 
227*14b24e2bSVaishali Kulkarni #define	MAX_TC	1
228*14b24e2bSVaishali Kulkarni 
229*14b24e2bSVaishali Kulkarni #define DUPLEX_HALF	0
230*14b24e2bSVaishali Kulkarni #define DUPLEX_FULL     1
231*14b24e2bSVaishali Kulkarni 
232*14b24e2bSVaishali Kulkarni #define ETH_ALLEN 	6
233*14b24e2bSVaishali Kulkarni 
234*14b24e2bSVaishali Kulkarni #define	MAC_STRING		"%2x:%2x:%2x:%2x:%2x:%2x"
235*14b24e2bSVaishali Kulkarni #define	MACTOSTR(a)		a[0], a[1], a[2], a[3], a[4], a[5]
236*14b24e2bSVaishali Kulkarni 
237*14b24e2bSVaishali Kulkarni #define MAX_MC_SOFT_LIMIT 1024
238*14b24e2bSVaishali Kulkarni 
239*14b24e2bSVaishali Kulkarni #define qede_delay(_msecs_)   delay(drv_usectohz(_msecs_ * 1000))
240*14b24e2bSVaishali Kulkarni 
241*14b24e2bSVaishali Kulkarni #define QEDE_CMD 73
242*14b24e2bSVaishali Kulkarni 
243*14b24e2bSVaishali Kulkarni 
244*14b24e2bSVaishali Kulkarni typedef struct _KstatRingMap
245*14b24e2bSVaishali Kulkarni {
246*14b24e2bSVaishali Kulkarni     uint32_t  idx;	/* ring index */
247*14b24e2bSVaishali Kulkarni     void * qede;	/* reference back to qede_t */
248*14b24e2bSVaishali Kulkarni } KstatRingMap;
249*14b24e2bSVaishali Kulkarni 
250*14b24e2bSVaishali Kulkarni #define IS_ETH_MULTICAST(eth_addr) \
251*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr))[0] & ((unsigned char) 0x01))
252*14b24e2bSVaishali Kulkarni 
253*14b24e2bSVaishali Kulkarni #define IS_ETH_ADDRESS_EQUAL(eth_addr1, eth_addr2)  \
254*14b24e2bSVaishali Kulkarni 	((((unsigned char *) (eth_addr1))[0] ==     \
255*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[0]) &&      \
256*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr1))[1] ==      \
257*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[1]) &&      \
258*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr1))[2] ==      \
259*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[2]) &&      \
260*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr1))[3] ==      \
261*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[3]) &&      \
262*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr1))[4] ==      \
263*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[4]) &&      \
264*14b24e2bSVaishali Kulkarni 	(((unsigned char *) (eth_addr1))[5] ==      \
265*14b24e2bSVaishali Kulkarni 	((unsigned char *) (eth_addr2))[5]))
266*14b24e2bSVaishali Kulkarni 
267*14b24e2bSVaishali Kulkarni #define COPY_ETH_ADDRESS(src, dst) \
268*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[0] = ((unsigned char *) (src))[0]; \
269*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[1] = ((unsigned char *) (src))[1]; \
270*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[2] = ((unsigned char *) (src))[2]; \
271*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[3] = ((unsigned char *) (src))[3]; \
272*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[4] = ((unsigned char *) (src))[4]; \
273*14b24e2bSVaishali Kulkarni 	((unsigned char *) (dst))[5] = ((unsigned char *) (src))[5];
274*14b24e2bSVaishali Kulkarni 
275*14b24e2bSVaishali Kulkarni 
276*14b24e2bSVaishali Kulkarni union db_prod {
277*14b24e2bSVaishali Kulkarni 	struct eth_db_data data;
278*14b24e2bSVaishali Kulkarni 	uint32_t raw;
279*14b24e2bSVaishali Kulkarni };
280*14b24e2bSVaishali Kulkarni 
281*14b24e2bSVaishali Kulkarni struct qede;
282*14b24e2bSVaishali Kulkarni struct qede_fastpath;
283*14b24e2bSVaishali Kulkarni struct qede_rx_ring;
284*14b24e2bSVaishali Kulkarni struct qede_tx_pktinfo_s;
285*14b24e2bSVaishali Kulkarni 
286*14b24e2bSVaishali Kulkarni typedef struct qede_tx_ring {
287*14b24e2bSVaishali Kulkarni 	struct qede_fastpath	*fp;
288*14b24e2bSVaishali Kulkarni 	struct qede *qede;
289*14b24e2bSVaishali Kulkarni 	uint32_t tx_queue_index;
290*14b24e2bSVaishali Kulkarni 	uint16_t *hw_cons_ptr;
291*14b24e2bSVaishali Kulkarni 
292*14b24e2bSVaishali Kulkarni 	/* pointer to driver ring control */
293*14b24e2bSVaishali Kulkarni 	struct ecore_chain	tx_bd_ring;
294*14b24e2bSVaishali Kulkarni 	u16			sw_tx_cons;
295*14b24e2bSVaishali Kulkarni 	u16			sw_tx_prod;
296*14b24e2bSVaishali Kulkarni 	u16			bd_ring_size;
297*14b24e2bSVaishali Kulkarni 
298*14b24e2bSVaishali Kulkarni 	/* From ecore_sp_tx_queue_start() */
299*14b24e2bSVaishali Kulkarni 	void __iomem *doorbell_addr;
300*14b24e2bSVaishali Kulkarni 	ddi_acc_handle_t	doorbell_handle;
301*14b24e2bSVaishali Kulkarni 
302*14b24e2bSVaishali Kulkarni 	/* Saved copy of doorbell data for this tx queue */
303*14b24e2bSVaishali Kulkarni 	union db_prod		tx_db;
304*14b24e2bSVaishali Kulkarni 
305*14b24e2bSVaishali Kulkarni 	uint32_t		fp_idx;
306*14b24e2bSVaishali Kulkarni 	kmutex_t		tx_lock;
307*14b24e2bSVaishali Kulkarni 	int			tx_buf_size;
308*14b24e2bSVaishali Kulkarni 	uint32_t		tx_ring_size;
309*14b24e2bSVaishali Kulkarni 	bool			queue_started;
310*14b24e2bSVaishali Kulkarni 	mac_ring_handle_t	mac_ring_handle;
311*14b24e2bSVaishali Kulkarni 
312*14b24e2bSVaishali Kulkarni 	/* pre-allocated bcopy packets */
313*14b24e2bSVaishali Kulkarni 	qede_tx_bcopy_list_t	bcopy_list;
314*14b24e2bSVaishali Kulkarni 	/* pre-allocated dma handles */
315*14b24e2bSVaishali Kulkarni 	qede_dma_handles_list_t	dmah_list;
316*14b24e2bSVaishali Kulkarni 	/* List of recycle entires for tx packets */
317*14b24e2bSVaishali Kulkarni 	qede_tx_recycle_list_t *tx_recycle_list;
318*14b24e2bSVaishali Kulkarni 
319*14b24e2bSVaishali Kulkarni #ifdef	DBLK_DMA_PREMAP
320*14b24e2bSVaishali Kulkarni 	pm_handle_t		pm_handle;
321*14b24e2bSVaishali Kulkarni #endif
322*14b24e2bSVaishali Kulkarni 	/* dma_handle for tx bd ring */
323*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	tx_bd_dmah;
324*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	tx_pbl_dmah;
325*14b24e2bSVaishali Kulkarni 
326*14b24e2bSVaishali Kulkarni 	bool			tx_q_sleeping;
327*14b24e2bSVaishali Kulkarni 
328*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_pkt_count;
329*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_byte_count;
330*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_pkt_dropped;
331*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_copy_count;
332*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_bind_count;
333*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_bind_fail;
334*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_premap_count;
335*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_premap_fail;
336*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_pullup_count;
337*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_too_many_cookies;
338*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_lso_pkt_count;
339*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_ring_pause;
340*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_too_many_mblks;
341*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_mapped_pkts;
342*14b24e2bSVaishali Kulkarni 	uint64_t 		tx_jumbo_pkt_count;
343*14b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
344*14b24e2bSVaishali Kulkarni } qede_tx_ring_t;
345*14b24e2bSVaishali Kulkarni 
346*14b24e2bSVaishali Kulkarni 
347*14b24e2bSVaishali Kulkarni typedef struct qede_vector_info {
348*14b24e2bSVaishali Kulkarni 	/*
349*14b24e2bSVaishali Kulkarni 	 * Pointer to a fastpath structure,
350*14b24e2bSVaishali Kulkarni 	 * or to a hwfnc.
351*14b24e2bSVaishali Kulkarni 	 */
352*14b24e2bSVaishali Kulkarni 	void *fp;
353*14b24e2bSVaishali Kulkarni 	struct qede *qede;
354*14b24e2bSVaishali Kulkarni 	uint32_t vect_index;
355*14b24e2bSVaishali Kulkarni 	bool handler_added;
356*14b24e2bSVaishali Kulkarni 	/* set and cleared by ISR, checked by stop path
357*14b24e2bSVaishali Kulkarni 	 * when waiting for quiesce
358*14b24e2bSVaishali Kulkarni 	 */
359*14b24e2bSVaishali Kulkarni 	bool in_isr;
360*14b24e2bSVaishali Kulkarni } qede_vector_info_t;
361*14b24e2bSVaishali Kulkarni 
362*14b24e2bSVaishali Kulkarni 
363*14b24e2bSVaishali Kulkarni typedef struct qede_fastpath {
364*14b24e2bSVaishali Kulkarni 	qede_vector_info_t *vect_info;
365*14b24e2bSVaishali Kulkarni 
366*14b24e2bSVaishali Kulkarni 	/* Status block associated with this fp */
367*14b24e2bSVaishali Kulkarni     	ddi_dma_handle_t	sb_dma_handle;
368*14b24e2bSVaishali Kulkarni     	ddi_acc_handle_t	sb_acc_handle;
369*14b24e2bSVaishali Kulkarni 	struct status_block *sb_virt;
370*14b24e2bSVaishali Kulkarni 	uint64_t		sb_phys;
371*14b24e2bSVaishali Kulkarni 
372*14b24e2bSVaishali Kulkarni 	struct ecore_sb_info *sb_info;
373*14b24e2bSVaishali Kulkarni 	struct qede_rx_ring *rx_ring;
374*14b24e2bSVaishali Kulkarni 	qede_tx_ring_t	*tx_ring[MAX_TC];
375*14b24e2bSVaishali Kulkarni 	struct qede *qede;
376*14b24e2bSVaishali Kulkarni 
377*14b24e2bSVaishali Kulkarni 	uint32_t	fp_index;
378*14b24e2bSVaishali Kulkarni 	uint32_t	fp_hw_eng_index;
379*14b24e2bSVaishali Kulkarni 	uint32_t	vport_id;	/* */
380*14b24e2bSVaishali Kulkarni 	uint32_t	stats_id;	/* vport id to hold stats */
381*14b24e2bSVaishali Kulkarni 	uint32_t	rx_queue_index;
382*14b24e2bSVaishali Kulkarni 	uint32_t	rss_id;
383*14b24e2bSVaishali Kulkarni 	kmutex_t	fp_lock;
384*14b24e2bSVaishali Kulkarni 	uint32_t 	disabled_by_poll;
385*14b24e2bSVaishali Kulkarni } qede_fastpath_t;
386*14b24e2bSVaishali Kulkarni 
387*14b24e2bSVaishali Kulkarni enum qede_agg_state {
388*14b24e2bSVaishali Kulkarni 	QEDE_AGG_STATE_NONE  = 0,
389*14b24e2bSVaishali Kulkarni 	QEDE_AGG_STATE_START = 1,
390*14b24e2bSVaishali Kulkarni 	QEDE_AGG_STATE_ERROR = 2
391*14b24e2bSVaishali Kulkarni };
392*14b24e2bSVaishali Kulkarni 
393*14b24e2bSVaishali Kulkarni #define QEDE_MAX_BD_PER_AGG 16
394*14b24e2bSVaishali Kulkarni struct qede_rx_buffer_s;
395*14b24e2bSVaishali Kulkarni typedef	struct qede_lro_info {
396*14b24e2bSVaishali Kulkarni 	uint16_t pars_flags;
397*14b24e2bSVaishali Kulkarni 	uint16_t pad;
398*14b24e2bSVaishali Kulkarni 	uint16_t vlan_tag;
399*14b24e2bSVaishali Kulkarni 	uint16_t bd_count;
400*14b24e2bSVaishali Kulkarni 	uint32_t rss_hash;
401*14b24e2bSVaishali Kulkarni 	uint32_t header_len;
402*14b24e2bSVaishali Kulkarni 	uint32_t free_buffer_count;
403*14b24e2bSVaishali Kulkarni 	struct qede_rx_buffer_s *rx_buffer[QEDE_MAX_BD_PER_AGG];
404*14b24e2bSVaishali Kulkarni 	enum qede_agg_state agg_state;
405*14b24e2bSVaishali Kulkarni } qede_lro_info_t;
406*14b24e2bSVaishali Kulkarni 
407*14b24e2bSVaishali Kulkarni typedef	struct qede_dma_info_s {
408*14b24e2bSVaishali Kulkarni 	ddi_acc_handle_t	acc_handle;
409*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	dma_handle;
410*14b24e2bSVaishali Kulkarni 	u32	ncookies;
411*14b24e2bSVaishali Kulkarni 	u32	offset;
412*14b24e2bSVaishali Kulkarni 	u64	phys_addr;
413*14b24e2bSVaishali Kulkarni 	void *virt_addr;
414*14b24e2bSVaishali Kulkarni 	u32	pad;
415*14b24e2bSVaishali Kulkarni } qede_dma_info_t;
416*14b24e2bSVaishali Kulkarni 
417*14b24e2bSVaishali Kulkarni enum rx_buf_state {
418*14b24e2bSVaishali Kulkarni 	RX_BUF_STATE_FREE,
419*14b24e2bSVaishali Kulkarni 	RX_BUF_STATE_WITH_FW,
420*14b24e2bSVaishali Kulkarni 	RX_BUF_STATE_WITH_OS,
421*14b24e2bSVaishali Kulkarni 	RX_BUF_STATE_WITH_DRV,
422*14b24e2bSVaishali Kulkarni };
423*14b24e2bSVaishali Kulkarni 
424*14b24e2bSVaishali Kulkarni struct qede_rx_buf_area;
425*14b24e2bSVaishali Kulkarni 
426*14b24e2bSVaishali Kulkarni typedef	struct qede_rx_buffer_s {
427*14b24e2bSVaishali Kulkarni 	qede_dma_info_t	dma_info;
428*14b24e2bSVaishali Kulkarni 	mblk_t *mp;
429*14b24e2bSVaishali Kulkarni 	u32		index;
430*14b24e2bSVaishali Kulkarni 	struct qede_rx_ring *rx_ring;
431*14b24e2bSVaishali Kulkarni 
432*14b24e2bSVaishali Kulkarni 	/* Recycle function */
433*14b24e2bSVaishali Kulkarni 	frtn_t		recycle;
434*14b24e2bSVaishali Kulkarni 	u32		ref_cnt;
435*14b24e2bSVaishali Kulkarni 	enum rx_buf_state 	buf_state;
436*14b24e2bSVaishali Kulkarni 	struct qede_rx_buf_area	*rx_buf_area;
437*14b24e2bSVaishali Kulkarni } qede_rx_buffer_t;
438*14b24e2bSVaishali Kulkarni 
439*14b24e2bSVaishali Kulkarni typedef	struct qede_rx_buf_list_s {
440*14b24e2bSVaishali Kulkarni 	kmutex_t		lock;
441*14b24e2bSVaishali Kulkarni 	u16			head, tail;
442*14b24e2bSVaishali Kulkarni 	u32			num_entries;
443*14b24e2bSVaishali Kulkarni 	qede_rx_buffer_t *buf_list[DEFAULT_RX_RING_SIZE];
444*14b24e2bSVaishali Kulkarni } qede_rx_buf_list_t;
445*14b24e2bSVaishali Kulkarni 
446*14b24e2bSVaishali Kulkarni typedef	struct qede_rx_buf_area {
447*14b24e2bSVaishali Kulkarni 	//kmutex_t		rx_buf_area_lock;
448*14b24e2bSVaishali Kulkarni 	qede_rx_buffer_t	rx_buf_pool[DEFAULT_RX_RING_SIZE];
449*14b24e2bSVaishali Kulkarni 
450*14b24e2bSVaishali Kulkarni 	qede_rx_buf_list_t	active_buf_list;
451*14b24e2bSVaishali Kulkarni 	qede_rx_buf_list_t	passive_buf_list;
452*14b24e2bSVaishali Kulkarni 
453*14b24e2bSVaishali Kulkarni 	u32			bufs_per_page;
454*14b24e2bSVaishali Kulkarni 	struct qede_rx_ring *rx_ring;
455*14b24e2bSVaishali Kulkarni 	u32			inactive;
456*14b24e2bSVaishali Kulkarni 	u32			buf_upstream;
457*14b24e2bSVaishali Kulkarni } qede_rx_buf_area_t;
458*14b24e2bSVaishali Kulkarni 
459*14b24e2bSVaishali Kulkarni typedef struct qede_rx_ring {
460*14b24e2bSVaishali Kulkarni 	uint32_t		rx_buf_count;
461*14b24e2bSVaishali Kulkarni 	uint32_t		rx_buf_size;
462*14b24e2bSVaishali Kulkarni 	/*
463*14b24e2bSVaishali Kulkarni 	 * Pointer to an array of producer indicies.
464*14b24e2bSVaishali Kulkarni 	 * Returned in call to ecore_sp_eth_rx_queue_start()
465*14b24e2bSVaishali Kulkarni 	 * during qede_start(). Driver uses address
466*14b24e2bSVaishali Kulkarni 	 * to update producer indicies for
467*14b24e2bSVaishali Kulkarni 	 * CQE and RX buffer chains.
468*14b24e2bSVaishali Kulkarni 	 */
469*14b24e2bSVaishali Kulkarni 	void __iomem *hw_rxq_prod_addr;
470*14b24e2bSVaishali Kulkarni 
471*14b24e2bSVaishali Kulkarni 	/* Pointer to hw cqe consumer index.
472*14b24e2bSVaishali Kulkarni 	 * Taken from sb_virt->pi_array after
473*14b24e2bSVaishali Kulkarni 	 * rx_ring has been started by calling
474*14b24e2bSVaishali Kulkarni 	 * ecore_sp_eth_rx_queue_start().
475*14b24e2bSVaishali Kulkarni 	 * This value is little endian and requires
476*14b24e2bSVaishali Kulkarni 	 * swapping on big endian platforms.
477*14b24e2bSVaishali Kulkarni 	 * It is updated by ecore and read by
478*14b24e2bSVaishali Kulkarni 	 * the driver while processing rings.
479*14b24e2bSVaishali Kulkarni 	 */
480*14b24e2bSVaishali Kulkarni 	uint16_t *hw_cons_ptr;
481*14b24e2bSVaishali Kulkarni 
482*14b24e2bSVaishali Kulkarni 	u16	sw_rx_cons;
483*14b24e2bSVaishali Kulkarni 	u16 sw_rx_prod;
484*14b24e2bSVaishali Kulkarni 	u16			last_cqe_consumer;
485*14b24e2bSVaishali Kulkarni 
486*14b24e2bSVaishali Kulkarni 	/*
487*14b24e2bSVaishali Kulkarni 	 * Driver buffer descriptor ring defining
488*14b24e2bSVaishali Kulkarni 	 * buffers on a one-to-one releationship
489*14b24e2bSVaishali Kulkarni 	 * to ecore_chain rx_bd_ring.
490*14b24e2bSVaishali Kulkarni 	 */
491*14b24e2bSVaishali Kulkarni 	qede_rx_buffer_t *rx_buffers;
492*14b24e2bSVaishali Kulkarni 	qede_rx_buf_area_t *rx_buf_area;
493*14b24e2bSVaishali Kulkarni 	/*
494*14b24e2bSVaishali Kulkarni 	 * Descriptor rings returned from
495*14b24e2bSVaishali Kulkarni 	 * ecore_chain_alloc()
496*14b24e2bSVaishali Kulkarni 	 */
497*14b24e2bSVaishali Kulkarni 	struct ecore_chain      rx_bd_ring;
498*14b24e2bSVaishali Kulkarni 	struct ecore_chain      rx_cqe_ring;
499*14b24e2bSVaishali Kulkarni 
500*14b24e2bSVaishali Kulkarni 	uint32_t	rss_id;
501*14b24e2bSVaishali Kulkarni 	bool	queue_started;
502*14b24e2bSVaishali Kulkarni 	bool	mac_ring_started;
503*14b24e2bSVaishali Kulkarni 	kmutex_t	rx_lock;
504*14b24e2bSVaishali Kulkarni 	kmutex_t	rx_replen_lock;
505*14b24e2bSVaishali Kulkarni 	mac_ring_handle_t	mac_ring_handle;
506*14b24e2bSVaishali Kulkarni 	u64			mr_gen_num; /* Mac rings generation number */
507*14b24e2bSVaishali Kulkarni 	uint32_t		group_index;
508*14b24e2bSVaishali Kulkarni 	qede_fastpath_t	*fp;
509*14b24e2bSVaishali Kulkarni 	struct qede *qede;
510*14b24e2bSVaishali Kulkarni 
511*14b24e2bSVaishali Kulkarni 	/* dma_handles for rx dma mem */
512*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	rx_bd_dmah;
513*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	rx_cqe_dmah;
514*14b24e2bSVaishali Kulkarni 	ddi_dma_handle_t	rx_cqe_pbl_dmah;
515*14b24e2bSVaishali Kulkarni 	uint32_t	rx_copy_threshold;
516*14b24e2bSVaishali Kulkarni 	uint32_t	rx_low_buffer_threshold;
517*14b24e2bSVaishali Kulkarni 	struct qede_lro_info lro_info[ETH_TPA_MAX_AGGS_NUM];
518*14b24e2bSVaishali Kulkarni 	uint32_t lro_active_count;
519*14b24e2bSVaishali Kulkarni 
520*14b24e2bSVaishali Kulkarni 	uint64_t rx_copy_cnt;
521*14b24e2bSVaishali Kulkarni 	uint64_t rx_drop_cnt;
522*14b24e2bSVaishali Kulkarni 	uint64_t rx_low_water_cnt;
523*14b24e2bSVaishali Kulkarni 	uint64_t rx_poll_cnt;
524*14b24e2bSVaishali Kulkarni 	uint64_t rx_reg_pkt_cnt;
525*14b24e2bSVaishali Kulkarni 	uint64_t rx_jumbo_pkt_cnt;
526*14b24e2bSVaishali Kulkarni 	uint64_t rx_lro_pkt_cnt;
527*14b24e2bSVaishali Kulkarni 	uint64_t rx_byte_cnt;
528*14b24e2bSVaishali Kulkarni 	uint64_t rx_pkt_cnt;
529*14b24e2bSVaishali Kulkarni 	uint8_t intrEnableCnt;
530*14b24e2bSVaishali Kulkarni 	uint8_t intrDisableCnt;
531*14b24e2bSVaishali Kulkarni 	struct ecore_queue_cid *p_cid;
532*14b24e2bSVaishali Kulkarni } qede_rx_ring_t;
533*14b24e2bSVaishali Kulkarni 
534*14b24e2bSVaishali Kulkarni typedef uint32_t qede_offload_t;
535*14b24e2bSVaishali Kulkarni typedef struct qede_params {
536*14b24e2bSVaishali Kulkarni 	qede_offload_t  enabled_offloads;
537*14b24e2bSVaishali Kulkarni 	boolean_t multi_promisc_fl;
538*14b24e2bSVaishali Kulkarni 	boolean_t promisc_fl;
539*14b24e2bSVaishali Kulkarni 	uint32_t link_state;
540*14b24e2bSVaishali Kulkarni 	u32	loopback_mode;
541*14b24e2bSVaishali Kulkarni } qede_params_t;
542*14b24e2bSVaishali Kulkarni 
543*14b24e2bSVaishali Kulkarni typedef struct qede_intr_context {
544*14b24e2bSVaishali Kulkarni     /* bit field indicating	enable/disable state of vector */
545*14b24e2bSVaishali Kulkarni     volatile uint32_t	intr_state;
546*14b24e2bSVaishali Kulkarni 	qede_vector_info_t *intr_vect_info;
547*14b24e2bSVaishali Kulkarni 	int intr_vect_info_array_size;			/* based on hw max vectors */
548*14b24e2bSVaishali Kulkarni 	ddi_intr_handle_t	*intr_hdl_array;		/* handle array from ddi_intr_alloc() */
549*14b24e2bSVaishali Kulkarni 	int intr_hdl_array_size;			/* based on hw max vectors */
550*14b24e2bSVaishali Kulkarni 	int intr_types_available;			/* from ddi_intr_get_supported_types */
551*14b24e2bSVaishali Kulkarni 	int intr_type_forced;				/* from qede.conf */
552*14b24e2bSVaishali Kulkarni 	int intr_type_in_use;				/* interrupt type currently used */
553*14b24e2bSVaishali Kulkarni 	int	intr_vect_supported;		/* from ddi_intr_get_nintrs */
554*14b24e2bSVaishali Kulkarni 	int	intr_vect_available;				/* from ddi_intr_get_navail */
555*14b24e2bSVaishali Kulkarni 	int intr_vect_to_request;			/* intr count requested */
556*14b24e2bSVaishali Kulkarni 	int intr_vect_allocated;			/* intr count taken */
557*14b24e2bSVaishali Kulkarni 	uint32_t	intr_pri;
558*14b24e2bSVaishali Kulkarni 	int intr_cap;
559*14b24e2bSVaishali Kulkarni 	uint32_t	intr_fp_vector_count;
560*14b24e2bSVaishali Kulkarni     enum ecore_int_mode intr_mode;
561*14b24e2bSVaishali Kulkarni } qede_intr_context_t;
562*14b24e2bSVaishali Kulkarni 
563*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_AUTONEG_ENABLE           (1 << 0)
564*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_RX_ENABLE                (1 << 1)
565*14b24e2bSVaishali Kulkarni #define QEDE_LINK_PAUSE_TX_ENABLE                (1 << 2)
566*14b24e2bSVaishali Kulkarni 
567*14b24e2bSVaishali Kulkarni typedef struct qede_props {
568*14b24e2bSVaishali Kulkarni 	uint32_t link_speed;
569*14b24e2bSVaishali Kulkarni 	boolean_t link_duplex;
570*14b24e2bSVaishali Kulkarni 	boolean_t tx_pause;
571*14b24e2bSVaishali Kulkarni 	boolean_t rx_pause;
572*14b24e2bSVaishali Kulkarni 	time_t    uptime;
573*14b24e2bSVaishali Kulkarni } qede_props_t;
574*14b24e2bSVaishali Kulkarni 
575*14b24e2bSVaishali Kulkarni typedef struct qede_link_props {
576*14b24e2bSVaishali Kulkarni 	uint8_t port_type;
577*14b24e2bSVaishali Kulkarni 	boolean_t autoneg;
578*14b24e2bSVaishali Kulkarni 	boolean_t asym_pause;
579*14b24e2bSVaishali Kulkarni 	boolean_t pause;
580*14b24e2bSVaishali Kulkarni     	boolean_t param_100000fdx;
581*14b24e2bSVaishali Kulkarni         boolean_t param_50000fdx;
582*14b24e2bSVaishali Kulkarni         boolean_t param_40000fdx;
583*14b24e2bSVaishali Kulkarni 	boolean_t param_25000fdx;
584*14b24e2bSVaishali Kulkarni         boolean_t param_10000fdx;
585*14b24e2bSVaishali Kulkarni         boolean_t param_1000fdx;
586*14b24e2bSVaishali Kulkarni         boolean_t param_1000hdx;
587*14b24e2bSVaishali Kulkarni } qede_link_props_t;
588*14b24e2bSVaishali Kulkarni 
589*14b24e2bSVaishali Kulkarni typedef struct qede_link_cfg {
590*14b24e2bSVaishali Kulkarni 	boolean_t link_up;
591*14b24e2bSVaishali Kulkarni 	uint32_t speed;
592*14b24e2bSVaishali Kulkarni 	uint8_t duplex;
593*14b24e2bSVaishali Kulkarni 	uint8_t port;
594*14b24e2bSVaishali Kulkarni 	boolean_t autoneg;
595*14b24e2bSVaishali Kulkarni 	uint32_t pause_cfg;
596*14b24e2bSVaishali Kulkarni 	qede_link_props_t supp_capab;
597*14b24e2bSVaishali Kulkarni 	qede_link_props_t adv_capab;
598*14b24e2bSVaishali Kulkarni 	qede_link_props_t rem_capab;
599*14b24e2bSVaishali Kulkarni } qede_link_cfg_t;
600*14b24e2bSVaishali Kulkarni 
601*14b24e2bSVaishali Kulkarni enum qede_filter_type {
602*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_UCAST,
603*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_MCAST,
604*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_RX_MODE,
605*14b24e2bSVaishali Kulkarni 	QEDE_MAX_FILTER_TYPES,
606*14b24e2bSVaishali Kulkarni 
607*14b24e2bSVaishali Kulkarni };
608*14b24e2bSVaishali Kulkarni 
609*14b24e2bSVaishali Kulkarni enum qede_filter_rx_mode_type {
610*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_RX_MODE_REGULAR,
611*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_RX_MODE_MULTI_PROMISC,
612*14b24e2bSVaishali Kulkarni 	QEDE_FILTER_RX_MODE_PROMISC,
613*14b24e2bSVaishali Kulkarni };
614*14b24e2bSVaishali Kulkarni 
615*14b24e2bSVaishali Kulkarni 
616*14b24e2bSVaishali Kulkarni 
617*14b24e2bSVaishali Kulkarni struct qede_mcast_filter_params {
618*14b24e2bSVaishali Kulkarni 	enum qede_filter_rx_mode_type acc_flg;
619*14b24e2bSVaishali Kulkarni 	struct ecore_filter_mcast mcast;
620*14b24e2bSVaishali Kulkarni };
621*14b24e2bSVaishali Kulkarni 
622*14b24e2bSVaishali Kulkarni #define QEDE_MAX_UCST_CNT       8
623*14b24e2bSVaishali Kulkarni typedef struct qede_mac_addr {
624*14b24e2bSVaishali Kulkarni 	 struct ether_addr mac_addr;
625*14b24e2bSVaishali Kulkarni 	  boolean_t         set;
626*14b24e2bSVaishali Kulkarni } qede_mac_addr_t;
627*14b24e2bSVaishali Kulkarni 
628*14b24e2bSVaishali Kulkarni 
629*14b24e2bSVaishali Kulkarni 
630*14b24e2bSVaishali Kulkarni enum qede_state {
631*14b24e2bSVaishali Kulkarni 	QEDE_STATE_UNKNOWN,
632*14b24e2bSVaishali Kulkarni 	QEDE_STATE_ATTACHED,
633*14b24e2bSVaishali Kulkarni 	QEDE_STATE_STARTING,	/* Transitioning State */
634*14b24e2bSVaishali Kulkarni 	QEDE_STATE_STARTED,
635*14b24e2bSVaishali Kulkarni 	QEDE_STATE_STOPPING,	/* Transitioning State */
636*14b24e2bSVaishali Kulkarni 	QEDE_STATE_STOPPED,
637*14b24e2bSVaishali Kulkarni 	QEDE_STATE_SUSPENDING,	/* Transitioning State */
638*14b24e2bSVaishali Kulkarni 	QEDE_STATE_SUSPENDED,
639*14b24e2bSVaishali Kulkarni 	QEDE_STATE_RESUMING,	/* Transitioning State */
640*14b24e2bSVaishali Kulkarni 	QEDE_STATE_FAILED,
641*14b24e2bSVaishali Kulkarni };
642*14b24e2bSVaishali Kulkarni 
643*14b24e2bSVaishali Kulkarni enum qede_attach_resources {
644*14b24e2bSVaishali Kulkarni 	QEDE_STRUCT_ALLOC = (1 << 0),
645*14b24e2bSVaishali Kulkarni 	QEDE_FM =			(1 << 1),
646*14b24e2bSVaishali Kulkarni 	QEDE_PCI = 	(1 << 2),
647*14b24e2bSVaishali Kulkarni 	QEDE_ECORE_HW_PREP = (1 << 3),
648*14b24e2bSVaishali Kulkarni 	QEDE_SET_PARAMS = (1 << 4),
649*14b24e2bSVaishali Kulkarni 	QEDE_CALLBACK = (1 << 5),
650*14b24e2bSVaishali Kulkarni 	QEDE_IO_STRUCT_ALLOC = (1 << 6),
651*14b24e2bSVaishali Kulkarni 	QEDE_INIT_LOCKS = (1 << 7),
652*14b24e2bSVaishali Kulkarni 	QEDE_INTR_ALLOC = (1 << 8),
653*14b24e2bSVaishali Kulkarni 	QEDE_INTR_CONFIG = (1 << 9),
654*14b24e2bSVaishali Kulkarni 	QEDE_EDEV_CONFIG = (1 << 10),
655*14b24e2bSVaishali Kulkarni 	QEDE_KSTAT_INIT = (1 << 11),
656*14b24e2bSVaishali Kulkarni 	QEDE_GLD_INIT = (1 << 12),
657*14b24e2bSVaishali Kulkarni 	QEDE_SP_INTR_ENBL = (1 << 13),
658*14b24e2bSVaishali Kulkarni 	QEDE_ECORE_HW_INIT = (1 << 14),
659*14b24e2bSVaishali Kulkarni /*
660*14b24e2bSVaishali Kulkarni 	 = (1 << 15),
661*14b24e2bSVaishali Kulkarni 	 = (1 << 16),
662*14b24e2bSVaishali Kulkarni 	 = (1 << 17),
663*14b24e2bSVaishali Kulkarni 	 = (1 << 18),
664*14b24e2bSVaishali Kulkarni 	 = (1 << 19),
665*14b24e2bSVaishali Kulkarni 	 = (1 << 20),
666*14b24e2bSVaishali Kulkarni */
667*14b24e2bSVaishali Kulkarni };
668*14b24e2bSVaishali Kulkarni 
669*14b24e2bSVaishali Kulkarni enum qede_vport_state {
670*14b24e2bSVaishali Kulkarni 	QEDE_VPORT_UNKNOWN,
671*14b24e2bSVaishali Kulkarni 	QEDE_VPORT_STARTED,
672*14b24e2bSVaishali Kulkarni 	QEDE_VPORT_ON,
673*14b24e2bSVaishali Kulkarni 	QEDE_VPORT_OFF,
674*14b24e2bSVaishali Kulkarni 	QEDE_VPORT_STOPPED
675*14b24e2bSVaishali Kulkarni };
676*14b24e2bSVaishali Kulkarni 
677*14b24e2bSVaishali Kulkarni #define	QEDE_MAX_GROUPS		1
678*14b24e2bSVaishali Kulkarni typedef struct qede_mac_group {
679*14b24e2bSVaishali Kulkarni 	int				group_index;
680*14b24e2bSVaishali Kulkarni 	mac_group_handle_t		group_handle;
681*14b24e2bSVaishali Kulkarni 	struct qede *qede;
682*14b24e2bSVaishali Kulkarni } qede_mac_group_t;
683*14b24e2bSVaishali Kulkarni 
684*14b24e2bSVaishali Kulkarni typedef struct qede_link_input_params {
685*14b24e2bSVaishali Kulkarni 	struct ecore_mcp_link_params 	default_link_params;
686*14b24e2bSVaishali Kulkarni 	u32  				loopback_mode;
687*14b24e2bSVaishali Kulkarni }qede_link_input_params_t;
688*14b24e2bSVaishali Kulkarni 
689*14b24e2bSVaishali Kulkarni typedef struct qede {
690*14b24e2bSVaishali Kulkarni 	struct ecore_dev 		edev; /* keep this at the beginning of the structure */
691*14b24e2bSVaishali Kulkarni 	dev_info_t *dip;
692*14b24e2bSVaishali Kulkarni 	int 				instance;
693*14b24e2bSVaishali Kulkarni 	enum qede_state			qede_state;
694*14b24e2bSVaishali Kulkarni #define	MAX_QEDE_NAME_LEN		8
695*14b24e2bSVaishali Kulkarni 	char				name[MAX_QEDE_NAME_LEN];
696*14b24e2bSVaishali Kulkarni 
697*14b24e2bSVaishali Kulkarni 	/* PCI access handle */
698*14b24e2bSVaishali Kulkarni 	ddi_acc_handle_t		pci_cfg_handle;
699*14b24e2bSVaishali Kulkarni 
700*14b24e2bSVaishali Kulkarni 	/* BAR 0 - registers */
701*14b24e2bSVaishali Kulkarni 	ddi_acc_handle_t		regs_handle;
702*14b24e2bSVaishali Kulkarni 	off_t				regview_size;
703*14b24e2bSVaishali Kulkarni 	caddr_t				regview;
704*14b24e2bSVaishali Kulkarni 	uint64_t			pci_bar0_base;
705*14b24e2bSVaishali Kulkarni 
706*14b24e2bSVaishali Kulkarni 	/* BAR 2 - doorbell */
707*14b24e2bSVaishali Kulkarni 	ddi_acc_handle_t		doorbell_handle;
708*14b24e2bSVaishali Kulkarni 	off_t				doorbell_size;
709*14b24e2bSVaishali Kulkarni 	caddr_t				doorbell;
710*14b24e2bSVaishali Kulkarni 	uint64_t			pci_bar2_base;
711*14b24e2bSVaishali Kulkarni 
712*14b24e2bSVaishali Kulkarni 	/* Vport params */
713*14b24e2bSVaishali Kulkarni 	struct ecore_sp_vport_update_params	vport_params[MAX_HWFNS_PER_DEVICE];
714*14b24e2bSVaishali Kulkarni 	struct ecore_rss_params		rss_params[MAX_HWFNS_PER_DEVICE];
715*14b24e2bSVaishali Kulkarni 	enum qede_vport_state 		vport_state[MAX_HWFNS_PER_DEVICE];
716*14b24e2bSVaishali Kulkarni 
717*14b24e2bSVaishali Kulkarni 	/* mac Layer related vars */
718*14b24e2bSVaishali Kulkarni 	mac_handle_t			mac_handle;
719*14b24e2bSVaishali Kulkarni 	qede_mac_group_t		rx_groups[QEDE_MAX_GROUPS];
720*14b24e2bSVaishali Kulkarni 	qede_mac_group_t		tx_groups[QEDE_MAX_GROUPS];
721*14b24e2bSVaishali Kulkarni 
722*14b24e2bSVaishali Kulkarni 	u8 *sp_dpc;
723*14b24e2bSVaishali Kulkarni 	/*
724*14b24e2bSVaishali Kulkarni 	 * pre-mapped buffer cache handle for TX
725*14b24e2bSVaishali Kulkarni 	 * used for getting sglist for mbkls
726*14b24e2bSVaishali Kulkarni 	 * that were already mapped in mac layer
727*14b24e2bSVaishali Kulkarni 	 */
728*14b24e2bSVaishali Kulkarni #ifdef	DBLK_DMA_PREMAP
729*14b24e2bSVaishali Kulkarni 	pm_handle_t			pm_handle;
730*14b24e2bSVaishali Kulkarni #endif
731*14b24e2bSVaishali Kulkarni 
732*14b24e2bSVaishali Kulkarni 	/* current operating paramters */
733*14b24e2bSVaishali Kulkarni 	uint32_t			mtu;
734*14b24e2bSVaishali Kulkarni 	uint32_t			num_fp;
735*14b24e2bSVaishali Kulkarni 	uint32_t        		mc_cnt;
736*14b24e2bSVaishali Kulkarni 
737*14b24e2bSVaishali Kulkarni 	uint32_t			tx_ring_size;
738*14b24e2bSVaishali Kulkarni 	uint32_t			tx_buf_size;
739*14b24e2bSVaishali Kulkarni 	uint16_t			tx_recycle_threshold;
740*14b24e2bSVaishali Kulkarni 	u16				pad; // remove later
741*14b24e2bSVaishali Kulkarni 
742*14b24e2bSVaishali Kulkarni 	int             		checksum;
743*14b24e2bSVaishali Kulkarni 	qede_offload_t  		enabled_offloads;
744*14b24e2bSVaishali Kulkarni 	uint32_t        		rx_ring_size;
745*14b24e2bSVaishali Kulkarni 	uint32_t        		rx_buf_count;
746*14b24e2bSVaishali Kulkarni 	uint32_t        		rx_buf_size;
747*14b24e2bSVaishali Kulkarni 	uint32_t        		rx_copy_threshold;
748*14b24e2bSVaishali Kulkarni 	uint32_t			rx_low_buffer_threshold;
749*14b24e2bSVaishali Kulkarni 	boolean_t       		lso_enable;
750*14b24e2bSVaishali Kulkarni 	boolean_t       		lro_enable;
751*14b24e2bSVaishali Kulkarni 	boolean_t       		jumbo_enable;
752*14b24e2bSVaishali Kulkarni 	boolean_t       		log_enable;
753*14b24e2bSVaishali Kulkarni 	uint32_t        		ecore_debug_level;
754*14b24e2bSVaishali Kulkarni 	uint32_t			ecore_debug_module;
755*14b24e2bSVaishali Kulkarni 	boolean_t       		intr_coalesce;
756*14b24e2bSVaishali Kulkarni 	uint32_t        		intr_rx_coal_usec;
757*14b24e2bSVaishali Kulkarni 	uint32_t        		intr_tx_coal_usec;
758*14b24e2bSVaishali Kulkarni 
759*14b24e2bSVaishali Kulkarni 	/* From ecore_hw_init */
760*14b24e2bSVaishali Kulkarni 	uint32_t			num_hwfns;
761*14b24e2bSVaishali Kulkarni 	unsigned char			ether_addr[ETHERADDRL];
762*14b24e2bSVaishali Kulkarni 	uint32_t			num_tc;
763*14b24e2bSVaishali Kulkarni 
764*14b24e2bSVaishali Kulkarni 	qede_mac_addr_t 		ucst_mac[QEDE_MAX_UCST_CNT];
765*14b24e2bSVaishali Kulkarni 	uint32_t        		ucst_total;
766*14b24e2bSVaishali Kulkarni 	uint32_t        		ucst_avail;
767*14b24e2bSVaishali Kulkarni 	qede_mac_addr_t 		suspnd_mac_list[QEDE_MAX_UCST_CNT];
768*14b24e2bSVaishali Kulkarni 
769*14b24e2bSVaishali Kulkarni 
770*14b24e2bSVaishali Kulkarni 	/* software data structures for tx/rx */
771*14b24e2bSVaishali Kulkarni 	qede_intr_context_t		intr_ctx;
772*14b24e2bSVaishali Kulkarni 	qede_fastpath_t			fp_array[MAX_FASTPATH_COUNT];
773*14b24e2bSVaishali Kulkarni 	struct ecore_sb_info		sb_array[MAX_FASTPATH_COUNT];
774*14b24e2bSVaishali Kulkarni 	qede_rx_ring_t			rx_array[MAX_FASTPATH_COUNT];
775*14b24e2bSVaishali Kulkarni 	qede_tx_ring_t	  tx_array[MAX_TC_COUNT][MAX_FASTPATH_COUNT];
776*14b24e2bSVaishali Kulkarni 
777*14b24e2bSVaishali Kulkarni 	uint16_t			tx_bcopy_threshold;
778*14b24e2bSVaishali Kulkarni 	uint16_t			pad1; /* remove later */
779*14b24e2bSVaishali Kulkarni