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 
780*14b24e2bSVaishali Kulkarni 	/* status_block phys mem */
781*14b24e2bSVaishali Kulkarni 	bool 				sb_phy_mem_alloc;
782*14b24e2bSVaishali Kulkarni 
783*14b24e2bSVaishali Kulkarni 	kmutex_t			drv_lock;
784*14b24e2bSVaishali Kulkarni 	kmutex_t			watch_lock;
785*14b24e2bSVaishali Kulkarni 	uint32_t			callback_flags;
786*14b24e2bSVaishali Kulkarni 	enum qede_attach_resources 	attach_resources;
787*14b24e2bSVaishali Kulkarni 
788*14b24e2bSVaishali Kulkarni 	/*
789*14b24e2bSVaishali Kulkarni 	 * qede osal mem management queues
790*14b24e2bSVaishali Kulkarni 	 */
791*14b24e2bSVaishali Kulkarni     	qede_phys_mem_list_t		phys_mem_list;
792*14b24e2bSVaishali Kulkarni     	qede_mem_list_t     		mem_list;
793*14b24e2bSVaishali Kulkarni 
794*14b24e2bSVaishali Kulkarni 	qede_props_t                    props;
795*14b24e2bSVaishali Kulkarni 	qede_link_cfg_t                 hwinit;
796*14b24e2bSVaishali Kulkarni 	qede_link_cfg_t                 curcfg;
797*14b24e2bSVaishali Kulkarni 	qede_params_t                   params;
798*14b24e2bSVaishali Kulkarni 	volatile uint32_t               plumbed;
799*14b24e2bSVaishali Kulkarni 	qede_mcast_list_t               mclist;
800*14b24e2bSVaishali Kulkarni 
801*14b24e2bSVaishali Kulkarni 	uint32_t			mfw_ver;
802*14b24e2bSVaishali Kulkarni 
803*14b24e2bSVaishali Kulkarni 	char                        	devName[QEDE_STR_SIZE];
804*14b24e2bSVaishali Kulkarni 	char                        	version[QEDE_STR_SIZE];
805*14b24e2bSVaishali Kulkarni 	char                        	versionFW[QEDE_STR_SIZE];
806*14b24e2bSVaishali Kulkarni 	char                        	versionMFW[QEDE_STR_SIZE];
807*14b24e2bSVaishali Kulkarni 	char                        	chip_name[QEDE_STR_SIZE];
808*14b24e2bSVaishali Kulkarni 	char                        	chipID[QEDE_STR_SIZE];
809*14b24e2bSVaishali Kulkarni 	char                        	intrAlloc[QEDE_STR_SIZE];
810*14b24e2bSVaishali Kulkarni 	char                        	bus_dev_func[QEDE_STR_SIZE];
811*14b24e2bSVaishali Kulkarni 	char                        	vendor_device[QEDE_STR_SIZE];
812*14b24e2bSVaishali Kulkarni 
813*14b24e2bSVaishali Kulkarni 	uint64_t                        txTotalPkts;
814*14b24e2bSVaishali Kulkarni 	uint64_t                        txTotalBytes;
815*14b24e2bSVaishali Kulkarni 	uint64_t                        txTotalDiscards;
816*14b24e2bSVaishali Kulkarni 	uint64_t                        rxTotalPkts;
817*14b24e2bSVaishali Kulkarni 	uint64_t                        rxTotalBytes;
818*14b24e2bSVaishali Kulkarni 	uint64_t                        rxTotalDiscards;
819*14b24e2bSVaishali Kulkarni 
820*14b24e2bSVaishali Kulkarni 	uint64_t			intrFired;
821*14b24e2bSVaishali Kulkarni 	kmutex_t			kstat_lock;
822*14b24e2bSVaishali Kulkarni 	kmutex_t			gld_lock;
823*14b24e2bSVaishali Kulkarni 	uint64_t			intrSbCnt[MAX_FASTPATH_COUNT + 1];
824*14b24e2bSVaishali Kulkarni 	uint64_t     intrSbNoChangeCnt[MAX_FASTPATH_COUNT + 1];
825*14b24e2bSVaishali Kulkarni 	uint64_t			intrSbPollCnt[MAX_FASTPATH_COUNT + 1];
826*14b24e2bSVaishali Kulkarni 	uint64_t			intrSbPollNoChangeCnt[MAX_FASTPATH_COUNT + 1];
827*14b24e2bSVaishali Kulkarni 
828*14b24e2bSVaishali Kulkarni 	kstat_t *kstats;
829*14b24e2bSVaishali Kulkarni 	kstat_t *kstats_link;
830*14b24e2bSVaishali Kulkarni 	kstat_t *kstats_intr;
831*14b24e2bSVaishali Kulkarni 	kstat_t *kstats_vport;
832*14b24e2bSVaishali Kulkarni 	kstat_t *kstats_rxq[MAX_FASTPATH_COUNT];
833*14b24e2bSVaishali Kulkarni 	KstatRingMap          		kstats_rxq_map[MAX_FASTPATH_COUNT];
834*14b24e2bSVaishali Kulkarni 	kstat_t *kstats_txq[MAX_FASTPATH_COUNT];
835*14b24e2bSVaishali Kulkarni 	KstatRingMap          		kstats_txq_map[MAX_FASTPATH_COUNT];
836*14b24e2bSVaishali Kulkarni     	struct ecore_eth_stats  	save_stats;
837*14b24e2bSVaishali Kulkarni 
838*14b24e2bSVaishali Kulkarni     	mblk_t	*stored_mp;
839*14b24e2bSVaishali Kulkarni     	int 		 		mp_index;
840*14b24e2bSVaishali Kulkarni     	qede_link_input_params_t 	link_input_params;  /*(test) */
841*14b24e2bSVaishali Kulkarni 	uint32_t			loop_back_mode;     /*(test) */
842*14b24e2bSVaishali Kulkarni 	bool				lb_linkup;	    /*(test) */
843*14b24e2bSVaishali Kulkarni 	uint32_t			forced_speed_10G;
844*14b24e2bSVaishali Kulkarni 	uint8_t				pci_func;
845*14b24e2bSVaishali Kulkarni         void *nvm_buf;
846*14b24e2bSVaishali Kulkarni         void *nvm_buf_start;
847*14b24e2bSVaishali Kulkarni 	uint32_t			nvm_buf_size;
848*14b24e2bSVaishali Kulkarni 	uint32_t			copy_len;
849*14b24e2bSVaishali Kulkarni 	uint8_t 			*reserved_buf;
850*14b24e2bSVaishali Kulkarni 	int                             fm_cap;
851*14b24e2bSVaishali Kulkarni         uint64_t                        allocbFailures;
852*14b24e2bSVaishali Kulkarni         volatile uint32_t               detach_unsafe;
853*14b24e2bSVaishali Kulkarni 
854*14b24e2bSVaishali Kulkarni } qede_t;
855*14b24e2bSVaishali Kulkarni 
856*14b24e2bSVaishali Kulkarni /*
857*14b24e2bSVaishali Kulkarni  * ioctl commands
858*14b24e2bSVaishali Kulkarni  */
859*14b24e2bSVaishali Kulkarni 
860*14b24e2bSVaishali Kulkarni typedef enum {
861*14b24e2bSVaishali Kulkarni 	QEDE_DRV_INFO = 2,
862*14b24e2bSVaishali Kulkarni 	QEDE_RD_PCICFG,
863*14b24e2bSVaishali Kulkarni 	QEDE_WR_PCICFG,
864*14b24e2bSVaishali Kulkarni 	QEDE_RW_REG,
865*14b24e2bSVaishali Kulkarni 	QEDE_RW_NVRAM,
866*14b24e2bSVaishali Kulkarni 	QEDE_FUNC_INFO,
867*14b24e2bSVaishali Kulkarni 	QEDE_MAC_ADDR
868*14b24e2bSVaishali Kulkarni } qede_ioctl_cmd_t;
869*14b24e2bSVaishali Kulkarni 
870*14b24e2bSVaishali Kulkarni 
871*14b24e2bSVaishali Kulkarni 
872*14b24e2bSVaishali Kulkarni /*
873*14b24e2bSVaishali Kulkarni  * ioctl message structure for FW update utility
874*14b24e2bSVaishali Kulkarni  */
875*14b24e2bSVaishali Kulkarni 
876*14b24e2bSVaishali Kulkarni /* regiser read/write commands */
877*14b24e2bSVaishali Kulkarni #define QEDE_REG_READ 0
878*14b24e2bSVaishali Kulkarni #define QEDE_REG_WRITE 1
879*14b24e2bSVaishali Kulkarni 
880*14b24e2bSVaishali Kulkarni /* nvram read/write commands */
881*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_READ 0
882*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_WRITE 1
883*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_PUT_FILE_DATA 2
884*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_SET_SECURE_MODE 3
885*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_DEL_FILE 4
886*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_PUT_FILE_BEGIN 5
887*14b24e2bSVaishali Kulkarni #define QEDE_NVRAM_CMD_GET_NVRAM_RESP 6
888*14b24e2bSVaishali Kulkarni 
889*14b24e2bSVaishali Kulkarni typedef struct {
890*14b24e2bSVaishali Kulkarni 	uint32_t cmd;
891*14b24e2bSVaishali Kulkarni 	uint32_t unused1;
892*14b24e2bSVaishali Kulkarni 	uint64_t off;
893*14b24e2bSVaishali Kulkarni 	uint32_t size;
894*14b24e2bSVaishali Kulkarni 	uint32_t rv;
895*14b24e2bSVaishali Kulkarni 	char uabc[2048];
896*14b24e2bSVaishali Kulkarni 	uint64_t address;
897*14b24e2bSVaishali Kulkarni 	void *ptr;
898*14b24e2bSVaishali Kulkarni } qede_ioctl_data_t;
899*14b24e2bSVaishali Kulkarni 
900*14b24e2bSVaishali Kulkarni typedef struct {
901*14b24e2bSVaishali Kulkarni 	uint32_t cmd;
902*14b24e2bSVaishali Kulkarni 	uint32_t unused1;
903*14b24e2bSVaishali Kulkarni 	uint64_t off;
904*14b24e2bSVaishali Kulkarni 	uint32_t size;
905*14b24e2bSVaishali Kulkarni 	uint32_t buf_size;
906*14b24e2bSVaishali Kulkarni 	char uabc[2048];
907*14b24e2bSVaishali Kulkarni 	uint64_t cmd2;
908*14b24e2bSVaishali Kulkarni #define START_NVM_WRITE 1
909*14b24e2bSVaishali Kulkarni #define ACCUMULATE_NVM_BUF 2
910*14b24e2bSVaishali Kulkarni #define STOP_NVM_WRITE 3
911*14b24e2bSVaishali Kulkarni #define READ_BUF 4
912*14b24e2bSVaishali Kulkarni 	void *ptr;
913*14b24e2bSVaishali Kulkarni }qede_nvram_data_t;
914*14b24e2bSVaishali Kulkarni 
915*14b24e2bSVaishali Kulkarni typedef struct {
916*14b24e2bSVaishali Kulkarni        	char drv_name[MAX_QEDE_NAME_LEN];
917*14b24e2bSVaishali Kulkarni 	char drv_version[QEDE_STR_SIZE];
918*14b24e2bSVaishali Kulkarni 	char mfw_version[QEDE_STR_SIZE];
919*14b24e2bSVaishali Kulkarni 	char stormfw_version[QEDE_STR_SIZE];
920*14b24e2bSVaishali Kulkarni 	uint32_t eeprom_dump_len; /* in bytes */
921*14b24e2bSVaishali Kulkarni 	uint32_t reg_dump_len; /* in bytes */
922*14b24e2bSVaishali Kulkarni 	char bus_info[QEDE_STR_SIZE];
923*14b24e2bSVaishali Kulkarni } qede_driver_info_t;
924*14b24e2bSVaishali Kulkarni 
925*14b24e2bSVaishali Kulkarni typedef struct {
926*14b24e2bSVaishali Kulkarni 	uint32_t        supported;	/* Features this interface supports */
927*14b24e2bSVaishali Kulkarni 	uint32_t        advertising; 	/* Features this interface advertises */
928*14b24e2bSVaishali Kulkarni 	uint32_t        speed; 		/* The forced speed, 10Mb, 100Mb, gigabit */
929*14b24e2bSVaishali Kulkarni 	uint32_t        duplex; 	/* Duplex, half or full */
930*14b24e2bSVaishali Kulkarni 	uint32_t        port; 		/* Which connector port */
931*14b24e2bSVaishali Kulkarni 	uint32_t        phy_address; 	/* port number*/
932*14b24e2bSVaishali Kulkarni 	uint32_t        autoneg; 	/* Enable or disable autonegotiation */
933*14b24e2bSVaishali Kulkarni } qede_func_info_t;
934*14b24e2bSVaishali Kulkarni 
935*14b24e2bSVaishali Kulkarni 
936*14b24e2bSVaishali Kulkarni typedef struct {
937*14b24e2bSVaishali Kulkarni 	bool    link_up;
938*14b24e2bSVaishali Kulkarni 	u32     supported_caps; /* In SUPPORTED defs */
939*14b24e2bSVaishali Kulkarni 	u32     advertised_caps; /* In ADVERTISED defs */
940*14b24e2bSVaishali Kulkarni 	u32     lp_caps; /* In ADVERTISED defs */
941*14b24e2bSVaishali Kulkarni 	u32     speed; /* In Mb/s */
942*14b24e2bSVaishali Kulkarni 	u8      duplex; /* In DUPLEX defs */
943*14b24e2bSVaishali Kulkarni 	u8      port; /* In PORT defs */
944*14b24e2bSVaishali Kulkarni 	bool    autoneg;
945*14b24e2bSVaishali Kulkarni } qede_link_output_t;
946*14b24e2bSVaishali Kulkarni 
947*14b24e2bSVaishali Kulkarni #define PORT_FIBRE                      (1)
948*14b24e2bSVaishali Kulkarni #define SUPPORTED_FIBRE                 (1 << 15)
949*14b24e2bSVaishali Kulkarni #define SUPPORTED_Autoneg               (1 << 16)
950*14b24e2bSVaishali Kulkarni #define SUPPORTED_Pause                 (1 << 17)
951*14b24e2bSVaishali Kulkarni #define SUPPORTED_Asym_Pause            (1 << 18)
952*14b24e2bSVaishali Kulkarni #define SUPPORTED_1000baseT_Half        (1 << 19)
953*14b24e2bSVaishali Kulkarni #define SUPPORTED_1000baseT_Full        (1 << 20)
954*14b24e2bSVaishali Kulkarni #define SUPPORTED_10000baseKR_Full      (1 << 21)
955*14b24e2bSVaishali Kulkarni #define SUPPORTED_20000baseKR2_Full     (1 << 22)
956*14b24e2bSVaishali Kulkarni #define SUPPORTED_40000baseKR4_Full     (1 << 23)
957*14b24e2bSVaishali Kulkarni #define SUPPORTED_40000baseCR4_Full     (1 << 24)
958*14b24e2bSVaishali Kulkarni #define SUPPORTED_40000baseSR4_Full     (1 << 25)
959*14b24e2bSVaishali Kulkarni #define SUPPORTED_40000baseLR4_Full     (1 << 26)
960*14b24e2bSVaishali Kulkarni 
961*14b24e2bSVaishali Kulkarni 
962*14b24e2bSVaishali Kulkarni 
963*14b24e2bSVaishali Kulkarni typedef struct {
964*14b24e2bSVaishali Kulkarni 	uint32_t cmd;
965*14b24e2bSVaishali Kulkarni #define QEDE_PCICFG_READ 0x01
966*14b24e2bSVaishali Kulkarni #define QEDE_PCICFG_WRITE 0x02
967*14b24e2bSVaishali Kulkarni 	uint32_t reg;
968*14b24e2bSVaishali Kulkarni 	uint32_t val;
969*14b24e2bSVaishali Kulkarni 	uint32_t width;
970*14b24e2bSVaishali Kulkarni } qede_pcicfg_rdw_t;
971*14b24e2bSVaishali Kulkarni /*
972*14b24e2bSVaishali Kulkarni  * (Internal) return values from ioctl subroutines
973*14b24e2bSVaishali Kulkarni  *
974*14b24e2bSVaishali Kulkarni  */
975*14b24e2bSVaishali Kulkarni enum ioc_reply {
976*14b24e2bSVaishali Kulkarni 	IOC_INVAL = -1, /* bad, NAK with EINVAL */
977*14b24e2bSVaishali Kulkarni 	IOC_DONE, /* OK, reply sent  */
978*14b24e2bSVaishali Kulkarni 	IOC_ACK, /* OK, just send ACK  */
979*14b24e2bSVaishali Kulkarni 	IOC_REPLY, /* OK, just send reply */
980*14b24e2bSVaishali Kulkarni 	IOC_RESTART_ACK, /* OK, restart & ACK */
981*14b24e2bSVaishali Kulkarni 	IOC_RESTART_REPLY /* OK, restart & reply */
982*14b24e2bSVaishali Kulkarni };
983*14b24e2bSVaishali Kulkarni 
984*14b24e2bSVaishali Kulkarni /*
985*14b24e2bSVaishali Kulkarni  * Loop Back Modes
986*14b24e2bSVaishali Kulkarni  */
987*14b24e2bSVaishali Kulkarni enum {
988*14b24e2bSVaishali Kulkarni 	QEDE_LOOP_NONE,
989*14b24e2bSVaishali Kulkarni 	QEDE_LOOP_INTERNAL,
990*14b24e2bSVaishali Kulkarni 	QEDE_LOOP_EXTERNAL,
991*14b24e2bSVaishali Kulkarni };
992*14b24e2bSVaishali Kulkarni 
993*14b24e2bSVaishali Kulkarni /* Loopback test return values */
994*14b24e2bSVaishali Kulkarni enum {
995*14b24e2bSVaishali Kulkarni 	QEDE_LB_TEST_OK,
996*14b24e2bSVaishali Kulkarni 	QEDE_LB_SEND_WAIT_QUEUE_ERR,
997*14b24e2bSVaishali Kulkarni 	QEDE_LB_NORCV_ERR,
998*14b24e2bSVaishali Kulkarni 	QEDE_LB_NOMEM_ERR,
999*14b24e2bSVaishali Kulkarni 	QEDE_LB_TX_QUEUE_ERR,
1000*14b24e2bSVaishali Kulkarni 	QEDE_LB_SHORT_DATA_ERR,
1001*14b24e2bSVaishali Kulkarni 	QEDE_LB_SEQUENCE_ERR,
1002*14b24e2bSVaishali Kulkarni 	QEDE_LB_DATA_ERR,
1003*14b24e2bSVaishali Kulkarni 	QEDE_LB_ERRCNT,
1004*14b24e2bSVaishali Kulkarni 	QEDE_LB_NOT_SUPPORTED,
1005*14b24e2bSVaishali Kulkarni 	QEDE_LB_TEST_CHECK_CABLE,
1006*14b24e2bSVaishali Kulkarni 	QEDE_LB_TEST_IN_PROGRESS
1007*14b24e2bSVaishali Kulkarni };
1008*14b24e2bSVaishali Kulkarni 
1009*14b24e2bSVaishali Kulkarni extern qede_link_props_t qede_def_link_props;
1010*14b24e2bSVaishali Kulkarni /* Functions exported by qede_cfg.c */
1011*14b24e2bSVaishali Kulkarni void qede_cfg_reset(qede_t *qede);
1012*14b24e2bSVaishali Kulkarni void qede_cfg_init(qede_t *qede);
1013*14b24e2bSVaishali Kulkarni 
1014*14b24e2bSVaishali Kulkarni /* Functions exported by qede_gld.c */
1015*14b24e2bSVaishali Kulkarni boolean_t qede_gld_init(qede_t *qede);
1016*14b24e2bSVaishali Kulkarni int qede_multicast(qede_t * qede, boolean_t flag, const uint8_t *ptr_mcaddr);
1017*14b24e2bSVaishali Kulkarni int qede_set_filter_rx_mode(qede_t *qede, enum qede_filter_rx_mode_type type);
1018*14b24e2bSVaishali Kulkarni int qede_set_rx_mac_mcast(qede_t *qede, enum ecore_filter_opcode opcode,
1019*14b24e2bSVaishali Kulkarni     uint8_t *mac, int mc_cnt);
1020*14b24e2bSVaishali Kulkarni int qede_ucst_find(qede_t *qede, const uint8_t *mac_addr);
1021*14b24e2bSVaishali Kulkarni int qede_clear_filters(qede_t *qede);
1022*14b24e2bSVaishali Kulkarni /* Functions exported by qede_main.c */
1023*14b24e2bSVaishali Kulkarni int
1024*14b24e2bSVaishali Kulkarni qede_stop(qede_t *);
1025*14b24e2bSVaishali Kulkarni int
1026*14b24e2bSVaishali Kulkarni qede_start(qede_t *);
1027*14b24e2bSVaishali Kulkarni 
1028*14b24e2bSVaishali Kulkarni #define	QEDE_DOORBELL_WR	qede_bar2_write32_tx_doorbell
1029*14b24e2bSVaishali Kulkarni void
1030*14b24e2bSVaishali Kulkarni qede_bar2_write32_tx_doorbell(qede_tx_ring_t *tx_ring, u32 val);
1031*14b24e2bSVaishali Kulkarni void
1032*14b24e2bSVaishali Kulkarni qede_enable_hw_intr(qede_fastpath_t *);
1033*14b24e2bSVaishali Kulkarni void
1034*14b24e2bSVaishali Kulkarni qede_disable_hw_intr(qede_fastpath_t *);
1035*14b24e2bSVaishali Kulkarni 
1036*14b24e2bSVaishali Kulkarni /* Functions exported by qede_dbg.c */
1037*14b24e2bSVaishali Kulkarni extern void
1038*14b24e2bSVaishali Kulkarni qede_stacktrace(qede_t *);
1039*14b24e2bSVaishali Kulkarni extern void
1040*14b24e2bSVaishali Kulkarni qede_print_vport_params(qede_t *,
1041*14b24e2bSVaishali Kulkarni     struct ecore_sp_vport_update_params *);
1042*14b24e2bSVaishali Kulkarni void
1043*14b24e2bSVaishali Kulkarni qede_dump_single_mblk(qede_t *qede, mblk_t *mp);
1044*14b24e2bSVaishali Kulkarni void
1045*14b24e2bSVaishali Kulkarni qede_dump_mblk_chain_bnext_ptr(qede_t *qede, mblk_t *mp);
1046*14b24e2bSVaishali Kulkarni void
1047*14b24e2bSVaishali Kulkarni qede_dump_mblk_chain_bcont_ptr(qede_t *qede, mblk_t *mp);
1048*14b24e2bSVaishali Kulkarni void
1049*14b24e2bSVaishali Kulkarni qede_dump_bytes(char *, int);
1050*14b24e2bSVaishali Kulkarni void qede_dump_reg_cqe(struct eth_fast_path_rx_reg_cqe *cqe);
1051*14b24e2bSVaishali Kulkarni void qede_dump_start_lro_cqe(struct eth_fast_path_rx_tpa_start_cqe *);
1052*14b24e2bSVaishali Kulkarni void qede_dump_cont_lro_cqe(struct eth_fast_path_rx_tpa_cont_cqe *);
1053*14b24e2bSVaishali Kulkarni void qede_dump_end_lro_cqe(struct eth_fast_path_rx_tpa_end_cqe *);
1054*14b24e2bSVaishali Kulkarni void qede_dump_mblk_chain_bcont_ptr(qede_t *, mblk_t *);
1055*14b24e2bSVaishali Kulkarni 
1056*14b24e2bSVaishali Kulkarni /* Functions exported by qede_fp.c */
1057*14b24e2bSVaishali Kulkarni mblk_t *qede_fp_poll(void *arg, int poll_bytes, int poll_pkts);
1058*14b24e2bSVaishali Kulkarni int qede_fp_stat(mac_ring_driver_t rh, uint_t stat, u64 *val);
1059*14b24e2bSVaishali Kulkarni mblk_t *
1060*14b24e2bSVaishali Kulkarni qede_process_fastpath(qede_fastpath_t *fp,
1061*14b24e2bSVaishali Kulkarni     int nbytes, int npkts, int *work_done);
1062*14b24e2bSVaishali Kulkarni void
1063*14b24e2bSVaishali Kulkarni qede_desc_dma_mem_sync(ddi_dma_handle_t *dma_handle,
1064*14b24e2bSVaishali Kulkarni     uint_t start, uint_t count, uint_t range,
1065*14b24e2bSVaishali Kulkarni     uint_t unit_size, uint_t direction);
1066*14b24e2bSVaishali Kulkarni 
1067*14b24e2bSVaishali Kulkarni /* Functions exported by qede_osal.c */
1068*14b24e2bSVaishali Kulkarni u32 qede_osal_cleanup(qede_t *qede);
1069*14b24e2bSVaishali Kulkarni int
1070*14b24e2bSVaishali Kulkarni qede_osal_find_dma_handle_for_block(qede_t *qede, void *addr,
1071*14b24e2bSVaishali Kulkarni     ddi_dma_handle_t *dma_handle);
1072*14b24e2bSVaishali Kulkarni 
1073*14b24e2bSVaishali Kulkarni /* Functions exported by qede_main.c */
1074*14b24e2bSVaishali Kulkarni int
1075*14b24e2bSVaishali Kulkarni qede_get_mag_elem(qede_rx_ring_t *, qede_rx_buffer_t *);
1076*14b24e2bSVaishali Kulkarni void
1077*14b24e2bSVaishali Kulkarni qede_update_rx_q_producer(qede_rx_ring_t *rx_ring);
1078*14b24e2bSVaishali Kulkarni void qede_get_link_info(struct ecore_hwfn *hwfn,struct qede_link_cfg *lnkcfg);
1079*14b24e2bSVaishali Kulkarni int
1080*14b24e2bSVaishali Kulkarni qede_put_to_passive_list(qede_rx_ring_t *rx_ring, qede_rx_buffer_t *rx_buffer);
1081*14b24e2bSVaishali Kulkarni qede_rx_buffer_t *
1082*14b24e2bSVaishali Kulkarni qede_get_from_active_list(qede_rx_ring_t *, uint32_t *);
1083*14b24e2bSVaishali Kulkarni void
1084*14b24e2bSVaishali Kulkarni qede_replenish_rx_buffers(qede_rx_ring_t *);
1085*14b24e2bSVaishali Kulkarni void
1086*14b24e2bSVaishali Kulkarni qede_recycle_copied_rx_buffer(qede_rx_buffer_t *rx_buffer);
1087*14b24e2bSVaishali Kulkarni boolean_t qede_kstat_init(qede_t *qede);
1088*14b24e2bSVaishali Kulkarni void qede_kstat_fini(qede_t *qede);
1089*14b24e2bSVaishali Kulkarni /*void qede_get_current_link(qede_t *qede, struct qede_link_cfg *lnkcfg);*/
1090*14b24e2bSVaishali Kulkarni #endif /* _QEDE_H */
1091