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