bna: ENET and Tx Rx Redesign Enablement
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / brocade / bna / bfi.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-2010 Brocade Communications Systems, Inc.
15  * All rights reserved
16  * www.brocade.com
17  */
18
19 #ifndef __BFI_H__
20 #define __BFI_H__
21
22 #include "bfa_defs.h"
23
24 #pragma pack(1)
25
26 /**
27  * BFI FW image type
28  */
29 #define BFI_FLASH_CHUNK_SZ                      256     /*!< Flash chunk size */
30 #define BFI_FLASH_CHUNK_SZ_WORDS        (BFI_FLASH_CHUNK_SZ/sizeof(u32))
31 enum {
32         BFI_IMAGE_CB_FC,
33         BFI_IMAGE_CT_FC,
34         BFI_IMAGE_CT_CNA,
35         BFI_IMAGE_MAX,
36 };
37
38 /**
39  * Msg header common to all msgs
40  */
41 struct bfi_mhdr {
42         u8              msg_class;      /*!< @ref enum bfi_mclass           */
43         u8              msg_id;         /*!< msg opcode with in the class   */
44         union {
45                 struct {
46                         u8      qid;
47                         u8      fn_lpu; /*!< msg destination                */
48                 } h2i;
49                 u16     i2htok; /*!< token in msgs to host          */
50         } mtag;
51 };
52
53 #define bfi_fn_lpu(__fn, __lpu) ((__fn) << 1 | (__lpu))
54 #define bfi_mhdr_2_fn(_mh)      ((_mh)->mtag.h2i.fn_lpu >> 1)
55 #define bfi_mhdr_2_qid(_mh)     ((_mh)->mtag.h2i.qid)
56
57 #define bfi_h2i_set(_mh, _mc, _op, _fn_lpu) do {                \
58         (_mh).msg_class                 = (_mc);                \
59         (_mh).msg_id                    = (_op);                \
60         (_mh).mtag.h2i.fn_lpu   = (_fn_lpu);                    \
61 } while (0)
62
63 #define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {                \
64         (_mh).msg_class                 = (_mc);                \
65         (_mh).msg_id                    = (_op);                \
66         (_mh).mtag.i2htok               = (_i2htok);            \
67 } while (0)
68
69 /*
70  * Message opcodes: 0-127 to firmware, 128-255 to host
71  */
72 #define BFI_I2H_OPCODE_BASE     128
73 #define BFA_I2HM(_x)                    ((_x) + BFI_I2H_OPCODE_BASE)
74
75 /**
76  ****************************************************************************
77  *
78  * Scatter Gather Element and Page definition
79  *
80  ****************************************************************************
81  */
82
83 #define BFI_SGE_INLINE  1
84 #define BFI_SGE_INLINE_MAX      (BFI_SGE_INLINE + 1)
85
86 /**
87  * SG Flags
88  */
89 enum {
90         BFI_SGE_DATA            = 0,    /*!< data address, not last          */
91         BFI_SGE_DATA_CPL        = 1,    /*!< data addr, last in current page */
92         BFI_SGE_DATA_LAST       = 3,    /*!< data address, last              */
93         BFI_SGE_LINK            = 2,    /*!< link address                    */
94         BFI_SGE_PGDLEN          = 2,    /*!< cumulative data length for page */
95 };
96
97 /**
98  * DMA addresses
99  */
100 union bfi_addr_u {
101         struct {
102                 u32     addr_lo;
103                 u32     addr_hi;
104         } a32;
105 };
106
107 /**
108  * Scatter Gather Element
109  */
110 struct bfi_sge {
111 #ifdef __BIGENDIAN
112         u32     flags:2,
113                         rsvd:2,
114                         sg_len:28;
115 #else
116         u32     sg_len:28,
117                         rsvd:2,
118                         flags:2;
119 #endif
120         union bfi_addr_u sga;
121 };
122
123 /**
124  * Scatter Gather Page
125  */
126 #define BFI_SGPG_DATA_SGES              7
127 #define BFI_SGPG_SGES_MAX               (BFI_SGPG_DATA_SGES + 1)
128 #define BFI_SGPG_RSVD_WD_LEN    8
129 struct bfi_sgpg {
130         struct bfi_sge sges[BFI_SGPG_SGES_MAX];
131         u32     rsvd[BFI_SGPG_RSVD_WD_LEN];
132 };
133
134 /*
135  * Large Message structure - 128 Bytes size Msgs
136  */
137 #define BFI_LMSG_SZ             128
138 #define BFI_LMSG_PL_WSZ \
139                         ((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
140
141 struct bfi_msg {
142         struct bfi_mhdr mhdr;
143         u32     pl[BFI_LMSG_PL_WSZ];
144 };
145
146 /**
147  * Mailbox message structure
148  */
149 #define BFI_MBMSG_SZ            7
150 struct bfi_mbmsg {
151         struct bfi_mhdr mh;
152         u32             pl[BFI_MBMSG_SZ];
153 };
154
155 /**
156  * Supported PCI function class codes (personality)
157  */
158 enum bfi_pcifn_class {
159         BFI_PCIFN_CLASS_FC      = 0x0c04,
160         BFI_PCIFN_CLASS_ETH     = 0x0200,
161 };
162
163 /**
164  * Message Classes
165  */
166 enum bfi_mclass {
167         BFI_MC_IOC              = 1,    /*!< IO Controller (IOC)            */
168         BFI_MC_DIAG             = 2,    /*!< Diagnostic Msgs                */
169         BFI_MC_FLASH            = 3,    /*!< Flash message class            */
170         BFI_MC_CEE              = 4,    /*!< CEE                            */
171         BFI_MC_FCPORT           = 5,    /*!< FC port                        */
172         BFI_MC_IOCFC            = 6,    /*!< FC - IO Controller (IOC)       */
173         BFI_MC_LL               = 7,    /*!< Link Layer                     */
174         BFI_MC_UF               = 8,    /*!< Unsolicited frame receive      */
175         BFI_MC_FCXP             = 9,    /*!< FC Transport                   */
176         BFI_MC_LPS              = 10,   /*!< lport fc login services        */
177         BFI_MC_RPORT            = 11,   /*!< Remote port                    */
178         BFI_MC_ITNIM            = 12,   /*!< I-T nexus (Initiator mode)     */
179         BFI_MC_IOIM_READ        = 13,   /*!< read IO (Initiator mode)       */
180         BFI_MC_IOIM_WRITE       = 14,   /*!< write IO (Initiator mode)      */
181         BFI_MC_IOIM_IO          = 15,   /*!< IO (Initiator mode)            */
182         BFI_MC_IOIM             = 16,   /*!< IO (Initiator mode)            */
183         BFI_MC_IOIM_IOCOM       = 17,   /*!< good IO completion             */
184         BFI_MC_TSKIM            = 18,   /*!< Initiator Task management      */
185         BFI_MC_SBOOT            = 19,   /*!< SAN boot services              */
186         BFI_MC_IPFC             = 20,   /*!< IP over FC Msgs                */
187         BFI_MC_PORT             = 21,   /*!< Physical port                  */
188         BFI_MC_SFP              = 22,   /*!< SFP module                     */
189         BFI_MC_MSGQ             = 23,   /*!< MSGQ                           */
190         BFI_MC_ENET             = 24,   /*!< ENET commands/responses        */
191         BFI_MC_MAX              = 32
192 };
193
194 #define BFI_IOC_MAX_CQS         4
195 #define BFI_IOC_MAX_CQS_ASIC    8
196 #define BFI_IOC_MSGLEN_MAX      32      /* 32 bytes */
197
198 #define BFI_BOOT_TYPE_OFF               8
199 #define BFI_BOOT_LOADER_OFF             12
200
201 #define BFI_BOOT_TYPE_NORMAL            0
202 #define BFI_BOOT_TYPE_FLASH             1
203 #define BFI_BOOT_TYPE_MEMTEST           2
204
205 #define BFI_BOOT_LOADER_OS              0
206
207 #define BFI_FWBOOT_ENV_OS               0
208
209 #define BFI_BOOT_MEMTEST_RES_ADDR   0x900
210 #define BFI_BOOT_MEMTEST_RES_SIG    0xA0A1A2A3
211
212 /**
213  *----------------------------------------------------------------------
214  *                              IOC
215  *----------------------------------------------------------------------
216  */
217
218 /**
219  * Different asic generations
220  */
221 enum bfi_asic_gen {
222         BFI_ASIC_GEN_CB         = 1,
223         BFI_ASIC_GEN_CT         = 2,
224 };
225
226 enum bfi_asic_mode {
227         BFI_ASIC_MODE_FC        = 1,    /* FC upto 8G speed             */
228         BFI_ASIC_MODE_FC16      = 2,    /* FC upto 16G speed            */
229         BFI_ASIC_MODE_ETH       = 3,    /* Ethernet ports               */
230         BFI_ASIC_MODE_COMBO     = 4,    /* FC 16G and Ethernet 10G port */
231 };
232
233 enum bfi_ioc_h2i_msgs {
234         BFI_IOC_H2I_ENABLE_REQ          = 1,
235         BFI_IOC_H2I_DISABLE_REQ         = 2,
236         BFI_IOC_H2I_GETATTR_REQ         = 3,
237         BFI_IOC_H2I_DBG_SYNC            = 4,
238         BFI_IOC_H2I_DBG_DUMP            = 5,
239 };
240
241 enum bfi_ioc_i2h_msgs {
242         BFI_IOC_I2H_ENABLE_REPLY        = BFA_I2HM(1),
243         BFI_IOC_I2H_DISABLE_REPLY       = BFA_I2HM(2),
244         BFI_IOC_I2H_GETATTR_REPLY       = BFA_I2HM(3),
245         BFI_IOC_I2H_HBEAT               = BFA_I2HM(4),
246 };
247
248 /**
249  * BFI_IOC_H2I_GETATTR_REQ message
250  */
251 struct bfi_ioc_getattr_req {
252         struct bfi_mhdr mh;
253         union bfi_addr_u        attr_addr;
254 };
255
256 struct bfi_ioc_attr {
257         u64             mfg_pwwn;       /*!< Mfg port wwn          */
258         u64             mfg_nwwn;       /*!< Mfg node wwn          */
259         mac_t           mfg_mac;        /*!< Mfg mac               */
260         u8              port_mode;      /* enum bfi_port_mode      */
261         u8              rsvd_a;
262         u64             pwwn;
263         u64             nwwn;
264         mac_t           mac;            /*!< PBC or Mfg mac        */
265         u16     rsvd_b;
266         mac_t           fcoe_mac;
267         u16     rsvd_c;
268         char            brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
269         u8              pcie_gen;
270         u8              pcie_lanes_orig;
271         u8              pcie_lanes;
272         u8              rx_bbcredit;    /*!< receive buffer credits */
273         u32     adapter_prop;   /*!< adapter properties     */
274         u16     maxfrsize;      /*!< max receive frame size */
275         char            asic_rev;
276         u8              rsvd_d;
277         char            fw_version[BFA_VERSION_LEN];
278         char            optrom_version[BFA_VERSION_LEN];
279         struct bfa_mfg_vpd vpd;
280         u32     card_type;      /*!< card type                  */
281 };
282
283 /**
284  * BFI_IOC_I2H_GETATTR_REPLY message
285  */
286 struct bfi_ioc_getattr_reply {
287         struct bfi_mhdr mh;     /*!< Common msg header          */
288         u8                      status; /*!< cfg reply status           */
289         u8                      rsvd[3];
290 };
291
292 /**
293  * Firmware memory page offsets
294  */
295 #define BFI_IOC_SMEM_PG0_CB     (0x40)
296 #define BFI_IOC_SMEM_PG0_CT     (0x180)
297
298 /**
299  * Firmware statistic offset
300  */
301 #define BFI_IOC_FWSTATS_OFF     (0x6B40)
302 #define BFI_IOC_FWSTATS_SZ      (4096)
303
304 /**
305  * Firmware trace offset
306  */
307 #define BFI_IOC_TRC_OFF         (0x4b00)
308 #define BFI_IOC_TRC_ENTS        256
309
310 #define BFI_IOC_FW_SIGNATURE    (0xbfadbfad)
311 #define BFI_IOC_MD5SUM_SZ       4
312 struct bfi_ioc_image_hdr {
313         u32     signature;      /*!< constant signature */
314         u8      asic_gen;       /*!< asic generation */
315         u8      asic_mode;
316         u8      port0_mode;     /*!< device mode for port 0 */
317         u8      port1_mode;     /*!< device mode for port 1 */
318         u32     exec;           /*!< exec vector        */
319         u32     bootenv;        /*!< firmware boot env */
320         u32     rsvd_b[4];
321         u32     md5sum[BFI_IOC_MD5SUM_SZ];
322 };
323
324 #define BFI_FWBOOT_DEVMODE_OFF          4
325 #define BFI_FWBOOT_TYPE_OFF             8
326 #define BFI_FWBOOT_ENV_OFF              12
327 #define BFI_FWBOOT_DEVMODE(__asic_gen, __asic_mode, __p0_mode, __p1_mode) \
328         (((u32)(__asic_gen)) << 24 |    \
329          ((u32)(__asic_mode)) << 16 |   \
330          ((u32)(__p0_mode)) << 8 |      \
331          ((u32)(__p1_mode)))
332
333 enum bfi_fwboot_type {
334         BFI_FWBOOT_TYPE_NORMAL  = 0,
335         BFI_FWBOOT_TYPE_FLASH   = 1,
336         BFI_FWBOOT_TYPE_MEMTEST = 2,
337 };
338
339 enum bfi_port_mode {
340         BFI_PORT_MODE_FC        = 1,
341         BFI_PORT_MODE_ETH       = 2,
342 };
343
344 /**
345  *  BFI_IOC_I2H_READY_EVENT message
346  */
347 struct bfi_ioc_rdy_event {
348         struct bfi_mhdr mh;             /*!< common msg header */
349         u8                      init_status;    /*!< init event status */
350         u8                      rsvd[3];
351 };
352
353 struct bfi_ioc_hbeat {
354         struct bfi_mhdr mh;             /*!< common msg header          */
355         u32        hb_count;    /*!< current heart beat count   */
356 };
357
358 /**
359  * IOC hardware/firmware state
360  */
361 enum bfi_ioc_state {
362         BFI_IOC_UNINIT          = 0,    /*!< not initialized                 */
363         BFI_IOC_INITING         = 1,    /*!< h/w is being initialized        */
364         BFI_IOC_HWINIT          = 2,    /*!< h/w is initialized              */
365         BFI_IOC_CFG             = 3,    /*!< IOC configuration in progress   */
366         BFI_IOC_OP              = 4,    /*!< IOC is operational              */
367         BFI_IOC_DISABLING       = 5,    /*!< IOC is being disabled           */
368         BFI_IOC_DISABLED        = 6,    /*!< IOC is disabled                 */
369         BFI_IOC_CFG_DISABLED    = 7,    /*!< IOC is being disabled;transient */
370         BFI_IOC_FAIL            = 8,    /*!< IOC heart-beat failure          */
371         BFI_IOC_MEMTEST         = 9,    /*!< IOC is doing memtest            */
372 };
373
374 #define BFI_IOC_ENDIAN_SIG  0x12345678
375
376 enum {
377         BFI_ADAPTER_TYPE_FC     = 0x01,         /*!< FC adapters           */
378         BFI_ADAPTER_TYPE_MK     = 0x0f0000,     /*!< adapter type mask     */
379         BFI_ADAPTER_TYPE_SH     = 16,           /*!< adapter type shift    */
380         BFI_ADAPTER_NPORTS_MK   = 0xff00,       /*!< number of ports mask  */
381         BFI_ADAPTER_NPORTS_SH   = 8,            /*!< number of ports shift */
382         BFI_ADAPTER_SPEED_MK    = 0xff,         /*!< adapter speed mask    */
383         BFI_ADAPTER_SPEED_SH    = 0,            /*!< adapter speed shift   */
384         BFI_ADAPTER_PROTO       = 0x100000,     /*!< prototype adapaters   */
385         BFI_ADAPTER_TTV         = 0x200000,     /*!< TTV debug capable     */
386         BFI_ADAPTER_UNSUPP      = 0x400000,     /*!< unknown adapter type  */
387 };
388
389 #define BFI_ADAPTER_GETP(__prop, __adap_prop)                   \
390         (((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>     \
391                 BFI_ADAPTER_ ## __prop ## _SH)
392 #define BFI_ADAPTER_SETP(__prop, __val)                         \
393         ((__val) << BFI_ADAPTER_ ## __prop ## _SH)
394 #define BFI_ADAPTER_IS_PROTO(__adap_type)                       \
395         ((__adap_type) & BFI_ADAPTER_PROTO)
396 #define BFI_ADAPTER_IS_TTV(__adap_type)                         \
397         ((__adap_type) & BFI_ADAPTER_TTV)
398 #define BFI_ADAPTER_IS_UNSUPP(__adap_type)                      \
399         ((__adap_type) & BFI_ADAPTER_UNSUPP)
400 #define BFI_ADAPTER_IS_SPECIAL(__adap_type)                     \
401         ((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \
402                         BFI_ADAPTER_UNSUPP))
403
404 /**
405  * BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages
406  */
407 struct bfi_ioc_ctrl_req {
408         struct bfi_mhdr mh;
409         u16                     clscode;
410         u16                     rsvd;
411         u32             tv_sec;
412 };
413
414 /**
415  * BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages
416  */
417 struct bfi_ioc_ctrl_reply {
418         struct bfi_mhdr mh;                     /*!< Common msg header     */
419         u8                      status;         /*!< enable/disable status */
420         u8                      port_mode;      /*!< enum bfa_mode */
421         u8                      cap_bm;         /*!< capability bit mask */
422         u8                      rsvd;
423 };
424
425 #define BFI_IOC_MSGSZ   8
426 /**
427  * H2I Messages
428  */
429 union bfi_ioc_h2i_msg_u {
430         struct bfi_mhdr mh;
431         struct bfi_ioc_ctrl_req enable_req;
432         struct bfi_ioc_ctrl_req disable_req;
433         struct bfi_ioc_getattr_req getattr_req;
434         u32                     mboxmsg[BFI_IOC_MSGSZ];
435 };
436
437 /**
438  * I2H Messages
439  */
440 union bfi_ioc_i2h_msg_u {
441         struct bfi_mhdr mh;
442         struct bfi_ioc_ctrl_reply fw_event;
443         u32                     mboxmsg[BFI_IOC_MSGSZ];
444 };
445
446 /**
447  *----------------------------------------------------------------------
448  *                              MSGQ
449  *----------------------------------------------------------------------
450  */
451
452 enum bfi_msgq_h2i_msgs {
453         BFI_MSGQ_H2I_INIT_REQ      = 1,
454         BFI_MSGQ_H2I_DOORBELL_PI        = 2,
455         BFI_MSGQ_H2I_DOORBELL_CI        = 3,
456         BFI_MSGQ_H2I_CMDQ_COPY_RSP      = 4,
457 };
458
459 enum bfi_msgq_i2h_msgs {
460         BFI_MSGQ_I2H_INIT_RSP      = BFA_I2HM(BFI_MSGQ_H2I_INIT_REQ),
461         BFI_MSGQ_I2H_DOORBELL_PI        = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_PI),
462         BFI_MSGQ_I2H_DOORBELL_CI        = BFA_I2HM(BFI_MSGQ_H2I_DOORBELL_CI),
463         BFI_MSGQ_I2H_CMDQ_COPY_REQ      = BFA_I2HM(BFI_MSGQ_H2I_CMDQ_COPY_RSP),
464 };
465
466 /* Messages(commands/responsed/AENS will have the following header */
467 struct bfi_msgq_mhdr {
468         u8      msg_class;
469         u8      msg_id;
470         u16     msg_token;
471         u16     num_entries;
472         u8      enet_id;
473         u8      rsvd[1];
474 };
475
476 #define bfi_msgq_mhdr_set(_mh, _mc, _mid, _tok, _enet_id) do {  \
477         (_mh).msg_class  = (_mc);       \
478         (_mh).msg_id        = (_mid);       \
479         (_mh).msg_token  = (_tok);       \
480         (_mh).enet_id      = (_enet_id);   \
481 } while (0)
482
483 /*
484  * Mailbox  for messaging interface
485  */
486 #define BFI_MSGQ_CMD_ENTRY_SIZE  (64)    /* TBD */
487 #define BFI_MSGQ_RSP_ENTRY_SIZE  (64)    /* TBD */
488
489 #define bfi_msgq_num_cmd_entries(_size)                          \
490         (((_size) + BFI_MSGQ_CMD_ENTRY_SIZE - 1) / BFI_MSGQ_CMD_ENTRY_SIZE)
491
492 struct bfi_msgq {
493         union bfi_addr_u addr;
494         u16 q_depth;     /* Total num of entries in the queue */
495         u8 rsvd[2];
496 };
497
498 /* BFI_ENET_MSGQ_CFG_REQ TBD init or cfg? */
499 struct bfi_msgq_cfg_req {
500         struct bfi_mhdr mh;
501         struct bfi_msgq cmdq;
502         struct bfi_msgq rspq;
503 };
504
505 /* BFI_ENET_MSGQ_CFG_RSP */
506 struct bfi_msgq_cfg_rsp {
507         struct bfi_mhdr mh;
508         u8 cmd_status;
509         u8 rsvd[3];
510 };
511
512 /* BFI_MSGQ_H2I_DOORBELL */
513 struct bfi_msgq_h2i_db {
514         struct bfi_mhdr mh;
515         union {
516                 u16 cmdq_pi;
517                 u16 rspq_ci;
518         } idx;
519 };
520
521 /* BFI_MSGQ_I2H_DOORBELL */
522 struct bfi_msgq_i2h_db {
523         struct bfi_mhdr mh;
524         union {
525                 u16 rspq_pi;
526                 u16 cmdq_ci;
527         } idx;
528 };
529
530 #define BFI_CMD_COPY_SZ 28
531
532 /* BFI_MSGQ_H2I_CMD_COPY_RSP */
533 struct bfi_msgq_h2i_cmdq_copy_rsp {
534         struct bfi_mhdr mh;
535         u8            data[BFI_CMD_COPY_SZ];
536 };
537
538 /* BFI_MSGQ_I2H_CMD_COPY_REQ */
539 struct bfi_msgq_i2h_cmdq_copy_req {
540         struct bfi_mhdr mh;
541         u16     offset;
542         u16     len;
543 };
544
545 #pragma pack()
546
547 #endif /* __BFI_H__ */