1*eef4f27bSRobert Mustacchi /*
2*eef4f27bSRobert Mustacchi  * Copyright 2014-2017 Cavium, Inc.
3*eef4f27bSRobert Mustacchi  * The contents of this file are subject to the terms of the Common Development
4*eef4f27bSRobert Mustacchi  * and Distribution License, v.1,  (the "License").
5*eef4f27bSRobert Mustacchi  *
6*eef4f27bSRobert Mustacchi  * You may not use this file except in compliance with the License.
7*eef4f27bSRobert Mustacchi  *
8*eef4f27bSRobert Mustacchi  * You can obtain a copy of the License at available
9*eef4f27bSRobert Mustacchi  * at http://opensource.org/licenses/CDDL-1.0
10*eef4f27bSRobert Mustacchi  *
11*eef4f27bSRobert Mustacchi  * See the License for the specific language governing permissions and
12*eef4f27bSRobert Mustacchi  * limitations under the License.
13*eef4f27bSRobert Mustacchi  */
14*eef4f27bSRobert Mustacchi 
15*eef4f27bSRobert Mustacchi #ifndef _LM_DEFS_H
16*eef4f27bSRobert Mustacchi #define	_LM_DEFS_H
17*eef4f27bSRobert Mustacchi 
18*eef4f27bSRobert Mustacchi #ifdef __cplusplus
19*eef4f27bSRobert Mustacchi extern "C" {
20*eef4f27bSRobert Mustacchi #endif
21*eef4f27bSRobert Mustacchi 
22*eef4f27bSRobert Mustacchi #include "bcmtype.h"
23*eef4f27bSRobert Mustacchi 
24*eef4f27bSRobert Mustacchi /*
25*eef4f27bSRobert Mustacchi  * Simple constants.
26*eef4f27bSRobert Mustacchi  */
27*eef4f27bSRobert Mustacchi 
28*eef4f27bSRobert Mustacchi #ifndef TRUE
29*eef4f27bSRobert Mustacchi #define	TRUE    1
30*eef4f27bSRobert Mustacchi #endif
31*eef4f27bSRobert Mustacchi 
32*eef4f27bSRobert Mustacchi #ifndef FALSE
33*eef4f27bSRobert Mustacchi #define	FALSE   0
34*eef4f27bSRobert Mustacchi #endif
35*eef4f27bSRobert Mustacchi 
36*eef4f27bSRobert Mustacchi #ifndef NULL
37*eef4f27bSRobert Mustacchi #define	NULL    ((void *) 0)
38*eef4f27bSRobert Mustacchi #endif
39*eef4f27bSRobert Mustacchi 
40*eef4f27bSRobert Mustacchi 
41*eef4f27bSRobert Mustacchi /* Signatures for integrity checks. */
42*eef4f27bSRobert Mustacchi #define	LM_DEVICE_SIG		0x6d635242	/* BRcm */
43*eef4f27bSRobert Mustacchi #define	L2PACKET_RX_SIG		0x7872324c	/* L2rx */
44*eef4f27bSRobert Mustacchi #define	L2PACKET_TX_SIG		0x7874324c	/* L2tx */
45*eef4f27bSRobert Mustacchi #define	L4BUFFER_RX_SIG		0x7872344c	/* L4rx */
46*eef4f27bSRobert Mustacchi #define	L4BUFFER_TX_SIG		0x7874344c	/* L4tx */
47*eef4f27bSRobert Mustacchi #define	L4BUFFER_SIG		0x66754254	/* TBuf */
48*eef4f27bSRobert Mustacchi #define	L4GEN_BUFFER_SIG	0x006e6567	/* gen  */
49*eef4f27bSRobert Mustacchi #define	L4GEN_BUFFER_SIG_END	0x0067656e	/* neg  */
50*eef4f27bSRobert Mustacchi 
51*eef4f27bSRobert Mustacchi #define	SIZEOF_SIG		16
52*eef4f27bSRobert Mustacchi #define	SIG(_p)			(*((u32_t *)((u8_t *)(_p) - sizeof (u32_t))))
53*eef4f27bSRobert Mustacchi #define	END_SIG(_p, _size)	(*((u32_t *)((u8_t *)(_p) + (_size))))
54*eef4f27bSRobert Mustacchi 
55*eef4f27bSRobert Mustacchi /*
56*eef4f27bSRobert Mustacchi  * This macro rounds the given value to the next word boundary if it
57*eef4f27bSRobert Mustacchi  * is not already at a word boundary.
58*eef4f27bSRobert Mustacchi  */
59*eef4f27bSRobert Mustacchi #define	ALIGN_VALUE_TO_WORD_BOUNDARY(_v) \
60*eef4f27bSRobert Mustacchi 	(((_v) + (sizeof (void *) - 1)) & ~(sizeof (void *) - 1))
61*eef4f27bSRobert Mustacchi 
62*eef4f27bSRobert Mustacchi /*
63*eef4f27bSRobert Mustacchi  * This macro determines the delta to the next alignment which is
64*eef4f27bSRobert Mustacchi  * either 1, 2, 4, 8, 16, 32, etc.
65*eef4f27bSRobert Mustacchi  */
66*eef4f27bSRobert Mustacchi #define	ALIGN_DELTA_TO_BOUNDARY(_p, _a) \
67*eef4f27bSRobert Mustacchi 	(((((u8_t *)(_p) - (u8_t *)0) + ((_a) - 1)) & ~((_a) - 1)) - \
68*eef4f27bSRobert Mustacchi 	((u8_t *)(_p) - (u8_t *)0))
69*eef4f27bSRobert Mustacchi 
70*eef4f27bSRobert Mustacchi /*
71*eef4f27bSRobert Mustacchi  * This macro returns the pointer to the next alignment if the pointer
72*eef4f27bSRobert Mustacchi  * is not currently on the indicated alignment boundary.
73*eef4f27bSRobert Mustacchi  */
74*eef4f27bSRobert Mustacchi #define	ALIGN_PTR_TO_BOUNDARY(_p, _a) \
75*eef4f27bSRobert Mustacchi 	((u8_t *)(_p) + ALIGN_DELTA_TO_BOUNDARY(_p, _a))
76*eef4f27bSRobert Mustacchi 
77*eef4f27bSRobert Mustacchi 
78*eef4f27bSRobert Mustacchi 
79*eef4f27bSRobert Mustacchi /*
80*eef4f27bSRobert Mustacchi  * Status codes.
81*eef4f27bSRobert Mustacchi  */
82*eef4f27bSRobert Mustacchi 
83*eef4f27bSRobert Mustacchi typedef enum
84*eef4f27bSRobert Mustacchi {
85*eef4f27bSRobert Mustacchi 	LM_STATUS_SUCCESS		= 0,
86*eef4f27bSRobert Mustacchi 	LM_STATUS_LINK_UNKNOWN		= 0,
87*eef4f27bSRobert Mustacchi 	LM_STATUS_FAILURE		= 1,
88*eef4f27bSRobert Mustacchi 	LM_STATUS_RESOURCE		= 2,
89*eef4f27bSRobert Mustacchi 	LM_STATUS_ABORTED		= 3,
90*eef4f27bSRobert Mustacchi 	LM_STATUS_PENDING		= 4,
91*eef4f27bSRobert Mustacchi 	LM_STATUS_PAUSED		= 5,
92*eef4f27bSRobert Mustacchi 	LM_STATUS_INVALID_PARAMETER	= 6,
93*eef4f27bSRobert Mustacchi 	LM_STATUS_LINK_ACTIVE		= 7,
94*eef4f27bSRobert Mustacchi 	LM_STATUS_LINK_DOWN		= 8,
95*eef4f27bSRobert Mustacchi 	LM_STATUS_UNKNOWN_ADAPTER	= 9,
96*eef4f27bSRobert Mustacchi 	LM_STATUS_UNKNOWN_PHY		= 10,
97*eef4f27bSRobert Mustacchi 	LM_STATUS_UNKNOWN_MEDIUM	= 11,
98*eef4f27bSRobert Mustacchi 	LM_STATUS_TOO_MANY_FRAGMENTS	= 12,
99*eef4f27bSRobert Mustacchi 	LM_STATUS_BUFFER_TOO_SHORT	= 16,
100*eef4f27bSRobert Mustacchi 	LM_STATUS_UPLOAD_IN_PROGRESS	= 17,
101*eef4f27bSRobert Mustacchi 	LM_STATUS_BUSY			= 18,
102*eef4f27bSRobert Mustacchi 	LM_STATUS_INVALID_KEY		= 19,
103*eef4f27bSRobert Mustacchi 	LM_STATUS_TIMEOUT		= 20,
104*eef4f27bSRobert Mustacchi 	LM_STATUS_REQUEST_NOT_ACCEPTED	= 21,
105*eef4f27bSRobert Mustacchi 	LM_STATUS_CONNECTION_CLOSED	= 22,
106*eef4f27bSRobert Mustacchi 	LM_STATUS_BAD_SIGNATURE		= 23,
107*eef4f27bSRobert Mustacchi 	LM_STATUS_CONNECTION_RESET	= 24,
108*eef4f27bSRobert Mustacchi 	LM_STATUS_EXISTING_OBJECT	= 25,
109*eef4f27bSRobert Mustacchi 	LM_STATUS_OBJECT_NOT_FOUND	= 26,
110*eef4f27bSRobert Mustacchi 	LM_STATUS_CONNECTION_RM_DISC	= 27,
111*eef4f27bSRobert Mustacchi 	LM_STATUS_VF_LAMAC_REJECTED	= 28,
112*eef4f27bSRobert Mustacchi 	LM_STATUS_NOT_IMPLEMENTED	= 29,
113*eef4f27bSRobert Mustacchi 	LM_STATUS_UNKNOWN_EVENT_CODE	= 30
114*eef4f27bSRobert Mustacchi } lm_status_t;
115*eef4f27bSRobert Mustacchi 
116*eef4f27bSRobert Mustacchi 
117*eef4f27bSRobert Mustacchi /*
118*eef4f27bSRobert Mustacchi  * Receive filter masks.
119*eef4f27bSRobert Mustacchi  */
120*eef4f27bSRobert Mustacchi 
121*eef4f27bSRobert Mustacchi typedef u32_t lm_rx_mask_t;
122*eef4f27bSRobert Mustacchi 
123*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_NONE			0x0000
124*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_UNICAST		0x0001
125*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_MULTICAST		0x0002
126*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_ALL_MULTICAST		0x0004
127*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_BROADCAST		0x0008
128*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_ACCEPT_ERROR_PACKET		0x0010
129*eef4f27bSRobert Mustacchi 
130*eef4f27bSRobert Mustacchi #define	LM_RX_MASK_PROMISCUOUS_MODE		0x10000
131*eef4f27bSRobert Mustacchi 
132*eef4f27bSRobert Mustacchi 
133*eef4f27bSRobert Mustacchi 
134*eef4f27bSRobert Mustacchi /*
135*eef4f27bSRobert Mustacchi  * Flow control.
136*eef4f27bSRobert Mustacchi  */
137*eef4f27bSRobert Mustacchi 
138*eef4f27bSRobert Mustacchi typedef u32_t lm_flow_control_t;
139*eef4f27bSRobert Mustacchi 
140*eef4f27bSRobert Mustacchi #define	LM_FLOW_CONTROL_NONE			0x00
141*eef4f27bSRobert Mustacchi #define	LM_FLOW_CONTROL_RECEIVE_PAUSE		0x01
142*eef4f27bSRobert Mustacchi #define	LM_FLOW_CONTROL_TRANSMIT_PAUSE		0x02
143*eef4f27bSRobert Mustacchi 
144*eef4f27bSRobert Mustacchi /*
145*eef4f27bSRobert Mustacchi  * This value can be or-ed with RECEIVE_PAUSE and TRANSMIT_PAUSE.  If the
146*eef4f27bSRobert Mustacchi  * auto-negotiation is disabled and the RECEIVE_PAUSE and TRANSMIT_PAUSE bits
147*eef4f27bSRobert Mustacchi  * are set, then flow control is enabled regardless of link partner's flow
148*eef4f27bSRobert Mustacchi  * control capability.  Otherwise, if this bit is set, then flow is negotiated
149*eef4f27bSRobert Mustacchi  * with the link partner.  Values 0x80000000 and 0x80000003 are equivalent.
150*eef4f27bSRobert Mustacchi  */
151*eef4f27bSRobert Mustacchi #define	LM_FLOW_CONTROL_AUTO_PAUSE		0x80000000
152*eef4f27bSRobert Mustacchi 
153*eef4f27bSRobert Mustacchi 
154*eef4f27bSRobert Mustacchi /*
155*eef4f27bSRobert Mustacchi  * EEE control.
156*eef4f27bSRobert Mustacchi  */
157*eef4f27bSRobert Mustacchi 
158*eef4f27bSRobert Mustacchi /*
159*eef4f27bSRobert Mustacchi  * values match the registry values for EeeCtrlMode . Default is MED
160*eef4f27bSRobert Mustacchi  * ("Balanced")
161*eef4f27bSRobert Mustacchi  */
162*eef4f27bSRobert Mustacchi typedef enum
163*eef4f27bSRobert Mustacchi {
164*eef4f27bSRobert Mustacchi 	LM_EEE_CONTROL_HIGH	= 0, // MaxPowerSave
165*eef4f27bSRobert Mustacchi 	LM_EEE_CONTROL_MED	= 1, // Balance
166*eef4f27bSRobert Mustacchi 	LM_EEE_CONTROL_LOW	= 2, // MaxPreformance
167*eef4f27bSRobert Mustacchi 	LM_EEE_CONTROL_NVRAM	= 3, // use NVRAM
168*eef4f27bSRobert Mustacchi 	LM_EEE_CONTROL_NA	= 4  // either N/A or disabled
169*eef4f27bSRobert Mustacchi } lm_eee_policy_t;
170*eef4f27bSRobert Mustacchi 
171*eef4f27bSRobert Mustacchi /*
172*eef4f27bSRobert Mustacchi  * media type.
173*eef4f27bSRobert Mustacchi  */
174*eef4f27bSRobert Mustacchi 
175*eef4f27bSRobert Mustacchi typedef u32_t lm_medium_t;
176*eef4f27bSRobert Mustacchi 
177*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_AUTO_DETECT			0x0000
178*eef4f27bSRobert Mustacchi 
179*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_UNKNOWN			0x0000
180*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_BNC			0x0001
181*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_UTP			0x0002
182*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_FIBER			0x0003
183*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_SERDES			0x0004
184*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_SERDES_SGMII		0x0005
185*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_XGXS			0x0006
186*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_XGXS_SGMII		0x0007
187*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_XMAC_LOOPBACK		0x0008
188*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_UMAC_LOOPBACK		0x0009
189*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_EXT_LOOPBACK		0x00f6
190*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK		0x00f7
191*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_SERDES_LOOPBACK		0x00f8
192*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_XGXS_LOOPBACK		0x00f9
193*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_XGXS_10_LOOPBACK		0x00fa
194*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_BMAC_LOOPBACK		0x00fb
195*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_EMAC_LOOPBACK		0x00fc
196*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_PHY_LOOPBACK		0x00fd
197*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_MAC_LOOPBACK		0x00fe
198*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_NULL			0x00ff
199*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_TYPE_MASK			0x00ff
200*eef4f27bSRobert Mustacchi #define	GET_MEDIUM_TYPE(m)			((m) & LM_MEDIUM_TYPE_MASK)
201*eef4f27bSRobert Mustacchi #define	SET_MEDIUM_TYPE(m, t) \
202*eef4f27bSRobert Mustacchi 	(m) = ((m) & ~LM_MEDIUM_TYPE_MASK) | (t)
203*eef4f27bSRobert Mustacchi 
204*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_IS_LOOPBACK(_medium) \
205*eef4f27bSRobert Mustacchi 	(((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_BMAC_LOOPBACK) || \
206*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_UMAC_LOOPBACK) || \
207*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XMAC_LOOPBACK) || \
208*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_EXT_LOOPBACK) || \
209*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_EXT_PHY_LOOPBACK) || \
210*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_SERDES_LOOPBACK) || \
211*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XGXS_LOOPBACK) || \
212*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_XGXS_10_LOOPBACK) || \
213*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_PHY_LOOPBACK) || \
214*eef4f27bSRobert Mustacchi 	((GET_MEDIUM_TYPE(_medium)) == LM_MEDIUM_TYPE_MAC_LOOPBACK))
215*eef4f27bSRobert Mustacchi 
216*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_AUTONEG			0x0000
217*eef4f27bSRobert Mustacchi 
218*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_UNKNOWN			0x0000
219*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_10MBPS			0x0100
220*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_100MBPS			0x0200
221*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_1000MBPS		0x0300
222*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_2500MBPS		0x0400
223*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_10GBPS			0x0600
224*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_12GBPS			0x0700
225*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_12_5GBPS		0x0800
226*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_13GBPS			0x0900
227*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_15GBPS			0x0a00
228*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_16GBPS			0x0b00
229*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_20GBPS			0x0c00
230*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_25GBPS			0x0d00
231*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_40GBPS			0x0e00
232*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_50GBPS			0x0f00
233*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_SEQ_START		0x1d00  // 100Mbps
234*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_SEQ_END			0xE400  // 20Gbps
235*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_AUTONEG_1G_FALLBACK	0xFD00  /* Serdes */
236*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_AUTONEG_2_5G_FALLBACK	0xFE00  /* Serdes */
237*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_HARDWARE_DEFAULT	0xff00  /* Serdes nvram def. */
238*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SPEED_MASK			0xff00
239*eef4f27bSRobert Mustacchi #define	GET_MEDIUM_SPEED(m)			((m) & LM_MEDIUM_SPEED_MASK)
240*eef4f27bSRobert Mustacchi #define	SET_MEDIUM_SPEED(m, s) \
241*eef4f27bSRobert Mustacchi 	(m) = ((m) & ~LM_MEDIUM_SPEED_MASK) | (s)
242*eef4f27bSRobert Mustacchi 
243*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_FULL_DUPLEX		0x00000
244*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_HALF_DUPLEX		0x10000
245*eef4f27bSRobert Mustacchi #define	GET_MEDIUM_DUPLEX(m)		((m) & LM_MEDIUM_HALF_DUPLEX)
246*eef4f27bSRobert Mustacchi #define	SET_MEDIUM_DUPLEX(m, d) \
247*eef4f27bSRobert Mustacchi 	(m) = ((m) & ~LM_MEDIUM_HALF_DUPLEX) | (d)
248*eef4f27bSRobert Mustacchi 
249*eef4f27bSRobert Mustacchi #define	LM_MEDIUM_SELECTIVE_AUTONEG		0x01000000
250*eef4f27bSRobert Mustacchi #define	GET_MEDIUM_AUTONEG_MODE(m)		((m) & 0xff000000)
251*eef4f27bSRobert Mustacchi 
252*eef4f27bSRobert Mustacchi typedef struct _lm_link_settings_t
253*eef4f27bSRobert Mustacchi {
254*eef4f27bSRobert Mustacchi 	u32_t flag;
255*eef4f27bSRobert Mustacchi #define	LINK_FLAG_SELECTIVE_AUTONEG_MASK			0x0f
256*eef4f27bSRobert Mustacchi #define	LINK_FLAG_SELECTIVE_AUTONEG_ONE_SPEED			0x01
257*eef4f27bSRobert Mustacchi #define	LINK_FLAG_SELECTIVE_AUTONEG_ENABLE_SLOWER_SPEEDS	0x02
258*eef4f27bSRobert Mustacchi #define	LINK_FLAG_WIRE_SPEED					0x10
259*eef4f27bSRobert Mustacchi 
260*eef4f27bSRobert Mustacchi 	lm_medium_t req_medium;
261*eef4f27bSRobert Mustacchi 	lm_flow_control_t flow_ctrl;
262*eef4f27bSRobert Mustacchi 
263*eef4f27bSRobert Mustacchi 	u32_t _reserved;
264*eef4f27bSRobert Mustacchi } lm_link_settings_t;
265*eef4f27bSRobert Mustacchi 
266*eef4f27bSRobert Mustacchi 
267*eef4f27bSRobert Mustacchi 
268*eef4f27bSRobert Mustacchi /*
269*eef4f27bSRobert Mustacchi  * Power state.
270*eef4f27bSRobert Mustacchi  */
271*eef4f27bSRobert Mustacchi 
272*eef4f27bSRobert Mustacchi typedef enum
273*eef4f27bSRobert Mustacchi {
274*eef4f27bSRobert Mustacchi 	LM_POWER_STATE_D0 = 0,
275*eef4f27bSRobert Mustacchi 	LM_POWER_STATE_D1 = 1,
276*eef4f27bSRobert Mustacchi 	LM_POWER_STATE_D2 = 2,
277*eef4f27bSRobert Mustacchi 	LM_POWER_STATE_D3 = 3
278*eef4f27bSRobert Mustacchi } lm_power_state_t;
279*eef4f27bSRobert Mustacchi 
280*eef4f27bSRobert Mustacchi 
281*eef4f27bSRobert Mustacchi 
282*eef4f27bSRobert Mustacchi /*
283*eef4f27bSRobert Mustacchi  * offloading.
284*eef4f27bSRobert Mustacchi  */
285*eef4f27bSRobert Mustacchi 
286*eef4f27bSRobert Mustacchi typedef u32_t lm_offload_t;
287*eef4f27bSRobert Mustacchi 
288*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_NONE			0x00000000
289*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_TX_IP_CKSUM		0x00000001
290*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RX_IP_CKSUM		0x00000002
291*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_TX_TCP_CKSUM		0x00000004
292*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RX_TCP_CKSUM		0x00000008
293*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_TX_UDP_CKSUM		0x00000010
294*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RX_UDP_CKSUM		0x00000020
295*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_IPV4_TCP_LSO		0x00000040
296*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_IPV6_TCP_LSO		0x00000080
297*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_CHIMNEY		0x00000100
298*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_IPV6_CHIMNEY		0x00000200
299*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_TX_TCP6_CKSUM	0x00001000
300*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RX_TCP6_CKSUM	0x00002000
301*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_TX_UDP6_CKSUM	0x00004000
302*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RX_UDP6_CKSUM	0x00008000
303*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RSC_IPV4		0x00010000
304*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_RSC_IPV6		0x00020000
305*eef4f27bSRobert Mustacchi #define	LM_OFFLOAD_ENCAP_PACKET		0x00040000
306*eef4f27bSRobert Mustacchi 
307*eef4f27bSRobert Mustacchi 
308*eef4f27bSRobert Mustacchi 
309*eef4f27bSRobert Mustacchi /*
310*eef4f27bSRobert Mustacchi  * RSS Hash Types
311*eef4f27bSRobert Mustacchi  */
312*eef4f27bSRobert Mustacchi 
313*eef4f27bSRobert Mustacchi typedef u32_t lm_rss_hash_t;
314*eef4f27bSRobert Mustacchi 
315*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_IPV4		0x00000100
316*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_TCP_IPV4		0x00000200
317*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_IPV6		0x00000400
318*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_IPV6_EX		0x00000800
319*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_TCP_IPV6		0x00001000
320*eef4f27bSRobert Mustacchi #define	LM_RSS_HASH_TCP_IPV6_EX		0x00002000
321*eef4f27bSRobert Mustacchi 
322*eef4f27bSRobert Mustacchi 
323*eef4f27bSRobert Mustacchi 
324*eef4f27bSRobert Mustacchi /*
325*eef4f27bSRobert Mustacchi  * Chip reset reasons.
326*eef4f27bSRobert Mustacchi  */
327*eef4f27bSRobert Mustacchi 
328*eef4f27bSRobert Mustacchi typedef enum
329*eef4f27bSRobert Mustacchi {
330*eef4f27bSRobert Mustacchi 	LM_REASON_NONE				= 0,
331*eef4f27bSRobert Mustacchi 	LM_REASON_DRIVER_RESET			= 1,
332*eef4f27bSRobert Mustacchi 	LM_REASON_DRIVER_UNLOAD			= 2,
333*eef4f27bSRobert Mustacchi 	LM_REASON_DRIVER_SHUTDOWN		= 3,
334*eef4f27bSRobert Mustacchi 	LM_REASON_WOL_SUSPEND			= 4,
335*eef4f27bSRobert Mustacchi 	LM_REASON_NO_WOL_SUSPEND		= 5,
336*eef4f27bSRobert Mustacchi 	LM_REASON_DIAG				= 6,
337*eef4f27bSRobert Mustacchi 	/* Power down phy/serdes */
338*eef4f27bSRobert Mustacchi 	LM_REASON_DRIVER_UNLOAD_POWER_DOWN	= 7,
339*eef4f27bSRobert Mustacchi 	LM_REASON_ERROR_RECOVERY		= 8
340*eef4f27bSRobert Mustacchi } lm_reason_t;
341*eef4f27bSRobert Mustacchi 
342*eef4f27bSRobert Mustacchi 
343*eef4f27bSRobert Mustacchi 
344*eef4f27bSRobert Mustacchi /*
345*eef4f27bSRobert Mustacchi  * Wake up mode.
346*eef4f27bSRobert Mustacchi  */
347*eef4f27bSRobert Mustacchi 
348*eef4f27bSRobert Mustacchi typedef u32_t lm_wake_up_mode_t;
349*eef4f27bSRobert Mustacchi 
350*eef4f27bSRobert Mustacchi #define	LM_WAKE_UP_MODE_NONE		0
351*eef4f27bSRobert Mustacchi #define	LM_WAKE_UP_MODE_MAGIC_PACKET	1
352*eef4f27bSRobert Mustacchi #define	LM_WAKE_UP_MODE_NWUF		2
353*eef4f27bSRobert Mustacchi #define	LM_WAKE_UP_MODE_LINK_CHANGE	4
354*eef4f27bSRobert Mustacchi 
355*eef4f27bSRobert Mustacchi 
356*eef4f27bSRobert Mustacchi 
357*eef4f27bSRobert Mustacchi /*
358*eef4f27bSRobert Mustacchi  * Event code.
359*eef4f27bSRobert Mustacchi  */
360*eef4f27bSRobert Mustacchi typedef enum
361*eef4f27bSRobert Mustacchi {
362*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_LINK_CHANGE		= 0,
363*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_PAUSE_OFFLOAD		= 1,
364*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_RESUME_OFFLOAD		= 2,
365*eef4f27bSRobert Mustacchi 	/* For Error Recovery Flow */
366*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_STOP_CHIP_ACCESS		= 3,
367*eef4f27bSRobert Mustacchi 	/* For Error Recovery Flow */
368*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_RESTART_CHIP_ACCESS	= 4,
369*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_UPLOAD_ALL		= 5,
370*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_DCBX_OPERA_CHANGE		= 6,
371*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_DCBX_REMOTE_CHANGE	= 7,
372*eef4f27bSRobert Mustacchi 	LM_EVENT_CODE_INVALIDATE_VF_BLOCK	= 8,
373*eef4f27bSRobert Mustacchi } lm_event_code_t;
374*eef4f27bSRobert Mustacchi 
375*eef4f27bSRobert Mustacchi 
376*eef4f27bSRobert Mustacchi /*
377*eef4f27bSRobert Mustacchi  * Transmit control flags.
378*eef4f27bSRobert Mustacchi  */
379*eef4f27bSRobert Mustacchi 
380*eef4f27bSRobert Mustacchi typedef u32_t lm_tx_flag_t;
381*eef4f27bSRobert Mustacchi 
382*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_INSERT_VLAN_TAG		0x01
383*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_COMPUTE_IP_CKSUM		0x02
384*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_COMPUTE_TCP_UDP_CKSUM	0x04
385*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_TCP_LSO_FRAME		0x08
386*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_TCP_LSO_SNAP_FRAME		0x10
387*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_COAL_NOW			0x20
388*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_DONT_COMPUTE_CRC		0x40
389*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_SKIP_MBQ_WRITE		0x80
390*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_IPV6_PACKET			0x100
391*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_VLAN_TAG_EXISTS		0x200
392*eef4f27bSRobert Mustacchi /*
393*eef4f27bSRobert Mustacchi  * If this flag is set, the firmware will ignore global
394*eef4f27bSRobert Mustacchi  * configuration (except Outer VLAN)and will handle inner Vlan
395*eef4f27bSRobert Mustacchi  * only according to driver instructions on the bd:
396*eef4f27bSRobert Mustacchi  * 1. LM_TX_FLAG_VLAN_TAG_EXISTS.
397*eef4f27bSRobert Mustacchi  * 2. LM_TX_FLAG_INSERT_VLAN_TAG.
398*eef4f27bSRobert Mustacchi  * Note that if set the firmware will not handle default vlan /
399*eef4f27bSRobert Mustacchi  * NIV tag / DCB.
400*eef4f27bSRobert Mustacchi  */
401*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_FORCE_VLAN_MODE		0x400
402*eef4f27bSRobert Mustacchi /* Encapsulated packet offload flags. */
403*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_IS_ENCAP_PACKET		0x800
404*eef4f27bSRobert Mustacchi #define	LM_TX_FLAG_ENCAP_PACKET_IS_INNER_IPV6	0x1000
405*eef4f27bSRobert Mustacchi 
406*eef4f27bSRobert Mustacchi typedef struct _lm_pkt_tx_info_t
407*eef4f27bSRobert Mustacchi {
408*eef4f27bSRobert Mustacchi 	lm_tx_flag_t flags;
409*eef4f27bSRobert Mustacchi 
410*eef4f27bSRobert Mustacchi 	u16_t vlan_tag;
411*eef4f27bSRobert Mustacchi 	u16_t lso_mss;
412*eef4f27bSRobert Mustacchi 	u16_t lso_ip_hdr_len;
413*eef4f27bSRobert Mustacchi 	u16_t lso_tcp_hdr_len;
414*eef4f27bSRobert Mustacchi 	u32_t lso_payload_len;
415*eef4f27bSRobert Mustacchi 
416*eef4f27bSRobert Mustacchi 	/* Everest only fields. */
417*eef4f27bSRobert Mustacchi 	u32_t lso_tcp_send_seq;
418*eef4f27bSRobert Mustacchi 	u16_t lso_ipid;
419*eef4f27bSRobert Mustacchi 	u16_t tcp_pseudo_csum;
420*eef4f27bSRobert Mustacchi 	u8_t  lso_tcp_flags;
421*eef4f27bSRobert Mustacchi 	u8_t  tcp_nonce_sum_bit;
422*eef4f27bSRobert Mustacchi 	u16_t fw_ip_csum;
423*eef4f27bSRobert Mustacchi 
424*eef4f27bSRobert Mustacchi 	u8_t dst_mac_addr[8];
425*eef4f27bSRobert Mustacchi 	s8_t cs_any_offset;
426*eef4f27bSRobert Mustacchi 	u8_t src_mac_addr[8];
427*eef4f27bSRobert Mustacchi 	u8_t _unused1;
428*eef4f27bSRobert Mustacchi 	u8_t eth_type[4];
429*eef4f27bSRobert Mustacchi 
430*eef4f27bSRobert Mustacchi 	/*
431*eef4f27bSRobert Mustacchi 	 * Encapsulated packet offsets.  These fields are only valid when
432*eef4f27bSRobert Mustacchi 	 * LM_TX_FLAG_IS_ENCAP_PACKET is set.
433*eef4f27bSRobert Mustacchi 	 */
434*eef4f27bSRobert Mustacchi 	u8_t  encap_packet_inner_frame_offset;
435*eef4f27bSRobert Mustacchi 	u8_t  encap_packet_inner_ip_relative_offset;
436*eef4f27bSRobert Mustacchi 	u16_t encap_packet_inner_tcp_relative_offset;
437*eef4f27bSRobert Mustacchi } lm_pkt_tx_info_t;
438*eef4f27bSRobert Mustacchi 
439*eef4f27bSRobert Mustacchi 
440*eef4f27bSRobert Mustacchi 
441*eef4f27bSRobert Mustacchi /*
442*eef4f27bSRobert Mustacchi  * Receive control flags.
443*eef4f27bSRobert Mustacchi  */
444*eef4f27bSRobert Mustacchi 
445*eef4f27bSRobert Mustacchi typedef u32_t lm_rx_flag_t;
446*eef4f27bSRobert Mustacchi 
447*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_VALID_VLAN_TAG		0x00000001
448*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_VALID_HASH_VALUE		0x00000010
449*eef4f27bSRobert Mustacchi 
450*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IS_IPV4_DATAGRAM		0x00000100
451*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IS_IPV6_DATAGRAM		0x00000200
452*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IP_CKSUM_IS_GOOD		0x00000400
453*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IP_CKSUM_IS_BAD		0x00000800
454*eef4f27bSRobert Mustacchi 
455*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IS_UDP_DATAGRAM		0x00001000
456*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_UDP_CKSUM_IS_GOOD		0x00002000
457*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_UDP_CKSUM_IS_BAD		0x00004000
458*eef4f27bSRobert Mustacchi 
459*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_IS_TCP_SEGMENT		0x00010000
460*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_TCP_CKSUM_IS_GOOD		0x00020000
461*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_TCP_CKSUM_IS_BAD		0x00040000
462*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_START_RSC_TPA		0x00080000
463*eef4f27bSRobert Mustacchi 
464*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_HASH_TYPE_IPV4		0x00100000
465*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_HASH_TYPE_TCP_IPV4		0x00200000
466*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_HASH_TYPE_IPV6		0x00400000
467*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_HASH_TYPE_TCP_IPV6		0x00800000
468*eef4f27bSRobert Mustacchi #define	LM_RX_FLAG_HASH_TYPE_MASK		0x00f00000
469*eef4f27bSRobert Mustacchi 
470*eef4f27bSRobert Mustacchi typedef struct _lm_pkt_rx_info_t
471*eef4f27bSRobert Mustacchi {
472*eef4f27bSRobert Mustacchi 	lm_rx_flag_t flags;
473*eef4f27bSRobert Mustacchi 
474*eef4f27bSRobert Mustacchi 	u32_t size;
475*eef4f27bSRobert Mustacchi 
476*eef4f27bSRobert Mustacchi 	u16_t vlan_tag;
477*eef4f27bSRobert Mustacchi 	u16_t _pad;
478*eef4f27bSRobert Mustacchi 
479*eef4f27bSRobert Mustacchi 	/*
480*eef4f27bSRobert Mustacchi 	 * Virtual address corresponding to the first byte of the first SGL
481*eef4f27bSRobert Mustacchi 	 * entry.  This is the starting location of the packet which may begin
482*eef4f27bSRobert Mustacchi 	 * with some control information.
483*eef4f27bSRobert Mustacchi 	 */
484*eef4f27bSRobert Mustacchi 	u8_t *mem_virt;
485*eef4f27bSRobert Mustacchi 	u32_t mem_size;
486*eef4f27bSRobert Mustacchi 
487*eef4f27bSRobert Mustacchi 	/* these fields only valid when LM_RX_FLAG_START_RSC_TPA is set */
488*eef4f27bSRobert Mustacchi 	u16_t coal_seg_cnt;
489*eef4f27bSRobert Mustacchi 	u16_t dup_ack_cnt;
490*eef4f27bSRobert Mustacchi 	u32_t ts_delta;  /* valid when timestamp is enabled */
491*eef4f27bSRobert Mustacchi 	/*
492*eef4f27bSRobert Mustacchi 	 * if the packet is RSC, this field will hold the total size of the
493*eef4f27bSRobert Mustacchi 	 * RSC SCU
494*eef4f27bSRobert Mustacchi 	 */
495*eef4f27bSRobert Mustacchi 	u32_t total_packet_size;
496*eef4f27bSRobert Mustacchi 
497*eef4f27bSRobert Mustacchi 	u32_t unused;
498*eef4f27bSRobert Mustacchi } lm_pkt_rx_info_t;
499*eef4f27bSRobert Mustacchi 
500*eef4f27bSRobert Mustacchi 
501*eef4f27bSRobert Mustacchi 
502*eef4f27bSRobert Mustacchi /*
503*eef4f27bSRobert Mustacchi  * various type of counters.
504*eef4f27bSRobert Mustacchi  */
505*eef4f27bSRobert Mustacchi 
506*eef4f27bSRobert Mustacchi typedef enum
507*eef4f27bSRobert Mustacchi {
508*eef4f27bSRobert Mustacchi 	LM_STATS_BASE				= 0x686b3000,
509*eef4f27bSRobert Mustacchi 	LM_STATS_FRAMES_XMITTED_OK		= 0x686b3001,
510*eef4f27bSRobert Mustacchi 	LM_STATS_FRAMES_RECEIVED_OK		= 0x686b3002,
511*eef4f27bSRobert Mustacchi 	LM_STATS_ERRORED_TRANSMIT_CNT		= 0x686b3003,
512*eef4f27bSRobert Mustacchi 	LM_STATS_ERRORED_RECEIVE_CNT		= 0x686b3004,
513*eef4f27bSRobert Mustacchi 	LM_STATS_RCV_CRC_ERROR			= 0x686b3005,
514*eef4f27bSRobert Mustacchi 	LM_STATS_ALIGNMENT_ERROR		= 0x686b3006,
515*eef4f27bSRobert Mustacchi 	LM_STATS_SINGLE_COLLISION_FRAMES	= 0x686b3007,
516*eef4f27bSRobert Mustacchi 	LM_STATS_MULTIPLE_COLLISION_FRAMES	= 0x686b3008,
517*eef4f27bSRobert Mustacchi 	LM_STATS_FRAMES_DEFERRED		= 0x686b3009,
518*eef4f27bSRobert Mustacchi 	LM_STATS_MAX_COLLISIONS			= 0x686b300a,
519*eef4f27bSRobert Mustacchi 	LM_STATS_RCV_OVERRUN			= 0x686b300b,
520*eef4f27bSRobert Mustacchi 	LM_STATS_XMIT_UNDERRUN			= 0x686b300c,
521*eef4f27bSRobert Mustacchi 	LM_STATS_UNICAST_FRAMES_XMIT		= 0x686b300d,
522*eef4f27bSRobert Mustacchi 	LM_STATS_MULTICAST_FRAMES_XMIT		= 0x686b300e,
523*eef4f27bSRobert Mustacchi 	LM_STATS_BROADCAST_FRAMES_XMIT		= 0x686b300f,
524*eef4f27bSRobert Mustacchi 	LM_STATS_UNICAST_FRAMES_RCV		= 0x686b3010,
525*eef4f27bSRobert Mustacchi 	LM_STATS_MULTICAST_FRAMES_RCV		= 0x686b3011,
526*eef4f27bSRobert Mustacchi 	LM_STATS_BROADCAST_FRAMES_RCV		= 0x686b3012,
527*eef4f27bSRobert Mustacchi 	LM_STATS_RCV_NO_BUFFER_DROP		= 0x686b3013,
528*eef4f27bSRobert Mustacchi 	LM_STATS_BYTES_RCV			= 0x686b3014,
529*eef4f27bSRobert Mustacchi 	LM_STATS_BYTES_XMIT			= 0x686b3015,
530*eef4f27bSRobert Mustacchi 	LM_STATS_IP4_OFFLOAD			= 0x686b3016,
531*eef4f27bSRobert Mustacchi 	LM_STATS_TCP_OFFLOAD			= 0x686b3017,
532*eef4f27bSRobert Mustacchi 	LM_STATS_IF_IN_DISCARDS			= 0x686b3018,
533*eef4f27bSRobert Mustacchi 	LM_STATS_IF_IN_ERRORS			= 0x686b3019,
534*eef4f27bSRobert Mustacchi 	LM_STATS_IF_OUT_ERRORS			= 0x686b301a,
535*eef4f27bSRobert Mustacchi 	LM_STATS_IP6_OFFLOAD			= 0x686b301b,
536*eef4f27bSRobert Mustacchi 	LM_STATS_TCP6_OFFLOAD			= 0x686b301c,
537*eef4f27bSRobert Mustacchi 	LM_STATS_XMIT_DISCARDS			= 0x686b301d,
538*eef4f27bSRobert Mustacchi 	LM_STATS_DIRECTED_BYTES_RCV		= 0x686b301e,
539*eef4f27bSRobert Mustacchi 	LM_STATS_MULTICAST_BYTES_RCV		= 0x686b301f,
540*eef4f27bSRobert Mustacchi 	LM_STATS_BROADCAST_BYTES_RCV		= 0x686b3020,
541*eef4f27bSRobert Mustacchi 	LM_STATS_DIRECTED_BYTES_XMIT		= 0x686b3021,
542*eef4f27bSRobert Mustacchi 	LM_STATS_MULTICAST_BYTES_XMIT		= 0x686b3022,
543*eef4f27bSRobert Mustacchi 	LM_STATS_BROADCAST_BYTES_XMIT		= 0x686b3023,
544*eef4f27bSRobert Mustacchi } lm_stats_t;
545*eef4f27bSRobert Mustacchi 
546*eef4f27bSRobert Mustacchi #define	NUM_OF_LM_STATS		36
547*eef4f27bSRobert Mustacchi 
548*eef4f27bSRobert Mustacchi 
549*eef4f27bSRobert Mustacchi /*
550*eef4f27bSRobert Mustacchi  * 64-bit value.
551*eef4f27bSRobert Mustacchi  */
552*eef4f27bSRobert Mustacchi 
553*eef4f27bSRobert Mustacchi typedef union _lm_u64_t
554*eef4f27bSRobert Mustacchi {
555*eef4f27bSRobert Mustacchi 	struct _lm_u64_as_u32_t
556*eef4f27bSRobert Mustacchi 	{
557*eef4f27bSRobert Mustacchi #ifdef BIG_ENDIAN_HOST
558*eef4f27bSRobert Mustacchi 		u32_t high;
559*eef4f27bSRobert Mustacchi 		u32_t low;
560*eef4f27bSRobert Mustacchi #else
561*eef4f27bSRobert Mustacchi 		u32_t low;
562*eef4f27bSRobert Mustacchi 		u32_t high;
563*eef4f27bSRobert Mustacchi #endif
564*eef4f27bSRobert Mustacchi 	} as_u32;
565*eef4f27bSRobert Mustacchi 
566*eef4f27bSRobert Mustacchi 	u64_t as_u64;
567*eef4f27bSRobert Mustacchi 
568*eef4f27bSRobert Mustacchi 	void *as_ptr;
569*eef4f27bSRobert Mustacchi } lm_u64_t;
570*eef4f27bSRobert Mustacchi 
571*eef4f27bSRobert Mustacchi 
572*eef4f27bSRobert Mustacchi typedef lm_u64_t lm_address_t;
573*eef4f27bSRobert Mustacchi 
574*eef4f27bSRobert Mustacchi 
575*eef4f27bSRobert Mustacchi /* 64-bit increment.  The second argument is a 32-bit value. */
576*eef4f27bSRobert Mustacchi #define	LM_INC64(result, addend32)			\
577*eef4f27bSRobert Mustacchi 	{						\
578*eef4f27bSRobert Mustacchi 		u32_t low;				\
579*eef4f27bSRobert Mustacchi 							\
580*eef4f27bSRobert Mustacchi 		low = (result)->as_u32.low;		\
581*eef4f27bSRobert Mustacchi 		(result)->as_u32.low += (addend32);	\
582*eef4f27bSRobert Mustacchi 		if ((result)->as_u32.low < low)		\
583*eef4f27bSRobert Mustacchi 		{					\
584*eef4f27bSRobert Mustacchi 		    (result)->as_u32.high++;		\
585*eef4f27bSRobert Mustacchi 		}					\
586*eef4f27bSRobert Mustacchi 	}
587*eef4f27bSRobert Mustacchi 
588*eef4f27bSRobert Mustacchi 
589*eef4f27bSRobert Mustacchi /* 64-bit decrement.  The second argument is a 32-bit value. */
590*eef4f27bSRobert Mustacchi #define	LM_DEC64(result, addend32)			\
591*eef4f27bSRobert Mustacchi 	{						\
592*eef4f27bSRobert Mustacchi 		u32_t low;				\
593*eef4f27bSRobert Mustacchi 							\
594*eef4f27bSRobert Mustacchi 		low = (result)->as_u32.low;		\
595*eef4f27bSRobert Mustacchi 		(result)->as_u32.low -= (addend32);	\
596*eef4f27bSRobert Mustacchi 		if ((result)->as_u32.low > low)		\
597*eef4f27bSRobert Mustacchi 		{					\
598*eef4f27bSRobert Mustacchi 			(result)->as_u32.high--;	\
599*eef4f27bSRobert Mustacchi 		}					\
600*eef4f27bSRobert Mustacchi 	}
601*eef4f27bSRobert Mustacchi 
602*eef4f27bSRobert Mustacchi /*
603*eef4f27bSRobert Mustacchi  * IP4 and TCP offload stats.
604*eef4f27bSRobert Mustacchi  */
605*eef4f27bSRobert Mustacchi 
606*eef4f27bSRobert Mustacchi typedef struct _lm_ip4_offload_stats_t
607*eef4f27bSRobert Mustacchi {
608*eef4f27bSRobert Mustacchi     u64_t in_receives;
609*eef4f27bSRobert Mustacchi     u64_t in_delivers;
610*eef4f27bSRobert Mustacchi     u64_t out_requests;
611*eef4f27bSRobert Mustacchi     u32_t in_header_errors;
612*eef4f27bSRobert Mustacchi     u32_t in_discards;
613*eef4f27bSRobert Mustacchi     u32_t out_discards;
614*eef4f27bSRobert Mustacchi     u32_t out_no_routes;
615*eef4f27bSRobert Mustacchi 
616*eef4f27bSRobert Mustacchi     u32_t _pad[8];
617*eef4f27bSRobert Mustacchi } lm_ip4_offload_stats_t;
618*eef4f27bSRobert Mustacchi 
619*eef4f27bSRobert Mustacchi 
620*eef4f27bSRobert Mustacchi typedef struct _lm_tcp_offload_stats_t
621*eef4f27bSRobert Mustacchi {
622*eef4f27bSRobert Mustacchi     u64_t in_segments;
623*eef4f27bSRobert Mustacchi     u64_t out_segments;
624*eef4f27bSRobert Mustacchi     u32_t retran_segments;
625*eef4f27bSRobert Mustacchi     u32_t in_errors;
626*eef4f27bSRobert Mustacchi     u32_t out_resets;
627*eef4f27bSRobert Mustacchi 
628*eef4f27bSRobert Mustacchi     u32_t _pad[8];
629*eef4f27bSRobert Mustacchi } lm_tcp_offload_stats_t;
630*eef4f27bSRobert Mustacchi 
631*eef4f27bSRobert Mustacchi 
632*eef4f27bSRobert Mustacchi 
633*eef4f27bSRobert Mustacchi /*
634*eef4f27bSRobert Mustacchi  * Host to network order conversion.
635*eef4f27bSRobert Mustacchi  */
636*eef4f27bSRobert Mustacchi 
637*eef4f27bSRobert Mustacchi #ifdef BIG_ENDIAN_HOST
638*eef4f27bSRobert Mustacchi 
639*eef4f27bSRobert Mustacchi #ifndef	HTON16
640*eef4f27bSRobert Mustacchi #define	HTON16(_val16)	(_val16)
641*eef4f27bSRobert Mustacchi #endif
642*eef4f27bSRobert Mustacchi #ifndef	HTON32
643*eef4f27bSRobert Mustacchi #define	HTON32(_val32)	(_val32)
644*eef4f27bSRobert Mustacchi #ifndef	NTOH16
645*eef4f27bSRobert Mustacchi #endif
646*eef4f27bSRobert Mustacchi #define	NTOH16(_val16)	(_val16)
647*eef4f27bSRobert Mustacchi #endif
648*eef4f27bSRobert Mustacchi #ifndef	NTOH32
649*eef4f27bSRobert Mustacchi #define	NTOH32(_val32)	(_val32)
650*eef4f27bSRobert Mustacchi #endif
651*eef4f27bSRobert Mustacchi 
652*eef4f27bSRobert Mustacchi #else
653*eef4f27bSRobert Mustacchi 
654*eef4f27bSRobert Mustacchi #ifndef	HTON16
655*eef4f27bSRobert Mustacchi #define	HTON16(_val16)	(((_val16 & 0xff00) >> 8) | ((_val16 & 0xff) << 8))
656*eef4f27bSRobert Mustacchi #endif
657*eef4f27bSRobert Mustacchi #ifndef	HTON32
658*eef4f27bSRobert Mustacchi #define	HTON32(_val32)	((HTON16(_val32) << 16) | (HTON16(_val32 >> 16)))
659*eef4f27bSRobert Mustacchi #endif
660*eef4f27bSRobert Mustacchi #ifndef	NTOH16
661*eef4f27bSRobert Mustacchi #define	NTOH16(_val16)	HTON16(_val16)
662*eef4f27bSRobert Mustacchi #endif
663*eef4f27bSRobert Mustacchi #ifndef	NTOH32
664*eef4f27bSRobert Mustacchi #define	NTOH32(_val32)	HTON32(_val32)
665*eef4f27bSRobert Mustacchi #endif
666*eef4f27bSRobert Mustacchi 
667*eef4f27bSRobert Mustacchi #endif
668*eef4f27bSRobert Mustacchi 
669*eef4f27bSRobert Mustacchi 
670*eef4f27bSRobert Mustacchi 
671*eef4f27bSRobert Mustacchi /*
672*eef4f27bSRobert Mustacchi  * Fragment structure.
673*eef4f27bSRobert Mustacchi  */
674*eef4f27bSRobert Mustacchi 
675*eef4f27bSRobert Mustacchi typedef struct _lm_frag_t
676*eef4f27bSRobert Mustacchi {
677*eef4f27bSRobert Mustacchi     lm_address_t addr;
678*eef4f27bSRobert Mustacchi     u32_t size;
679*eef4f27bSRobert Mustacchi     u32_t _reserved;
680*eef4f27bSRobert Mustacchi } lm_frag_t;
681*eef4f27bSRobert Mustacchi 
682*eef4f27bSRobert Mustacchi typedef struct _lm_frag_list_t
683*eef4f27bSRobert Mustacchi {
684*eef4f27bSRobert Mustacchi     u32_t cnt;
685*eef4f27bSRobert Mustacchi     u32_t size;
686*eef4f27bSRobert Mustacchi 
687*eef4f27bSRobert Mustacchi     lm_frag_t frag_arr[1];
688*eef4f27bSRobert Mustacchi } lm_frag_list_t;
689*eef4f27bSRobert Mustacchi 
690*eef4f27bSRobert Mustacchi /* a macro for declaring 'lm_frag_list_t' with various array sizes. */
691*eef4f27bSRobert Mustacchi #define	DECLARE_FRAG_LIST_BUFFER_TYPE(_FRAG_LIST_TYPE_NAME, _MAX_FRAG_CNT) \
692*eef4f27bSRobert Mustacchi 	typedef struct _##_FRAG_LIST_TYPE_NAME				\
693*eef4f27bSRobert Mustacchi 	{								\
694*eef4f27bSRobert Mustacchi 		lm_frag_list_t list;					\
695*eef4f27bSRobert Mustacchi 		lm_frag_t frag_arr[_MAX_FRAG_CNT-1];			\
696*eef4f27bSRobert Mustacchi 	} _FRAG_LIST_TYPE_NAME
697*eef4f27bSRobert Mustacchi 
698*eef4f27bSRobert Mustacchi /*
699*eef4f27bSRobert Mustacchi  * DCBX indicate event parameters.
700*eef4f27bSRobert Mustacchi  */
701*eef4f27bSRobert Mustacchi typedef enum _dcb_condition_selector_t
702*eef4f27bSRobert Mustacchi {
703*eef4f27bSRobert Mustacchi     DCB_CONDITION_RESERVED,
704*eef4f27bSRobert Mustacchi     DCB_CONDITION_DEFAULT,
705*eef4f27bSRobert Mustacchi     DCB_CONDITION_TCP_PORT,
706*eef4f27bSRobert Mustacchi     DCB_CONDITION_UDP_PORT,
707*eef4f27bSRobert Mustacchi     DCB_CONDITION_TCP_OR_UDP_PORT,
708*eef4f27bSRobert Mustacchi     DCB_CONDITION_ETHERTYPE,
709*eef4f27bSRobert Mustacchi     DCB_CONDITION_NETDIRECT_PORT,
710*eef4f27bSRobert Mustacchi     DCB_CONDITION_MAX,
711*eef4f27bSRobert Mustacchi }dcb_condition_selector_t;
712*eef4f27bSRobert Mustacchi 
713*eef4f27bSRobert Mustacchi typedef enum _action_selector_t
714*eef4f27bSRobert Mustacchi {
715*eef4f27bSRobert Mustacchi     DCB_ACTION_PRIORITY,
716*eef4f27bSRobert Mustacchi     DCB_ACTION_MAX,
717*eef4f27bSRobert Mustacchi } action_selector_t;
718*eef4f27bSRobert Mustacchi 
719*eef4f27bSRobert Mustacchi typedef struct _dcb_classif_elem_t
720*eef4f27bSRobert Mustacchi {
721*eef4f27bSRobert Mustacchi     u32_t flags;
722*eef4f27bSRobert Mustacchi #define	DCB_CLASSIF_ENFORCED_BY_VBD	0x1
723*eef4f27bSRobert Mustacchi     dcb_condition_selector_t condition_selector;
724*eef4f27bSRobert Mustacchi     u16_t condition_field;
725*eef4f27bSRobert Mustacchi     action_selector_t action_selector;
726*eef4f27bSRobert Mustacchi     u16_t action_field;
727*eef4f27bSRobert Mustacchi }dcb_classif_elem_t;
728*eef4f27bSRobert Mustacchi 
729*eef4f27bSRobert Mustacchi typedef enum _dcb_classif_version_t
730*eef4f27bSRobert Mustacchi {
731*eef4f27bSRobert Mustacchi     DCB_CLASSIFI_VER_SIMPLE_ELEM,
732*eef4f27bSRobert Mustacchi     DCB_CLASSIFI_VER_SIMPLE_ELEM_MAX,
733*eef4f27bSRobert Mustacchi }dcb_classif_version_t;
734*eef4f27bSRobert Mustacchi 
735*eef4f27bSRobert Mustacchi typedef struct _dcb_classif_params_t
736*eef4f27bSRobert Mustacchi {
737*eef4f27bSRobert Mustacchi     u16_t num_classif_elements;
738*eef4f27bSRobert Mustacchi     u16_t _pad;
739*eef4f27bSRobert Mustacchi     dcb_classif_version_t classif_version;
740*eef4f27bSRobert Mustacchi     void *classif_table;
741*eef4f27bSRobert Mustacchi }dcb_classif_params_t;
742*eef4f27bSRobert Mustacchi 
743*eef4f27bSRobert Mustacchi typedef struct _dcb_pfc_param_t
744*eef4f27bSRobert Mustacchi {
745*eef4f27bSRobert Mustacchi     u32_t pfc_enable;
746*eef4f27bSRobert Mustacchi #define	DCB_PFC_MAX_BIT_ENABLE_MASK	(0xFF)
747*eef4f27bSRobert Mustacchi }dcb_pfc_param_t;
748*eef4f27bSRobert Mustacchi 
749*eef4f27bSRobert Mustacchi typedef enum _tsa_assignment
750*eef4f27bSRobert Mustacchi {
751*eef4f27bSRobert Mustacchi     TSA_ASSIGNMENT_DCB_TSA_STRICT,
752*eef4f27bSRobert Mustacchi     TSA_ASSIGNMENT_DCB_TSA_CBS,
753*eef4f27bSRobert Mustacchi     TSA_ASSIGNMENT_DCB_TSA_ETS,
754*eef4f27bSRobert Mustacchi } tsa_assignment;
755*eef4f27bSRobert Mustacchi 
756*eef4f27bSRobert Mustacchi typedef struct _dcb_ets_tsa_param_t
757*eef4f27bSRobert Mustacchi {
758*eef4f27bSRobert Mustacchi     u32_t num_traffic_classes;
759*eef4f27bSRobert Mustacchi     u8_t priority_assignment_table[8];
760*eef4f27bSRobert Mustacchi     u8_t tc_bw_assignment_table[8];
761*eef4f27bSRobert Mustacchi     tsa_assignment tsa_assignment_table[8];
762*eef4f27bSRobert Mustacchi } dcb_ets_tsa_param_t;
763*eef4f27bSRobert Mustacchi 
764*eef4f27bSRobert Mustacchi typedef struct _dcb_indicate_event_params_t
765*eef4f27bSRobert Mustacchi {
766*eef4f27bSRobert Mustacchi     u32_t flags;
767*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_ETS_ENABLED		0x00000001
768*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_ETS_CHANGED		0x00000002
769*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_PFC_ENABLED		0x00000004
770*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_PFC_CHANGED		0x00000008
771*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_CLASSIF_ENABLED	0x00000020
772*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_CLASSIF_CHANGED	0x00000040
773*eef4f27bSRobert Mustacchi #define	DCB_PARAMS_WILLING		0x00000080
774*eef4f27bSRobert Mustacchi 
775*eef4f27bSRobert Mustacchi     dcb_ets_tsa_param_t ets_params;
776*eef4f27bSRobert Mustacchi     dcb_pfc_param_t pfc_params;
777*eef4f27bSRobert Mustacchi     dcb_classif_params_t classif_params;
778*eef4f27bSRobert Mustacchi     u32_t reserved[4];
779*eef4f27bSRobert Mustacchi } dcb_indicate_event_params_t;
780*eef4f27bSRobert Mustacchi 
781*eef4f27bSRobert Mustacchi /*
782*eef4f27bSRobert Mustacchi  * Macro fore calculating the address of the base of the structure given its
783*eef4f27bSRobert Mustacchi  * type, and an address of a field within the structure.
784*eef4f27bSRobert Mustacchi  */
785*eef4f27bSRobert Mustacchi 
786*eef4f27bSRobert Mustacchi #define	GET_CONTAINING_RECORD(address, type, field) \
787*eef4f27bSRobert Mustacchi 	((type *)((u8_t *)(address) - (u8_t *)(&((type *)0)->field)))
788*eef4f27bSRobert Mustacchi 
789*eef4f27bSRobert Mustacchi 
790*eef4f27bSRobert Mustacchi 
791*eef4f27bSRobert Mustacchi /*
792*eef4f27bSRobert Mustacchi  * Simple macros.
793*eef4f27bSRobert Mustacchi  */
794*eef4f27bSRobert Mustacchi 
795*eef4f27bSRobert Mustacchi #define	IS_ETH_BROADCAST(eth_addr)					\
796*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr))[0] == ((unsigned char) 0xff))
797*eef4f27bSRobert Mustacchi 
798*eef4f27bSRobert Mustacchi #define	IS_ETH_MULTICAST(eth_addr)					\
799*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr))[0] & ((unsigned char) 0x01))
800*eef4f27bSRobert Mustacchi 
801*eef4f27bSRobert Mustacchi #define	IS_ETH_ADDRESS_EQUAL(eth_addr1, eth_addr2)			\
802*eef4f27bSRobert Mustacchi 	((((unsigned char *) (eth_addr1))[0] ==				\
803*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[0]) &&				\
804*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr1))[1] ==				\
805*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[1]) &&				\
806*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr1))[2] ==				\
807*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[2]) &&				\
808*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr1))[3] ==				\
809*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[3]) &&				\
810*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr1))[4] ==				\
811*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[4]) &&				\
812*eef4f27bSRobert Mustacchi 	(((unsigned char *) (eth_addr1))[5] ==				\
813*eef4f27bSRobert Mustacchi 	((unsigned char *) (eth_addr2))[5]))
814*eef4f27bSRobert Mustacchi 
815*eef4f27bSRobert Mustacchi #define	COPY_ETH_ADDRESS(src, dst)					\
816*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[0] = ((unsigned char *) (src))[0];	\
817*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[1] = ((unsigned char *) (src))[1];	\
818*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[2] = ((unsigned char *) (src))[2];	\
819*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[3] = ((unsigned char *) (src))[3];	\
820*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[4] = ((unsigned char *) (src))[4];	\
821*eef4f27bSRobert Mustacchi 	((unsigned char *) (dst))[5] = ((unsigned char *) (src))[5];
822*eef4f27bSRobert Mustacchi 
823*eef4f27bSRobert Mustacchi #ifdef __cplusplus
824*eef4f27bSRobert Mustacchi }
825*eef4f27bSRobert Mustacchi #endif
826*eef4f27bSRobert Mustacchi 
827*eef4f27bSRobert Mustacchi #endif /* _LM_DEFS_H */
828