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