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