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