Merge branch 'i2c-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvar...
[pandora-kernel.git] / drivers / net / 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      rsvd;
47                         u8      lpu_id; /*!< msg destination                */
48                 } h2i;
49                 u16     i2htok; /*!< token in msgs to host          */
50         } mtag;
51 };
52
53 #define bfi_h2i_set(_mh, _mc, _op, _lpuid) do {         \
54         (_mh).msg_class                 = (_mc);                \
55         (_mh).msg_id                    = (_op);                \
56         (_mh).mtag.h2i.lpu_id   = (_lpuid);                     \
57 } while (0)
58
59 #define bfi_i2h_set(_mh, _mc, _op, _i2htok) do {                \
60         (_mh).msg_class                 = (_mc);                \
61         (_mh).msg_id                    = (_op);                \
62         (_mh).mtag.i2htok               = (_i2htok);            \
63 } while (0)
64
65 /*
66  * Message opcodes: 0-127 to firmware, 128-255 to host
67  */
68 #define BFI_I2H_OPCODE_BASE     128
69 #define BFA_I2HM(_x)                    ((_x) + BFI_I2H_OPCODE_BASE)
70
71 /**
72  ****************************************************************************
73  *
74  * Scatter Gather Element and Page definition
75  *
76  ****************************************************************************
77  */
78
79 #define BFI_SGE_INLINE  1
80 #define BFI_SGE_INLINE_MAX      (BFI_SGE_INLINE + 1)
81
82 /**
83  * SG Flags
84  */
85 enum {
86         BFI_SGE_DATA            = 0,    /*!< data address, not last          */
87         BFI_SGE_DATA_CPL        = 1,    /*!< data addr, last in current page */
88         BFI_SGE_DATA_LAST       = 3,    /*!< data address, last              */
89         BFI_SGE_LINK            = 2,    /*!< link address                    */
90         BFI_SGE_PGDLEN          = 2,    /*!< cumulative data length for page */
91 };
92
93 /**
94  * DMA addresses
95  */
96 union bfi_addr_u {
97         struct {
98                 u32     addr_lo;
99                 u32     addr_hi;
100         } a32;
101 };
102
103 /**
104  * Scatter Gather Element
105  */
106 struct bfi_sge {
107 #ifdef __BIGENDIAN
108         u32     flags:2,
109                         rsvd:2,
110                         sg_len:28;
111 #else
112         u32     sg_len:28,
113                         rsvd:2,
114                         flags:2;
115 #endif
116         union bfi_addr_u sga;
117 };
118
119 /**
120  * Scatter Gather Page
121  */
122 #define BFI_SGPG_DATA_SGES              7
123 #define BFI_SGPG_SGES_MAX               (BFI_SGPG_DATA_SGES + 1)
124 #define BFI_SGPG_RSVD_WD_LEN    8
125 struct bfi_sgpg {
126         struct bfi_sge sges[BFI_SGPG_SGES_MAX];
127         u32     rsvd[BFI_SGPG_RSVD_WD_LEN];
128 };
129
130 /*
131  * Large Message structure - 128 Bytes size Msgs
132  */
133 #define BFI_LMSG_SZ             128
134 #define BFI_LMSG_PL_WSZ \
135                         ((BFI_LMSG_SZ - sizeof(struct bfi_mhdr)) / 4)
136
137 struct bfi_msg {
138         struct bfi_mhdr mhdr;
139         u32     pl[BFI_LMSG_PL_WSZ];
140 };
141
142 /**
143  * Mailbox message structure
144  */
145 #define BFI_MBMSG_SZ            7
146 struct bfi_mbmsg {
147         struct bfi_mhdr mh;
148         u32             pl[BFI_MBMSG_SZ];
149 };
150
151 /**
152  * Message Classes
153  */
154 enum bfi_mclass {
155         BFI_MC_IOC              = 1,    /*!< IO Controller (IOC)            */
156         BFI_MC_DIAG             = 2,    /*!< Diagnostic Msgs                */
157         BFI_MC_FLASH            = 3,    /*!< Flash message class            */
158         BFI_MC_CEE              = 4,    /*!< CEE                            */
159         BFI_MC_FCPORT           = 5,    /*!< FC port                        */
160         BFI_MC_IOCFC            = 6,    /*!< FC - IO Controller (IOC)       */
161         BFI_MC_LL               = 7,    /*!< Link Layer                     */
162         BFI_MC_UF               = 8,    /*!< Unsolicited frame receive      */
163         BFI_MC_FCXP             = 9,    /*!< FC Transport                   */
164         BFI_MC_LPS              = 10,   /*!< lport fc login services        */
165         BFI_MC_RPORT            = 11,   /*!< Remote port                    */
166         BFI_MC_ITNIM            = 12,   /*!< I-T nexus (Initiator mode)     */
167         BFI_MC_IOIM_READ        = 13,   /*!< read IO (Initiator mode)       */
168         BFI_MC_IOIM_WRITE       = 14,   /*!< write IO (Initiator mode)      */
169         BFI_MC_IOIM_IO          = 15,   /*!< IO (Initiator mode)            */
170         BFI_MC_IOIM             = 16,   /*!< IO (Initiator mode)            */
171         BFI_MC_IOIM_IOCOM       = 17,   /*!< good IO completion             */
172         BFI_MC_TSKIM            = 18,   /*!< Initiator Task management      */
173         BFI_MC_SBOOT            = 19,   /*!< SAN boot services              */
174         BFI_MC_IPFC             = 20,   /*!< IP over FC Msgs                */
175         BFI_MC_PORT             = 21,   /*!< Physical port                  */
176         BFI_MC_SFP              = 22,   /*!< SFP module                     */
177         BFI_MC_MSGQ             = 23,   /*!< MSGQ                           */
178         BFI_MC_ENET             = 24,   /*!< ENET commands/responses        */
179         BFI_MC_MAX              = 32
180 };
181
182 #define BFI_IOC_MAX_CQS         4
183 #define BFI_IOC_MAX_CQS_ASIC    8
184 #define BFI_IOC_MSGLEN_MAX      32      /* 32 bytes */
185
186 #define BFI_BOOT_TYPE_OFF               8
187 #define BFI_BOOT_LOADER_OFF             12
188
189 #define BFI_BOOT_TYPE_NORMAL            0
190 #define BFI_BOOT_TYPE_FLASH             1
191 #define BFI_BOOT_TYPE_MEMTEST           2
192
193 #define BFI_BOOT_LOADER_OS              0
194
195 #define BFI_BOOT_MEMTEST_RES_ADDR   0x900
196 #define BFI_BOOT_MEMTEST_RES_SIG    0xA0A1A2A3
197
198 /**
199  *----------------------------------------------------------------------
200  *                              IOC
201  *----------------------------------------------------------------------
202  */
203
204 enum bfi_ioc_h2i_msgs {
205         BFI_IOC_H2I_ENABLE_REQ          = 1,
206         BFI_IOC_H2I_DISABLE_REQ         = 2,
207         BFI_IOC_H2I_GETATTR_REQ         = 3,
208         BFI_IOC_H2I_DBG_SYNC            = 4,
209         BFI_IOC_H2I_DBG_DUMP            = 5,
210 };
211
212 enum bfi_ioc_i2h_msgs {
213         BFI_IOC_I2H_ENABLE_REPLY        = BFA_I2HM(1),
214         BFI_IOC_I2H_DISABLE_REPLY       = BFA_I2HM(2),
215         BFI_IOC_I2H_GETATTR_REPLY       = BFA_I2HM(3),
216         BFI_IOC_I2H_READY_EVENT         = BFA_I2HM(4),
217         BFI_IOC_I2H_HBEAT               = BFA_I2HM(5),
218 };
219
220 /**
221  * BFI_IOC_H2I_GETATTR_REQ message
222  */
223 struct bfi_ioc_getattr_req {
224         struct bfi_mhdr mh;
225         union bfi_addr_u        attr_addr;
226 };
227
228 struct bfi_ioc_attr {
229         u64             mfg_pwwn;       /*!< Mfg port wwn          */
230         u64             mfg_nwwn;       /*!< Mfg node wwn          */
231         mac_t           mfg_mac;        /*!< Mfg mac               */
232         u16     rsvd_a;
233         u64             pwwn;
234         u64             nwwn;
235         mac_t           mac;            /*!< PBC or Mfg mac        */
236         u16     rsvd_b;
237         mac_t           fcoe_mac;
238         u16     rsvd_c;
239         char            brcd_serialnum[STRSZ(BFA_MFG_SERIALNUM_SIZE)];
240         u8              pcie_gen;
241         u8              pcie_lanes_orig;
242         u8              pcie_lanes;
243         u8              rx_bbcredit;    /*!< receive buffer credits */
244         u32     adapter_prop;   /*!< adapter properties     */
245         u16     maxfrsize;      /*!< max receive frame size */
246         char            asic_rev;
247         u8              rsvd_d;
248         char            fw_version[BFA_VERSION_LEN];
249         char            optrom_version[BFA_VERSION_LEN];
250         struct bfa_mfg_vpd vpd;
251         u32     card_type;      /*!< card type                  */
252 };
253
254 /**
255  * BFI_IOC_I2H_GETATTR_REPLY message
256  */
257 struct bfi_ioc_getattr_reply {
258         struct bfi_mhdr mh;     /*!< Common msg header          */
259         u8                      status; /*!< cfg reply status           */
260         u8                      rsvd[3];
261 };
262
263 /**
264  * Firmware memory page offsets
265  */
266 #define BFI_IOC_SMEM_PG0_CB     (0x40)
267 #define BFI_IOC_SMEM_PG0_CT     (0x180)
268
269 /**
270  * Firmware statistic offset
271  */
272 #define BFI_IOC_FWSTATS_OFF     (0x6B40)
273 #define BFI_IOC_FWSTATS_SZ      (4096)
274
275 /**
276  * Firmware trace offset
277  */
278 #define BFI_IOC_TRC_OFF         (0x4b00)
279 #define BFI_IOC_TRC_ENTS        256
280
281 #define BFI_IOC_FW_SIGNATURE    (0xbfadbfad)
282 #define BFI_IOC_MD5SUM_SZ       4
283 struct bfi_ioc_image_hdr {
284         u32     signature;      /*!< constant signature */
285         u32     rsvd_a;
286         u32     exec;           /*!< exec vector        */
287         u32     param;          /*!< parameters         */
288         u32     rsvd_b[4];
289         u32     md5sum[BFI_IOC_MD5SUM_SZ];
290 };
291
292 enum bfi_fwboot_type {
293         BFI_FWBOOT_TYPE_NORMAL  = 0,
294         BFI_FWBOOT_TYPE_FLASH   = 1,
295         BFI_FWBOOT_TYPE_MEMTEST = 2,
296 };
297
298 /**
299  *  BFI_IOC_I2H_READY_EVENT message
300  */
301 struct bfi_ioc_rdy_event {
302         struct bfi_mhdr mh;             /*!< common msg header */
303         u8                      init_status;    /*!< init event status */
304         u8                      rsvd[3];
305 };
306
307 struct bfi_ioc_hbeat {
308         struct bfi_mhdr mh;             /*!< common msg header          */
309         u32        hb_count;    /*!< current heart beat count   */
310 };
311
312 /**
313  * IOC hardware/firmware state
314  */
315 enum bfi_ioc_state {
316         BFI_IOC_UNINIT          = 0,    /*!< not initialized                 */
317         BFI_IOC_INITING         = 1,    /*!< h/w is being initialized        */
318         BFI_IOC_HWINIT          = 2,    /*!< h/w is initialized              */
319         BFI_IOC_CFG             = 3,    /*!< IOC configuration in progress   */
320         BFI_IOC_OP              = 4,    /*!< IOC is operational              */
321         BFI_IOC_DISABLING       = 5,    /*!< IOC is being disabled           */
322         BFI_IOC_DISABLED        = 6,    /*!< IOC is disabled                 */
323         BFI_IOC_CFG_DISABLED    = 7,    /*!< IOC is being disabled;transient */
324         BFI_IOC_FAIL            = 8,    /*!< IOC heart-beat failure          */
325         BFI_IOC_MEMTEST         = 9,    /*!< IOC is doing memtest            */
326 };
327
328 #define BFI_IOC_ENDIAN_SIG  0x12345678
329
330 enum {
331         BFI_ADAPTER_TYPE_FC     = 0x01,         /*!< FC adapters           */
332         BFI_ADAPTER_TYPE_MK     = 0x0f0000,     /*!< adapter type mask     */
333         BFI_ADAPTER_TYPE_SH     = 16,           /*!< adapter type shift    */
334         BFI_ADAPTER_NPORTS_MK   = 0xff00,       /*!< number of ports mask  */
335         BFI_ADAPTER_NPORTS_SH   = 8,            /*!< number of ports shift */
336         BFI_ADAPTER_SPEED_MK    = 0xff,         /*!< adapter speed mask    */
337         BFI_ADAPTER_SPEED_SH    = 0,            /*!< adapter speed shift   */
338         BFI_ADAPTER_PROTO       = 0x100000,     /*!< prototype adapaters   */
339         BFI_ADAPTER_TTV         = 0x200000,     /*!< TTV debug capable     */
340         BFI_ADAPTER_UNSUPP      = 0x400000,     /*!< unknown adapter type  */
341 };
342
343 #define BFI_ADAPTER_GETP(__prop, __adap_prop)                   \
344         (((__adap_prop) & BFI_ADAPTER_ ## __prop ## _MK) >>     \
345                 BFI_ADAPTER_ ## __prop ## _SH)
346 #define BFI_ADAPTER_SETP(__prop, __val)                         \
347         ((__val) << BFI_ADAPTER_ ## __prop ## _SH)
348 #define BFI_ADAPTER_IS_PROTO(__adap_type)                       \
349         ((__adap_type) & BFI_ADAPTER_PROTO)
350 #define BFI_ADAPTER_IS_TTV(__adap_type)                         \
351         ((__adap_type) & BFI_ADAPTER_TTV)
352 #define BFI_ADAPTER_IS_UNSUPP(__adap_type)                      \
353         ((__adap_type) & BFI_ADAPTER_UNSUPP)
354 #define BFI_ADAPTER_IS_SPECIAL(__adap_type)                     \
355         ((__adap_type) & (BFI_ADAPTER_TTV | BFI_ADAPTER_PROTO | \
356                         BFI_ADAPTER_UNSUPP))
357
358 /**
359  * BFI_IOC_H2I_ENABLE_REQ & BFI_IOC_H2I_DISABLE_REQ messages
360  */
361 struct bfi_ioc_ctrl_req {
362         struct bfi_mhdr mh;
363         u8                      ioc_class;
364         u8                      rsvd[3];
365         u32             tv_sec;
366 };
367
368 /**
369  * BFI_IOC_I2H_ENABLE_REPLY & BFI_IOC_I2H_DISABLE_REPLY messages
370  */
371 struct bfi_ioc_ctrl_reply {
372         struct bfi_mhdr mh;             /*!< Common msg header     */
373         u8                      status;         /*!< enable/disable status */
374         u8                      rsvd[3];
375 };
376
377 #define BFI_IOC_MSGSZ   8
378 /**
379  * H2I Messages
380  */
381 union bfi_ioc_h2i_msg_u {
382         struct bfi_mhdr mh;
383         struct bfi_ioc_ctrl_req enable_req;
384         struct bfi_ioc_ctrl_req disable_req;
385         struct bfi_ioc_getattr_req getattr_req;
386         u32                     mboxmsg[BFI_IOC_MSGSZ];
387 };
388
389 /**
390  * I2H Messages
391  */
392 union bfi_ioc_i2h_msg_u {
393         struct bfi_mhdr mh;
394         struct bfi_ioc_rdy_event rdy_event;
395         u32                     mboxmsg[BFI_IOC_MSGSZ];
396 };
397
398 #pragma pack()
399
400 #endif /* __BFI_H__ */