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
58union 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
81struct 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
93struct bfi_enet_txq_wi_ext {
94	u16			reserved;
95	u16			opcode;		/* BFI_ENET_TXQ_WI_EXTENSION */
96	u32			reserved2[3];
97};
98
99struct 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  */
106struct 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   */
121struct 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 */
155struct 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   */
167struct 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
174struct bfi_enet_txq {
175	struct bfi_enet_q	q;
176	u8			priority;
177	u8			rsvd[3];
178};
179
180struct bfi_enet_rxq {
181	struct bfi_enet_q	q;
182	u16		rx_buffer_size;
183	u16		rsvd;
184};
185
186struct bfi_enet_cq {
187	struct bfi_enet_q	q;
188};
189
190struct 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
203struct 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 */
213enum 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
258enum 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 */
339enum 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 */
356struct 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 */
369struct 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 */
376struct 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 */
388struct 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 */
395struct 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 */
410enum 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
416struct 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
426struct 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
441struct 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 */
459enum 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
466enum 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
474struct 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 */
497struct 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
514struct 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 */
535struct 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 */
547enum 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
554struct bfi_enet_rss_cfg {
555	u8	type;
556	u8	mask;
557	u8	rsvd[2];
558	u32	key[BFI_ENET_RSS_KEY_LEN];
559};
560
561struct 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 */
574struct 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 */
581struct 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 */
592struct 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 */
601struct 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 */
613struct 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 */
624struct 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 */
636struct 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 */
648struct 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 */
656enum {
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 */
667struct 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 */
686struct 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 */
705struct 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 */
721struct 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 */
740struct 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 */
755struct 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 */
776struct 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 */
791struct 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 */
846struct 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