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