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