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
57union 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
80struct 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
92struct bfi_enet_txq_wi_ext {
93	u16			reserved;
94	u16			opcode;		/* BFI_ENET_TXQ_WI_EXTENSION */
95	u32			reserved2[3];
96};
97
98struct 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  */
105struct 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   */
120struct 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 */
154struct 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   */
166struct 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
173struct bfi_enet_txq {
174	struct bfi_enet_q	q;
175	u8			priority;
176	u8			rsvd[3];
177};
178
179struct bfi_enet_rxq {
180	struct bfi_enet_q	q;
181	u16		rx_buffer_size;
182	u16		rsvd;
183};
184
185struct bfi_enet_cq {
186	struct bfi_enet_q	q;
187};
188
189struct 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
202struct 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 */
212enum 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
257enum 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 */
338enum 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 */
355struct 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 */
368struct 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 */
375struct 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 */
387struct 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 */
394struct 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 */
409enum 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
415struct 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
425struct 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
440struct 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 */
458enum 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
465enum 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
473struct 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 */
496struct 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
513struct 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 */
534struct 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 */
546enum 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
553struct bfi_enet_rss_cfg {
554	u8	type;
555	u8	mask;
556	u8	rsvd[2];
557	u32	key[BFI_ENET_RSS_KEY_LEN];
558};
559
560struct 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 */
573struct 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 */
580struct 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 */
591struct 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 */
600struct 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 */
612struct 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 */
623struct 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 */
635struct 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 */
647struct 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 */
655enum {
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 */
666struct 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 */
685struct 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 */
704struct 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 */
720struct 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 */
739struct 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 */
754struct 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 */
775struct 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 */
790struct 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 */
845struct 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