1 /*
2  * Linux network driver for Brocade Converged Network Adapter.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License (GPL) Version 2 as
6  * published by the Free Software Foundation
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  */
13 /*
14  * Copyright (c) 2005-2011 Brocade Communications Systems, Inc.
15  * All rights reserved
16  * www.brocade.com
17  */
18 
19 /* BNA Hardware and Firmware Interface */
20 
21 /* Skipping statistics collection to avoid clutter.
22  * Command is no longer needed:
23  *	MTU
24  *	TxQ Stop
25  *	RxQ Stop
26  *	RxF Enable/Disable
27  *
28  * HDS-off request is dynamic
29  * keep structures as multiple of 32-bit fields for alignment.
30  * All values must be written in big-endian.
31  */
32 #ifndef __BFI_ENET_H__
33 #define __BFI_ENET_H__
34 
35 #include "bfa_defs.h"
36 #include "bfi.h"
37 
38 #pragma pack(1)
39 
40 #define BFI_ENET_CFG_MAX		32	/* Max resources per PF */
41 
42 #define BFI_ENET_TXQ_PRIO_MAX		8
43 #define BFI_ENET_RX_QSET_MAX		16
44 #define BFI_ENET_TXQ_WI_VECT_MAX	4
45 
46 #define BFI_ENET_VLAN_ID_MAX		4096
47 #define BFI_ENET_VLAN_BLOCK_SIZE	512	/* in bits */
48 #define BFI_ENET_VLAN_BLOCKS_MAX					\
49 	(BFI_ENET_VLAN_ID_MAX / BFI_ENET_VLAN_BLOCK_SIZE)
50 #define BFI_ENET_VLAN_WORD_SIZE		32	/* in bits */
51 #define BFI_ENET_VLAN_WORDS_MAX						\
52 	(BFI_ENET_VLAN_BLOCK_SIZE / BFI_ENET_VLAN_WORD_SIZE)
53 
54 #define BFI_ENET_RSS_RIT_MAX		64	/* entries */
55 #define BFI_ENET_RSS_KEY_LEN		10	/* 32-bit words */
56 
57 union bfi_addr_be_u {
58 	struct {
59 		u32	addr_hi;	/* Most Significant 32-bits */
60 		u32	addr_lo;	/* Least Significant 32-Bits */
61 	} a32;
62 };
63 
64 /*	T X   Q U E U E   D E F I N E S      */
65 /* TxQ Vector (a.k.a. Tx-Buffer Descriptor) */
66 /* TxQ Entry Opcodes */
67 #define BFI_ENET_TXQ_WI_SEND		(0x402)	/* Single Frame Transmission */
68 #define BFI_ENET_TXQ_WI_SEND_LSO	(0x403)	/* Multi-Frame Transmission */
69 #define BFI_ENET_TXQ_WI_EXTENSION	(0x104)	/* Extension WI */
70 
71 /* TxQ Entry Control Flags */
72 #define BFI_ENET_TXQ_WI_CF_FCOE_CRC	(1 << 8)
73 #define BFI_ENET_TXQ_WI_CF_IPID_MODE	(1 << 5)
74 #define BFI_ENET_TXQ_WI_CF_INS_PRIO	(1 << 4)
75 #define BFI_ENET_TXQ_WI_CF_INS_VLAN	(1 << 3)
76 #define BFI_ENET_TXQ_WI_CF_UDP_CKSUM	(1 << 2)
77 #define BFI_ENET_TXQ_WI_CF_TCP_CKSUM	(1 << 1)
78 #define BFI_ENET_TXQ_WI_CF_IP_CKSUM	(1 << 0)
79 
80 struct bfi_enet_txq_wi_base {
81 	u8			reserved;
82 	u8			num_vectors;	/* number of vectors present */
83 	u16			opcode;
84 			/* BFI_ENET_TXQ_WI_SEND or BFI_ENET_TXQ_WI_SEND_LSO */
85 	u16			flags;		/* OR of all the flags */
86 	u16			l4_hdr_size_n_offset;
87 	u16			vlan_tag;
88 	u16			lso_mss;	/* Only 14 LSB are valid */
89 	u32			frame_length;	/* Only 24 LSB are valid */
90 };
91 
92 struct bfi_enet_txq_wi_ext {
93 	u16			reserved;
94 	u16			opcode;		/* BFI_ENET_TXQ_WI_EXTENSION */
95 	u32			reserved2[3];
96 };
97 
98 struct bfi_enet_txq_wi_vector {			/* Tx Buffer Descriptor */
99 	u16			reserved;
100 	u16			length;		/* Only 14 LSB are valid */
101 	union bfi_addr_be_u	addr;
102 };
103 
104 /*  TxQ Entry Structure  */
105 struct bfi_enet_txq_entry {
106 	union {
107 		struct bfi_enet_txq_wi_base	base;
108 		struct bfi_enet_txq_wi_ext	ext;
109 	} wi;
110 	struct bfi_enet_txq_wi_vector vector[BFI_ENET_TXQ_WI_VECT_MAX];
111 };
112 
113 #define wi_hdr		wi.base
114 #define wi_ext_hdr	wi.ext
115 
116 #define BFI_ENET_TXQ_WI_L4_HDR_N_OFFSET(_hdr_size, _offset) \
117 		(((_hdr_size) << 10) | ((_offset) & 0x3FF))
118 
119 /*   R X   Q U E U E   D E F I N E S   */
120 struct bfi_enet_rxq_entry {
121 	union bfi_addr_be_u  rx_buffer;
122 };
123 
124 /*   R X   C O M P L E T I O N   Q U E U E   D E F I N E S   */
125 /* CQ Entry Flags */
126 #define	BFI_ENET_CQ_EF_MAC_ERROR	(1 <<  0)
127 #define	BFI_ENET_CQ_EF_FCS_ERROR	(1 <<  1)
128 #define	BFI_ENET_CQ_EF_TOO_LONG		(1 <<  2)
129 #define	BFI_ENET_CQ_EF_FC_CRC_OK	(1 <<  3)
130 
131 #define	BFI_ENET_CQ_EF_RSVD1		(1 <<  4)
132 #define	BFI_ENET_CQ_EF_L4_CKSUM_OK	(1 <<  5)
133 #define	BFI_ENET_CQ_EF_L3_CKSUM_OK	(1 <<  6)
134 #define	BFI_ENET_CQ_EF_HDS_HEADER	(1 <<  7)
135 
136 #define	BFI_ENET_CQ_EF_UDP		(1 <<  8)
137 #define	BFI_ENET_CQ_EF_TCP		(1 <<  9)
138 #define	BFI_ENET_CQ_EF_IP_OPTIONS	(1 << 10)
139 #define	BFI_ENET_CQ_EF_IPV6		(1 << 11)
140 
141 #define	BFI_ENET_CQ_EF_IPV4		(1 << 12)
142 #define	BFI_ENET_CQ_EF_VLAN		(1 << 13)
143 #define	BFI_ENET_CQ_EF_RSS		(1 << 14)
144 #define	BFI_ENET_CQ_EF_RSVD2		(1 << 15)
145 
146 #define	BFI_ENET_CQ_EF_MCAST_MATCH	(1 << 16)
147 #define	BFI_ENET_CQ_EF_MCAST		(1 << 17)
148 #define BFI_ENET_CQ_EF_BCAST		(1 << 18)
149 #define	BFI_ENET_CQ_EF_REMOTE		(1 << 19)
150 
151 #define	BFI_ENET_CQ_EF_LOCAL		(1 << 20)
152 
153 /* CQ Entry Structure */
154 struct bfi_enet_cq_entry {
155 	u32 flags;
156 	u16	vlan_tag;
157 	u16	length;
158 	u32	rss_hash;
159 	u8	valid;
160 	u8	reserved1;
161 	u8	reserved2;
162 	u8	rxq_id;
163 };
164 
165 /*   E N E T   C O N T R O L   P A T H   C O M M A N D S   */
166 struct bfi_enet_q {
167 	union bfi_addr_u	pg_tbl;
168 	union bfi_addr_u	first_entry;
169 	u16		pages;	/* # of pages */
170 	u16		page_sz;
171 };
172 
173 struct bfi_enet_txq {
174 	struct bfi_enet_q	q;
175 	u8			priority;
176 	u8			rsvd[3];
177 };
178 
179 struct bfi_enet_rxq {
180 	struct bfi_enet_q	q;
181 	u16		rx_buffer_size;
182 	u16		rsvd;
183 };
184 
185 struct bfi_enet_cq {
186 	struct bfi_enet_q	q;
187 };
188 
189 struct bfi_enet_ib_cfg {
190 	u8		int_pkt_dma;
191 	u8		int_enabled;
192 	u8		int_pkt_enabled;
193 	u8		continuous_coalescing;
194 	u8		msix;
195 	u8		rsvd[3];
196 	u32	coalescing_timeout;
197 	u32	inter_pkt_timeout;
198 	u8		inter_pkt_count;
199 	u8		rsvd1[3];
200 };
201 
202 struct bfi_enet_ib {
203 	union bfi_addr_u	index_addr;
204 	union {
205 		u16	msix_index;
206 		u16	intx_bitmask;
207 	} intr;
208 	u16		rsvd;
209 };
210 
211 /* ENET command messages */
212 enum bfi_enet_h2i_msgs {
213 	/* Rx Commands */
214 	BFI_ENET_H2I_RX_CFG_SET_REQ = 1,
215 	BFI_ENET_H2I_RX_CFG_CLR_REQ = 2,
216 
217 	BFI_ENET_H2I_RIT_CFG_REQ = 3,
218 	BFI_ENET_H2I_RSS_CFG_REQ = 4,
219 	BFI_ENET_H2I_RSS_ENABLE_REQ = 5,
220 	BFI_ENET_H2I_RX_PROMISCUOUS_REQ = 6,
221 	BFI_ENET_H2I_RX_DEFAULT_REQ = 7,
222 
223 	BFI_ENET_H2I_MAC_UCAST_SET_REQ = 8,
224 	BFI_ENET_H2I_MAC_UCAST_CLR_REQ = 9,
225 	BFI_ENET_H2I_MAC_UCAST_ADD_REQ = 10,
226 	BFI_ENET_H2I_MAC_UCAST_DEL_REQ = 11,
227 
228 	BFI_ENET_H2I_MAC_MCAST_ADD_REQ = 12,
229 	BFI_ENET_H2I_MAC_MCAST_DEL_REQ = 13,
230 	BFI_ENET_H2I_MAC_MCAST_FILTER_REQ = 14,
231 
232 	BFI_ENET_H2I_RX_VLAN_SET_REQ = 15,
233 	BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ = 16,
234 
235 	/* Tx Commands */
236 	BFI_ENET_H2I_TX_CFG_SET_REQ = 17,
237 	BFI_ENET_H2I_TX_CFG_CLR_REQ = 18,
238 
239 	/* Port Commands */
240 	BFI_ENET_H2I_PORT_ADMIN_UP_REQ = 19,
241 	BFI_ENET_H2I_SET_PAUSE_REQ = 20,
242 	BFI_ENET_H2I_DIAG_LOOPBACK_REQ = 21,
243 
244 	/* Get Attributes Command */
245 	BFI_ENET_H2I_GET_ATTR_REQ = 22,
246 
247 	/*  Statistics Commands */
248 	BFI_ENET_H2I_STATS_GET_REQ = 23,
249 	BFI_ENET_H2I_STATS_CLR_REQ = 24,
250 
251 	BFI_ENET_H2I_WOL_MAGIC_REQ = 25,
252 	BFI_ENET_H2I_WOL_FRAME_REQ = 26,
253 
254 	BFI_ENET_H2I_MAX = 27,
255 };
256 
257 enum bfi_enet_i2h_msgs {
258 	/* Rx Responses */
259 	BFI_ENET_I2H_RX_CFG_SET_RSP =
260 		BFA_I2HM(BFI_ENET_H2I_RX_CFG_SET_REQ),
261 	BFI_ENET_I2H_RX_CFG_CLR_RSP =
262 		BFA_I2HM(BFI_ENET_H2I_RX_CFG_CLR_REQ),
263 
264 	BFI_ENET_I2H_RIT_CFG_RSP =
265 		BFA_I2HM(BFI_ENET_H2I_RIT_CFG_REQ),
266 	BFI_ENET_I2H_RSS_CFG_RSP =
267 		BFA_I2HM(BFI_ENET_H2I_RSS_CFG_REQ),
268 	BFI_ENET_I2H_RSS_ENABLE_RSP =
269 		BFA_I2HM(BFI_ENET_H2I_RSS_ENABLE_REQ),
270 	BFI_ENET_I2H_RX_PROMISCUOUS_RSP =
271 		BFA_I2HM(BFI_ENET_H2I_RX_PROMISCUOUS_REQ),
272 	BFI_ENET_I2H_RX_DEFAULT_RSP =
273 		BFA_I2HM(BFI_ENET_H2I_RX_DEFAULT_REQ),
274 
275 	BFI_ENET_I2H_MAC_UCAST_SET_RSP =
276 		BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_SET_REQ),
277 	BFI_ENET_I2H_MAC_UCAST_CLR_RSP =
278 		BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_CLR_REQ),
279 	BFI_ENET_I2H_MAC_UCAST_ADD_RSP =
280 		BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_ADD_REQ),
281 	BFI_ENET_I2H_MAC_UCAST_DEL_RSP =
282 		BFA_I2HM(BFI_ENET_H2I_MAC_UCAST_DEL_REQ),
283 
284 	BFI_ENET_I2H_MAC_MCAST_ADD_RSP =
285 		BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_ADD_REQ),
286 	BFI_ENET_I2H_MAC_MCAST_DEL_RSP =
287 		BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_DEL_REQ),
288 	BFI_ENET_I2H_MAC_MCAST_FILTER_RSP =
289 		BFA_I2HM(BFI_ENET_H2I_MAC_MCAST_FILTER_REQ),
290 
291 	BFI_ENET_I2H_RX_VLAN_SET_RSP =
292 		BFA_I2HM(BFI_ENET_H2I_RX_VLAN_SET_REQ),
293 
294 	BFI_ENET_I2H_RX_VLAN_STRIP_ENABLE_RSP =
295 		BFA_I2HM(BFI_ENET_H2I_RX_VLAN_STRIP_ENABLE_REQ),
296 
297 	/* Tx Responses */
298 	BFI_ENET_I2H_TX_CFG_SET_RSP =
299 		BFA_I2HM(BFI_ENET_H2I_TX_CFG_SET_REQ),
300 	BFI_ENET_I2H_TX_CFG_CLR_RSP =
301 		BFA_I2HM(BFI_ENET_H2I_TX_CFG_CLR_REQ),
302 
303 	/* Port Responses */
304 	BFI_ENET_I2H_PORT_ADMIN_RSP =
305 		BFA_I2HM(BFI_ENET_H2I_PORT_ADMIN_UP_REQ),
306 
307 	BFI_ENET_I2H_SET_PAUSE_RSP =
308 		BFA_I2HM(BFI_ENET_H2I_SET_PAUSE_REQ),
309 	BFI_ENET_I2H_DIAG_LOOPBACK_RSP =
310 		BFA_I2HM(BFI_ENET_H2I_DIAG_LOOPBACK_REQ),
311 
312 	/*  Attributes Response */
313 	BFI_ENET_I2H_GET_ATTR_RSP =
314 		BFA_I2HM(BFI_ENET_H2I_GET_ATTR_REQ),
315 
316 	/* Statistics Responses */
317 	BFI_ENET_I2H_STATS_GET_RSP =
318 		BFA_I2HM(BFI_ENET_H2I_STATS_GET_REQ),
319 	BFI_ENET_I2H_STATS_CLR_RSP =
320 		BFA_I2HM(BFI_ENET_H2I_STATS_CLR_REQ),
321 
322 	BFI_ENET_I2H_WOL_MAGIC_RSP =
323 		BFA_I2HM(BFI_ENET_H2I_WOL_MAGIC_REQ),
324 	BFI_ENET_I2H_WOL_FRAME_RSP =
325 		BFA_I2HM(BFI_ENET_H2I_WOL_FRAME_REQ),
326 
327 	/* AENs */
328 	BFI_ENET_I2H_LINK_DOWN_AEN = BFA_I2HM(BFI_ENET_H2I_MAX),
329 	BFI_ENET_I2H_LINK_UP_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 1),
330 
331 	BFI_ENET_I2H_PORT_ENABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 2),
332 	BFI_ENET_I2H_PORT_DISABLE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 3),
333 
334 	BFI_ENET_I2H_BW_UPDATE_AEN = BFA_I2HM(BFI_ENET_H2I_MAX + 4),
335 };
336 
337 /* The following error codes can be returned by the enet commands */
338 enum bfi_enet_err {
339 	BFI_ENET_CMD_OK		= 0,
340 	BFI_ENET_CMD_FAIL	= 1,
341 	BFI_ENET_CMD_DUP_ENTRY	= 2,	/* !< Duplicate entry in CAM */
342 	BFI_ENET_CMD_CAM_FULL	= 3,	/* !< CAM is full */
343 	BFI_ENET_CMD_NOT_OWNER	= 4,	/* !< Not permitted, b'cos not owner */
344 	BFI_ENET_CMD_NOT_EXEC	= 5,	/* !< Was not sent to f/w at all */
345 	BFI_ENET_CMD_WAITING	= 6,	/* !< Waiting for completion */
346 	BFI_ENET_CMD_PORT_DISABLED = 7,	/* !< port in disabled state */
347 };
348 
349 /* Generic Request
350  *
351  * bfi_enet_req is used by:
352  *	BFI_ENET_H2I_RX_CFG_CLR_REQ
353  *	BFI_ENET_H2I_TX_CFG_CLR_REQ
354  */
355 struct bfi_enet_req {
356 	struct bfi_msgq_mhdr mh;
357 };
358 
359 /* Enable/Disable Request
360  *
361  * bfi_enet_enable_req is used by:
362  *	BFI_ENET_H2I_RSS_ENABLE_REQ	(enet_id must be zero)
363  *	BFI_ENET_H2I_RX_PROMISCUOUS_REQ (enet_id must be zero)
364  *	BFI_ENET_H2I_RX_DEFAULT_REQ	(enet_id must be zero)
365  *	BFI_ENET_H2I_RX_MAC_MCAST_FILTER_REQ
366  *	BFI_ENET_H2I_PORT_ADMIN_UP_REQ	(enet_id must be zero)
367  */
368 struct bfi_enet_enable_req {
369 	struct		bfi_msgq_mhdr mh;
370 	u8		enable;		/* 1 = enable;  0 = disable */
371 	u8		rsvd[3];
372 };
373 
374 /* Generic Response */
375 struct bfi_enet_rsp {
376 	struct bfi_msgq_mhdr mh;
377 	u8		error;		/*!< if error see cmd_offset */
378 	u8		rsvd;
379 	u16		cmd_offset;	/*!< offset to invalid parameter */
380 };
381 
382 /* GLOBAL CONFIGURATION */
383 
384 /* bfi_enet_attr_req is used by:
385  *	BFI_ENET_H2I_GET_ATTR_REQ
386  */
387 struct bfi_enet_attr_req {
388 	struct bfi_msgq_mhdr	mh;
389 };
390 
391 /* bfi_enet_attr_rsp is used by:
392  *	BFI_ENET_I2H_GET_ATTR_RSP
393  */
394 struct bfi_enet_attr_rsp {
395 	struct bfi_msgq_mhdr mh;
396 	u8		error;		/*!< if error see cmd_offset */
397 	u8		rsvd;
398 	u16		cmd_offset;	/*!< offset to invalid parameter */
399 	u32		max_cfg;
400 	u32		max_ucmac;
401 	u32		rit_size;
402 };
403 
404 /* Tx Configuration
405  *
406  * bfi_enet_tx_cfg is used by:
407  *	BFI_ENET_H2I_TX_CFG_SET_REQ
408  */
409 enum bfi_enet_tx_vlan_mode {
410 	BFI_ENET_TX_VLAN_NOP	= 0,
411 	BFI_ENET_TX_VLAN_INS	= 1,
412 	BFI_ENET_TX_VLAN_WI	= 2,
413 };
414 
415 struct bfi_enet_tx_cfg {
416 	u8		vlan_mode;	/*!< processing mode */
417 	u8		rsvd;
418 	u16		vlan_id;
419 	u8		admit_tagged_frame;
420 	u8		apply_vlan_filter;
421 	u8		add_to_vswitch;
422 	u8		rsvd1[1];
423 };
424 
425 struct bfi_enet_tx_cfg_req {
426 	struct bfi_msgq_mhdr mh;
427 	u8			num_queues;	/* # of Tx Queues */
428 	u8			rsvd[3];
429 
430 	struct {
431 		struct bfi_enet_txq	q;
432 		struct bfi_enet_ib	ib;
433 	} q_cfg[BFI_ENET_TXQ_PRIO_MAX];
434 
435 	struct bfi_enet_ib_cfg	ib_cfg;
436 
437 	struct bfi_enet_tx_cfg	tx_cfg;
438 };
439 
440 struct bfi_enet_tx_cfg_rsp {
441 	struct		bfi_msgq_mhdr mh;
442 	u8		error;
443 	u8		hw_id;		/* For debugging */
444 	u8		rsvd[2];
445 	struct {
446 		u32	q_dbell;	/* PCI base address offset */
447 		u32	i_dbell;	/* PCI base address offset */
448 		u8	hw_qid;		/* For debugging */
449 		u8	rsvd[3];
450 	} q_handles[BFI_ENET_TXQ_PRIO_MAX];
451 };
452 
453 /* Rx Configuration
454  *
455  * bfi_enet_rx_cfg is used by:
456  *	BFI_ENET_H2I_RX_CFG_SET_REQ
457  */
458 enum bfi_enet_rxq_type {
459 	BFI_ENET_RXQ_SINGLE		= 1,
460 	BFI_ENET_RXQ_LARGE_SMALL	= 2,
461 	BFI_ENET_RXQ_HDS		= 3,
462 	BFI_ENET_RXQ_HDS_OPT_BASED	= 4,
463 };
464 
465 enum bfi_enet_hds_type {
466 	BFI_ENET_HDS_FORCED	= 0x01,
467 	BFI_ENET_HDS_IPV6_UDP	= 0x02,
468 	BFI_ENET_HDS_IPV6_TCP	= 0x04,
469 	BFI_ENET_HDS_IPV4_TCP	= 0x08,
470 	BFI_ENET_HDS_IPV4_UDP	= 0x10,
471 };
472 
473 struct bfi_enet_rx_cfg {
474 	u8		rxq_type;
475 	u8		rsvd[1];
476 	u16		frame_size;
477 
478 	struct {
479 		u8			max_header_size;
480 		u8			force_offset;
481 		u8			type;
482 		u8			rsvd1;
483 	} hds;
484 
485 	u8		multi_buffer;
486 	u8		strip_vlan;
487 	u8		drop_untagged;
488 	u8		rsvd2;
489 };
490 
491 /*
492  * Multicast frames are received on the ql of q-set index zero.
493  * On the completion queue.  RxQ ID = even is for large/data buffer queues
494  * and RxQ ID = odd is for small/header buffer queues.
495  */
496 struct bfi_enet_rx_cfg_req {
497 	struct bfi_msgq_mhdr mh;
498 	u8			num_queue_sets;	/* # of Rx Queue Sets */
499 	u8			rsvd[3];
500 
501 	struct {
502 		struct bfi_enet_rxq	ql;	/* large/data/single buffers */
503 		struct bfi_enet_rxq	qs;	/* small/header buffers */
504 		struct bfi_enet_cq	cq;
505 		struct bfi_enet_ib	ib;
506 	} q_cfg[BFI_ENET_RX_QSET_MAX];
507 
508 	struct bfi_enet_ib_cfg	ib_cfg;
509 
510 	struct bfi_enet_rx_cfg	rx_cfg;
511 };
512 
513 struct bfi_enet_rx_cfg_rsp {
514 	struct bfi_msgq_mhdr mh;
515 	u8		error;
516 	u8		hw_id;	 /* For debugging */
517 	u8		rsvd[2];
518 	struct {
519 		u32	ql_dbell; /* PCI base address offset */
520 		u32	qs_dbell; /* PCI base address offset */
521 		u32	i_dbell;  /* PCI base address offset */
522 		u8		hw_lqid;  /* For debugging */
523 		u8		hw_sqid;  /* For debugging */
524 		u8		hw_cqid;  /* For debugging */
525 		u8		rsvd;
526 	} q_handles[BFI_ENET_RX_QSET_MAX];
527 };
528 
529 /* RIT
530  *
531  * bfi_enet_rit_req is used by:
532  *	BFI_ENET_H2I_RIT_CFG_REQ
533  */
534 struct bfi_enet_rit_req {
535 	struct	bfi_msgq_mhdr mh;
536 	u16	size;			/* number of table-entries used */
537 	u8	rsvd[2];
538 	u8	table[BFI_ENET_RSS_RIT_MAX];
539 };
540 
541 /* RSS
542  *
543  * bfi_enet_rss_cfg_req is used by:
544  *	BFI_ENET_H2I_RSS_CFG_REQ
545  */
546 enum bfi_enet_rss_type {
547 	BFI_ENET_RSS_IPV6	= 0x01,
548 	BFI_ENET_RSS_IPV6_TCP	= 0x02,
549 	BFI_ENET_RSS_IPV4	= 0x04,
550 	BFI_ENET_RSS_IPV4_TCP	= 0x08
551 };
552 
553 struct bfi_enet_rss_cfg {
554 	u8	type;
555 	u8	mask;
556 	u8	rsvd[2];
557 	u32	key[BFI_ENET_RSS_KEY_LEN];
558 };
559 
560 struct bfi_enet_rss_cfg_req {
561 	struct bfi_msgq_mhdr	mh;
562 	struct bfi_enet_rss_cfg	cfg;
563 };
564 
565 /* MAC Unicast
566  *
567  * bfi_enet_rx_vlan_req is used by:
568  *	BFI_ENET_H2I_MAC_UCAST_SET_REQ
569  *	BFI_ENET_H2I_MAC_UCAST_CLR_REQ
570  *	BFI_ENET_H2I_MAC_UCAST_ADD_REQ
571  *	BFI_ENET_H2I_MAC_UCAST_DEL_REQ
572  */
573 struct bfi_enet_ucast_req {
574 	struct bfi_msgq_mhdr	mh;
575 	mac_t			mac_addr;
576 	u8			rsvd[2];
577 };
578 
579 /* MAC Unicast + VLAN */
580 struct bfi_enet_mac_n_vlan_req {
581 	struct bfi_msgq_mhdr	mh;
582 	u16			vlan_id;
583 	mac_t			mac_addr;
584 };
585 
586 /* MAC Multicast
587  *
588  * bfi_enet_mac_mfilter_add_req is used by:
589  *	BFI_ENET_H2I_MAC_MCAST_ADD_REQ
590  */
591 struct bfi_enet_mcast_add_req {
592 	struct bfi_msgq_mhdr	mh;
593 	mac_t			mac_addr;
594 	u8			rsvd[2];
595 };
596 
597 /* bfi_enet_mac_mfilter_add_rsp is used by:
598  *	BFI_ENET_I2H_MAC_MCAST_ADD_RSP
599  */
600 struct bfi_enet_mcast_add_rsp {
601 	struct bfi_msgq_mhdr	mh;
602 	u8			error;
603 	u8			rsvd;
604 	u16			cmd_offset;
605 	u16			handle;
606 	u8			rsvd1[2];
607 };
608 
609 /* bfi_enet_mac_mfilter_del_req is used by:
610  *	BFI_ENET_H2I_MAC_MCAST_DEL_REQ
611  */
612 struct bfi_enet_mcast_del_req {
613 	struct bfi_msgq_mhdr	mh;
614 	u16			handle;
615 	u8			rsvd[2];
616 };
617 
618 /* VLAN
619  *
620  * bfi_enet_rx_vlan_req is used by:
621  *	BFI_ENET_H2I_RX_VLAN_SET_REQ
622  */
623 struct bfi_enet_rx_vlan_req {
624 	struct bfi_msgq_mhdr	mh;
625 	u8			block_idx;
626 	u8			rsvd[3];
627 	u32			bit_mask[BFI_ENET_VLAN_WORDS_MAX];
628 };
629 
630 /* PAUSE
631  *
632  * bfi_enet_set_pause_req is used by:
633  *	BFI_ENET_H2I_SET_PAUSE_REQ
634  */
635 struct bfi_enet_set_pause_req {
636 	struct bfi_msgq_mhdr	mh;
637 	u8			rsvd[2];
638 	u8			tx_pause;	/* 1 = enable;  0 = disable */
639 	u8			rx_pause;	/* 1 = enable;  0 = disable */
640 };
641 
642 /* DIAGNOSTICS
643  *
644  * bfi_enet_diag_lb_req is used by:
645  *      BFI_ENET_H2I_DIAG_LOOPBACK
646  */
647 struct bfi_enet_diag_lb_req {
648 	struct bfi_msgq_mhdr	mh;
649 	u8			rsvd[2];
650 	u8			mode;		/* cable or Serdes */
651 	u8			enable;		/* 1 = enable;  0 = disable */
652 };
653 
654 /* enum for Loopback opmodes */
655 enum {
656 	BFI_ENET_DIAG_LB_OPMODE_EXT = 0,
657 	BFI_ENET_DIAG_LB_OPMODE_CBL = 1,
658 };
659 
660 /* STATISTICS
661  *
662  * bfi_enet_stats_req is used by:
663  *    BFI_ENET_H2I_STATS_GET_REQ
664  *    BFI_ENET_I2H_STATS_CLR_REQ
665  */
666 struct bfi_enet_stats_req {
667 	struct bfi_msgq_mhdr	mh;
668 	u16			stats_mask;
669 	u8			rsvd[2];
670 	u32			rx_enet_mask;
671 	u32			tx_enet_mask;
672 	union bfi_addr_u	host_buffer;
673 };
674 
675 /* defines for "stats_mask" above. */
676 #define BFI_ENET_STATS_MAC    (1 << 0)    /* !< MAC Statistics */
677 #define BFI_ENET_STATS_BPC    (1 << 1)    /* !< Pause Stats from BPC */
678 #define BFI_ENET_STATS_RAD    (1 << 2)    /* !< Rx Admission Statistics */
679 #define BFI_ENET_STATS_RX_FC  (1 << 3)    /* !< Rx FC Stats from RxA */
680 #define BFI_ENET_STATS_TX_FC  (1 << 4)    /* !< Tx FC Stats from TxA */
681 
682 #define BFI_ENET_STATS_ALL    0x1f
683 
684 /* TxF Frame Statistics */
685 struct bfi_enet_stats_txf {
686 	u64 ucast_octets;
687 	u64 ucast;
688 	u64 ucast_vlan;
689 
690 	u64 mcast_octets;
691 	u64 mcast;
692 	u64 mcast_vlan;
693 
694 	u64 bcast_octets;
695 	u64 bcast;
696 	u64 bcast_vlan;
697 
698 	u64 errors;
699 	u64 filter_vlan;      /* frames filtered due to VLAN */
700 	u64 filter_mac_sa;    /* frames filtered due to SA check */
701 };
702 
703 /* RxF Frame Statistics */
704 struct bfi_enet_stats_rxf {
705 	u64 ucast_octets;
706 	u64 ucast;
707 	u64 ucast_vlan;
708 
709 	u64 mcast_octets;
710 	u64 mcast;
711 	u64 mcast_vlan;
712 
713 	u64 bcast_octets;
714 	u64 bcast;
715 	u64 bcast_vlan;
716 	u64 frame_drops;
717 };
718 
719 /* FC Tx Frame Statistics */
720 struct bfi_enet_stats_fc_tx {
721 	u64 txf_ucast_octets;
722 	u64 txf_ucast;
723 	u64 txf_ucast_vlan;
724 
725 	u64 txf_mcast_octets;
726 	u64 txf_mcast;
727 	u64 txf_mcast_vlan;
728 
729 	u64 txf_bcast_octets;
730 	u64 txf_bcast;
731 	u64 txf_bcast_vlan;
732 
733 	u64 txf_parity_errors;
734 	u64 txf_timeout;
735 	u64 txf_fid_parity_errors;
736 };
737 
738 /* FC Rx Frame Statistics */
739 struct bfi_enet_stats_fc_rx {
740 	u64 rxf_ucast_octets;
741 	u64 rxf_ucast;
742 	u64 rxf_ucast_vlan;
743 
744 	u64 rxf_mcast_octets;
745 	u64 rxf_mcast;
746 	u64 rxf_mcast_vlan;
747 
748 	u64 rxf_bcast_octets;
749 	u64 rxf_bcast;
750 	u64 rxf_bcast_vlan;
751 };
752 
753 /* RAD Frame Statistics */
754 struct bfi_enet_stats_rad {
755 	u64 rx_frames;
756 	u64 rx_octets;
757 	u64 rx_vlan_frames;
758 
759 	u64 rx_ucast;
760 	u64 rx_ucast_octets;
761 	u64 rx_ucast_vlan;
762 
763 	u64 rx_mcast;
764 	u64 rx_mcast_octets;
765 	u64 rx_mcast_vlan;
766 
767 	u64 rx_bcast;
768 	u64 rx_bcast_octets;
769 	u64 rx_bcast_vlan;
770 
771 	u64 rx_drops;
772 };
773 
774 /* BPC Tx Registers */
775 struct bfi_enet_stats_bpc {
776 	/* transmit stats */
777 	u64 tx_pause[8];
778 	u64 tx_zero_pause[8];	/*!< Pause cancellation */
779 	/*!<Pause initiation rather than retention */
780 	u64 tx_first_pause[8];
781 
782 	/* receive stats */
783 	u64 rx_pause[8];
784 	u64 rx_zero_pause[8];	/*!< Pause cancellation */
785 	/*!<Pause initiation rather than retention */
786 	u64 rx_first_pause[8];
787 };
788 
789 /* MAC Rx Statistics */
790 struct bfi_enet_stats_mac {
791 	u64 stats_clr_cnt;	/* times this stats cleared */
792 	u64 frame_64;		/* both rx and tx counter */
793 	u64 frame_65_127;		/* both rx and tx counter */
794 	u64 frame_128_255;		/* both rx and tx counter */
795 	u64 frame_256_511;		/* both rx and tx counter */
796 	u64 frame_512_1023;	/* both rx and tx counter */
797 	u64 frame_1024_1518;	/* both rx and tx counter */
798 	u64 frame_1519_1522;	/* both rx and tx counter */
799 
800 	/* receive stats */
801 	u64 rx_bytes;
802 	u64 rx_packets;
803 	u64 rx_fcs_error;
804 	u64 rx_multicast;
805 	u64 rx_broadcast;
806 	u64 rx_control_frames;
807 	u64 rx_pause;
808 	u64 rx_unknown_opcode;
809 	u64 rx_alignment_error;
810 	u64 rx_frame_length_error;
811 	u64 rx_code_error;
812 	u64 rx_carrier_sense_error;
813 	u64 rx_undersize;
814 	u64 rx_oversize;
815 	u64 rx_fragments;
816 	u64 rx_jabber;
817 	u64 rx_drop;
818 
819 	/* transmit stats */
820 	u64 tx_bytes;
821 	u64 tx_packets;
822 	u64 tx_multicast;
823 	u64 tx_broadcast;
824 	u64 tx_pause;
825 	u64 tx_deferral;
826 	u64 tx_excessive_deferral;
827 	u64 tx_single_collision;
828 	u64 tx_muliple_collision;
829 	u64 tx_late_collision;
830 	u64 tx_excessive_collision;
831 	u64 tx_total_collision;
832 	u64 tx_pause_honored;
833 	u64 tx_drop;
834 	u64 tx_jabber;
835 	u64 tx_fcs_error;
836 	u64 tx_control_frame;
837 	u64 tx_oversize;
838 	u64 tx_undersize;
839 	u64 tx_fragments;
840 };
841 
842 /* Complete statistics, DMAed from fw to host followed by
843  * BFI_ENET_I2H_STATS_GET_RSP
844  */
845 struct bfi_enet_stats {
846 	struct bfi_enet_stats_mac	mac_stats;
847 	struct bfi_enet_stats_bpc	bpc_stats;
848 	struct bfi_enet_stats_rad	rad_stats;
849 	struct bfi_enet_stats_rad	rlb_stats;
850 	struct bfi_enet_stats_fc_rx	fc_rx_stats;
851 	struct bfi_enet_stats_fc_tx	fc_tx_stats;
852 	struct bfi_enet_stats_rxf	rxf_stats[BFI_ENET_CFG_MAX];
853 	struct bfi_enet_stats_txf	txf_stats[BFI_ENET_CFG_MAX];
854 };
855 
856 #pragma pack()
857 
858 #endif  /* __BFI_ENET_H__ */
859