]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ocs_fc/sli4.h
zfs: merge openzfs/zfs@afa7b3484 (master) into main
[FreeBSD/FreeBSD.git] / sys / dev / ocs_fc / sli4.h
1 /*-
2  * Copyright (c) 2017 Broadcom. All rights reserved.
3  * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  *    this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  *    this list of conditions and the following disclaimer in the documentation
13  *    and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  *
31  * $FreeBSD$
32  */
33
34 /**
35  * @file
36  * Define common SLI-4 structures and function prototypes.
37  */
38
39 #ifndef _SLI4_H
40 #define _SLI4_H
41
42 #include "ocs_os.h"
43
44 #define SLI_PAGE_SIZE           (4096)
45 #define SLI_SUB_PAGE_MASK       (SLI_PAGE_SIZE - 1)
46 #define SLI_PAGE_SHIFT          12
47 #define SLI_ROUND_PAGE(b)       (((b) + SLI_SUB_PAGE_MASK) & ~SLI_SUB_PAGE_MASK)
48
49 #define SLI4_BMBX_TIMEOUT_MSEC          30000
50 #define SLI4_FW_READY_TIMEOUT_MSEC      30000
51
52 static inline uint32_t
53 sli_page_count(size_t bytes, uint32_t page_size)
54 {
55         uint32_t        mask = page_size - 1;
56         uint32_t        shift = 0;
57
58         switch (page_size) {
59         case 4096:
60                 shift = 12;
61                 break;
62         case 8192:
63                 shift = 13;
64                 break;
65         case 16384:
66                 shift = 14;
67                 break;
68         case 32768:
69                 shift = 15;
70                 break;
71         case 65536:
72                 shift = 16;
73                 break;
74         default:
75                 return 0;
76         }
77
78         return (bytes + mask) >> shift;
79 }
80
81 /*************************************************************************
82  * Common PCI configuration space register definitions
83  */
84
85 #define SLI4_PCI_CLASS_REVISION         0x0008  /** register offset */
86 #define SLI4_PCI_REV_ID_SHIFT                   0
87 #define SLI4_PCI_REV_ID_MASK                    0xff
88 #define SLI4_PCI_CLASS_SHIFT                    8
89 #define SLI4_PCI_CLASS_MASK                     0xfff
90
91 #define SLI4_PCI_SOFT_RESET_CSR         0x005c  /** register offset */
92 #define SLI4_PCI_SOFT_RESET_MASK                0x0080
93
94 /*************************************************************************
95  * Common SLI-4 register offsets and field definitions
96  */
97
98 /**
99  * @brief SLI_INTF - SLI Interface Definition Register
100  */
101 #define SLI4_INTF_REG                   0x0058  /** register offset */
102 #define SLI4_INTF_VALID_SHIFT                   29
103 #define SLI4_INTF_VALID_MASK                    0x7
104 #define SLI4_INTF_VALID                         0x6
105 #define SLI4_INTF_IF_TYPE_SHIFT                 12
106 #define SLI4_INTF_IF_TYPE_MASK                  0xf
107 #define SLI4_INTF_SLI_FAMILY_SHIFT              8
108 #define SLI4_INTF_SLI_FAMILY_MASK               0xf
109 #define SLI4_INTF_SLI_REVISION_SHIFT            4
110 #define SLI4_INTF_SLI_REVISION_MASK             0xf
111 #define SLI4_FAMILY_CHECK_ASIC_TYPE             0xf
112
113 #define SLI4_IF_TYPE_BE3_SKH_PF         0
114 #define SLI4_IF_TYPE_BE3_SKH_VF         1
115 #define SLI4_IF_TYPE_LANCER_FC_ETH      2
116 #define SLI4_IF_TYPE_LANCER_RDMA        3
117 #define SLI4_MAX_IF_TYPES               4
118
119 /**
120  * @brief ASIC_ID - SLI ASIC Type and Revision Register
121  */
122 #define SLI4_ASIC_ID_REG                        0x009c /* register offset */
123 #define SLI4_ASIC_REV_SHIFT                     0
124 #define SLI4_ASIC_REV_MASK                      0xf
125 #define SLI4_ASIC_VER_SHIFT                     4
126 #define SLI4_ASIC_VER_MASK                      0xf
127 #define SLI4_ASIC_GEN_SHIFT                     8
128 #define SLI4_ASIC_GEN_MASK                      0xff
129 #define SLI4_ASIC_GEN_BE2                       0x00
130 #define SLI4_ASIC_GEN_BE3                       0x03
131 #define SLI4_ASIC_GEN_SKYHAWK                   0x04
132 #define SLI4_ASIC_GEN_CORSAIR                   0x05
133 #define SLI4_ASIC_GEN_LANCER                    0x0b
134
135 /**
136  * @brief BMBX - Bootstrap Mailbox Register
137  */
138 #define SLI4_BMBX_REG                   0x0160  /* register offset */
139 #define SLI4_BMBX_MASK_HI                       0x3
140 #define SLI4_BMBX_MASK_LO                       0xf
141 #define SLI4_BMBX_RDY                           BIT(0)
142 #define SLI4_BMBX_HI                            BIT(1)
143 #define SLI4_BMBX_WRITE_HI(r)                   ((ocs_addr32_hi(r) & ~SLI4_BMBX_MASK_HI) | \
144                                                                 SLI4_BMBX_HI)
145 #define SLI4_BMBX_WRITE_LO(r)                   (((ocs_addr32_hi(r) & SLI4_BMBX_MASK_HI) << 30) | \
146                                                                 (((r) & ~SLI4_BMBX_MASK_LO) >> 2))
147
148 #define SLI4_BMBX_SIZE                  256
149
150 /**
151  * @brief EQCQ_DOORBELL - EQ and CQ Doorbell Register
152  */
153 #define SLI4_EQCQ_DOORBELL_REG          0x120
154 #define SLI4_EQCQ_DOORBELL_CI                   BIT(9)
155 #define SLI4_EQCQ_DOORBELL_QT                   BIT(10)
156 #define SLI4_EQCQ_DOORBELL_ARM                  BIT(29)
157 #define SLI4_EQCQ_DOORBELL_SE                   BIT(31)
158 #define SLI4_EQCQ_NUM_SHIFT                     16
159 #define SLI4_EQCQ_NUM_MASK                      0x01ff
160 #define SLI4_EQCQ_EQ_ID_MASK                    0x3fff
161 #define SLI4_EQCQ_CQ_ID_MASK                    0x7fff
162 #define SLI4_EQCQ_EQ_ID_MASK_LO                 0x01ff
163 #define SLI4_EQCQ_CQ_ID_MASK_LO                 0x03ff
164 #define SLI4_EQCQ_EQCQ_ID_MASK_HI               0xf800
165
166 /**
167  * @brief SLIPORT_CONTROL - SLI Port Control Register
168  */
169 #define SLI4_SLIPORT_CONTROL_REG        0x0408
170 #define SLI4_SLIPORT_CONTROL_END                BIT(30)
171 #define SLI4_SLIPORT_CONTROL_LITTLE_ENDIAN      (0)
172 #define SLI4_SLIPORT_CONTROL_BIG_ENDIAN         BIT(30)
173 #define SLI4_SLIPORT_CONTROL_IP                 BIT(27)
174 #define SLI4_SLIPORT_CONTROL_IDIS               BIT(22)
175 #define SLI4_SLIPORT_CONTROL_FDD                BIT(31)
176
177 /**
178  * @brief SLI4_SLIPORT_ERROR1 - SLI Port Error Register
179  */
180 #define SLI4_SLIPORT_ERROR1             0x040c
181
182 /**
183  * @brief SLI4_SLIPORT_ERROR2 - SLI Port Error Register
184  */
185 #define SLI4_SLIPORT_ERROR2             0x0410
186
187 /**
188  * @brief User error registers
189  */
190 #define SLI4_UERR_STATUS_LOW_REG                0xA0
191 #define SLI4_UERR_STATUS_HIGH_REG               0xA4
192 #define SLI4_UERR_MASK_LOW_REG                  0xA8
193 #define SLI4_UERR_MASK_HIGH_REG                 0xAC
194
195 /**
196  * @brief Registers for generating software UE (BE3)
197  */
198 #define SLI4_SW_UE_CSR1                 0x138
199 #define SLI4_SW_UE_CSR2                 0x1FFFC
200
201 /**
202  * @brief Registers for generating software UE (Skyhawk)
203  */
204 #define SLI4_SW_UE_REG                  0x5C    /* register offset */
205
206 static inline uint32_t sli_eq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm)
207 {
208         uint32_t        reg = 0;
209 #if BYTE_ORDER == LITTLE_ENDIAN
210         struct {
211                 uint32_t        eq_id_lo:9,
212                                 ci:1,                   /* clear interrupt */
213                                 qt:1,                   /* queue type */
214                                 eq_id_hi:5,
215                                 number_popped:13,
216                                 arm:1,
217                                 :1,
218                                 se:1;
219         } * eq_doorbell = (void *)&reg;
220 #else
221 #error big endian version not defined
222 #endif
223
224         eq_doorbell->eq_id_lo = id & SLI4_EQCQ_EQ_ID_MASK_LO;
225         eq_doorbell->qt = 1;    /* EQ is type 1 (section 2.2.3.3 SLI Arch) */
226         eq_doorbell->eq_id_hi = (id >> 9) & 0x1f;
227         eq_doorbell->number_popped = n_popped;
228         eq_doorbell->arm = arm;
229         eq_doorbell->ci = TRUE;
230
231         return reg;
232 }
233
234 static inline uint32_t sli_cq_doorbell(uint16_t n_popped, uint16_t id, uint8_t arm)
235 {
236         uint32_t        reg = 0;
237 #if BYTE_ORDER == LITTLE_ENDIAN
238         struct {
239                 uint32_t        cq_id_lo:10,
240                                 qt:1,                   /* queue type */
241                                 cq_id_hi:5,
242                                 number_popped:13,
243                                 arm:1,
244                                 :1,
245                                 se:1;
246         } * cq_doorbell = (void *)&reg;
247 #else
248 #error big endian version not defined
249 #endif
250
251         cq_doorbell->cq_id_lo = id & SLI4_EQCQ_CQ_ID_MASK_LO;
252         cq_doorbell->qt = 0;    /* CQ is type 0 (section 2.2.3.3 SLI Arch) */
253         cq_doorbell->cq_id_hi = (id >> 10) & 0x1f;
254         cq_doorbell->number_popped = n_popped;
255         cq_doorbell->arm = arm;
256
257         return reg;
258 }
259
260 /**
261  * @brief MQ_DOORBELL - MQ Doorbell Register
262  */
263 #define SLI4_MQ_DOORBELL_REG            0x0140  /* register offset */
264 #define SLI4_MQ_DOORBELL_NUM_SHIFT              16
265 #define SLI4_MQ_DOORBELL_NUM_MASK               0x3fff
266 #define SLI4_MQ_DOORBELL_ID_MASK                0xffff
267 #define SLI4_MQ_DOORBELL(n, i)                  ((((n) & SLI4_MQ_DOORBELL_NUM_MASK) << SLI4_MQ_DOORBELL_NUM_SHIFT) | \
268                                                   ((i) & SLI4_MQ_DOORBELL_ID_MASK))
269
270 /**
271  * @brief RQ_DOORBELL - RQ Doorbell Register
272  */
273 #define SLI4_RQ_DOORBELL_REG            0x0a0   /* register offset */
274 #define SLI4_RQ_DOORBELL_NUM_SHIFT              16
275 #define SLI4_RQ_DOORBELL_NUM_MASK               0x3fff
276 #define SLI4_RQ_DOORBELL_ID_MASK                0xffff
277 #define SLI4_RQ_DOORBELL(n, i)                  ((((n) & SLI4_RQ_DOORBELL_NUM_MASK) << SLI4_RQ_DOORBELL_NUM_SHIFT) | \
278                                                   ((i) & SLI4_RQ_DOORBELL_ID_MASK))
279
280 /**
281  * @brief WQ_DOORBELL - WQ Doorbell Register
282  */
283 #define SLI4_IO_WQ_DOORBELL_REG         0x040   /* register offset */
284 #define SLI4_WQ_DOORBELL_IDX_SHIFT              16
285 #define SLI4_WQ_DOORBELL_IDX_MASK               0x00ff
286 #define SLI4_WQ_DOORBELL_NUM_SHIFT              24
287 #define SLI4_WQ_DOORBELL_NUM_MASK               0x00ff
288 #define SLI4_WQ_DOORBELL_ID_MASK                0xffff
289 #define SLI4_WQ_DOORBELL(n, x, i)               ((((n) & SLI4_WQ_DOORBELL_NUM_MASK) << SLI4_WQ_DOORBELL_NUM_SHIFT) | \
290                                                  (((x) & SLI4_WQ_DOORBELL_IDX_MASK) << SLI4_WQ_DOORBELL_IDX_SHIFT) | \
291                                                   ((i) & SLI4_WQ_DOORBELL_ID_MASK))
292
293 /**
294  * @brief SLIPORT_SEMAPHORE - SLI Port Host and Port Status Register
295  */
296 #define SLI4_PORT_SEMAPHORE_REG_0       0x00ac  /** register offset Interface Type 0 + 1 */
297 #define SLI4_PORT_SEMAPHORE_REG_1       0x0180  /** register offset Interface Type 0 + 1 */
298 #define SLI4_PORT_SEMAPHORE_REG_23      0x0400  /** register offset Interface Type 2 + 3 */
299 #define SLI4_PORT_SEMAPHORE_PORT_MASK           0x0000ffff
300 #define SLI4_PORT_SEMAPHORE_PORT(r)             ((r) & SLI4_PORT_SEMAPHORE_PORT_MASK)
301 #define SLI4_PORT_SEMAPHORE_HOST_MASK           0x00ff0000
302 #define SLI4_PORT_SEMAPHORE_HOST_SHIFT          16
303 #define SLI4_PORT_SEMAPHORE_HOST(r)             (((r) & SLI4_PORT_SEMAPHORE_HOST_MASK) >> \
304                                                                 SLI4_PORT_SEMAPHORE_HOST_SHIFT)
305 #define SLI4_PORT_SEMAPHORE_SCR2                BIT(26) /** scratch area 2 */
306 #define SLI4_PORT_SEMAPHORE_SCR1                BIT(27) /** scratch area 1 */
307 #define SLI4_PORT_SEMAPHORE_IPC                 BIT(28) /** IP conflict */
308 #define SLI4_PORT_SEMAPHORE_NIP                 BIT(29) /** no IP address */
309 #define SLI4_PORT_SEMAPHORE_SFI                 BIT(30) /** secondary firmware image used */
310 #define SLI4_PORT_SEMAPHORE_PERR                BIT(31) /** POST fatal error */
311
312 #define SLI4_PORT_SEMAPHORE_STATUS_POST_READY   0xc000
313 #define SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR  0xf000
314 #define SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK     0xf000
315 #define SLI4_PORT_SEMAPHORE_IN_ERR(r)           (SLI4_PORT_SEMAPHORE_STATUS_UNRECOV_ERR == ((r) & \
316                                                                 SLI4_PORT_SEMAPHORE_STATUS_ERR_MASK))
317
318 /**
319  * @brief SLIPORT_STATUS - SLI Port Status Register
320  */
321
322 #define SLI4_PORT_STATUS_REG_23         0x0404  /** register offset Interface Type 2 + 3 */
323 #define SLI4_PORT_STATUS_FDP                    BIT(21) /** function specific dump present */
324 #define SLI4_PORT_STATUS_RDY                    BIT(23) /** ready */
325 #define SLI4_PORT_STATUS_RN                     BIT(24) /** reset needed */
326 #define SLI4_PORT_STATUS_DIP                    BIT(25) /** dump present */
327 #define SLI4_PORT_STATUS_OTI                    BIT(29) /** over temp indicator */
328 #define SLI4_PORT_STATUS_END                    BIT(30) /** endianness */
329 #define SLI4_PORT_STATUS_ERR                    BIT(31) /** SLI port error */
330 #define SLI4_PORT_STATUS_READY(r)               ((r) & SLI4_PORT_STATUS_RDY)
331 #define SLI4_PORT_STATUS_ERROR(r)               ((r) & SLI4_PORT_STATUS_ERR)
332 #define SLI4_PORT_STATUS_DUMP_PRESENT(r)        ((r) & SLI4_PORT_STATUS_DIP)
333 #define SLI4_PORT_STATUS_FDP_PRESENT(r)         ((r) & SLI4_PORT_STATUS_FDP)
334
335 #define SLI4_PHSDEV_CONTROL_REG_23              0x0414  /** register offset Interface Type 2 + 3 */
336 #define SLI4_PHYDEV_CONTROL_DRST                BIT(0)  /** physical device reset */
337 #define SLI4_PHYDEV_CONTROL_FRST                BIT(1)  /** firmware reset */
338 #define SLI4_PHYDEV_CONTROL_DD                  BIT(2)  /** diagnostic dump */
339 #define SLI4_PHYDEV_CONTROL_FRL_MASK            0x000000f0
340 #define SLI4_PHYDEV_CONTROL_FRL_SHIFT           4
341 #define SLI4_PHYDEV_CONTROL_FRL(r)              (((r) & SLI4_PHYDEV_CONTROL_FRL_MASK) >> \
342                                                                 SLI4_PHYDEV_CONTROL_FRL_SHIFT_SHIFT)
343
344 /*************************************************************************
345  * SLI-4 mailbox command formats and definitions
346  */
347
348 typedef struct sli4_mbox_command_header_s {
349 #if BYTE_ORDER == LITTLE_ENDIAN
350         uint32_t        :8,
351                         command:8,
352                         status:16;      /** Port writes to indicate success / fail */
353 #else
354 #error big endian version not defined
355 #endif
356 } sli4_mbox_command_header_t;
357
358 #define SLI4_MBOX_COMMAND_CONFIG_LINK   0x07
359 #define SLI4_MBOX_COMMAND_DUMP          0x17
360 #define SLI4_MBOX_COMMAND_DOWN_LINK     0x06
361 #define SLI4_MBOX_COMMAND_INIT_LINK     0x05
362 #define SLI4_MBOX_COMMAND_INIT_VFI      0xa3
363 #define SLI4_MBOX_COMMAND_INIT_VPI      0xa4
364 #define SLI4_MBOX_COMMAND_POST_XRI      0xa7
365 #define SLI4_MBOX_COMMAND_RELEASE_XRI   0xac
366 #define SLI4_MBOX_COMMAND_READ_CONFIG   0x0b
367 #define SLI4_MBOX_COMMAND_READ_STATUS   0x0e
368 #define SLI4_MBOX_COMMAND_READ_NVPARMS  0x02
369 #define SLI4_MBOX_COMMAND_READ_REV      0x11
370 #define SLI4_MBOX_COMMAND_READ_LNK_STAT 0x12
371 #define SLI4_MBOX_COMMAND_READ_SPARM64  0x8d
372 #define SLI4_MBOX_COMMAND_READ_TOPOLOGY 0x95
373 #define SLI4_MBOX_COMMAND_REG_FCFI      0xa0
374 #define SLI4_MBOX_COMMAND_REG_FCFI_MRQ  0xaf
375 #define SLI4_MBOX_COMMAND_REG_RPI       0x93
376 #define SLI4_MBOX_COMMAND_REG_RX_RQ     0xa6
377 #define SLI4_MBOX_COMMAND_REG_VFI       0x9f
378 #define SLI4_MBOX_COMMAND_REG_VPI       0x96
379 #define SLI4_MBOX_COMMAND_REQUEST_FEATURES 0x9d
380 #define SLI4_MBOX_COMMAND_SLI_CONFIG    0x9b
381 #define SLI4_MBOX_COMMAND_UNREG_FCFI    0xa2
382 #define SLI4_MBOX_COMMAND_UNREG_RPI     0x14
383 #define SLI4_MBOX_COMMAND_UNREG_VFI     0xa1
384 #define SLI4_MBOX_COMMAND_UNREG_VPI     0x97
385 #define SLI4_MBOX_COMMAND_WRITE_NVPARMS 0x03
386 #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY  0xAD
387 #define SLI4_MBOX_COMMAND_CONFIG_AUTO_XFER_RDY_HP       0xAE
388
389 #define SLI4_MBOX_STATUS_SUCCESS        0x0000
390 #define SLI4_MBOX_STATUS_FAILURE        0x0001
391 #define SLI4_MBOX_STATUS_RPI_NOT_REG    0x1400
392
393 /**
394  * @brief Buffer Descriptor Entry (BDE)
395  */
396 typedef struct sli4_bde_s {
397 #if BYTE_ORDER == LITTLE_ENDIAN
398         uint32_t        buffer_length:24,
399                         bde_type:8;
400         union {
401                 struct {
402                         uint32_t        buffer_address_low;
403                         uint32_t        buffer_address_high;
404                 } data;
405                 struct {
406                         uint32_t        offset;
407                         uint32_t        rsvd2;
408                 } imm;
409                 struct {
410                         uint32_t        sgl_segment_address_low;
411                         uint32_t        sgl_segment_address_high;
412                 } blp;
413         } u;
414 #else
415 #error big endian version not defined
416 #endif
417 } sli4_bde_t;
418
419 #define SLI4_BDE_TYPE_BDE_64            0x00    /** Generic 64-bit data */
420 #define SLI4_BDE_TYPE_BDE_IMM           0x01    /** Immediate data */
421 #define SLI4_BDE_TYPE_BLP               0x40    /** Buffer List Pointer */
422
423 /**
424  * @brief Scatter-Gather Entry (SGE)
425  */
426 typedef struct sli4_sge_s {
427 #if BYTE_ORDER == LITTLE_ENDIAN
428         uint32_t        buffer_address_high;
429         uint32_t        buffer_address_low;
430         uint32_t        data_offset:27,
431                         sge_type:4,
432                         last:1;
433         uint32_t        buffer_length;
434 #else
435 #error big endian version not defined
436 #endif
437 } sli4_sge_t;
438
439 /**
440  * @brief T10 DIF Scatter-Gather Entry (SGE)
441  */
442 typedef struct sli4_dif_sge_s {
443 #if BYTE_ORDER == LITTLE_ENDIAN
444         uint32_t        buffer_address_high;
445         uint32_t        buffer_address_low;
446         uint32_t        :27,
447                         sge_type:4,
448                         last:1;
449         uint32_t        :32;
450 #else
451 #error big endian version not defined
452 #endif
453 } sli4_dif_sge_t;
454
455 /**
456  * @brief T10 DIF Seed Scatter-Gather Entry (SGE)
457  */
458 typedef struct sli4_diseed_sge_s {
459 #if BYTE_ORDER == LITTLE_ENDIAN
460         uint32_t        ref_tag_cmp;
461         uint32_t        ref_tag_repl;
462         uint32_t        app_tag_repl:16,
463                         :2,
464                         hs:1,
465                         ws:1,
466                         ic:1,
467                         ics:1,
468                         atrt:1,
469                         at:1,
470                         fwd_app_tag:1,
471                         repl_app_tag:1,
472                         head_insert:1,
473                         sge_type:4,
474                         last:1;
475         uint32_t        app_tag_cmp:16,
476                         dif_blk_size:3,
477                         auto_incr_ref_tag:1,
478                         check_app_tag:1,
479                         check_ref_tag:1,
480                         check_crc:1,
481                         new_ref_tag:1,
482                         dif_op_rx:4,
483                         dif_op_tx:4;
484 #else
485 #error big endian version not defined
486 #endif
487 } sli4_diseed_sge_t;
488
489 /**
490  * @brief List Segment Pointer Scatter-Gather Entry (SGE)
491  */
492 typedef struct sli4_lsp_sge_s {
493 #if BYTE_ORDER == LITTLE_ENDIAN
494         uint32_t        buffer_address_high;
495         uint32_t        buffer_address_low;
496         uint32_t        :27,
497                         sge_type:4,
498                         last:1;
499         uint32_t        segment_length:24,
500                         :8;
501 #else
502 #error big endian version not defined
503 #endif
504 } sli4_lsp_sge_t;
505
506 #define SLI4_SGE_MAX_RESERVED                   3
507
508 #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CRC     0x00
509 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_NODIF     0x01
510 #define SLI4_SGE_DIF_OP_IN_NODIF_OUT_CHKSUM  0x02
511 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_NODIF  0x03
512 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CRC       0x04
513 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CHKSUM 0x05
514 #define SLI4_SGE_DIF_OP_IN_CRC_OUT_CHKSUM    0x06
515 #define SLI4_SGE_DIF_OP_IN_CHKSUM_OUT_CRC    0x07
516 #define SLI4_SGE_DIF_OP_IN_RAW_OUT_RAW       0x08
517
518 #define SLI4_SGE_TYPE_DATA              0x00
519 #define SLI4_SGE_TYPE_CHAIN             0x03    /** Skyhawk only */
520 #define SLI4_SGE_TYPE_DIF               0x04    /** Data Integrity Field */
521 #define SLI4_SGE_TYPE_LSP               0x05    /** List Segment Pointer */
522 #define SLI4_SGE_TYPE_PEDIF             0x06    /** Post Encryption Engine DIF */
523 #define SLI4_SGE_TYPE_PESEED            0x07    /** Post Encryption Engine DIF Seed */
524 #define SLI4_SGE_TYPE_DISEED            0x08    /** DIF Seed */
525 #define SLI4_SGE_TYPE_ENC               0x09    /** Encryption */
526 #define SLI4_SGE_TYPE_ATM               0x0a    /** DIF Application Tag Mask */
527 #define SLI4_SGE_TYPE_SKIP              0x0c    /** SKIP */
528
529 #define OCS_MAX_SGE_SIZE                0x80000000 /* Maximum data allowed in a SGE */
530
531 /**
532  * @brief CONFIG_LINK
533  */
534 typedef struct sli4_cmd_config_link_s {
535         sli4_mbox_command_header_t      hdr;
536 #if BYTE_ORDER == LITTLE_ENDIAN
537         uint32_t        maxbbc:8,       /** Max buffer-to-buffer credit */
538                         :24;
539         uint32_t        alpa:8,
540                         n_port_id:16,
541                         :8;
542         uint32_t        rsvd3;
543         uint32_t        e_d_tov;
544         uint32_t        lp_tov;
545         uint32_t        r_a_tov;
546         uint32_t        r_t_tov;
547         uint32_t        al_tov;
548         uint32_t        rsvd9;
549         uint32_t        :8,
550                         bbscn:4,        /** buffer-to-buffer state change number */
551                         cscn:1,         /** configure BBSCN */
552                         :19;
553 #else
554 #error big endian version not defined
555 #endif
556 } sli4_cmd_config_link_t;
557
558 /**
559  * @brief DUMP Type 4
560  */
561 #define SLI4_WKI_TAG_SAT_TEM 0x1040
562 typedef struct sli4_cmd_dump4_s {
563         sli4_mbox_command_header_t      hdr;
564 #if BYTE_ORDER == LITTLE_ENDIAN
565         uint32_t        type:4,
566                         :28;
567         uint32_t        wki_selection:16,
568                         :16;
569         uint32_t        resv;
570         uint32_t        returned_byte_cnt;
571         uint32_t        resp_data[59];
572 #else
573 #error big endian version not defined
574 #endif
575 } sli4_cmd_dump4_t;
576
577 /**
578  * @brief FW_INITIALIZE - initialize a SLI port
579  *
580  * @note This command uses a different format than all others.
581  */
582
583 extern const uint8_t sli4_fw_initialize[8];
584
585 /**
586  * @brief FW_DEINITIALIZE - deinitialize a SLI port
587  *
588  * @note This command uses a different format than all others.
589  */
590
591 extern const uint8_t sli4_fw_deinitialize[8];
592
593 /**
594  * @brief INIT_LINK - initialize the link for a FC/FCoE port
595  */
596 typedef struct sli4_cmd_init_link_flags_s {
597         uint32_t        loopback:1,
598                         topology:2,
599                         #define FC_TOPOLOGY_FCAL        0
600                         #define FC_TOPOLOGY_P2P         1
601                         :3,
602                         unfair:1,
603                         skip_lirp_lilp:1,
604                         gen_loop_validity_check:1,
605                         skip_lisa:1,
606                         enable_topology_failover:1,
607                         fixed_speed:1,
608                         :3,
609                         select_hightest_al_pa:1,
610                         :16;    /* pad to 32 bits */
611 } sli4_cmd_init_link_flags_t;
612
613 #define SLI4_INIT_LINK_F_LOOP_BACK      BIT(0)
614 #define SLI4_INIT_LINK_F_UNFAIR         BIT(6)
615 #define SLI4_INIT_LINK_F_NO_LIRP        BIT(7)
616 #define SLI4_INIT_LINK_F_LOOP_VALID_CHK BIT(8)
617 #define SLI4_INIT_LINK_F_NO_LISA        BIT(9)
618 #define SLI4_INIT_LINK_F_FAIL_OVER      BIT(10)
619 #define SLI4_INIT_LINK_F_NO_AUTOSPEED   BIT(11)
620 #define SLI4_INIT_LINK_F_PICK_HI_ALPA   BIT(15)
621
622 #define SLI4_INIT_LINK_F_P2P_ONLY       1
623 #define SLI4_INIT_LINK_F_FCAL_ONLY      2
624
625 #define SLI4_INIT_LINK_F_FCAL_FAIL_OVER 0
626 #define SLI4_INIT_LINK_F_P2P_FAIL_OVER  1
627
628 typedef struct sli4_cmd_init_link_s {
629         sli4_mbox_command_header_t      hdr;
630 #if BYTE_ORDER == LITTLE_ENDIAN
631         uint32_t        selective_reset_al_pa:8,
632                         :24;
633         sli4_cmd_init_link_flags_t link_flags;
634         uint32_t        link_speed_selection_code;
635                         #define FC_LINK_SPEED_1G                1
636                         #define FC_LINK_SPEED_2G                2
637                         #define FC_LINK_SPEED_AUTO_1_2          3
638                         #define FC_LINK_SPEED_4G                4
639                         #define FC_LINK_SPEED_AUTO_4_1          5
640                         #define FC_LINK_SPEED_AUTO_4_2          6
641                         #define FC_LINK_SPEED_AUTO_4_2_1        7
642                         #define FC_LINK_SPEED_8G                8
643                         #define FC_LINK_SPEED_AUTO_8_1          9
644                         #define FC_LINK_SPEED_AUTO_8_2          10
645                         #define FC_LINK_SPEED_AUTO_8_2_1        11
646                         #define FC_LINK_SPEED_AUTO_8_4          12
647                         #define FC_LINK_SPEED_AUTO_8_4_1        13
648                         #define FC_LINK_SPEED_AUTO_8_4_2        14
649                         #define FC_LINK_SPEED_10G               16
650                         #define FC_LINK_SPEED_16G               17
651                         #define FC_LINK_SPEED_AUTO_16_8_4       18
652                         #define FC_LINK_SPEED_AUTO_16_8         19
653                         #define FC_LINK_SPEED_32G               20
654                         #define FC_LINK_SPEED_AUTO_32_16_8      21
655                         #define FC_LINK_SPEED_AUTO_32_16        22
656 #else
657 #error big endian version not defined
658 #endif
659 } sli4_cmd_init_link_t;
660
661 /**
662  * @brief INIT_VFI - initialize the VFI resource
663  */
664 typedef struct sli4_cmd_init_vfi_s {
665         sli4_mbox_command_header_t      hdr;
666 #if BYTE_ORDER == LITTLE_ENDIAN
667         uint32_t        vfi:16,
668                         :12,
669                         vp:1,
670                         vf:1,
671                         vt:1,
672                         vr:1;
673         uint32_t        fcfi:16,
674                         vpi:16;
675         uint32_t        vf_id:13,
676                         pri:3,
677                         :16;
678         uint32_t        :24,
679                         hop_count:8;
680 #else
681 #error big endian version not defined
682 #endif
683 } sli4_cmd_init_vfi_t;
684
685 /**
686  * @brief INIT_VPI - initialize the VPI resource
687  */
688 typedef struct sli4_cmd_init_vpi_s {
689         sli4_mbox_command_header_t      hdr;
690 #if BYTE_ORDER == LITTLE_ENDIAN
691         uint32_t        vpi:16,
692                         vfi:16;
693 #else
694 #error big endian version not defined
695 #endif
696 } sli4_cmd_init_vpi_t;
697
698 /**
699  * @brief POST_XRI - post XRI resources to the SLI Port
700  */
701 typedef struct sli4_cmd_post_xri_s {
702         sli4_mbox_command_header_t      hdr;
703 #if BYTE_ORDER == LITTLE_ENDIAN
704         uint32_t        xri_base:16,
705                         xri_count:12,
706                         enx:1,
707                         dl:1,
708                         di:1,
709                         val:1;
710 #else
711 #error big endian version not defined
712 #endif
713 } sli4_cmd_post_xri_t;
714
715 /**
716  * @brief RELEASE_XRI - Release XRI resources from the SLI Port
717  */
718 typedef struct sli4_cmd_release_xri_s {
719         sli4_mbox_command_header_t      hdr;
720 #if BYTE_ORDER == LITTLE_ENDIAN
721         uint32_t        released_xri_count:5,
722                         :11,
723                         xri_count:5,
724                         :11;
725         struct {
726                 uint32_t        xri_tag0:16,
727                                 xri_tag1:16;
728         } xri_tbl[62];
729 #else
730 #error big endian version not defined
731 #endif
732 } sli4_cmd_release_xri_t;
733
734 /**
735  * @brief READ_CONFIG - read SLI port configuration parameters
736  */
737 typedef struct sli4_cmd_read_config_s {
738         sli4_mbox_command_header_t      hdr;
739 } sli4_cmd_read_config_t;
740
741 typedef struct sli4_res_read_config_s {
742         sli4_mbox_command_header_t      hdr;
743 #if BYTE_ORDER == LITTLE_ENDIAN
744         uint32_t        :31,
745                         ext:1;          /** Resource Extents */
746         uint32_t        :24,
747                         topology:8;
748         uint32_t        rsvd3;
749         uint32_t        e_d_tov:16,
750                         :16;
751         uint32_t        rsvd5;
752         uint32_t        r_a_tov:16,
753                         :16;
754         uint32_t        rsvd7;
755         uint32_t        rsvd8;
756         uint32_t        lmt:16,         /** Link Module Type */
757                         :16;
758         uint32_t        rsvd10;
759         uint32_t        rsvd11;
760         uint32_t        xri_base:16,
761                         xri_count:16;
762         uint32_t        rpi_base:16,
763                         rpi_count:16;
764         uint32_t        vpi_base:16,
765                         vpi_count:16;
766         uint32_t        vfi_base:16,
767                         vfi_count:16;
768         uint32_t        :16,
769                         fcfi_count:16;
770         uint32_t        rq_count:16,
771                         eq_count:16;
772         uint32_t        wq_count:16,
773                         cq_count:16;
774         uint32_t        pad[45];
775 #else
776 #error big endian version not defined
777 #endif
778 } sli4_res_read_config_t;
779
780 #define SLI4_READ_CFG_TOPO_FCOE                 0x0     /** FCoE topology */
781 #define SLI4_READ_CFG_TOPO_FC                   0x1     /** FC topology unknown */
782 #define SLI4_READ_CFG_TOPO_FC_DA                0x2     /** FC Direct Attach (non FC-AL) topology */
783 #define SLI4_READ_CFG_TOPO_FC_AL                0x3     /** FC-AL topology */
784
785 /**
786  * @brief READ_NVPARMS - read SLI port configuration parameters
787  */
788 typedef struct sli4_cmd_read_nvparms_s {
789         sli4_mbox_command_header_t      hdr;
790 #if BYTE_ORDER == LITTLE_ENDIAN
791         uint32_t        rsvd1;
792         uint32_t        rsvd2;
793         uint32_t        rsvd3;
794         uint32_t        rsvd4;
795         uint8_t         wwpn[8];
796         uint8_t         wwnn[8];
797         uint32_t        hard_alpa:8,
798                         preferred_d_id:24;
799 #else
800 #error big endian version not defined
801 #endif
802 } sli4_cmd_read_nvparms_t;
803
804 /**
805  * @brief WRITE_NVPARMS - write SLI port configuration parameters
806  */
807 typedef struct sli4_cmd_write_nvparms_s {
808         sli4_mbox_command_header_t      hdr;
809 #if BYTE_ORDER == LITTLE_ENDIAN
810         uint32_t        rsvd1;
811         uint32_t        rsvd2;
812         uint32_t        rsvd3;
813         uint32_t        rsvd4;
814         uint8_t         wwpn[8];
815         uint8_t         wwnn[8];
816         uint32_t        hard_alpa:8,
817                         preferred_d_id:24;
818 #else
819 #error big endian version not defined
820 #endif
821 } sli4_cmd_write_nvparms_t;
822
823 /**
824  * @brief READ_REV - read the Port revision levels
825  */
826 typedef struct sli4_cmd_read_rev_s {
827         sli4_mbox_command_header_t      hdr;
828 #if BYTE_ORDER == LITTLE_ENDIAN
829         uint32_t        :16,
830                         sli_level:4,
831                         fcoem:1,
832                         ceev:2,
833                         :6,
834                         vpd:1,
835                         :2;
836         uint32_t        first_hw_revision;
837         uint32_t        second_hw_revision;
838         uint32_t        rsvd4;
839         uint32_t        third_hw_revision;
840         uint32_t        fc_ph_low:8,
841                         fc_ph_high:8,
842                         feature_level_low:8,
843                         feature_level_high:8;
844         uint32_t        rsvd7;
845         uint32_t        first_fw_id;
846         char            first_fw_name[16];
847         uint32_t        second_fw_id;
848         char            second_fw_name[16];
849         uint32_t        rsvd18[30];
850         uint32_t        available_length:24,
851                         :8;
852         uint32_t        physical_address_low;
853         uint32_t        physical_address_high;
854         uint32_t        returned_vpd_length;
855         uint32_t        actual_vpd_length;
856 #else
857 #error big endian version not defined
858 #endif
859 } sli4_cmd_read_rev_t;
860
861 /**
862  * @brief READ_SPARM64 - read the Port service parameters
863  */
864 typedef struct sli4_cmd_read_sparm64_s {
865         sli4_mbox_command_header_t      hdr;
866 #if BYTE_ORDER == LITTLE_ENDIAN
867         uint32_t        rsvd1;
868         uint32_t        rsvd2;
869         sli4_bde_t      bde_64;
870         uint32_t        vpi:16,
871                         :16;
872         uint32_t        port_name_start:16,
873                         port_name_length:16;
874         uint32_t        node_name_start:16,
875                         node_name_length:16;
876 #else
877 #error big endian version not defined
878 #endif
879 } sli4_cmd_read_sparm64_t;
880
881 #define SLI4_READ_SPARM64_VPI_DEFAULT   0
882 #define SLI4_READ_SPARM64_VPI_SPECIAL   UINT16_MAX
883
884 #define SLI4_READ_SPARM64_WWPN_OFFSET   (4 * sizeof(uint32_t))
885 #define SLI4_READ_SPARM64_WWNN_OFFSET   (SLI4_READ_SPARM64_WWPN_OFFSET + sizeof(uint64_t))
886
887 typedef struct sli4_port_state_s {
888 #if BYTE_ORDER == LITTLE_ENDIAN
889         uint32_t        nx_port_recv_state:2,
890                         nx_port_trans_state:2,
891                         nx_port_state_machine:4,
892                         link_speed:8,
893                         :14,
894                         tf:1,
895                         lu:1;
896 #else
897 #error big endian version not defined
898 #endif
899 } sli4_port_state_t;
900
901 /**
902  * @brief READ_TOPOLOGY - read the link event information
903  */
904 typedef struct sli4_cmd_read_topology_s {
905         sli4_mbox_command_header_t      hdr;
906 #if BYTE_ORDER == LITTLE_ENDIAN
907         uint32_t        event_tag;
908         uint32_t        attention_type:8,
909                         il:1,
910                         pb_recvd:1,
911                         :22;
912         uint32_t        topology:8,
913                         lip_type:8,
914                         lip_al_ps:8,
915                         al_pa_granted:8;
916         sli4_bde_t      bde_loop_map;
917         sli4_port_state_t link_down;
918         sli4_port_state_t link_current;
919         uint32_t        max_bbc:8,
920                         init_bbc:8,
921                         bbscn:4,
922                         cbbscn:4,
923                         :8;
924         uint32_t        r_t_tov:9,
925                         :3,
926                         al_tov:4,
927                         lp_tov:16;
928         uint32_t        acquired_al_pa:8,
929                         :7,
930                         pb:1,
931                         specified_al_pa:16;
932         uint32_t        initial_n_port_id:24,
933                         :8;
934 #else
935 #error big endian version not defined
936 #endif
937 } sli4_cmd_read_topology_t;
938
939 #define SLI4_MIN_LOOP_MAP_BYTES 128
940
941 #define SLI4_READ_TOPOLOGY_LINK_UP      0x1
942 #define SLI4_READ_TOPOLOGY_LINK_DOWN    0x2
943 #define SLI4_READ_TOPOLOGY_LINK_NO_ALPA 0x3
944
945 #define SLI4_READ_TOPOLOGY_UNKNOWN      0x0
946 #define SLI4_READ_TOPOLOGY_NPORT        0x1
947 #define SLI4_READ_TOPOLOGY_FC_AL        0x2
948
949 #define SLI4_READ_TOPOLOGY_SPEED_NONE   0x00
950 #define SLI4_READ_TOPOLOGY_SPEED_1G     0x04
951 #define SLI4_READ_TOPOLOGY_SPEED_2G     0x08
952 #define SLI4_READ_TOPOLOGY_SPEED_4G     0x10
953 #define SLI4_READ_TOPOLOGY_SPEED_8G     0x20
954 #define SLI4_READ_TOPOLOGY_SPEED_10G    0x40
955 #define SLI4_READ_TOPOLOGY_SPEED_16G    0x80
956 #define SLI4_READ_TOPOLOGY_SPEED_32G    0x90
957
958 /**
959  * @brief REG_FCFI - activate a FC Forwarder
960  */
961 #define SLI4_CMD_REG_FCFI_NUM_RQ_CFG    4
962 typedef struct sli4_cmd_reg_fcfi_s {
963         sli4_mbox_command_header_t      hdr;
964 #if BYTE_ORDER == LITTLE_ENDIAN
965         uint32_t        fcf_index:16,
966                         fcfi:16;
967         uint32_t        rq_id_1:16,
968                         rq_id_0:16;
969         uint32_t        rq_id_3:16,
970                         rq_id_2:16;
971         struct {
972                 uint32_t        r_ctl_mask:8,
973                                 r_ctl_match:8,
974                                 type_mask:8,
975                                 type_match:8;
976         } rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG];
977         uint32_t        vlan_tag:12,
978                         vv:1,
979                         :19;
980 #else
981 #error big endian version not defined
982 #endif
983 } sli4_cmd_reg_fcfi_t;
984
985 #define SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG        4
986 #define SLI4_CMD_REG_FCFI_MRQ_MAX_NUM_RQ        32
987 #define SLI4_CMD_REG_FCFI_SET_FCFI_MODE         0
988 #define SLI4_CMD_REG_FCFI_SET_MRQ_MODE          1
989
990 typedef struct sli4_cmd_reg_fcfi_mrq_s {
991         sli4_mbox_command_header_t      hdr;
992 #if BYTE_ORDER == LITTLE_ENDIAN
993         uint32_t        fcf_index:16,
994                         fcfi:16;
995
996         uint32_t        rq_id_1:16,
997                         rq_id_0:16;
998
999         uint32_t        rq_id_3:16,
1000                         rq_id_2:16;
1001
1002         struct {
1003                 uint32_t        r_ctl_mask:8,
1004                                 r_ctl_match:8,
1005                                 type_mask:8,
1006                                 type_match:8;
1007         } rq_cfg[SLI4_CMD_REG_FCFI_MRQ_NUM_RQ_CFG];
1008
1009         uint32_t        vlan_tag:12,
1010                         vv:1,
1011                         mode:1,
1012                         :18;
1013
1014         uint32_t        num_mrq_pairs:8,
1015                         mrq_filter_bitmask:4,
1016                         rq_selection_policy:4,
1017                         :16;
1018 #endif
1019 } sli4_cmd_reg_fcfi_mrq_t;
1020
1021 /**
1022  * @brief REG_RPI - register a Remote Port Indicator
1023  */
1024 typedef struct sli4_cmd_reg_rpi_s {
1025         sli4_mbox_command_header_t      hdr;
1026 #if BYTE_ORDER == LITTLE_ENDIAN
1027         uint32_t        rpi:16,
1028                         :16;
1029         uint32_t        remote_n_port_id:24,
1030                         upd:1,
1031                         :2,
1032                         etow:1,
1033                         :1,
1034                         terp:1,
1035                         :1,
1036                         ci:1;
1037         sli4_bde_t      bde_64;
1038         uint32_t        vpi:16,
1039                         :16;
1040 #else
1041 #error big endian version not defined
1042 #endif
1043 } sli4_cmd_reg_rpi_t;
1044 #define SLI4_REG_RPI_BUF_LEN                    0x70
1045
1046 /**
1047  * @brief REG_VFI - register a Virtual Fabric Indicator
1048  */
1049 typedef struct sli4_cmd_reg_vfi_s {
1050         sli4_mbox_command_header_t      hdr;
1051 #if BYTE_ORDER == LITTLE_ENDIAN
1052         uint32_t        vfi:16,
1053                         :12,
1054                         vp:1,
1055                         upd:1,
1056                         :2;
1057         uint32_t        fcfi:16,
1058                         vpi:16;                 /* vp=TRUE */
1059         uint8_t         wwpn[8];                /* vp=TRUE */
1060         sli4_bde_t      sparm;                  /* either FLOGI or PLOGI */
1061         uint32_t        e_d_tov;
1062         uint32_t        r_a_tov;
1063         uint32_t        local_n_port_id:24,     /* vp=TRUE */
1064                         :8;
1065 #else
1066 #error big endian version not defined
1067 #endif
1068 } sli4_cmd_reg_vfi_t;
1069
1070 /**
1071  * @brief REG_VPI - register a Virtual Port Indicator
1072  */
1073 typedef struct sli4_cmd_reg_vpi_s {
1074         sli4_mbox_command_header_t      hdr;
1075 #if BYTE_ORDER == LITTLE_ENDIAN
1076         uint32_t        rsvd1;
1077         uint32_t        local_n_port_id:24,
1078                         upd:1,
1079                         :7;
1080         uint8_t         wwpn[8];
1081         uint32_t        rsvd5;
1082         uint32_t        vpi:16,
1083                         vfi:16;
1084 #else
1085 #error big endian version not defined
1086 #endif
1087 } sli4_cmd_reg_vpi_t;
1088
1089 /**
1090  * @brief REQUEST_FEATURES - request / query SLI features
1091  */
1092 typedef union {
1093 #if BYTE_ORDER == LITTLE_ENDIAN
1094         struct {
1095                 uint32_t        iaab:1,         /** inhibit auto-ABTS originator */
1096                                 npiv:1,         /** NPIV support */
1097                                 dif:1,          /** DIF/DIX support */
1098                                 vf:1,           /** virtual fabric support */
1099                                 fcpi:1,         /** FCP initiator support */
1100                                 fcpt:1,         /** FCP target support */
1101                                 fcpc:1,         /** combined FCP initiator/target */
1102                                 :1,
1103                                 rqd:1,          /** recovery qualified delay */
1104                                 iaar:1,         /** inhibit auto-ABTS responder */
1105                                 hlm:1,          /** High Login Mode */
1106                                 perfh:1,        /** performance hints */
1107                                 rxseq:1,        /** RX Sequence Coalescing */
1108                                 rxri:1,         /** Release XRI variant of Coalescing */
1109                                 dcl2:1,         /** Disable Class 2 */
1110                                 rsco:1,         /** Receive Sequence Coalescing Optimizations */
1111                                 mrqp:1,         /** Multi RQ Pair Mode Support */
1112                                 :15;
1113         } flag;
1114         uint32_t        dword;
1115 #else
1116 #error big endian version not defined
1117 #endif
1118 } sli4_features_t;
1119
1120 typedef struct sli4_cmd_request_features_s {
1121         sli4_mbox_command_header_t      hdr;
1122 #if BYTE_ORDER == LITTLE_ENDIAN
1123         uint32_t        qry:1,
1124                         :31;
1125 #else
1126 #error big endian version not defined
1127 #endif
1128         sli4_features_t command;
1129         sli4_features_t response;
1130 } sli4_cmd_request_features_t;
1131
1132 /**
1133  * @brief SLI_CONFIG - submit a configuration command to Port
1134  *
1135  * Command is either embedded as part of the payload (embed) or located
1136  * in a separate memory buffer (mem)
1137  */
1138
1139 typedef struct sli4_sli_config_pmd_s {
1140         uint32_t        address_low;
1141         uint32_t        address_high;
1142         uint32_t        length:24,
1143                         :8;
1144 } sli4_sli_config_pmd_t;
1145
1146 typedef struct sli4_cmd_sli_config_s {
1147         sli4_mbox_command_header_t      hdr;
1148 #if BYTE_ORDER == LITTLE_ENDIAN
1149         uint32_t        emb:1,
1150                         :2,
1151                         pmd_count:5,
1152                         :24;
1153         uint32_t        payload_length;
1154         uint32_t        rsvd3;
1155         uint32_t        rsvd4;
1156         uint32_t        rsvd5;
1157         union {
1158                 uint8_t                 embed[58 * sizeof(uint32_t)];
1159                 sli4_sli_config_pmd_t   mem;
1160         } payload;
1161 #else
1162 #error big endian version not defined
1163 #endif
1164 } sli4_cmd_sli_config_t;
1165
1166 /**
1167  * @brief READ_STATUS - read tx/rx status of a particular port
1168  *
1169  */
1170
1171 typedef struct sli4_cmd_read_status_s {
1172         sli4_mbox_command_header_t      hdr;
1173 #if BYTE_ORDER == LITTLE_ENDIAN
1174         uint32_t        cc:1,
1175                         :31;
1176         uint32_t        rsvd2;
1177         uint32_t        transmit_kbyte_count;
1178         uint32_t        receive_kbyte_count;
1179         uint32_t        transmit_frame_count;
1180         uint32_t        receive_frame_count;
1181         uint32_t        transmit_sequence_count;
1182         uint32_t        receive_sequence_count;
1183         uint32_t        total_exchanges_originator;
1184         uint32_t        total_exchanges_responder;
1185         uint32_t        receive_p_bsy_count;
1186         uint32_t        receive_f_bsy_count;
1187         uint32_t        dropped_frames_due_to_no_rq_buffer_count;
1188         uint32_t        empty_rq_timeout_count;
1189         uint32_t        dropped_frames_due_to_no_xri_count;
1190         uint32_t        empty_xri_pool_count;
1191
1192 #else
1193 #error big endian version not defined
1194 #endif
1195 } sli4_cmd_read_status_t;
1196
1197 /**
1198  * @brief READ_LNK_STAT - read link status of a particular port
1199  *
1200  */
1201
1202 typedef struct sli4_cmd_read_link_stats_s {
1203         sli4_mbox_command_header_t      hdr;
1204 #if BYTE_ORDER == LITTLE_ENDIAN
1205         uint32_t        rec:1,
1206                         gec:1,
1207                         w02of:1,
1208                         w03of:1,
1209                         w04of:1,
1210                         w05of:1,
1211                         w06of:1,
1212                         w07of:1,
1213                         w08of:1,
1214                         w09of:1,
1215                         w10of:1,
1216                         w11of:1,
1217                         w12of:1,
1218                         w13of:1,
1219                         w14of:1,
1220                         w15of:1,
1221                         w16of:1,
1222                         w17of:1,
1223                         w18of:1,
1224                         w19of:1,
1225                         w20of:1,
1226                         w21of:1,
1227                         resv0:8,
1228                         clrc:1,
1229                         clof:1;
1230         uint32_t        link_failure_error_count;
1231         uint32_t        loss_of_sync_error_count;
1232         uint32_t        loss_of_signal_error_count;
1233         uint32_t        primitive_sequence_error_count;
1234         uint32_t        invalid_transmission_word_error_count;
1235         uint32_t        crc_error_count;
1236         uint32_t        primitive_sequence_event_timeout_count;
1237         uint32_t        elastic_buffer_overrun_error_count;
1238         uint32_t        arbitration_fc_al_timout_count;
1239         uint32_t        advertised_receive_bufftor_to_buffer_credit;
1240         uint32_t        current_receive_buffer_to_buffer_credit;
1241         uint32_t        advertised_transmit_buffer_to_buffer_credit;
1242         uint32_t        current_transmit_buffer_to_buffer_credit;
1243         uint32_t        received_eofa_count;
1244         uint32_t        received_eofdti_count;
1245         uint32_t        received_eofni_count;
1246         uint32_t        received_soff_count;
1247         uint32_t        received_dropped_no_aer_count;
1248         uint32_t        received_dropped_no_available_rpi_resources_count;
1249         uint32_t        received_dropped_no_available_xri_resources_count;
1250
1251 #else
1252 #error big endian version not defined
1253 #endif
1254 } sli4_cmd_read_link_stats_t;
1255
1256 /**
1257  * @brief Format a WQE with WQ_ID Association performance hint
1258  *
1259  * @par Description
1260  * PHWQ works by over-writing part of Word 10 in the WQE with the WQ ID.
1261  *
1262  * @param entry Pointer to the WQE.
1263  * @param q_id Queue ID.
1264  *
1265  * @return None.
1266  */
1267 static inline void
1268 sli_set_wq_id_association(void *entry, uint16_t q_id)
1269 {
1270         uint32_t *wqe = entry;
1271
1272         /*
1273          * Set Word 10, bit 0 to zero
1274          * Set Word 10, bits 15:1 to the WQ ID
1275          */
1276 #if BYTE_ORDER == LITTLE_ENDIAN
1277         wqe[10] &= ~0xffff;
1278         wqe[10] |= q_id << 1;
1279 #else
1280 #error big endian version not defined
1281 #endif
1282 }
1283
1284 /**
1285  * @brief UNREG_FCFI - unregister a FCFI
1286  */
1287 typedef struct sli4_cmd_unreg_fcfi_s {
1288         sli4_mbox_command_header_t      hdr;
1289         uint32_t        rsvd1;
1290 #if BYTE_ORDER == LITTLE_ENDIAN
1291         uint32_t        fcfi:16,
1292                         :16;
1293 #else
1294 #error big endian version not defined
1295 #endif
1296 } sli4_cmd_unreg_fcfi_t;
1297
1298 /**
1299  * @brief UNREG_RPI - unregister one or more RPI
1300  */
1301 typedef struct sli4_cmd_unreg_rpi_s {
1302         sli4_mbox_command_header_t      hdr;
1303 #if BYTE_ORDER == LITTLE_ENDIAN
1304         uint32_t        index:16,
1305                         :13,
1306                         dp:1,
1307                         ii:2;
1308         uint32_t        destination_n_port_id:24,
1309                         :8;
1310 #else
1311 #error big endian version not defined
1312 #endif
1313 } sli4_cmd_unreg_rpi_t;
1314
1315 #define SLI4_UNREG_RPI_II_RPI                   0x0
1316 #define SLI4_UNREG_RPI_II_VPI                   0x1
1317 #define SLI4_UNREG_RPI_II_VFI                   0x2
1318 #define SLI4_UNREG_RPI_II_FCFI                  0x3
1319
1320 /**
1321  * @brief UNREG_VFI - unregister one or more VFI
1322  */
1323 typedef struct sli4_cmd_unreg_vfi_s {
1324         sli4_mbox_command_header_t      hdr;
1325 #if BYTE_ORDER == LITTLE_ENDIAN
1326         uint32_t        rsvd1;
1327         uint32_t        index:16,
1328                         :14,
1329                         ii:2;
1330 #else
1331 #error big endian version not defined
1332 #endif
1333 } sli4_cmd_unreg_vfi_t;
1334
1335 #define SLI4_UNREG_VFI_II_VFI                   0x0
1336 #define SLI4_UNREG_VFI_II_FCFI                  0x3
1337
1338 enum {
1339         SLI4_UNREG_TYPE_PORT,
1340         SLI4_UNREG_TYPE_DOMAIN,
1341         SLI4_UNREG_TYPE_FCF,
1342         SLI4_UNREG_TYPE_ALL
1343 };
1344
1345 /**
1346  * @brief UNREG_VPI - unregister one or more VPI
1347  */
1348 typedef struct sli4_cmd_unreg_vpi_s {
1349         sli4_mbox_command_header_t      hdr;
1350 #if BYTE_ORDER == LITTLE_ENDIAN
1351         uint32_t        rsvd1;
1352         uint32_t        index:16,
1353                         :14,
1354                         ii:2;
1355 #else
1356 #error big endian version not defined
1357 #endif
1358 } sli4_cmd_unreg_vpi_t;
1359
1360 #define SLI4_UNREG_VPI_II_VPI                   0x0
1361 #define SLI4_UNREG_VPI_II_VFI                   0x2
1362 #define SLI4_UNREG_VPI_II_FCFI                  0x3
1363
1364 /**
1365  * @brief AUTO_XFER_RDY - Configure the auto-generate XFER-RDY feature.
1366  */
1367 typedef struct sli4_cmd_config_auto_xfer_rdy_s {
1368         sli4_mbox_command_header_t      hdr;
1369 #if BYTE_ORDER == LITTLE_ENDIAN
1370         uint32_t        resv;
1371         uint32_t        max_burst_len;
1372 #else
1373 #error big endian version not defined
1374 #endif
1375 } sli4_cmd_config_auto_xfer_rdy_t;
1376
1377 typedef struct sli4_cmd_config_auto_xfer_rdy_hp_s {
1378         sli4_mbox_command_header_t      hdr;
1379 #if BYTE_ORDER == LITTLE_ENDIAN
1380         uint32_t        resv;
1381         uint32_t        max_burst_len;
1382         uint32_t        esoc:1,
1383                         :31;
1384         uint32_t        block_size:16,
1385                         :16;
1386 #else
1387 #error big endian version not defined
1388 #endif
1389 } sli4_cmd_config_auto_xfer_rdy_hp_t;
1390
1391 /*************************************************************************
1392  * SLI-4 common configuration command formats and definitions
1393  */
1394
1395 #define SLI4_CFG_STATUS_SUCCESS                 0x00
1396 #define SLI4_CFG_STATUS_FAILED                  0x01
1397 #define SLI4_CFG_STATUS_ILLEGAL_REQUEST         0x02
1398 #define SLI4_CFG_STATUS_ILLEGAL_FIELD           0x03
1399
1400 #define SLI4_MGMT_STATUS_FLASHROM_READ_FAILED   0xcb
1401
1402 #define SLI4_CFG_ADD_STATUS_NO_STATUS           0x00
1403 #define SLI4_CFG_ADD_STATUS_INVALID_OPCODE      0x1e
1404
1405 /**
1406  * Subsystem values.
1407  */
1408 #define SLI4_SUBSYSTEM_COMMON                   0x01
1409 #define SLI4_SUBSYSTEM_LOWLEVEL                 0x0B
1410 #define SLI4_SUBSYSTEM_FCFCOE                   0x0c
1411 #define SLI4_SUBSYSTEM_DMTF                     0x11
1412
1413 #define SLI4_OPC_LOWLEVEL_SET_WATCHDOG          0X36
1414
1415 /**
1416  * Common opcode (OPC) values.
1417  */
1418 #define SLI4_OPC_COMMON_FUNCTION_RESET                  0x3d
1419 #define SLI4_OPC_COMMON_CREATE_CQ                       0x0c
1420 #define SLI4_OPC_COMMON_CREATE_CQ_SET                   0x1d
1421 #define SLI4_OPC_COMMON_DESTROY_CQ                      0x36
1422 #define SLI4_OPC_COMMON_MODIFY_EQ_DELAY                 0x29
1423 #define SLI4_OPC_COMMON_CREATE_EQ                       0x0d
1424 #define SLI4_OPC_COMMON_DESTROY_EQ                      0x37
1425 #define SLI4_OPC_COMMON_CREATE_MQ_EXT                   0x5a
1426 #define SLI4_OPC_COMMON_DESTROY_MQ                      0x35
1427 #define SLI4_OPC_COMMON_GET_CNTL_ATTRIBUTES             0x20
1428 #define SLI4_OPC_COMMON_NOP                             0x21
1429 #define SLI4_OPC_COMMON_GET_RESOURCE_EXTENT_INFO        0x9a
1430 #define SLI4_OPC_COMMON_GET_SLI4_PARAMETERS             0xb5
1431 #define SLI4_OPC_COMMON_QUERY_FW_CONFIG                 0x3a
1432 #define SLI4_OPC_COMMON_GET_PORT_NAME                   0x4d
1433
1434 #define SLI4_OPC_COMMON_WRITE_FLASHROM                  0x07
1435 #define SLI4_OPC_COMMON_MANAGE_FAT                      0x44
1436 #define SLI4_OPC_COMMON_READ_TRANSCEIVER_DATA           0x49
1437 #define SLI4_OPC_COMMON_GET_CNTL_ADDL_ATTRIBUTES        0x79
1438 #define SLI4_OPC_COMMON_GET_EXT_FAT_CAPABILITIES        0x7d
1439 #define SLI4_OPC_COMMON_SET_EXT_FAT_CAPABILITIES        0x7e
1440 #define SLI4_OPC_COMMON_EXT_FAT_CONFIGURE_SNAPSHOT      0x7f
1441 #define SLI4_OPC_COMMON_EXT_FAT_RETRIEVE_SNAPSHOT       0x80
1442 #define SLI4_OPC_COMMON_EXT_FAT_READ_STRING_TABLE       0x82
1443 #define SLI4_OPC_COMMON_GET_FUNCTION_CONFIG             0xa0
1444 #define SLI4_OPC_COMMON_GET_PROFILE_CONFIG              0xa4
1445 #define SLI4_OPC_COMMON_SET_PROFILE_CONFIG              0xa5
1446 #define SLI4_OPC_COMMON_GET_PROFILE_LIST                0xa6
1447 #define SLI4_OPC_COMMON_GET_ACTIVE_PROFILE              0xa7
1448 #define SLI4_OPC_COMMON_SET_ACTIVE_PROFILE              0xa8
1449 #define SLI4_OPC_COMMON_READ_OBJECT                     0xab
1450 #define SLI4_OPC_COMMON_WRITE_OBJECT                    0xac
1451 #define SLI4_OPC_COMMON_DELETE_OBJECT                   0xae
1452 #define SLI4_OPC_COMMON_READ_OBJECT_LIST                0xad
1453 #define SLI4_OPC_COMMON_SET_DUMP_LOCATION               0xb8
1454 #define SLI4_OPC_COMMON_SET_FEATURES                    0xbf
1455 #define SLI4_OPC_COMMON_GET_RECONFIG_LINK_INFO          0xc9
1456 #define SLI4_OPC_COMMON_SET_RECONFIG_LINK_ID            0xca
1457
1458 /**
1459  * DMTF opcode (OPC) values.
1460  */
1461 #define SLI4_OPC_DMTF_EXEC_CLP_CMD                      0x01
1462
1463 /**
1464  * @brief Generic Command Request header
1465  */
1466 typedef struct sli4_req_hdr_s {
1467 #if BYTE_ORDER == LITTLE_ENDIAN
1468         uint32_t        opcode:8,
1469                         subsystem:8,
1470                         :16;
1471         uint32_t        timeout;
1472         uint32_t        request_length;
1473         uint32_t        version:8,
1474                         :24;
1475 #else
1476 #error big endian version not defined
1477 #endif
1478 } sli4_req_hdr_t;
1479
1480 /**
1481  * @brief Generic Command Response header
1482  */
1483 typedef struct sli4_res_hdr_s {
1484 #if BYTE_ORDER == LITTLE_ENDIAN
1485         uint32_t        opcode:8,
1486                         subsystem:8,
1487                         :16;
1488         uint32_t        status:8,
1489                         additional_status:8,
1490                         :16;
1491         uint32_t        response_length;
1492         uint32_t        actual_response_length;
1493 #else
1494 #error big endian version not defined
1495 #endif
1496 } sli4_res_hdr_t;
1497
1498 /**
1499  * @brief COMMON_FUNCTION_RESET
1500  *
1501  * Resets the Port, returning it to a power-on state. This configuration
1502  * command does not have a payload and should set/expect the lengths to
1503  * be zero.
1504  */
1505 typedef struct sli4_req_common_function_reset_s {
1506         sli4_req_hdr_t  hdr;
1507 } sli4_req_common_function_reset_t;
1508
1509 typedef struct sli4_res_common_function_reset_s {
1510         sli4_res_hdr_t  hdr;
1511 } sli4_res_common_function_reset_t;
1512
1513 /**
1514  * @brief COMMON_CREATE_CQ_V0
1515  *
1516  * Create a Completion Queue.
1517  */
1518 typedef struct sli4_req_common_create_cq_v0_s {
1519         sli4_req_hdr_t  hdr;
1520 #if BYTE_ORDER == LITTLE_ENDIAN
1521         uint32_t        num_pages:16,
1522                         :16;
1523         uint32_t        :12,
1524                         clswm:2,
1525                         nodelay:1,
1526                         :12,
1527                         cqecnt:2,
1528                         valid:1,
1529                         :1,
1530                         evt:1;
1531         uint32_t        :22,
1532                         eq_id:8,
1533                         :1,
1534                         arm:1;
1535         uint32_t        rsvd[2];
1536         struct {
1537                 uint32_t        low;
1538                 uint32_t        high;
1539         } page_physical_address[0];
1540 #else
1541 #error big endian version not defined
1542 #endif
1543 } sli4_req_common_create_cq_v0_t;
1544
1545 /**
1546  * @brief COMMON_CREATE_CQ_V2
1547  *
1548  * Create a Completion Queue.
1549  */
1550 typedef struct sli4_req_common_create_cq_v2_s {
1551         sli4_req_hdr_t  hdr;
1552 #if BYTE_ORDER == LITTLE_ENDIAN
1553         uint32_t        num_pages:16,
1554                         page_size:8,
1555                         :8,
1556         uint32_t        :12,
1557                         clswm:2,
1558                         nodelay:1,
1559                         autovalid:1,
1560                         :11,
1561                         cqecnt:2,
1562                         valid:1,
1563                         :1,
1564                         evt:1;
1565         uint32_t        eq_id:16,
1566                         :15,
1567                         arm:1;
1568         uint32_t        cqe_count:16,
1569                         :16;
1570         uint32_t        rsvd[1];
1571         struct {
1572                 uint32_t        low;
1573                 uint32_t        high;
1574         } page_physical_address[0];
1575 #else
1576 #error big endian version not defined
1577 #endif
1578 } sli4_req_common_create_cq_v2_t;
1579
1580 /**
1581  * @brief COMMON_CREATE_CQ_SET_V0
1582  *
1583  * Create a set of Completion Queues.
1584  */
1585 typedef struct sli4_req_common_create_cq_set_v0_s {
1586         sli4_req_hdr_t  hdr;
1587 #if BYTE_ORDER == LITTLE_ENDIAN
1588         uint32_t        num_pages:16,
1589                         page_size:8,
1590                         :8;
1591         uint32_t        :12,
1592                         clswm:2,
1593                         nodelay:1,
1594                         autovalid:1,
1595                         rsvd:11,
1596                         cqecnt:2,
1597                         valid:1,
1598                         :1,
1599                         evt:1;
1600         uint32_t        num_cq_req:16,
1601                         cqe_count:15,
1602                         arm:1;
1603         uint16_t        eq_id[16];
1604         struct {
1605                 uint32_t        low;
1606                 uint32_t        high;
1607         } page_physical_address[0];
1608 #else
1609 #error big endian version not defined
1610 #endif
1611 } sli4_req_common_create_cq_set_v0_t;
1612
1613 /**
1614  * CQE count.
1615  */
1616 #define SLI4_CQ_CNT_256                 0
1617 #define SLI4_CQ_CNT_512                 1
1618 #define SLI4_CQ_CNT_1024                2
1619 #define SLI4_CQ_CNT_LARGE               3
1620
1621 #define SLI4_CQE_BYTES                  (4 * sizeof(uint32_t))
1622
1623 #define SLI4_COMMON_CREATE_CQ_V2_MAX_PAGES 8
1624
1625 /**
1626  * @brief Generic Common Create EQ/CQ/MQ/WQ/RQ Queue completion
1627  */
1628 typedef struct sli4_res_common_create_queue_s {
1629         sli4_res_hdr_t  hdr;
1630 #if BYTE_ORDER == LITTLE_ENDIAN
1631         uint32_t q_id:16,
1632                 :8,
1633                 ulp:8;
1634         uint32_t db_offset;
1635         uint32_t db_rs:16,
1636                  db_fmt:16;
1637 #else
1638 #error big endian version not defined
1639 #endif
1640 } sli4_res_common_create_queue_t;
1641
1642 typedef struct sli4_res_common_create_queue_set_s {
1643         sli4_res_hdr_t  hdr;
1644 #if BYTE_ORDER == LITTLE_ENDIAN
1645         uint32_t q_id:16,
1646                 num_q_allocated:16;
1647 #else
1648 #error big endian version not defined
1649 #endif
1650 } sli4_res_common_create_queue_set_t;
1651
1652 /**
1653  * @brief Common Destroy CQ
1654  */
1655 typedef struct sli4_req_common_destroy_cq_s {
1656         sli4_req_hdr_t  hdr;
1657 #if BYTE_ORDER == LITTLE_ENDIAN
1658         uint32_t        cq_id:16,
1659                         :16;
1660 #else
1661 #error big endian version not defined
1662 #endif
1663 } sli4_req_common_destroy_cq_t;
1664
1665 /**
1666  * @brief COMMON_MODIFY_EQ_DELAY
1667  *
1668  * Modify the delay multiplier for EQs
1669  */
1670 typedef struct sli4_req_common_modify_eq_delay_s {
1671         sli4_req_hdr_t  hdr;
1672 #if BYTE_ORDER == LITTLE_ENDIAN
1673         uint32_t        num_eq;
1674         struct {
1675                 uint32_t        eq_id;
1676                 uint32_t        phase;
1677                 uint32_t        delay_multiplier;
1678         } eq_delay_record[8];
1679 #else
1680 #error big endian version not defined
1681 #endif
1682 } sli4_req_common_modify_eq_delay_t;
1683
1684 /**
1685  * @brief COMMON_CREATE_EQ
1686  *
1687  * Create an Event Queue.
1688  */
1689 typedef struct sli4_req_common_create_eq_s {
1690         sli4_req_hdr_t  hdr;
1691 #if BYTE_ORDER == LITTLE_ENDIAN
1692         uint32_t        num_pages:16,
1693                         :16;
1694         uint32_t        :29,
1695                         valid:1,
1696                         :1,
1697                         eqesz:1;
1698         uint32_t        :26,
1699                         count:3,
1700                         :2,
1701                         arm:1;
1702         uint32_t        :13,
1703                         delay_multiplier:10,
1704                         :9;
1705         uint32_t        rsvd;
1706         struct {
1707                 uint32_t        low;
1708                 uint32_t        high;
1709         } page_address[8];
1710 #else
1711 #error big endian version not defined
1712 #endif
1713 } sli4_req_common_create_eq_t;
1714
1715 #define SLI4_EQ_CNT_256                 0
1716 #define SLI4_EQ_CNT_512                 1
1717 #define SLI4_EQ_CNT_1024                2
1718 #define SLI4_EQ_CNT_2048                3
1719 #define SLI4_EQ_CNT_4096                4
1720
1721 #define SLI4_EQE_SIZE_4                 0
1722 #define SLI4_EQE_SIZE_16                1
1723
1724 /**
1725  * @brief Common Destroy EQ
1726  */
1727 typedef struct sli4_req_common_destroy_eq_s {
1728         sli4_req_hdr_t  hdr;
1729 #if BYTE_ORDER == LITTLE_ENDIAN
1730         uint32_t        eq_id:16,
1731                         :16;
1732 #else
1733 #error big endian version not defined
1734 #endif
1735 } sli4_req_common_destroy_eq_t;
1736
1737 /**
1738  * @brief COMMON_CREATE_MQ_EXT
1739  *
1740  * Create a Mailbox Queue; accommodate v0 and v1 forms.
1741  */
1742 typedef struct sli4_req_common_create_mq_ext_s {
1743         sli4_req_hdr_t  hdr;
1744 #if BYTE_ORDER == LITTLE_ENDIAN
1745         uint32_t        num_pages:16,
1746                         cq_id_v1:16;
1747         uint32_t        async_event_bitmap;
1748         uint32_t        async_cq_id_v1:16,
1749                         ring_size:4,
1750                         :2,
1751                         cq_id_v0:10;
1752         uint32_t        :31,
1753                         val:1;
1754         uint32_t        acqv:1,
1755                         async_cq_id_v0:10,
1756                         :21;
1757         uint32_t        rsvd9;
1758         struct {
1759                 uint32_t        low;
1760                 uint32_t        high;
1761         } page_physical_address[8];
1762 #else
1763 #error big endian version not defined
1764 #endif
1765 } sli4_req_common_create_mq_ext_t;
1766
1767 #define SLI4_MQE_SIZE_16                0x05
1768 #define SLI4_MQE_SIZE_32                0x06
1769 #define SLI4_MQE_SIZE_64                0x07
1770 #define SLI4_MQE_SIZE_128               0x08
1771
1772 #define SLI4_ASYNC_EVT_LINK_STATE       BIT(1)
1773 #define SLI4_ASYNC_EVT_FCOE_FIP         BIT(2)
1774 #define SLI4_ASYNC_EVT_DCBX             BIT(3)
1775 #define SLI4_ASYNC_EVT_ISCSI            BIT(4)
1776 #define SLI4_ASYNC_EVT_GRP5             BIT(5)
1777 #define SLI4_ASYNC_EVT_FC               BIT(16)
1778 #define SLI4_ASYNC_EVT_SLI_PORT         BIT(17)
1779 #define SLI4_ASYNC_EVT_VF               BIT(18)
1780 #define SLI4_ASYNC_EVT_MR               BIT(19)
1781
1782 #define SLI4_ASYNC_EVT_ALL      \
1783                 SLI4_ASYNC_EVT_LINK_STATE       | \
1784                 SLI4_ASYNC_EVT_FCOE_FIP         | \
1785                 SLI4_ASYNC_EVT_DCBX             | \
1786                 SLI4_ASYNC_EVT_ISCSI            | \
1787                 SLI4_ASYNC_EVT_GRP5             | \
1788                 SLI4_ASYNC_EVT_FC               | \
1789                 SLI4_ASYNC_EVT_SLI_PORT         | \
1790                 SLI4_ASYNC_EVT_VF               |\
1791                 SLI4_ASYNC_EVT_MR
1792
1793 #define SLI4_ASYNC_EVT_FC_FCOE \
1794                 SLI4_ASYNC_EVT_LINK_STATE       | \
1795                 SLI4_ASYNC_EVT_FCOE_FIP         | \
1796                 SLI4_ASYNC_EVT_GRP5             | \
1797                 SLI4_ASYNC_EVT_FC               | \
1798                 SLI4_ASYNC_EVT_SLI_PORT
1799
1800 /**
1801  * @brief Common Destroy MQ
1802  */
1803 typedef struct sli4_req_common_destroy_mq_s {
1804         sli4_req_hdr_t  hdr;
1805 #if BYTE_ORDER == LITTLE_ENDIAN
1806         uint32_t        mq_id:16,
1807                         :16;
1808 #else
1809 #error big endian version not defined
1810 #endif
1811 } sli4_req_common_destroy_mq_t;
1812
1813 /**
1814  * @brief COMMON_GET_CNTL_ATTRIBUTES
1815  *
1816  * Query for information about the SLI Port
1817  */
1818 typedef struct sli4_res_common_get_cntl_attributes_s {
1819         sli4_res_hdr_t  hdr;
1820 #if BYTE_ORDER == LITTLE_ENDIAN
1821         uint8_t         version_string[32];
1822         uint8_t         manufacturer_name[32];
1823         uint32_t        supported_modes;
1824         uint32_t        eprom_version_lo:8,
1825                         eprom_version_hi:8,
1826                         :16;
1827         uint32_t        mbx_data_structure_version;
1828         uint32_t        ep_firmware_data_structure_version;
1829         uint8_t         ncsi_version_string[12];
1830         uint32_t        default_extended_timeout;
1831         uint8_t         model_number[32];
1832         uint8_t         description[64];
1833         uint8_t         serial_number[32];
1834         uint8_t         ip_version_string[32];
1835         uint8_t         fw_version_string[32];
1836         uint8_t         bios_version_string[32];
1837         uint8_t         redboot_version_string[32];
1838         uint8_t         driver_version_string[32];
1839         uint8_t         fw_on_flash_version_string[32];
1840         uint32_t        functionalities_supported;
1841         uint32_t        max_cdb_length:16,
1842                         asic_revision:8,
1843                         generational_guid0:8;
1844         uint32_t        generational_guid1_12[3];
1845         uint32_t        generational_guid13:24,
1846                         hba_port_count:8;
1847         uint32_t        default_link_down_timeout:16,
1848                         iscsi_version_min_max:8,
1849                         multifunctional_device:8;
1850         uint32_t        cache_valid:8,
1851                         hba_status:8,
1852                         max_domains_supported:8,
1853                         port_number:6,
1854                         port_type:2;
1855         uint32_t        firmware_post_status;
1856         uint32_t        hba_mtu;
1857         uint32_t        iscsi_features:8,
1858                         rsvd121:24;
1859         uint32_t        pci_vendor_id:16,
1860                         pci_device_id:16;
1861         uint32_t        pci_sub_vendor_id:16,
1862                         pci_sub_system_id:16;
1863         uint32_t        pci_bus_number:8,
1864                         pci_device_number:8,
1865                         pci_function_number:8,
1866                         interface_type:8;
1867         uint64_t        unique_identifier;
1868         uint32_t        number_of_netfilters:8,
1869                         rsvd130:24;
1870 #else
1871 #error big endian version not defined
1872 #endif
1873 } sli4_res_common_get_cntl_attributes_t;
1874
1875 /**
1876  * @brief COMMON_GET_CNTL_ATTRIBUTES
1877  *
1878  * This command queries the controller information from the Flash ROM.
1879  */
1880 typedef struct sli4_req_common_get_cntl_addl_attributes_s {
1881         sli4_req_hdr_t  hdr;
1882 } sli4_req_common_get_cntl_addl_attributes_t;
1883
1884 typedef struct sli4_res_common_get_cntl_addl_attributes_s {
1885         sli4_res_hdr_t  hdr;
1886         uint16_t        ipl_file_number;
1887         uint8_t         ipl_file_version;
1888         uint8_t         rsvd0;
1889         uint8_t         on_die_temperature;
1890         uint8_t         rsvd1[3];
1891         uint32_t        driver_advanced_features_supported;
1892         uint32_t        rsvd2[4];
1893         char            fcoe_universal_bios_version[32];
1894         char            fcoe_x86_bios_version[32];
1895         char            fcoe_efi_bios_version[32];
1896         char            fcoe_fcode_version[32];
1897         char            uefi_bios_version[32];
1898         char            uefi_nic_version[32];
1899         char            uefi_fcode_version[32];
1900         char            uefi_iscsi_version[32];
1901         char            iscsi_x86_bios_version[32];
1902         char            pxe_x86_bios_version[32];
1903         uint8_t         fcoe_default_wwpn[8];
1904         uint8_t         ext_phy_version[32];
1905         uint8_t         fc_universal_bios_version[32];
1906         uint8_t         fc_x86_bios_version[32];
1907         uint8_t         fc_efi_bios_version[32];
1908         uint8_t         fc_fcode_version[32];
1909         uint8_t         ext_phy_crc_label[8];
1910         uint8_t         ipl_file_name[16];
1911         uint8_t         rsvd3[72];
1912 } sli4_res_common_get_cntl_addl_attributes_t;
1913
1914 /**
1915  * @brief COMMON_NOP
1916  *
1917  * This command does not do anything; it only returns the payload in the completion.
1918  */
1919 typedef struct sli4_req_common_nop_s {
1920         sli4_req_hdr_t  hdr;
1921 #if BYTE_ORDER == LITTLE_ENDIAN
1922         uint32_t        context[2];
1923 #else
1924 #error big endian version not defined
1925 #endif
1926 } sli4_req_common_nop_t;
1927
1928 typedef struct sli4_res_common_nop_s {
1929         sli4_res_hdr_t  hdr;
1930 #if BYTE_ORDER == LITTLE_ENDIAN
1931         uint32_t        context[2];
1932 #else
1933 #error big endian version not defined
1934 #endif
1935 } sli4_res_common_nop_t;
1936
1937 /**
1938  * @brief COMMON_GET_RESOURCE_EXTENT_INFO
1939  */
1940 typedef struct sli4_req_common_get_resource_extent_info_s {
1941         sli4_req_hdr_t  hdr;
1942 #if BYTE_ORDER == LITTLE_ENDIAN
1943         uint32_t        resource_type:16,
1944                         :16;
1945 #else
1946 #error big endian version not defined
1947 #endif
1948 } sli4_req_common_get_resource_extent_info_t;
1949
1950 #define SLI4_RSC_TYPE_ISCSI_INI_XRI     0x0c
1951 #define SLI4_RSC_TYPE_FCOE_VFI          0x20
1952 #define SLI4_RSC_TYPE_FCOE_VPI          0x21
1953 #define SLI4_RSC_TYPE_FCOE_RPI          0x22
1954 #define SLI4_RSC_TYPE_FCOE_XRI          0x23
1955
1956 typedef struct sli4_res_common_get_resource_extent_info_s {
1957         sli4_res_hdr_t  hdr;
1958 #if BYTE_ORDER == LITTLE_ENDIAN
1959         uint32_t        resource_extent_count:16,
1960                         resource_extent_size:16;
1961 #else
1962 #error big endian version not defined
1963 #endif
1964 } sli4_res_common_get_resource_extent_info_t;
1965
1966 #define SLI4_128BYTE_WQE_SUPPORT        0x02
1967 /**
1968  * @brief COMMON_GET_SLI4_PARAMETERS
1969  */
1970 typedef struct sli4_res_common_get_sli4_parameters_s {
1971         sli4_res_hdr_t  hdr;
1972 #if BYTE_ORDER == LITTLE_ENDIAN
1973         uint32_t        protocol_type:8,
1974                         :24;
1975         uint32_t        ft:1,
1976                         :3,
1977                         sli_revision:4,
1978                         sli_family:4,
1979                         if_type:4,
1980                         sli_hint_1:8,
1981                         sli_hint_2:5,
1982                         :3;
1983         uint32_t        eq_page_cnt:4,
1984                         :4,
1985                         eqe_sizes:4,
1986                         :4,
1987                         eq_page_sizes:8,
1988                         eqe_count_method:4,
1989                         :4;
1990         uint32_t        eqe_count_mask:16,
1991                         :16;
1992         uint32_t        cq_page_cnt:4,
1993                         :4,
1994                         cqe_sizes:4,
1995                         :2,
1996                         cqv:2,
1997                         cq_page_sizes:8,
1998                         cqe_count_method:4,
1999                         :4;
2000         uint32_t        cqe_count_mask:16,
2001                         :16;
2002         uint32_t        mq_page_cnt:4,
2003                         :10,
2004                         mqv:2,
2005                         mq_page_sizes:8,
2006                         mqe_count_method:4,
2007                         :4;
2008         uint32_t        mqe_count_mask:16,
2009                         :16;
2010         uint32_t        wq_page_cnt:4,
2011                         :4,
2012                         wqe_sizes:4,
2013                         :2,
2014                         wqv:2,
2015                         wq_page_sizes:8,
2016                         wqe_count_method:4,
2017                         :4;
2018         uint32_t        wqe_count_mask:16,
2019                         :16;
2020         uint32_t        rq_page_cnt:4,
2021                         :4,
2022                         rqe_sizes:4,
2023                         :2,
2024                         rqv:2,
2025                         rq_page_sizes:8,
2026                         rqe_count_method:4,
2027                         :4;
2028         uint32_t        rqe_count_mask:16,
2029                         :12,
2030                         rq_db_window:4;
2031         uint32_t        fcoe:1,
2032                         ext:1,
2033                         hdrr:1,
2034                         sglr:1,
2035                         fbrr:1,
2036                         areg:1,
2037                         tgt:1,
2038                         terp:1,
2039                         assi:1,
2040                         wchn:1,
2041                         tcca:1,
2042                         trty:1,
2043                         trir:1,
2044                         phoff:1,
2045                         phon:1,
2046                         phwq:1,                 /** Performance Hint WQ_ID Association */
2047                         boundary_4ga:1,
2048                         rxc:1,
2049                         hlm:1,
2050                         ipr:1,
2051                         rxri:1,
2052                         sglc:1,
2053                         timm:1,
2054                         tsmm:1,
2055                         :1,
2056                         oas:1,
2057                         lc:1,
2058                         agxf:1,
2059                         loopback_scope:4;
2060         uint32_t        sge_supported_length;
2061         uint32_t        sgl_page_cnt:4,
2062                         :4,
2063                         sgl_page_sizes:8,
2064                         sgl_pp_align:8,
2065                         :8;
2066         uint32_t        min_rq_buffer_size:16,
2067                         :16;
2068         uint32_t        max_rq_buffer_size;
2069         uint32_t        physical_xri_max:16,
2070                         physical_rpi_max:16;
2071         uint32_t        physical_vpi_max:16,
2072                         physical_vfi_max:16;
2073         uint32_t        rsvd19;
2074         uint32_t        frag_num_field_offset:16,       /* dword 20 */
2075                         frag_num_field_size:16;
2076         uint32_t        sgl_index_field_offset:16,      /* dword 21 */
2077                         sgl_index_field_size:16;
2078         uint32_t        chain_sge_initial_value_lo;     /* dword 22 */
2079         uint32_t        chain_sge_initial_value_hi;     /* dword 23 */
2080 #else
2081 #error big endian version not defined
2082 #endif
2083 } sli4_res_common_get_sli4_parameters_t;
2084
2085 /**
2086  * @brief COMMON_QUERY_FW_CONFIG
2087  *
2088  * This command retrieves firmware configuration parameters and adapter
2089  * resources available to the driver.
2090  */
2091 typedef struct sli4_req_common_query_fw_config_s {
2092         sli4_req_hdr_t  hdr;
2093 } sli4_req_common_query_fw_config_t;
2094
2095 #define SLI4_FUNCTION_MODE_FCOE_INI_MODE 0x40
2096 #define SLI4_FUNCTION_MODE_FCOE_TGT_MODE 0x80
2097 #define SLI4_FUNCTION_MODE_DUA_MODE      0x800
2098
2099 #define SLI4_ULP_MODE_FCOE_INI           0x40
2100 #define SLI4_ULP_MODE_FCOE_TGT           0x80
2101
2102 typedef struct sli4_res_common_query_fw_config_s {
2103         sli4_res_hdr_t  hdr;
2104         uint32_t        config_number;
2105         uint32_t        asic_rev;
2106         uint32_t        physical_port;
2107         uint32_t        function_mode;
2108         uint32_t        ulp0_mode;
2109         uint32_t        ulp0_nic_wqid_base;
2110         uint32_t        ulp0_nic_wq_total; /* Dword 10 */
2111         uint32_t        ulp0_toe_wqid_base;
2112         uint32_t        ulp0_toe_wq_total;
2113         uint32_t        ulp0_toe_rqid_base;
2114         uint32_t        ulp0_toe_rq_total;
2115         uint32_t        ulp0_toe_defrqid_base;
2116         uint32_t        ulp0_toe_defrq_total;
2117         uint32_t        ulp0_lro_rqid_base;
2118         uint32_t        ulp0_lro_rq_total;
2119         uint32_t        ulp0_iscsi_icd_base;
2120         uint32_t        ulp0_iscsi_icd_total; /* Dword 20 */
2121         uint32_t        ulp1_mode;
2122         uint32_t        ulp1_nic_wqid_base;
2123         uint32_t        ulp1_nic_wq_total;
2124         uint32_t        ulp1_toe_wqid_base;
2125         uint32_t        ulp1_toe_wq_total;
2126         uint32_t        ulp1_toe_rqid_base;
2127         uint32_t        ulp1_toe_rq_total;
2128         uint32_t        ulp1_toe_defrqid_base;
2129         uint32_t        ulp1_toe_defrq_total;
2130         uint32_t        ulp1_lro_rqid_base;  /* Dword 30 */
2131         uint32_t        ulp1_lro_rq_total;
2132         uint32_t        ulp1_iscsi_icd_base;
2133         uint32_t        ulp1_iscsi_icd_total;
2134         uint32_t        function_capabilities;
2135         uint32_t        ulp0_cq_base;
2136         uint32_t        ulp0_cq_total;
2137         uint32_t        ulp0_eq_base;
2138         uint32_t        ulp0_eq_total;
2139         uint32_t        ulp0_iscsi_chain_icd_base;
2140         uint32_t        ulp0_iscsi_chain_icd_total;  /* Dword 40 */
2141         uint32_t        ulp1_iscsi_chain_icd_base;
2142         uint32_t        ulp1_iscsi_chain_icd_total;
2143 } sli4_res_common_query_fw_config_t;
2144
2145 /**
2146  * @brief COMMON_GET_PORT_NAME
2147  */
2148 typedef struct sli4_req_common_get_port_name_s {
2149         sli4_req_hdr_t  hdr;
2150 #if BYTE_ORDER == LITTLE_ENDIAN
2151         uint32_t        pt:2,           /* only COMMON_GET_PORT_NAME_V1 */
2152                         :30;
2153 #else
2154 #error big endian version not defined
2155 #endif
2156 } sli4_req_common_get_port_name_t;
2157
2158 typedef struct sli4_res_common_get_port_name_s {
2159         sli4_res_hdr_t  hdr;
2160         char            port_name[4];
2161 } sli4_res_common_get_port_name_t;
2162
2163 /**
2164  * @brief COMMON_WRITE_FLASHROM
2165  */
2166 typedef struct sli4_req_common_write_flashrom_s {
2167         sli4_req_hdr_t  hdr;
2168 #if BYTE_ORDER == LITTLE_ENDIAN
2169         uint32_t        flash_rom_access_opcode;
2170         uint32_t        flash_rom_access_operation_type;
2171         uint32_t        data_buffer_size;
2172         uint32_t        offset;
2173         uint8_t         data_buffer[4];
2174 #else
2175 #error big endian version not defined
2176 #endif
2177 } sli4_req_common_write_flashrom_t;
2178
2179 #define SLI4_MGMT_FLASHROM_OPCODE_FLASH                 0x01
2180 #define SLI4_MGMT_FLASHROM_OPCODE_SAVE                  0x02
2181 #define SLI4_MGMT_FLASHROM_OPCODE_CLEAR                 0x03
2182 #define SLI4_MGMT_FLASHROM_OPCODE_REPORT                0x04
2183 #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_INFO            0x05
2184 #define SLI4_MGMT_FLASHROM_OPCODE_IMAGE_CRC             0x06
2185 #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_FLASH    0x07
2186 #define SLI4_MGMT_FLASHROM_OPCODE_OFFSET_BASED_SAVE     0x08
2187 #define SLI4_MGMT_PHY_FLASHROM_OPCODE_FLASH             0x09
2188 #define SLI4_MGMT_PHY_FLASHROM_OPCODE_SAVE              0x0a
2189
2190 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI             0x00
2191 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_REDBOOT           0x01
2192 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_BIOS              0x02
2193 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS          0x03
2194 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CONTROL      0x04
2195 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_IPSEC_CFG         0x05
2196 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_INIT_DATA         0x06
2197 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ROM_OFFSET        0x07
2198 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BIOS         0x08
2199 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ISCSI_BAK         0x09
2200 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_ACT          0x0a
2201 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_FCOE_BAK          0x0b
2202 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_CODE_CTRL_P       0x0c
2203 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NCSI              0x0d
2204 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_NIC               0x0e
2205 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_DCBX              0x0f
2206 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_PXE_BIOS_CFG      0x10
2207 #define SLI4_FLASH_ROM_ACCESS_OP_TYPE_ALL_CFG_DATA      0x11
2208
2209 /**
2210  * @brief COMMON_MANAGE_FAT
2211  */
2212 typedef struct sli4_req_common_manage_fat_s {
2213         sli4_req_hdr_t  hdr;
2214 #if BYTE_ORDER == LITTLE_ENDIAN
2215         uint32_t        fat_operation;
2216         uint32_t        read_log_offset;
2217         uint32_t        read_log_length;
2218         uint32_t        data_buffer_size;
2219         uint32_t        data_buffer;            /* response only */
2220 #else
2221 #error big endian version not defined
2222 #endif
2223 } sli4_req_common_manage_fat_t;
2224
2225 /**
2226  * @brief COMMON_GET_EXT_FAT_CAPABILITIES
2227  */
2228 typedef struct sli4_req_common_get_ext_fat_capabilities_s {
2229         sli4_req_hdr_t  hdr;
2230 #if BYTE_ORDER == LITTLE_ENDIAN
2231         uint32_t        parameter_type;
2232 #else
2233 #error big endian version not defined
2234 #endif
2235 } sli4_req_common_get_ext_fat_capabilities_t;
2236
2237 /**
2238  * @brief COMMON_SET_EXT_FAT_CAPABILITIES
2239  */
2240 typedef struct sli4_req_common_set_ext_fat_capabilities_s {
2241         sli4_req_hdr_t  hdr;
2242 #if BYTE_ORDER == LITTLE_ENDIAN
2243         uint32_t        maximum_log_entries;
2244         uint32_t        log_entry_size;
2245         uint32_t        logging_type:8,
2246                         maximum_logging_functions:8,
2247                         maximum_logging_ports:8,
2248                         :8;
2249         uint32_t        supported_modes;
2250         uint32_t        number_modules;
2251         uint32_t        debug_module[14];
2252 #else
2253 #error big endian version not defined
2254 #endif
2255 } sli4_req_common_set_ext_fat_capabilities_t;
2256
2257 /**
2258  * @brief COMMON_EXT_FAT_CONFIGURE_SNAPSHOT
2259  */
2260 typedef struct sli4_req_common_ext_fat_configure_snapshot_s {
2261         sli4_req_hdr_t  hdr;
2262 #if BYTE_ORDER == LITTLE_ENDIAN
2263         uint32_t        total_log_entries;
2264 #else
2265 #error big endian version not defined
2266 #endif
2267 } sli4_req_common_ext_fat_configure_snapshot_t;
2268
2269 /**
2270  * @brief COMMON_EXT_FAT_RETRIEVE_SNAPSHOT
2271  */
2272 typedef struct sli4_req_common_ext_fat_retrieve_snapshot_s {
2273         sli4_req_hdr_t  hdr;
2274 #if BYTE_ORDER == LITTLE_ENDIAN
2275         uint32_t        snapshot_mode;
2276         uint32_t        start_index;
2277         uint32_t        number_log_entries;
2278 #else
2279 #error big endian version not defined
2280 #endif
2281 } sli4_req_common_ext_fat_retrieve_snapshot_t;
2282
2283 typedef struct sli4_res_common_ext_fat_retrieve_snapshot_s {
2284         sli4_res_hdr_t  hdr;
2285 #if BYTE_ORDER == LITTLE_ENDIAN
2286         uint32_t        number_log_entries;
2287         uint32_t        version:8,
2288                         physical_port:8,
2289                         function_id:16;
2290         uint32_t        trace_level;
2291         uint32_t        module_mask[2];
2292         uint32_t        trace_table_index;
2293         uint32_t        timestamp;
2294         uint8_t         string_data[16];
2295         uint32_t        data[6];
2296 #else
2297 #error big endian version not defined
2298 #endif
2299 } sli4_res_common_ext_fat_retrieve_snapshot_t;
2300
2301 /**
2302  * @brief COMMON_EXT_FAT_READ_STRING_TABLE
2303  */
2304 typedef struct sli4_req_common_ext_fat_read_string_table_s {
2305         sli4_req_hdr_t  hdr;
2306 #if BYTE_ORDER == LITTLE_ENDIAN
2307         uint32_t        byte_offset;
2308         uint32_t        number_bytes;
2309 #else
2310 #error big endian version not defined
2311 #endif
2312 } sli4_req_common_ext_fat_read_string_table_t;
2313
2314 typedef struct sli4_res_common_ext_fat_read_string_table_s {
2315         sli4_res_hdr_t  hdr;
2316 #if BYTE_ORDER == LITTLE_ENDIAN
2317         uint32_t        number_returned_bytes;
2318         uint32_t        number_remaining_bytes;
2319         uint32_t        table_data0:8,
2320                         :24;
2321         uint8_t         table_data[0];
2322 #else
2323 #error big endian version not defined
2324 #endif
2325 } sli4_res_common_ext_fat_read_string_table_t;
2326
2327 /**
2328  * @brief COMMON_READ_TRANSCEIVER_DATA
2329  *
2330  * This command reads SFF transceiver data(Format is defined
2331  * by the SFF-8472 specification).
2332  */
2333 typedef struct sli4_req_common_read_transceiver_data_s {
2334         sli4_req_hdr_t  hdr;
2335 #if BYTE_ORDER == LITTLE_ENDIAN
2336         uint32_t        page_number;
2337         uint32_t        port;
2338 #else
2339 #error big endian version not defined
2340 #endif
2341 } sli4_req_common_read_transceiver_data_t;
2342
2343 typedef struct sli4_res_common_read_transceiver_data_s {
2344         sli4_res_hdr_t  hdr;
2345 #if BYTE_ORDER == LITTLE_ENDIAN
2346         uint32_t        page_number;
2347         uint32_t        port;
2348         uint32_t        page_data[32];
2349         uint32_t        page_data_2[32];
2350 #else
2351 #error big endian version not defined
2352 #endif
2353 } sli4_res_common_read_transceiver_data_t;
2354
2355 /**
2356  * @brief COMMON_READ_OBJECT
2357  */
2358 typedef struct sli4_req_common_read_object_s {
2359         sli4_req_hdr_t  hdr;
2360 #if BYTE_ORDER == LITTLE_ENDIAN
2361         uint32_t        desired_read_length:24,
2362                         :8;
2363         uint32_t        read_offset;
2364         uint8_t         object_name[104];
2365         uint32_t        host_buffer_descriptor_count;
2366         sli4_bde_t      host_buffer_descriptor[0];
2367 #else
2368 #error big endian version not defined
2369 #endif
2370 } sli4_req_common_read_object_t;
2371
2372 typedef struct sli4_res_common_read_object_s {
2373         sli4_res_hdr_t  hdr;
2374 #if BYTE_ORDER == LITTLE_ENDIAN
2375         uint32_t        actual_read_length;
2376         uint32_t        resv:31,
2377                         eof:1;
2378 #else
2379 #error big endian version not defined
2380 #endif
2381 } sli4_res_common_read_object_t;
2382
2383 /**
2384  * @brief COMMON_WRITE_OBJECT
2385  */
2386 typedef struct sli4_req_common_write_object_s {
2387         sli4_req_hdr_t  hdr;
2388 #if BYTE_ORDER == LITTLE_ENDIAN
2389         uint32_t        desired_write_length:24,
2390                         :6,
2391                         noc:1,
2392                         eof:1;
2393         uint32_t        write_offset;
2394         uint8_t         object_name[104];
2395         uint32_t        host_buffer_descriptor_count;
2396         sli4_bde_t      host_buffer_descriptor[0];
2397 #else
2398 #error big endian version not defined
2399 #endif
2400 } sli4_req_common_write_object_t;
2401
2402 typedef struct sli4_res_common_write_object_s {
2403         sli4_res_hdr_t  hdr;
2404 #if BYTE_ORDER == LITTLE_ENDIAN
2405         uint32_t        actual_write_length;
2406         uint32_t        change_status:8,
2407                         :24;
2408 #else
2409 #error big endian version not defined
2410 #endif
2411 } sli4_res_common_write_object_t;
2412
2413 /**
2414  * @brief COMMON_DELETE_OBJECT
2415  */
2416 typedef struct sli4_req_common_delete_object_s {
2417         sli4_req_hdr_t  hdr;
2418 #if BYTE_ORDER == LITTLE_ENDIAN
2419         uint32_t        rsvd4;
2420         uint32_t        rsvd5;
2421         uint8_t         object_name[104];
2422 #else
2423 #error big endian version not defined
2424 #endif
2425 } sli4_req_common_delete_object_t;
2426
2427 /**
2428  * @brief COMMON_READ_OBJECT_LIST
2429  */
2430 typedef struct sli4_req_common_read_object_list_s {
2431         sli4_req_hdr_t  hdr;
2432 #if BYTE_ORDER == LITTLE_ENDIAN
2433         uint32_t        desired_read_length:24,
2434                         :8;
2435         uint32_t        read_offset;
2436         uint8_t         object_name[104];
2437         uint32_t        host_buffer_descriptor_count;
2438         sli4_bde_t      host_buffer_descriptor[0];
2439 #else
2440 #error big endian version not defined
2441 #endif
2442 } sli4_req_common_read_object_list_t;
2443
2444 /**
2445  * @brief COMMON_SET_DUMP_LOCATION
2446  */
2447 typedef struct sli4_req_common_set_dump_location_s {
2448         sli4_req_hdr_t  hdr;
2449 #if BYTE_ORDER == LITTLE_ENDIAN
2450         uint32_t        buffer_length:24,
2451                         :5,
2452                         fdb:1,
2453                         blp:1,
2454                         qry:1;
2455         uint32_t        buf_addr_low;
2456         uint32_t        buf_addr_high;
2457 #else
2458 #error big endian version not defined
2459 #endif
2460 } sli4_req_common_set_dump_location_t;
2461
2462 typedef struct sli4_res_common_set_dump_location_s {
2463         sli4_res_hdr_t  hdr;
2464 #if BYTE_ORDER == LITTLE_ENDIAN
2465         uint32_t        buffer_length:24,
2466                         :8;
2467 #else
2468 #error big endian version not defined
2469 #endif
2470 }sli4_res_common_set_dump_location_t;
2471
2472 /**
2473  * @brief COMMON_SET_SET_FEATURES
2474  */
2475 #define SLI4_SET_FEATURES_DIF_SEED                      0x01
2476 #define SLI4_SET_FEATURES_XRI_TIMER                     0x03
2477 #define SLI4_SET_FEATURES_MAX_PCIE_SPEED                0x04
2478 #define SLI4_SET_FEATURES_FCTL_CHECK                    0x05
2479 #define SLI4_SET_FEATURES_FEC                           0x06
2480 #define SLI4_SET_FEATURES_PCIE_RECV_DETECT              0x07
2481 #define SLI4_SET_FEATURES_DIF_MEMORY_MODE               0x08
2482 #define SLI4_SET_FEATURES_DISABLE_SLI_PORT_PAUSE_STATE  0x09
2483 #define SLI4_SET_FEATURES_ENABLE_PCIE_OPTIONS           0x0A
2484 #define SLI4_SET_FEATURES_SET_CONFIG_AUTO_XFER_RDY_T10PI        0x0C
2485 #define SLI4_SET_FEATURES_ENABLE_MULTI_RECEIVE_QUEUE    0x0D
2486 #define SLI4_SET_FEATURES_SET_FTD_XFER_HINT             0x0F
2487 #define SLI4_SET_FEATURES_SLI_PORT_HEALTH_CHECK         0x11
2488
2489 typedef struct sli4_req_common_set_features_s {
2490         sli4_req_hdr_t  hdr;
2491 #if BYTE_ORDER == LITTLE_ENDIAN
2492         uint32_t        feature;
2493         uint32_t        param_len;
2494         uint32_t        params[8];
2495 #else
2496 #error big endian version not defined
2497 #endif
2498 } sli4_req_common_set_features_t;
2499
2500 typedef struct sli4_req_common_set_features_dif_seed_s {
2501 #if BYTE_ORDER == LITTLE_ENDIAN
2502         uint32_t        seed:16,
2503                 :16;
2504 #else
2505 #error big endian version not defined
2506 #endif
2507 } sli4_req_common_set_features_dif_seed_t;
2508
2509 typedef struct sli4_req_common_set_features_t10_pi_mem_model_s {
2510 #if BYTE_ORDER == LITTLE_ENDIAN
2511         uint32_t        tmm:1,
2512                 :31;
2513 #else
2514 #error big endian version not defined
2515 #endif
2516 } sli4_req_common_set_features_t10_pi_mem_model_t;
2517
2518 typedef struct sli4_req_common_set_features_multirq_s {
2519 #if BYTE_ORDER == LITTLE_ENDIAN
2520         uint32_t        isr:1,                  /*<< Include Sequence Reporting */
2521                         agxfe:1,                /*<< Auto Generate XFER-RDY Feature Enabled */
2522                         :30;
2523         uint32_t        num_rqs:8,
2524                         rq_select_policy:4,
2525                         :20;
2526 #else
2527 #error big endian version not defined
2528 #endif
2529 } sli4_req_common_set_features_multirq_t;
2530
2531 typedef struct sli4_req_common_set_features_xfer_rdy_t10pi_s {
2532 #if BYTE_ORDER == LITTLE_ENDIAN
2533         uint32_t        rtc:1,
2534                         atv:1,
2535                         tmm:1,
2536                         :1,
2537                         p_type:3,
2538                         blk_size:3,
2539                         :22;
2540         uint32_t        app_tag:16,
2541                         :16;
2542 #else
2543 #error big endian version not defined
2544 #endif
2545 } sli4_req_common_set_features_xfer_rdy_t10pi_t;
2546
2547 typedef struct sli4_req_common_set_features_health_check_s {
2548 #if BYTE_ORDER == LITTLE_ENDIAN
2549         uint32_t        hck:1,
2550                         qry:1,
2551                         :30;
2552 #else
2553 #error big endian version not defined
2554 #endif
2555 } sli4_req_common_set_features_health_check_t;
2556
2557 typedef struct sli4_req_common_set_features_set_fdt_xfer_hint_s {
2558 #if BYTE_ORDER == LITTLE_ENDIAN
2559         uint32_t        fdt_xfer_hint;
2560 #else
2561 #error big endian version not defined
2562 #endif
2563 } sli4_req_common_set_features_set_fdt_xfer_hint_t;
2564
2565 /**
2566  * @brief DMTF_EXEC_CLP_CMD
2567  */
2568 typedef struct sli4_req_dmtf_exec_clp_cmd_s {
2569         sli4_req_hdr_t  hdr;
2570 #if BYTE_ORDER == LITTLE_ENDIAN
2571         uint32_t        cmd_buf_length;
2572         uint32_t        resp_buf_length;
2573         uint32_t        cmd_buf_addr_low;
2574         uint32_t        cmd_buf_addr_high;
2575         uint32_t        resp_buf_addr_low;
2576         uint32_t        resp_buf_addr_high;
2577 #else
2578 #error big endian version not defined
2579 #endif
2580 } sli4_req_dmtf_exec_clp_cmd_t;
2581
2582 typedef struct sli4_res_dmtf_exec_clp_cmd_s {
2583         sli4_res_hdr_t  hdr;
2584 #if BYTE_ORDER == LITTLE_ENDIAN
2585         uint32_t        :32;
2586         uint32_t        resp_length;
2587         uint32_t        :32;
2588         uint32_t        :32;
2589         uint32_t        :32;
2590         uint32_t        :32;
2591         uint32_t        clp_status;
2592         uint32_t        clp_detailed_status;
2593 #else
2594 #error big endian version not defined
2595 #endif
2596 } sli4_res_dmtf_exec_clp_cmd_t;
2597
2598 /**
2599  * @brief Resource descriptor
2600  */
2601
2602 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PCIE      0x50
2603 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_NIC       0x51
2604 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISCSI     0x52
2605 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_FCFCOE    0x53
2606 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_RDMA      0x54
2607 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_PORT      0x55
2608 #define SLI4_RESOURCE_DESCRIPTOR_TYPE_ISAP      0x56
2609
2610 #define SLI4_PROTOCOL_NIC_TOE                   0x01
2611 #define SLI4_PROTOCOL_ISCSI                     0x02
2612 #define SLI4_PROTOCOL_FCOE                      0x04
2613 #define SLI4_PROTOCOL_NIC_TOE_RDMA              0x08
2614 #define SLI4_PROTOCOL_FC                        0x10
2615 #define SLI4_PROTOCOL_DEFAULT                   0xff
2616
2617 typedef struct sli4_resource_descriptor_v1_s {
2618         uint32_t        descriptor_type:8,
2619                         descriptor_length:8,
2620                         :16;
2621         uint32_t        type_specific[0];
2622 } sli4_resource_descriptor_v1_t;
2623
2624 typedef struct sli4_pcie_resource_descriptor_v1_s {
2625         uint32_t        descriptor_type:8,
2626                         descriptor_length:8,
2627                         :14,
2628                         imm:1,
2629                         nosv:1;
2630         uint32_t        :16,
2631                         pf_number:10,
2632                         :6;
2633         uint32_t        rsvd1;
2634         uint32_t        sriov_state:8,
2635                         pf_state:8,
2636                         pf_type:8,
2637                         :8;
2638         uint32_t        number_of_vfs:16,
2639                         :16;
2640         uint32_t        mission_roles:8,
2641                         :19,
2642                         pchg:1,
2643                         schg:1,
2644                         xchg:1,
2645                         xrom:2;
2646         uint32_t        rsvd2[16];
2647 } sli4_pcie_resource_descriptor_v1_t;
2648
2649 typedef struct sli4_isap_resource_descriptor_v1_s {
2650         uint32_t        descriptor_type:8,
2651                         descriptor_length:8,
2652                         :16;
2653         uint32_t        iscsi_tgt:1,
2654                         iscsi_ini:1,
2655                         iscsi_dif:1,
2656                         :29;
2657         uint32_t        rsvd1[3];
2658         uint32_t        fcoe_tgt:1,
2659                         fcoe_ini:1,
2660                         fcoe_dif:1,
2661                         :29;
2662         uint32_t        rsvd2[7];
2663         uint32_t        mc_type0:8,
2664                         mc_type1:8,
2665                         mc_type2:8,
2666                         mc_type3:8;
2667         uint32_t        rsvd3[3];
2668 } sli4_isap_resouce_descriptor_v1_t;
2669
2670 /**
2671  * @brief COMMON_GET_FUNCTION_CONFIG
2672  */
2673 typedef struct sli4_req_common_get_function_config_s {
2674         sli4_req_hdr_t  hdr;
2675 } sli4_req_common_get_function_config_t;
2676
2677 typedef struct sli4_res_common_get_function_config_s {
2678         sli4_res_hdr_t  hdr;
2679 #if BYTE_ORDER == LITTLE_ENDIAN
2680         uint32_t        desc_count;
2681         uint32_t        desc[54];
2682 #else
2683 #error big endian version not defined
2684 #endif
2685 } sli4_res_common_get_function_config_t;
2686
2687 /**
2688  * @brief COMMON_GET_PROFILE_CONFIG
2689  */
2690 typedef struct sli4_req_common_get_profile_config_s {
2691         sli4_req_hdr_t  hdr;
2692         uint32_t        profile_id:8,
2693                         typ:2,
2694                         :22;
2695 } sli4_req_common_get_profile_config_t;
2696
2697 typedef struct sli4_res_common_get_profile_config_s {
2698         sli4_res_hdr_t  hdr;
2699 #if BYTE_ORDER == LITTLE_ENDIAN
2700         uint32_t        desc_count;
2701         uint32_t        desc[0];
2702 #else
2703 #error big endian version not defined
2704 #endif
2705 } sli4_res_common_get_profile_config_t;
2706
2707 /**
2708  * @brief COMMON_SET_PROFILE_CONFIG
2709  */
2710 typedef struct sli4_req_common_set_profile_config_s {
2711         sli4_req_hdr_t  hdr;
2712         uint32_t        profile_id:8,
2713                         :23,
2714                         isap:1;
2715         uint32_t        desc_count;
2716         uint32_t        desc[0];
2717 } sli4_req_common_set_profile_config_t;
2718
2719 typedef struct sli4_res_common_set_profile_config_s {
2720         sli4_res_hdr_t  hdr;
2721 #if BYTE_ORDER == LITTLE_ENDIAN
2722 #else
2723 #error big endian version not defined
2724 #endif
2725 } sli4_res_common_set_profile_config_t;
2726
2727 /**
2728  * @brief Profile Descriptor for profile functions
2729  */
2730 typedef struct sli4_profile_descriptor_s {
2731 #if BYTE_ORDER == LITTLE_ENDIAN
2732         uint32_t        profile_id:8,
2733                         :8,
2734                         profile_index:8,
2735                         :8;
2736         uint32_t        profile_description[128];
2737 #else
2738 #error big endian version not defined
2739 #endif
2740 } sli4_profile_descriptor_t;
2741
2742 /* We don't know in advance how many descriptors there are.  We have
2743    to pick a number that we think will be big enough and ask for that
2744    many. */
2745
2746 #define MAX_PRODUCT_DESCRIPTORS 40
2747
2748 /**
2749  * @brief COMMON_GET_PROFILE_LIST
2750  */
2751 typedef struct sli4_req_common_get_profile_list_s {
2752         sli4_req_hdr_t  hdr;
2753 #if BYTE_ORDER == LITTLE_ENDIAN
2754         uint32_t        start_profile_index:8,
2755                         :24;
2756 #else
2757 #error big endian version not defined
2758 #endif
2759 } sli4_req_common_get_profile_list_t;
2760
2761 typedef struct sli4_res_common_get_profile_list_s {
2762         sli4_res_hdr_t  hdr;
2763 #if BYTE_ORDER == LITTLE_ENDIAN
2764         uint32_t        profile_descriptor_count;
2765         sli4_profile_descriptor_t profile_descriptor[MAX_PRODUCT_DESCRIPTORS];
2766 #else
2767 #error big endian version not defined
2768 #endif
2769 } sli4_res_common_get_profile_list_t;
2770
2771 /**
2772  * @brief COMMON_GET_ACTIVE_PROFILE
2773  */
2774 typedef struct sli4_req_common_get_active_profile_s {
2775         sli4_req_hdr_t  hdr;
2776 } sli4_req_common_get_active_profile_t;
2777
2778 typedef struct sli4_res_common_get_active_profile_s {
2779         sli4_res_hdr_t  hdr;
2780 #if BYTE_ORDER == LITTLE_ENDIAN
2781         uint32_t        active_profile_id:8,
2782                         :8,
2783                         next_profile_id:8,
2784                         :8;
2785 #else
2786 #error big endian version not defined
2787 #endif
2788 } sli4_res_common_get_active_profile_t;
2789
2790 /**
2791  * @brief COMMON_SET_ACTIVE_PROFILE
2792  */
2793 typedef struct sli4_req_common_set_active_profile_s {
2794         sli4_req_hdr_t  hdr;
2795 #if BYTE_ORDER == LITTLE_ENDIAN
2796         uint32_t        active_profile_id:8,
2797                         :23,
2798                         fd:1;
2799 #else
2800 #error big endian version not defined
2801 #endif
2802 } sli4_req_common_set_active_profile_t;
2803
2804 typedef struct sli4_res_common_set_active_profile_s {
2805         sli4_res_hdr_t  hdr;
2806 } sli4_res_common_set_active_profile_t;
2807
2808 /**
2809  * @brief Link Config Descriptor for link config functions
2810  */
2811 typedef struct sli4_link_config_descriptor_s {
2812 #if BYTE_ORDER == LITTLE_ENDIAN
2813         uint32_t        link_config_id:8,
2814                         :24;
2815         uint32_t        config_description[8];
2816 #else
2817 #error big endian version not defined
2818 #endif
2819 } sli4_link_config_descriptor_t;
2820
2821 #define MAX_LINK_CONFIG_DESCRIPTORS 10
2822
2823 /**
2824  * @brief COMMON_GET_RECONFIG_LINK_INFO
2825  */
2826 typedef struct sli4_req_common_get_reconfig_link_info_s {
2827         sli4_req_hdr_t  hdr;
2828 #if BYTE_ORDER == LITTLE_ENDIAN
2829 #else
2830 #error big endian version not defined
2831 #endif
2832 } sli4_req_common_get_reconfig_link_info_t;
2833
2834 typedef struct sli4_res_common_get_reconfig_link_info_s {
2835         sli4_res_hdr_t  hdr;
2836 #if BYTE_ORDER == LITTLE_ENDIAN
2837         uint32_t        active_link_config_id:8,
2838                         :8,
2839                         next_link_config_id:8,
2840                         :8;
2841         uint32_t        link_configuration_descriptor_count;
2842         sli4_link_config_descriptor_t   desc[MAX_LINK_CONFIG_DESCRIPTORS];
2843 #else
2844 #error big endian version not defined
2845 #endif
2846 } sli4_res_common_get_reconfig_link_info_t;
2847
2848 /**
2849  * @brief COMMON_SET_RECONFIG_LINK_ID
2850  */
2851 typedef struct sli4_req_common_set_reconfig_link_id_s {
2852         sli4_req_hdr_t  hdr;
2853 #if BYTE_ORDER == LITTLE_ENDIAN
2854         uint32_t        next_link_config_id:8,
2855                         :23,
2856                         fd:1;
2857 #else
2858 #error big endian version not defined
2859 #endif
2860 } sli4_req_common_set_reconfig_link_id_t;
2861
2862 typedef struct sli4_res_common_set_reconfig_link_id_s {
2863         sli4_res_hdr_t  hdr;
2864 #if BYTE_ORDER == LITTLE_ENDIAN
2865 #else
2866 #error big endian version not defined
2867 #endif
2868 } sli4_res_common_set_reconfig_link_id_t;
2869
2870 typedef struct sli4_req_lowlevel_set_watchdog_s {
2871         sli4_req_hdr_t  hdr;
2872 #if BYTE_ORDER == LITTLE_ENDIAN
2873         uint32_t        watchdog_timeout:16,
2874                         :16;
2875 #else
2876 #error big endian version not defined
2877 #endif
2878
2879 } sli4_req_lowlevel_set_watchdog_t;
2880
2881 typedef struct sli4_res_lowlevel_set_watchdog_s {
2882         sli4_res_hdr_t  hdr;
2883 #if BYTE_ORDER == LITTLE_ENDIAN
2884         uint32_t        rsvd;
2885 #else
2886 #error big endian version not defined
2887 #endif
2888 } sli4_res_lowlevel_set_watchdog_t;
2889
2890 /**
2891  * @brief Event Queue Entry
2892  */
2893 typedef struct sli4_eqe_s {
2894 #if BYTE_ORDER == LITTLE_ENDIAN
2895         uint32_t        vld:1,          /** valid */
2896                         major_code:3,
2897                         minor_code:12,
2898                         resource_id:16;
2899 #else
2900 #error big endian version not defined
2901 #endif
2902 } sli4_eqe_t;
2903
2904 #define SLI4_MAJOR_CODE_STANDARD        0
2905 #define SLI4_MAJOR_CODE_SENTINEL        1
2906
2907 /**
2908  * @brief Mailbox Completion Queue Entry
2909  *
2910  * A CQE generated on the completion of a MQE from a MQ.
2911  */
2912 typedef struct sli4_mcqe_s {
2913 #if BYTE_ORDER == LITTLE_ENDIAN
2914         uint32_t        completion_status:16, /** values are protocol specific */
2915                         extended_status:16;
2916         uint32_t        mqe_tag_low;
2917         uint32_t        mqe_tag_high;
2918         uint32_t        :27,
2919                         con:1,          /** consumed - command now being executed */
2920                         cmp:1,          /** completed - command still executing if clear */
2921                         :1,
2922                         ae:1,           /** async event - this is an ACQE */
2923                         val:1;          /** valid - contents of CQE are valid */
2924 #else
2925 #error big endian version not defined
2926 #endif
2927 } sli4_mcqe_t;
2928
2929 /**
2930  * @brief Asynchronous Completion Queue Entry
2931  *
2932  * A CQE generated asynchronously in response to the link or other internal events.
2933  */
2934 typedef struct sli4_acqe_s {
2935 #if BYTE_ORDER == LITTLE_ENDIAN
2936         uint32_t        event_data[3];
2937         uint32_t        :8,
2938                         event_code:8,
2939                         event_type:8,   /** values are protocol specific */
2940                         :6,
2941                         ae:1,           /** async event - this is an ACQE */
2942                         val:1;          /** valid - contents of CQE are valid */
2943 #else
2944 #error big endian version not defined
2945 #endif
2946 } sli4_acqe_t;
2947
2948 #define SLI4_ACQE_EVENT_CODE_LINK_STATE         0x01
2949 #define SLI4_ACQE_EVENT_CODE_FCOE_FIP           0x02
2950 #define SLI4_ACQE_EVENT_CODE_DCBX               0x03
2951 #define SLI4_ACQE_EVENT_CODE_ISCSI              0x04
2952 #define SLI4_ACQE_EVENT_CODE_GRP_5              0x05
2953 #define SLI4_ACQE_EVENT_CODE_FC_LINK_EVENT      0x10
2954 #define SLI4_ACQE_EVENT_CODE_SLI_PORT_EVENT     0x11
2955 #define SLI4_ACQE_EVENT_CODE_VF_EVENT           0x12
2956 #define SLI4_ACQE_EVENT_CODE_MR_EVENT           0x13
2957
2958 /**
2959  * @brief Register name enums
2960  */
2961 typedef enum {
2962         SLI4_REG_BMBX,
2963         SLI4_REG_EQCQ_DOORBELL,
2964         SLI4_REG_FCOE_RQ_DOORBELL,
2965         SLI4_REG_IO_WQ_DOORBELL,
2966         SLI4_REG_MQ_DOORBELL,
2967         SLI4_REG_PHYSDEV_CONTROL,
2968         SLI4_REG_SLIPORT_CONTROL,
2969         SLI4_REG_SLIPORT_ERROR1,
2970         SLI4_REG_SLIPORT_ERROR2,
2971         SLI4_REG_SLIPORT_SEMAPHORE,
2972         SLI4_REG_SLIPORT_STATUS,
2973         SLI4_REG_UERR_MASK_HI,
2974         SLI4_REG_UERR_MASK_LO,
2975         SLI4_REG_UERR_STATUS_HI,
2976         SLI4_REG_UERR_STATUS_LO,
2977         SLI4_REG_SW_UE_CSR1,
2978         SLI4_REG_SW_UE_CSR2,
2979         SLI4_REG_MAX                    /* must be last */
2980 } sli4_regname_e;
2981
2982 typedef struct sli4_reg_s {
2983         uint32_t        rset;
2984         uint32_t        off;
2985 } sli4_reg_t;
2986
2987 typedef enum {
2988         SLI_QTYPE_EQ,
2989         SLI_QTYPE_CQ,
2990         SLI_QTYPE_MQ,
2991         SLI_QTYPE_WQ,
2992         SLI_QTYPE_RQ,
2993         SLI_QTYPE_MAX,                  /* must be last */
2994 } sli4_qtype_e;
2995
2996 #define SLI_USER_MQ_COUNT       1       /** User specified max mail queues */
2997 #define SLI_MAX_CQ_SET_COUNT    16
2998 #define SLI_MAX_RQ_SET_COUNT    16
2999
3000 typedef enum {
3001         SLI_QENTRY_ASYNC,
3002         SLI_QENTRY_MQ,
3003         SLI_QENTRY_RQ,
3004         SLI_QENTRY_WQ,
3005         SLI_QENTRY_WQ_RELEASE,
3006         SLI_QENTRY_OPT_WRITE_CMD,
3007         SLI_QENTRY_OPT_WRITE_DATA,
3008         SLI_QENTRY_XABT,
3009         SLI_QENTRY_MAX                  /* must be last */
3010 } sli4_qentry_e;
3011
3012 typedef struct sli4_queue_s {
3013         /* Common to all queue types */
3014         ocs_dma_t       dma;
3015         ocs_lock_t      lock;
3016         uint32_t        index;          /** current host entry index */
3017         uint16_t        size;           /** entry size */
3018         uint16_t        length;         /** number of entries */
3019         uint16_t        n_posted;       /** number entries posted */
3020         uint16_t        id;             /** Port assigned xQ_ID */
3021         uint16_t        ulp;            /** ULP assigned to this queue */
3022         uint32_t        doorbell_offset;/** The offset for the doorbell */
3023         uint16_t        doorbell_rset;  /** register set for the doorbell */
3024         uint8_t         type;           /** queue type ie EQ, CQ, ... */
3025         uint32_t        proc_limit;     /** limit number of CQE processed per iteration */
3026         uint32_t        posted_limit;   /** number of CQE/EQE to process before ringing doorbell */
3027         uint32_t        max_num_processed;
3028         time_t          max_process_time;
3029
3030         /* Type specific gunk */
3031         union {
3032                 uint32_t        r_idx;  /** "read" index (MQ only) */
3033                 struct {
3034                         uint32_t        is_mq:1,/** CQ contains MQ/Async completions */
3035                                         is_hdr:1,/** is a RQ for packet headers */
3036                                         rq_batch:1;/** RQ index incremented by 8 */
3037                 } flag;
3038         } u;
3039 } sli4_queue_t;
3040
3041 static inline void
3042 sli_queue_lock(sli4_queue_t *q)
3043 {
3044         ocs_lock(&q->lock);
3045 }
3046
3047 static inline void
3048 sli_queue_unlock(sli4_queue_t *q)
3049 {
3050         ocs_unlock(&q->lock);
3051 }
3052
3053 #define SLI4_QUEUE_DEFAULT_CQ   UINT16_MAX /** Use the default CQ */
3054
3055 #define SLI4_QUEUE_RQ_BATCH     8
3056
3057 typedef enum {
3058         SLI4_CB_LINK,
3059         SLI4_CB_FIP,
3060         SLI4_CB_MAX                     /* must be last */
3061 } sli4_callback_e;
3062
3063 typedef enum {
3064         SLI_LINK_STATUS_UP,
3065         SLI_LINK_STATUS_DOWN,
3066         SLI_LINK_STATUS_NO_ALPA,
3067         SLI_LINK_STATUS_MAX,
3068 } sli4_link_status_e;
3069
3070 typedef enum {
3071         SLI_LINK_TOPO_NPORT = 1,        /** fabric or point-to-point */
3072         SLI_LINK_TOPO_LOOP,
3073         SLI_LINK_TOPO_LOOPBACK_INTERNAL,
3074         SLI_LINK_TOPO_LOOPBACK_EXTERNAL,
3075         SLI_LINK_TOPO_NONE,
3076         SLI_LINK_TOPO_MAX,
3077 } sli4_link_topology_e;
3078
3079 /* TODO do we need both sli4_port_type_e & sli4_link_medium_e */
3080 typedef enum {
3081         SLI_LINK_MEDIUM_ETHERNET,
3082         SLI_LINK_MEDIUM_FC,
3083         SLI_LINK_MEDIUM_MAX,
3084 } sli4_link_medium_e;
3085
3086 typedef struct sli4_link_event_s {
3087         sli4_link_status_e      status;         /* link up/down */
3088         sli4_link_topology_e    topology;
3089         sli4_link_medium_e      medium;         /* Ethernet / FC */
3090         uint32_t                speed;          /* Mbps */
3091         uint8_t                 *loop_map;
3092         uint32_t                fc_id;
3093 } sli4_link_event_t;
3094
3095 /**
3096  * @brief Fields retrieved from skyhawk that used used to build chained SGL
3097  */
3098 typedef struct sli4_sgl_chaining_params_s {
3099         uint8_t         chaining_capable;
3100         uint16_t        frag_num_field_offset;
3101         uint16_t        sgl_index_field_offset;
3102         uint64_t        frag_num_field_mask;
3103         uint64_t        sgl_index_field_mask;
3104         uint32_t        chain_sge_initial_value_lo;
3105         uint32_t        chain_sge_initial_value_hi;
3106 } sli4_sgl_chaining_params_t;
3107
3108 typedef struct sli4_fip_event_s {
3109         uint32_t        type;
3110         uint32_t        index;          /* FCF index or UINT32_MAX if invalid */
3111 } sli4_fip_event_t;
3112
3113 typedef enum {
3114         SLI_RSRC_FCOE_VFI,
3115         SLI_RSRC_FCOE_VPI,
3116         SLI_RSRC_FCOE_RPI,
3117         SLI_RSRC_FCOE_XRI,
3118         SLI_RSRC_FCOE_FCFI,
3119         SLI_RSRC_MAX                    /* must be last */
3120 } sli4_resource_e;
3121
3122 typedef enum {
3123         SLI4_PORT_TYPE_FC,
3124         SLI4_PORT_TYPE_NIC,
3125         SLI4_PORT_TYPE_MAX              /* must be last */
3126 } sli4_port_type_e;
3127
3128 typedef enum {
3129         SLI4_ASIC_TYPE_BE3 = 1,
3130         SLI4_ASIC_TYPE_SKYHAWK,
3131         SLI4_ASIC_TYPE_LANCER,
3132         SLI4_ASIC_TYPE_CORSAIR,
3133         SLI4_ASIC_TYPE_LANCERG6,
3134 } sli4_asic_type_e;
3135
3136 typedef enum {
3137         SLI4_ASIC_REV_FPGA = 1,
3138         SLI4_ASIC_REV_A0,
3139         SLI4_ASIC_REV_A1,
3140         SLI4_ASIC_REV_A2,
3141         SLI4_ASIC_REV_A3,
3142         SLI4_ASIC_REV_B0,
3143         SLI4_ASIC_REV_B1,
3144         SLI4_ASIC_REV_C0,
3145         SLI4_ASIC_REV_D0,
3146 } sli4_asic_rev_e;
3147
3148 typedef struct sli4_s {
3149         ocs_os_handle_t os;
3150         sli4_port_type_e port_type;
3151
3152         uint32_t        sli_rev;        /* SLI revision number */
3153         uint32_t        sli_family;
3154         uint32_t        if_type;        /* SLI Interface type */
3155
3156         sli4_asic_type_e asic_type;     /*<< ASIC type */
3157         sli4_asic_rev_e asic_rev;       /*<< ASIC revision */
3158         uint32_t        physical_port;
3159
3160         struct {
3161                 uint16_t                e_d_tov;
3162                 uint16_t                r_a_tov;
3163                 uint16_t                max_qcount[SLI_QTYPE_MAX];
3164                 uint32_t                max_qentries[SLI_QTYPE_MAX];
3165                 uint16_t                count_mask[SLI_QTYPE_MAX];
3166                 uint16_t                count_method[SLI_QTYPE_MAX];
3167                 uint32_t                qpage_count[SLI_QTYPE_MAX];
3168                 uint16_t                link_module_type;
3169                 uint8_t                 rq_batch;
3170                 uint16_t                rq_min_buf_size;
3171                 uint32_t                rq_max_buf_size;
3172                 uint8_t                 topology;
3173                 uint8_t                 wwpn[8];
3174                 uint8_t                 wwnn[8];
3175                 uint32_t                fw_rev[2];
3176                 uint8_t                 fw_name[2][16];
3177                 char                    ipl_name[16];
3178                 uint32_t                hw_rev[3];
3179                 uint8_t                 port_number;
3180                 char                    port_name[2];
3181                 char                    bios_version_string[32];
3182                 uint8_t                 dual_ulp_capable;
3183                 uint8_t                 is_ulp_fc[2];
3184                 /*
3185                  * Tracks the port resources using extents metaphor. For
3186                  * devices that don't implement extents (i.e.
3187                  * has_extents == FALSE), the code models each resource as
3188                  * a single large extent.
3189                  */
3190                 struct {
3191                         uint32_t        number; /* number of extents */
3192                         uint32_t        size;   /* number of elements in each extent */
3193                         uint32_t        n_alloc;/* number of elements allocated */
3194                         uint32_t        *base;
3195                         ocs_bitmap_t    *use_map;/* bitmap showing resources in use */
3196                         uint32_t        map_size;/* number of bits in bitmap */
3197                 } extent[SLI_RSRC_MAX];
3198                 sli4_features_t         features;
3199                 uint32_t                has_extents:1,
3200                                         auto_reg:1,
3201                                         auto_xfer_rdy:1,
3202                                         hdr_template_req:1,
3203                                         perf_hint:1,
3204                                         perf_wq_id_association:1,
3205                                         cq_create_version:2,
3206                                         mq_create_version:2,
3207                                         high_login_mode:1,
3208                                         sgl_pre_registered:1,
3209                                         sgl_pre_registration_required:1,
3210                                         t10_dif_inline_capable:1,
3211                                         t10_dif_separate_capable:1;
3212                 uint32_t                sge_supported_length;
3213                 uint32_t                sgl_page_sizes;
3214                 uint32_t                max_sgl_pages;
3215                 sli4_sgl_chaining_params_t sgl_chaining_params;
3216                 size_t                  wqe_size;
3217         } config;
3218
3219         /*
3220          * Callback functions
3221          */
3222         int32_t         (*link)(void *, void *);
3223         void            *link_arg;
3224         int32_t         (*fip)(void *, void *);
3225         void            *fip_arg;
3226
3227         ocs_dma_t       bmbx;
3228 #if defined(OCS_INCLUDE_DEBUG)
3229         /* Save pointer to physical memory descriptor for non-embedded SLI_CONFIG
3230          * commands for BMBX dumping purposes */
3231         ocs_dma_t       *bmbx_non_emb_pmd;
3232 #endif
3233
3234         struct {
3235                 ocs_dma_t       data;
3236                 uint32_t        length;
3237         } vpd;
3238 } sli4_t;
3239
3240 /**
3241  * Get / set parameter functions
3242  */
3243 static inline uint32_t
3244 sli_get_max_rsrc(sli4_t *sli4, sli4_resource_e rsrc)
3245 {
3246         if (rsrc >= SLI_RSRC_MAX) {
3247                 return 0;
3248         }
3249
3250         return sli4->config.extent[rsrc].size;
3251 }
3252
3253 static inline uint32_t
3254 sli_get_max_queue(sli4_t *sli4, sli4_qtype_e qtype)
3255 {
3256         if (qtype >= SLI_QTYPE_MAX) {
3257                 return 0;
3258         }
3259         return sli4->config.max_qcount[qtype];
3260 }
3261
3262 static inline uint32_t
3263 sli_get_max_qentries(sli4_t *sli4, sli4_qtype_e qtype)
3264 {
3265
3266         return sli4->config.max_qentries[qtype];
3267 }
3268
3269 static inline uint32_t
3270 sli_get_max_sge(sli4_t *sli4)
3271 {
3272         return sli4->config.sge_supported_length;
3273 }
3274
3275 static inline uint32_t
3276 sli_get_max_sgl(sli4_t *sli4)
3277 {
3278
3279         if (sli4->config.sgl_page_sizes != 1) {
3280                 ocs_log_test(sli4->os, "unsupported SGL page sizes %#x\n",
3281                                 sli4->config.sgl_page_sizes);
3282                 return 0;
3283         }
3284
3285         return ((sli4->config.max_sgl_pages * SLI_PAGE_SIZE) / sizeof(sli4_sge_t));
3286 }
3287
3288 static inline sli4_link_medium_e
3289 sli_get_medium(sli4_t *sli4)
3290 {
3291         switch (sli4->config.topology) {
3292         case SLI4_READ_CFG_TOPO_FCOE:
3293                 return SLI_LINK_MEDIUM_ETHERNET;
3294         case SLI4_READ_CFG_TOPO_FC:
3295         case SLI4_READ_CFG_TOPO_FC_DA:
3296         case SLI4_READ_CFG_TOPO_FC_AL:
3297                 return SLI_LINK_MEDIUM_FC;
3298         default:
3299                 return SLI_LINK_MEDIUM_MAX;
3300         }
3301 }
3302
3303 static inline void
3304 sli_skh_chain_sge_build(sli4_t *sli4, sli4_sge_t *sge, uint32_t xri_index, uint32_t frag_num, uint32_t offset)
3305 {
3306         sli4_sgl_chaining_params_t *cparms = &sli4->config.sgl_chaining_params;
3307
3308         ocs_memset(sge, 0, sizeof(*sge));
3309         sge->sge_type = SLI4_SGE_TYPE_CHAIN;
3310         sge->buffer_address_high = (uint32_t)cparms->chain_sge_initial_value_hi;
3311         sge->buffer_address_low =
3312                 (uint32_t)((cparms->chain_sge_initial_value_lo |
3313                             (((uintptr_t)(xri_index & cparms->sgl_index_field_mask)) <<
3314                              cparms->sgl_index_field_offset) |
3315                             (((uintptr_t)(frag_num & cparms->frag_num_field_mask)) <<
3316                              cparms->frag_num_field_offset)  |
3317                             offset) >> 3);
3318 }
3319
3320 static inline uint32_t
3321 sli_get_sli_rev(sli4_t *sli4)
3322 {
3323         return sli4->sli_rev;
3324 }
3325
3326 static inline uint32_t
3327 sli_get_sli_family(sli4_t *sli4)
3328 {
3329         return sli4->sli_family;
3330 }
3331
3332 static inline uint32_t
3333 sli_get_if_type(sli4_t *sli4)
3334 {
3335         return sli4->if_type;
3336 }
3337
3338 static inline void *
3339 sli_get_wwn_port(sli4_t *sli4)
3340 {
3341         return sli4->config.wwpn;
3342 }
3343
3344 static inline void *
3345 sli_get_wwn_node(sli4_t *sli4)
3346 {
3347         return sli4->config.wwnn;
3348 }
3349
3350 static inline void *
3351 sli_get_vpd(sli4_t *sli4)
3352 {
3353         return sli4->vpd.data.virt;
3354 }
3355
3356 static inline uint32_t
3357 sli_get_vpd_len(sli4_t *sli4)
3358 {
3359         return sli4->vpd.length;
3360 }
3361
3362 static inline uint32_t
3363 sli_get_fw_revision(sli4_t *sli4, uint32_t which)
3364 {
3365         return sli4->config.fw_rev[which];
3366 }
3367
3368 static inline void *
3369 sli_get_fw_name(sli4_t *sli4, uint32_t which)
3370 {
3371         return sli4->config.fw_name[which];
3372 }
3373
3374 static inline char *
3375 sli_get_ipl_name(sli4_t *sli4)
3376 {
3377         return sli4->config.ipl_name;
3378 }
3379
3380 static inline uint32_t
3381 sli_get_hw_revision(sli4_t *sli4, uint32_t which)
3382 {
3383         return sli4->config.hw_rev[which];
3384 }
3385
3386 static inline uint32_t
3387 sli_get_auto_xfer_rdy_capable(sli4_t *sli4)
3388 {
3389         return sli4->config.auto_xfer_rdy;
3390 }
3391
3392 static inline uint32_t
3393 sli_get_dif_capable(sli4_t *sli4)
3394 {
3395         return sli4->config.features.flag.dif;
3396 }
3397
3398 static inline uint32_t
3399 sli_is_dif_inline_capable(sli4_t *sli4)
3400 {
3401         return sli_get_dif_capable(sli4) && sli4->config.t10_dif_inline_capable;
3402 }
3403
3404 static inline uint32_t
3405 sli_is_dif_separate_capable(sli4_t *sli4)
3406 {
3407         return sli_get_dif_capable(sli4) && sli4->config.t10_dif_separate_capable;
3408 }
3409
3410 static inline uint32_t
3411 sli_get_is_dual_ulp_capable(sli4_t *sli4)
3412 {
3413         return sli4->config.dual_ulp_capable;
3414 }
3415
3416 static inline uint32_t
3417 sli_get_is_sgl_chaining_capable(sli4_t *sli4)
3418 {
3419         return sli4->config.sgl_chaining_params.chaining_capable;
3420 }
3421
3422 static inline uint32_t
3423 sli_get_is_ulp_enabled(sli4_t *sli4, uint16_t ulp)
3424 {
3425         return sli4->config.is_ulp_fc[ulp];
3426 }
3427
3428 static inline uint32_t
3429 sli_get_hlm_capable(sli4_t *sli4)
3430 {
3431         return sli4->config.features.flag.hlm;
3432 }
3433
3434 static inline int32_t
3435 sli_set_hlm(sli4_t *sli4, uint32_t value)
3436 {
3437         if (value && !sli4->config.features.flag.hlm) {
3438                 ocs_log_test(sli4->os, "HLM not supported\n");
3439                 return -1;
3440         }
3441
3442         sli4->config.high_login_mode = value != 0 ? TRUE : FALSE;
3443
3444         return 0;
3445 }
3446
3447 static inline uint32_t
3448 sli_get_hlm(sli4_t *sli4)
3449 {
3450         return sli4->config.high_login_mode;
3451 }
3452
3453 static inline uint32_t
3454 sli_get_sgl_preregister_required(sli4_t *sli4)
3455 {
3456         return sli4->config.sgl_pre_registration_required;
3457 }
3458
3459 static inline uint32_t
3460 sli_get_sgl_preregister(sli4_t *sli4)
3461 {
3462         return sli4->config.sgl_pre_registered;
3463 }
3464
3465 static inline int32_t
3466 sli_set_sgl_preregister(sli4_t *sli4, uint32_t value)
3467 {
3468         if ((value == 0) && sli4->config.sgl_pre_registration_required) {
3469                 ocs_log_test(sli4->os, "SGL pre-registration required\n");
3470                 return -1;
3471         }
3472
3473         sli4->config.sgl_pre_registered = value != 0 ? TRUE : FALSE;
3474
3475         return 0;
3476 }
3477
3478 static inline sli4_asic_type_e
3479 sli_get_asic_type(sli4_t *sli4)
3480 {
3481         return sli4->asic_type;
3482 }
3483
3484 static inline sli4_asic_rev_e
3485 sli_get_asic_rev(sli4_t *sli4)
3486 {
3487         return sli4->asic_rev;
3488 }
3489
3490 static inline int32_t
3491 sli_set_topology(sli4_t *sli4, uint32_t value)
3492 {
3493         int32_t rc = 0;
3494
3495         switch (value) {
3496         case SLI4_READ_CFG_TOPO_FCOE:
3497         case SLI4_READ_CFG_TOPO_FC:
3498         case SLI4_READ_CFG_TOPO_FC_DA:
3499         case SLI4_READ_CFG_TOPO_FC_AL:
3500                 sli4->config.topology = value;
3501                 break;
3502         default:
3503                 ocs_log_test(sli4->os, "unsupported topology %#x\n", value);
3504                 rc = -1;
3505         }
3506
3507         return rc;
3508 }
3509
3510 static inline uint16_t
3511 sli_get_link_module_type(sli4_t *sli4)
3512 {
3513         return sli4->config.link_module_type;
3514 }
3515
3516 static inline char *
3517 sli_get_portnum(sli4_t *sli4)
3518 {
3519         return sli4->config.port_name;
3520 }
3521
3522 static inline char *
3523 sli_get_bios_version_string(sli4_t *sli4)
3524 {
3525         return sli4->config.bios_version_string;
3526 }
3527
3528 static inline uint32_t
3529 sli_convert_mask_to_count(uint32_t method, uint32_t mask)
3530 {
3531         uint32_t count = 0;
3532
3533         if (method) {
3534                 count = 1 << ocs_lg2(mask);
3535                 count *= 16;
3536         } else {
3537                 count = mask;
3538         }
3539
3540         return count;
3541 }
3542
3543 /**
3544  * @brief Common Create Queue function prototype
3545  */
3546 typedef int32_t (*sli4_create_q_fn_t)(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
3547
3548 /**
3549  * @brief Common Destroy Queue function prototype
3550  */
3551 typedef int32_t (*sli4_destroy_q_fn_t)(sli4_t *, void *, size_t, uint16_t);
3552
3553 /****************************************************************************
3554  * Function prototypes
3555  */
3556 extern int32_t sli_cmd_config_auto_xfer_rdy(sli4_t *, void *, size_t, uint32_t);
3557 extern int32_t sli_cmd_config_auto_xfer_rdy_hp(sli4_t *, void *, size_t, uint32_t, uint32_t, uint32_t);
3558 extern int32_t sli_cmd_config_link(sli4_t *, void *, size_t);
3559 extern int32_t sli_cmd_down_link(sli4_t *, void *, size_t);
3560 extern int32_t sli_cmd_dump_type4(sli4_t *, void *, size_t, uint16_t);
3561 extern int32_t sli_cmd_common_read_transceiver_data(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *);
3562 extern int32_t sli_cmd_read_link_stats(sli4_t *, void *, size_t,uint8_t, uint8_t, uint8_t);
3563 extern int32_t sli_cmd_read_status(sli4_t *sli4, void *buf, size_t size, uint8_t clear_counters);
3564 extern int32_t sli_cmd_init_link(sli4_t *, void *, size_t, uint32_t, uint8_t);
3565 extern int32_t sli_cmd_init_vfi(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t);
3566 extern int32_t sli_cmd_init_vpi(sli4_t *, void *, size_t, uint16_t, uint16_t);
3567 extern int32_t sli_cmd_post_xri(sli4_t *, void *, size_t,  uint16_t, uint16_t);
3568 extern int32_t sli_cmd_release_xri(sli4_t *, void *, size_t,  uint8_t);
3569 extern int32_t sli_cmd_read_sparm64(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t);
3570 extern int32_t sli_cmd_read_topology(sli4_t *, void *, size_t, ocs_dma_t *);
3571 extern int32_t sli_cmd_read_nvparms(sli4_t *, void *, size_t);
3572 extern int32_t sli_cmd_write_nvparms(sli4_t *, void *, size_t, uint8_t *, uint8_t *, uint8_t, uint32_t);
3573 typedef struct {
3574         uint16_t rq_id;
3575         uint8_t r_ctl_mask;
3576         uint8_t r_ctl_match;
3577         uint8_t type_mask;
3578         uint8_t type_match;
3579 } sli4_cmd_rq_cfg_t;
3580 extern int32_t sli_cmd_reg_fcfi(sli4_t *, void *, size_t, uint16_t,
3581                                 sli4_cmd_rq_cfg_t rq_cfg[SLI4_CMD_REG_FCFI_NUM_RQ_CFG], uint16_t);
3582 extern int32_t sli_cmd_reg_fcfi_mrq(sli4_t *, void *, size_t, uint8_t, uint16_t, uint16_t, uint8_t, uint8_t , uint16_t, sli4_cmd_rq_cfg_t *);
3583
3584 extern int32_t sli_cmd_reg_rpi(sli4_t *, void *, size_t, uint32_t, uint16_t, uint16_t, ocs_dma_t *, uint8_t, uint8_t);
3585 extern int32_t sli_cmd_reg_vfi(sli4_t *, void *, size_t, ocs_domain_t *);
3586 extern int32_t sli_cmd_reg_vpi(sli4_t *, void *, size_t, ocs_sli_port_t *, uint8_t);
3587 extern int32_t sli_cmd_sli_config(sli4_t *, void *, size_t, uint32_t, ocs_dma_t *);
3588 extern int32_t sli_cmd_unreg_fcfi(sli4_t *, void *, size_t, uint16_t);
3589 extern int32_t sli_cmd_unreg_rpi(sli4_t *, void *, size_t, uint16_t, sli4_resource_e, uint32_t);
3590 extern int32_t sli_cmd_unreg_vfi(sli4_t *, void *, size_t, ocs_domain_t *, uint32_t);
3591 extern int32_t sli_cmd_unreg_vpi(sli4_t *, void *, size_t, uint16_t, uint32_t);
3592 extern int32_t sli_cmd_common_nop(sli4_t *, void *, size_t, uint64_t);
3593 extern int32_t sli_cmd_common_get_resource_extent_info(sli4_t *, void *, size_t, uint16_t);
3594 extern int32_t sli_cmd_common_get_sli4_parameters(sli4_t *, void *, size_t);
3595 extern int32_t sli_cmd_common_write_object(sli4_t *, void *, size_t,
3596                 uint16_t, uint16_t, uint32_t, uint32_t, char *, ocs_dma_t *);
3597 extern int32_t sli_cmd_common_delete_object(sli4_t *, void *, size_t, char *);
3598 extern int32_t sli_cmd_common_read_object(sli4_t *, void *, size_t, uint32_t,
3599                 uint32_t, char *, ocs_dma_t *);
3600 extern int32_t sli_cmd_dmtf_exec_clp_cmd(sli4_t *sli4, void *buf, size_t size,
3601                 ocs_dma_t *cmd,
3602                 ocs_dma_t *resp);
3603 extern int32_t sli_cmd_common_set_dump_location(sli4_t *sli4, void *buf, size_t size,
3604                                                 uint8_t query, uint8_t is_buffer_list,
3605                                                 ocs_dma_t *buffer, uint8_t fdb);
3606 extern int32_t sli_cmd_common_set_features(sli4_t *, void *, size_t, uint32_t, uint32_t, void*);
3607 extern int32_t sli_cmd_common_get_profile_list(sli4_t *sli4, void *buf,
3608                 size_t size, uint32_t start_profile_index, ocs_dma_t *dma);
3609 extern int32_t sli_cmd_common_get_active_profile(sli4_t *sli4, void *buf,
3610                 size_t size);
3611 extern int32_t sli_cmd_common_set_active_profile(sli4_t *sli4, void *buf,
3612                 size_t size,
3613                 uint32_t fd,
3614                 uint32_t active_profile_id);
3615 extern int32_t sli_cmd_common_get_reconfig_link_info(sli4_t *sli4, void *buf,
3616                 size_t size, ocs_dma_t *dma);
3617 extern int32_t sli_cmd_common_set_reconfig_link_id(sli4_t *sli4, void *buf,
3618                 size_t size, ocs_dma_t *dma,
3619                 uint32_t fd, uint32_t active_link_config_id);
3620 extern int32_t sli_cmd_common_get_function_config(sli4_t *sli4, void *buf,
3621                 size_t size);
3622 extern int32_t sli_cmd_common_get_profile_config(sli4_t *sli4, void *buf,
3623                 size_t size, ocs_dma_t *dma);
3624 extern int32_t sli_cmd_common_set_profile_config(sli4_t *sli4, void *buf,
3625                 size_t size, ocs_dma_t *dma,
3626                 uint8_t profile_id, uint32_t descriptor_count,
3627                 uint8_t isap);
3628
3629 extern int32_t sli_cqe_mq(void *);
3630 extern int32_t sli_cqe_async(sli4_t *, void *);
3631
3632 extern int32_t sli_setup(sli4_t *, ocs_os_handle_t, sli4_port_type_e);
3633 extern void sli_calc_max_qentries(sli4_t *sli4);
3634 extern int32_t sli_init(sli4_t *);
3635 extern int32_t sli_reset(sli4_t *);
3636 extern int32_t sli_fw_reset(sli4_t *);
3637 extern int32_t sli_teardown(sli4_t *);
3638 extern int32_t sli_callback(sli4_t *, sli4_callback_e, void *, void *);
3639 extern int32_t sli_bmbx_command(sli4_t *);
3640 extern int32_t __sli_queue_init(sli4_t *, sli4_queue_t *, uint32_t, size_t, uint32_t, uint32_t);
3641 extern int32_t __sli_create_queue(sli4_t *, sli4_queue_t *);
3642 extern int32_t sli_eq_modify_delay(sli4_t *sli4, sli4_queue_t *eq, uint32_t num_eq, uint32_t shift, uint32_t delay_mult);
3643 extern int32_t sli_queue_alloc(sli4_t *, uint32_t, sli4_queue_t *, uint32_t, sli4_queue_t *, uint16_t);
3644 extern int32_t sli_cq_alloc_set(sli4_t *, sli4_queue_t *qs[], uint32_t, uint32_t, sli4_queue_t *eqs[]);
3645 extern int32_t sli_get_queue_entry_size(sli4_t *, uint32_t);
3646 extern int32_t sli_queue_free(sli4_t *, sli4_queue_t *, uint32_t, uint32_t);
3647 extern int32_t sli_queue_reset(sli4_t *, sli4_queue_t *);
3648 extern int32_t sli_queue_is_empty(sli4_t *, sli4_queue_t *);
3649 extern int32_t sli_queue_eq_arm(sli4_t *, sli4_queue_t *, uint8_t);
3650 extern int32_t sli_queue_arm(sli4_t *, sli4_queue_t *, uint8_t);
3651 extern int32_t _sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *);
3652 extern int32_t sli_queue_write(sli4_t *, sli4_queue_t *, uint8_t *);
3653 extern int32_t sli_queue_read(sli4_t *, sli4_queue_t *, uint8_t *);
3654 extern int32_t sli_queue_index(sli4_t *, sli4_queue_t *);
3655 extern int32_t _sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *);
3656 extern int32_t sli_queue_poke(sli4_t *, sli4_queue_t *, uint32_t, uint8_t *);
3657 extern int32_t sli_resource_alloc(sli4_t *, sli4_resource_e, uint32_t *, uint32_t *);
3658 extern int32_t sli_resource_free(sli4_t *, sli4_resource_e, uint32_t);
3659 extern int32_t sli_resource_reset(sli4_t *, sli4_resource_e);
3660 extern int32_t sli_eq_parse(sli4_t *, uint8_t *, uint16_t *);
3661 extern int32_t sli_cq_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *);
3662
3663 extern int32_t sli_raise_ue(sli4_t *, uint8_t);
3664 extern int32_t sli_dump_is_ready(sli4_t *);
3665 extern int32_t sli_dump_is_present(sli4_t *);
3666 extern int32_t sli_reset_required(sli4_t *);
3667 extern int32_t sli_fw_error_status(sli4_t *);
3668 extern int32_t sli_fw_ready(sli4_t *);
3669 extern uint32_t sli_reg_read(sli4_t *, sli4_regname_e);
3670 extern void sli_reg_write(sli4_t *, sli4_regname_e, uint32_t);
3671 extern int32_t sli_link_is_configurable(sli4_t *);
3672
3673 #include "ocs_fcp.h"
3674
3675 /**
3676  * @brief Maximum value for a FCFI
3677  *
3678  * Note that although most commands provide a 16 bit field for the FCFI,
3679  * the FC/FCoE Asynchronous Recived CQE format only provides 6 bits for
3680  * the returned FCFI. Then effectively, the FCFI cannot be larger than
3681  * 1 << 6 or 64.
3682  */
3683 #define SLI4_MAX_FCFI   64
3684
3685 /**
3686  * @brief Maximum value for FCF index
3687  *
3688  * The SLI-4 specification uses a 16 bit field in most places for the FCF
3689  * index, but practically, this value will be much smaller. Arbitrarily
3690  * limit the max FCF index to match the max FCFI value.
3691  */
3692 #define SLI4_MAX_FCF_INDEX      SLI4_MAX_FCFI
3693
3694 /*************************************************************************
3695  * SLI-4 FC/FCoE mailbox command formats and definitions.
3696  */
3697
3698 /**
3699  * FC/FCoE opcode (OPC) values.
3700  */
3701 #define SLI4_OPC_FCOE_WQ_CREATE                 0x1
3702 #define SLI4_OPC_FCOE_WQ_DESTROY                0x2
3703 #define SLI4_OPC_FCOE_POST_SGL_PAGES            0x3
3704 #define SLI4_OPC_FCOE_RQ_CREATE                 0x5
3705 #define SLI4_OPC_FCOE_RQ_DESTROY                0x6
3706 #define SLI4_OPC_FCOE_READ_FCF_TABLE            0x8
3707 #define SLI4_OPC_FCOE_POST_HDR_TEMPLATES        0xb
3708 #define SLI4_OPC_FCOE_REDISCOVER_FCF            0x10
3709
3710 /* Use the default CQ associated with the WQ */
3711 #define SLI4_CQ_DEFAULT 0xffff
3712
3713 typedef struct sli4_physical_page_descriptor_s {
3714         uint32_t        low;
3715         uint32_t        high;
3716 } sli4_physical_page_descriptor_t;
3717
3718 /**
3719  * @brief FCOE_WQ_CREATE
3720  *
3721  * Create a Work Queue for FC/FCoE use.
3722  */
3723 #define SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES        4
3724
3725 typedef struct sli4_req_fcoe_wq_create_s {
3726         sli4_req_hdr_t  hdr;
3727 #if BYTE_ORDER == LITTLE_ENDIAN
3728         uint32_t        num_pages:8,
3729                         dua:1,
3730                         :7,
3731                         cq_id:16;
3732         sli4_physical_page_descriptor_t page_physical_address[SLI4_FCOE_WQ_CREATE_V0_MAX_PAGES];
3733         uint32_t        bqu:1,
3734                         :7,
3735                         ulp:8,
3736                         :16;
3737 #else
3738 #error big endian version not defined
3739 #endif
3740 } sli4_req_fcoe_wq_create_t;
3741
3742 /**
3743  * @brief FCOE_WQ_CREATE_V1
3744  *
3745  * Create a version 1 Work Queue for FC/FCoE use.
3746  */
3747 typedef struct sli4_req_fcoe_wq_create_v1_s {
3748         sli4_req_hdr_t  hdr;
3749 #if BYTE_ORDER == LITTLE_ENDIAN
3750         uint32_t        num_pages:16,
3751                         cq_id:16;
3752         uint32_t        page_size:8,
3753                         wqe_size:4,
3754                         :4,
3755                         wqe_count:16;
3756         uint32_t        rsvd6;
3757         sli4_physical_page_descriptor_t page_physical_address[8];
3758 #else
3759 #error big endian version not defined
3760 #endif
3761 } sli4_req_fcoe_wq_create_v1_t;
3762
3763 #define SLI4_FCOE_WQ_CREATE_V1_MAX_PAGES        8
3764
3765 /**
3766  * @brief FCOE_WQ_DESTROY
3767  *
3768  * Destroy an FC/FCoE Work Queue.
3769  */
3770 typedef struct sli4_req_fcoe_wq_destroy_s {
3771         sli4_req_hdr_t  hdr;
3772 #if BYTE_ORDER == LITTLE_ENDIAN
3773         uint32_t        wq_id:16,
3774                         :16;
3775 #else
3776 #error big endian version not defined
3777 #endif
3778 } sli4_req_fcoe_wq_destroy_t;
3779
3780 /**
3781  * @brief FCOE_POST_SGL_PAGES
3782  *
3783  * Register the scatter gather list (SGL) memory and associate it with an XRI.
3784  */
3785 typedef struct sli4_req_fcoe_post_sgl_pages_s {
3786         sli4_req_hdr_t  hdr;
3787 #if BYTE_ORDER == LITTLE_ENDIAN
3788         uint32_t        xri_start:16,
3789                         xri_count:16;
3790         struct {
3791                 uint32_t        page0_low;
3792                 uint32_t        page0_high;
3793                 uint32_t        page1_low;
3794                 uint32_t        page1_high;
3795         } page_set[10];
3796 #else
3797 #error big endian version not defined
3798 #endif
3799 } sli4_req_fcoe_post_sgl_pages_t;
3800
3801 /**
3802  * @brief FCOE_RQ_CREATE
3803  *
3804  * Create a Receive Queue for FC/FCoE use.
3805  */
3806 typedef struct sli4_req_fcoe_rq_create_s {
3807         sli4_req_hdr_t  hdr;
3808 #if BYTE_ORDER == LITTLE_ENDIAN
3809         uint32_t        num_pages:16,
3810                         dua:1,
3811                         bqu:1,
3812                         :6,
3813                         ulp:8;
3814         uint32_t        :16,
3815                         rqe_count:4,
3816                         :12;
3817         uint32_t        rsvd6;
3818         uint32_t        buffer_size:16,
3819                         cq_id:16;
3820         uint32_t        rsvd8;
3821         sli4_physical_page_descriptor_t page_physical_address[8];
3822 #else
3823 #error big endian version not defined
3824 #endif
3825 } sli4_req_fcoe_rq_create_t;
3826
3827 #define SLI4_FCOE_RQ_CREATE_V0_MAX_PAGES        8
3828 #define SLI4_FCOE_RQ_CREATE_V0_MIN_BUF_SIZE     128
3829 #define SLI4_FCOE_RQ_CREATE_V0_MAX_BUF_SIZE     2048
3830
3831 /**
3832  * @brief FCOE_RQ_CREATE_V1
3833  *
3834  * Create a version 1 Receive Queue for FC/FCoE use.
3835  */
3836 typedef struct sli4_req_fcoe_rq_create_v1_s {
3837         sli4_req_hdr_t  hdr;
3838 #if BYTE_ORDER == LITTLE_ENDIAN
3839         uint32_t        num_pages:16,
3840                         :13,
3841                         dim:1,
3842                         dfd:1,
3843                         dnb:1;
3844         uint32_t        page_size:8,
3845                         rqe_size:4,
3846                         :4,
3847                         rqe_count:16;
3848         uint32_t        rsvd6;
3849         uint32_t        :16,
3850                         cq_id:16;
3851         uint32_t        buffer_size;
3852         sli4_physical_page_descriptor_t page_physical_address[8];
3853 #else
3854 #error big endian version not defined
3855 #endif
3856 } sli4_req_fcoe_rq_create_v1_t;
3857
3858 /**
3859  * @brief FCOE_RQ_CREATE_V2
3860  *
3861  * Create a version 2 Receive Queue for FC/FCoE use.
3862  */
3863 typedef struct sli4_req_fcoe_rq_create_v2_s {
3864         sli4_req_hdr_t  hdr;
3865 #if BYTE_ORDER == LITTLE_ENDIAN
3866         uint32_t        num_pages:16,
3867                         rq_count:8,
3868                         :5,
3869                         dim:1,
3870                         dfd:1,
3871                         dnb:1;
3872         uint32_t        page_size:8,
3873                         rqe_size:4,
3874                         :4,
3875                         rqe_count:16;
3876         uint32_t        hdr_buffer_size:16,
3877                         payload_buffer_size:16;
3878         uint32_t        base_cq_id:16,
3879                         :16;
3880         uint32_t        rsvd;
3881         sli4_physical_page_descriptor_t page_physical_address[0];
3882 #else
3883 #error big endian version not defined
3884 #endif
3885 } sli4_req_fcoe_rq_create_v2_t;
3886
3887 #define SLI4_FCOE_RQ_CREATE_V1_MAX_PAGES        8
3888 #define SLI4_FCOE_RQ_CREATE_V1_MIN_BUF_SIZE     64
3889 #define SLI4_FCOE_RQ_CREATE_V1_MAX_BUF_SIZE     2048
3890
3891 #define SLI4_FCOE_RQE_SIZE_8                    0x2
3892 #define SLI4_FCOE_RQE_SIZE_16                   0x3
3893 #define SLI4_FCOE_RQE_SIZE_32                   0x4
3894 #define SLI4_FCOE_RQE_SIZE_64                   0x5
3895 #define SLI4_FCOE_RQE_SIZE_128                  0x6
3896
3897 #define SLI4_FCOE_RQ_PAGE_SIZE_4096             0x1
3898 #define SLI4_FCOE_RQ_PAGE_SIZE_8192             0x2
3899 #define SLI4_FCOE_RQ_PAGE_SIZE_16384            0x4
3900 #define SLI4_FCOE_RQ_PAGE_SIZE_32768            0x8
3901 #define SLI4_FCOE_RQ_PAGE_SIZE_64536            0x10
3902
3903 #define SLI4_FCOE_RQE_SIZE                      8
3904
3905 /**
3906  * @brief FCOE_RQ_DESTROY
3907  *
3908  * Destroy an FC/FCoE Receive Queue.
3909  */
3910 typedef struct sli4_req_fcoe_rq_destroy_s {
3911         sli4_req_hdr_t  hdr;
3912 #if BYTE_ORDER == LITTLE_ENDIAN
3913         uint32_t        rq_id:16,
3914                         :16;
3915 #else
3916 #error big endian version not defined
3917 #endif
3918 } sli4_req_fcoe_rq_destroy_t;
3919
3920 /**
3921  * @brief FCOE_READ_FCF_TABLE
3922  *
3923  * Retrieve a FCF database (also known as a table) entry created by the SLI Port
3924  * during FIP discovery.
3925  */
3926 typedef struct sli4_req_fcoe_read_fcf_table_s {
3927         sli4_req_hdr_t  hdr;
3928 #if BYTE_ORDER == LITTLE_ENDIAN
3929         uint32_t        fcf_index:16,
3930                         :16;
3931 #else
3932 #error big endian version not defined
3933 #endif
3934 } sli4_req_fcoe_read_fcf_table_t;
3935
3936 /* A FCF index of -1 on the request means return the first valid entry */
3937 #define SLI4_FCOE_FCF_TABLE_FIRST               (UINT16_MAX)
3938
3939 /**
3940  * @brief FCF table entry
3941  *
3942  * This is the information returned by the FCOE_READ_FCF_TABLE command.
3943  */
3944 typedef struct sli4_fcf_entry_s {
3945 #if BYTE_ORDER == LITTLE_ENDIAN
3946         uint32_t        max_receive_size;
3947         uint32_t        fip_keep_alive;
3948         uint32_t        fip_priority;
3949         uint8_t         fcf_mac_address[6];
3950         uint8_t         fcf_available;
3951         uint8_t         mac_address_provider;
3952         uint8_t         fabric_name_id[8];
3953         uint8_t         fc_map[3];
3954         uint8_t         val:1,
3955                         fc:1,
3956                         :5,
3957                         sol:1;
3958         uint32_t        fcf_index:16,
3959                         fcf_state:16;
3960         uint8_t         vlan_bitmap[512];
3961         uint8_t         switch_name[8];
3962 #else
3963 #error big endian version not defined
3964 #endif
3965 } sli4_fcf_entry_t;
3966
3967 /**
3968  * @brief FCOE_READ_FCF_TABLE response.
3969  */
3970 typedef struct sli4_res_fcoe_read_fcf_table_s {
3971         sli4_res_hdr_t  hdr;
3972 #if BYTE_ORDER == LITTLE_ENDIAN
3973         uint32_t        event_tag;
3974         uint32_t        next_index:16,
3975                         :16;
3976         sli4_fcf_entry_t fcf_entry;
3977 #else
3978 #error big endian version not defined
3979 #endif
3980 } sli4_res_fcoe_read_fcf_table_t;
3981
3982 /* A next FCF index of -1 in the response means this is the last valid entry */
3983 #define SLI4_FCOE_FCF_TABLE_LAST                (UINT16_MAX)
3984
3985 /**
3986  * @brief FCOE_POST_HDR_TEMPLATES
3987  */
3988 typedef struct sli4_req_fcoe_post_hdr_templates_s {
3989         sli4_req_hdr_t  hdr;
3990 #if BYTE_ORDER == LITTLE_ENDIAN
3991         uint32_t        rpi_offset:16,
3992                         page_count:16;
3993         sli4_physical_page_descriptor_t page_descriptor[0];
3994 #else
3995 #error big endian version not defined
3996 #endif
3997 } sli4_req_fcoe_post_hdr_templates_t;
3998
3999 #define SLI4_FCOE_HDR_TEMPLATE_SIZE     64
4000
4001 /**
4002  * @brief FCOE_REDISCOVER_FCF
4003  */
4004 typedef struct sli4_req_fcoe_rediscover_fcf_s {
4005         sli4_req_hdr_t  hdr;
4006 #if BYTE_ORDER == LITTLE_ENDIAN
4007         uint32_t        fcf_count:16,
4008                         :16;
4009         uint32_t        rsvd5;
4010         uint16_t        fcf_index[16];
4011 #else
4012 #error big endian version not defined
4013 #endif
4014 } sli4_req_fcoe_rediscover_fcf_t;
4015
4016 /**
4017  * Work Queue Entry (WQE) types.
4018  */
4019 #define SLI4_WQE_ABORT                  0x0f
4020 #define SLI4_WQE_ELS_REQUEST64          0x8a
4021 #define SLI4_WQE_FCP_IBIDIR64           0xac
4022 #define SLI4_WQE_FCP_IREAD64            0x9a
4023 #define SLI4_WQE_FCP_IWRITE64           0x98
4024 #define SLI4_WQE_FCP_ICMND64            0x9c
4025 #define SLI4_WQE_FCP_TRECEIVE64         0xa1
4026 #define SLI4_WQE_FCP_CONT_TRECEIVE64    0xe5
4027 #define SLI4_WQE_FCP_TRSP64             0xa3
4028 #define SLI4_WQE_FCP_TSEND64            0x9f
4029 #define SLI4_WQE_GEN_REQUEST64          0xc2
4030 #define SLI4_WQE_SEND_FRAME             0xe1
4031 #define SLI4_WQE_XMIT_BCAST64           0X84
4032 #define SLI4_WQE_XMIT_BLS_RSP           0x97
4033 #define SLI4_WQE_ELS_RSP64              0x95
4034 #define SLI4_WQE_XMIT_SEQUENCE64        0x82
4035 #define SLI4_WQE_REQUEUE_XRI            0x93
4036
4037 /**
4038  * WQE command types.
4039  */
4040 #define SLI4_CMD_FCP_IREAD64_WQE        0x00
4041 #define SLI4_CMD_FCP_ICMND64_WQE        0x00
4042 #define SLI4_CMD_FCP_IWRITE64_WQE       0x01
4043 #define SLI4_CMD_FCP_TRECEIVE64_WQE     0x02
4044 #define SLI4_CMD_FCP_TRSP64_WQE         0x03
4045 #define SLI4_CMD_FCP_TSEND64_WQE        0x07
4046 #define SLI4_CMD_GEN_REQUEST64_WQE      0x08
4047 #define SLI4_CMD_XMIT_BCAST64_WQE       0x08
4048 #define SLI4_CMD_XMIT_BLS_RSP64_WQE     0x08
4049 #define SLI4_CMD_ABORT_WQE              0x08
4050 #define SLI4_CMD_XMIT_SEQUENCE64_WQE    0x08
4051 #define SLI4_CMD_REQUEUE_XRI_WQE        0x0A
4052 #define SLI4_CMD_SEND_FRAME_WQE         0x0a
4053
4054 #define SLI4_WQE_SIZE                   0x05
4055 #define SLI4_WQE_EXT_SIZE               0x06
4056
4057 #define SLI4_WQE_BYTES                  (16 * sizeof(uint32_t))
4058 #define SLI4_WQE_EXT_BYTES              (32 * sizeof(uint32_t))
4059
4060 /* Mask for ccp (CS_CTL) */
4061 #define SLI4_MASK_CCP   0xfe /* Upper 7 bits of CS_CTL is priority */
4062
4063 /**
4064  * @brief Generic WQE
4065  */
4066 typedef struct sli4_generic_wqe_s {
4067 #if BYTE_ORDER == LITTLE_ENDIAN
4068         uint32_t        cmd_spec0_5[6];
4069         uint32_t        xri_tag:16,
4070                         context_tag:16;
4071         uint32_t        :2,
4072                         ct:2,
4073                         :4,
4074                         command:8,
4075                         class:3,
4076                         :1,
4077                         pu:2,
4078                         :2,
4079                         timer:8;
4080         uint32_t        abort_tag;
4081         uint32_t        request_tag:16,
4082                         :16;
4083         uint32_t        ebde_cnt:4,
4084                         :3,
4085                         len_loc:2,
4086                         qosd:1,
4087                         :1,
4088                         xbl:1,
4089                         hlm:1,
4090                         iod:1,
4091                         dbde:1,
4092                         wqes:1,
4093                         pri:3,
4094                         pv:1,
4095                         eat:1,
4096                         xc:1,
4097                         :1,
4098                         ccpe:1,
4099                         ccp:8;
4100         uint32_t        cmd_type:4,
4101                         :3,
4102                         wqec:1,
4103                         :8,
4104                         cq_id:16;
4105 #else
4106 #error big endian version not defined
4107 #endif
4108 } sli4_generic_wqe_t;
4109
4110 /**
4111  * @brief WQE used to abort exchanges.
4112  */
4113 typedef struct sli4_abort_wqe_s {
4114 #if BYTE_ORDER == LITTLE_ENDIAN
4115         uint32_t        rsvd0;
4116         uint32_t        rsvd1;
4117         uint32_t        ext_t_tag;
4118         uint32_t        ia:1,
4119                         ir:1,
4120                         :6,
4121                         criteria:8,
4122                         :16;
4123         uint32_t        ext_t_mask;
4124         uint32_t        t_mask;
4125         uint32_t        xri_tag:16,
4126                         context_tag:16;
4127         uint32_t        :2,
4128                         ct:2,
4129                         :4,
4130                         command:8,
4131                         class:3,
4132                         :1,
4133                         pu:2,
4134                         :2,
4135                         timer:8;
4136         uint32_t        t_tag;
4137         uint32_t        request_tag:16,
4138                         :16;
4139         uint32_t        ebde_cnt:4,
4140                         :3,
4141                         len_loc:2,
4142                         qosd:1,
4143                         :1,
4144                         xbl:1,
4145                         :1,
4146                         iod:1,
4147                         dbde:1,
4148                         wqes:1,
4149                         pri:3,
4150                         pv:1,
4151                         eat:1,
4152                         xc:1,
4153                         :1,
4154                         ccpe:1,
4155                         ccp:8;
4156         uint32_t        cmd_type:4,
4157                         :3,
4158                         wqec:1,
4159                         :8,
4160                         cq_id:16;
4161 #else
4162 #error big endian version not defined
4163 #endif
4164 } sli4_abort_wqe_t;
4165
4166 #define SLI4_ABORT_CRITERIA_XRI_TAG             0x01
4167 #define SLI4_ABORT_CRITERIA_ABORT_TAG           0x02
4168 #define SLI4_ABORT_CRITERIA_REQUEST_TAG         0x03
4169 #define SLI4_ABORT_CRITERIA_EXT_ABORT_TAG       0x04
4170
4171 typedef enum {
4172         SLI_ABORT_XRI,
4173         SLI_ABORT_ABORT_ID,
4174         SLI_ABORT_REQUEST_ID,
4175         SLI_ABORT_MAX,          /* must be last */
4176 } sli4_abort_type_e;
4177
4178 /**
4179  * @brief WQE used to create an ELS request.
4180  */
4181 typedef struct sli4_els_request64_wqe_s {
4182         sli4_bde_t      els_request_payload;
4183 #if BYTE_ORDER == LITTLE_ENDIAN
4184         uint32_t        els_request_payload_length;
4185         uint32_t        sid:24,
4186                         sp:1,
4187                         :7;
4188         uint32_t        remote_id:24,
4189                         :8;
4190         uint32_t        xri_tag:16,
4191                         context_tag:16;
4192         uint32_t        :2,
4193                         ct:2,
4194                         :4,
4195                         command:8,
4196                         class:3,
4197                         ar:1,
4198                         pu:2,
4199                         :2,
4200                         timer:8;
4201         uint32_t        abort_tag;
4202         uint32_t        request_tag:16,
4203                         temporary_rpi:16;
4204         uint32_t        ebde_cnt:4,
4205                         :3,
4206                         len_loc:2,
4207                         qosd:1,
4208                         :1,
4209                         xbl:1,
4210                         hlm:1,
4211                         iod:1,
4212                         dbde:1,
4213                         wqes:1,
4214                         pri:3,
4215                         pv:1,
4216                         eat:1,
4217                         xc:1,
4218                         :1,
4219                         ccpe:1,
4220                         ccp:8;
4221         uint32_t        cmd_type:4,
4222                         els_id:3,
4223                         wqec:1,
4224                         :8,
4225                         cq_id:16;
4226         sli4_bde_t      els_response_payload_bde;
4227         uint32_t        max_response_payload_length;
4228 #else
4229 #error big endian version not defined
4230 #endif
4231 } sli4_els_request64_wqe_t;
4232
4233 #define SLI4_ELS_REQUEST64_CONTEXT_RPI  0x0
4234 #define SLI4_ELS_REQUEST64_CONTEXT_VPI  0x1
4235 #define SLI4_ELS_REQUEST64_CONTEXT_VFI  0x2
4236 #define SLI4_ELS_REQUEST64_CONTEXT_FCFI 0x3
4237
4238 #define SLI4_ELS_REQUEST64_CLASS_2      0x1
4239 #define SLI4_ELS_REQUEST64_CLASS_3      0x2
4240
4241 #define SLI4_ELS_REQUEST64_DIR_WRITE    0x0
4242 #define SLI4_ELS_REQUEST64_DIR_READ     0x1
4243
4244 #define SLI4_ELS_REQUEST64_OTHER        0x0
4245 #define SLI4_ELS_REQUEST64_LOGO         0x1
4246 #define SLI4_ELS_REQUEST64_FDISC        0x2
4247 #define SLI4_ELS_REQUEST64_FLOGIN       0x3
4248 #define SLI4_ELS_REQUEST64_PLOGI        0x4
4249
4250 #define SLI4_ELS_REQUEST64_CMD_GEN              0x08
4251 #define SLI4_ELS_REQUEST64_CMD_NON_FABRIC       0x0c
4252 #define SLI4_ELS_REQUEST64_CMD_FABRIC           0x0d
4253
4254 /**
4255  * @brief WQE used to create an FCP initiator no data command.
4256  */
4257 typedef struct sli4_fcp_icmnd64_wqe_s {
4258         sli4_bde_t      bde;
4259 #if BYTE_ORDER == LITTLE_ENDIAN
4260         uint32_t        payload_offset_length:16,
4261                         fcp_cmd_buffer_length:16;
4262         uint32_t        rsvd4;
4263         uint32_t        remote_n_port_id:24,
4264                         :8;
4265         uint32_t        xri_tag:16,
4266                         context_tag:16;
4267         uint32_t        dif:2,
4268                         ct:2,
4269                         bs:3,
4270                         :1,
4271                         command:8,
4272                         class:3,
4273                         :1,
4274                         pu:2,
4275                         erp:1,
4276                         lnk:1,
4277                         timer:8;
4278         uint32_t        abort_tag;
4279         uint32_t        request_tag:16,
4280                         :16;
4281         uint32_t        ebde_cnt:4,
4282                         :3,
4283                         len_loc:2,
4284                         qosd:1,
4285                         :1,
4286                         xbl:1,
4287                         hlm:1,
4288                         iod:1,
4289                         dbde:1,
4290                         wqes:1,
4291                         pri:3,
4292                         pv:1,
4293                         eat:1,
4294                         xc:1,
4295                         :1,
4296                         ccpe:1,
4297                         ccp:8;
4298         uint32_t        cmd_type:4,
4299                         :3,
4300                         wqec:1,
4301                         :8,
4302                         cq_id:16;
4303         uint32_t        rsvd12;
4304         uint32_t        rsvd13;
4305         uint32_t        rsvd14;
4306         uint32_t        rsvd15;
4307 #else
4308 #error big endian version not defined
4309 #endif
4310 } sli4_fcp_icmnd64_wqe_t;
4311
4312 /**
4313  * @brief WQE used to create an FCP initiator read.
4314  */
4315 typedef struct sli4_fcp_iread64_wqe_s {
4316         sli4_bde_t      bde;
4317 #if BYTE_ORDER == LITTLE_ENDIAN
4318         uint32_t        payload_offset_length:16,
4319                         fcp_cmd_buffer_length:16;
4320         uint32_t        total_transfer_length;
4321         uint32_t        remote_n_port_id:24,
4322                         :8;
4323         uint32_t        xri_tag:16,
4324                         context_tag:16;
4325         uint32_t        dif:2,
4326                         ct:2,
4327                         bs:3,
4328                         :1,
4329                         command:8,
4330                         class:3,
4331                         :1,
4332                         pu:2,
4333                         erp:1,
4334                         lnk:1,
4335                         timer:8;
4336         uint32_t        abort_tag;
4337         uint32_t        request_tag:16,
4338                         :16;
4339         uint32_t        ebde_cnt:4,
4340                         :3,
4341                         len_loc:2,
4342                         qosd:1,
4343                         :1,
4344                         xbl:1,
4345                         hlm:1,
4346                         iod:1,
4347                         dbde:1,
4348                         wqes:1,
4349                         pri:3,
4350                         pv:1,
4351                         eat:1,
4352                         xc:1,
4353                         :1,
4354                         ccpe:1,
4355                         ccp:8;
4356         uint32_t        cmd_type:4,
4357                         :3,
4358                         wqec:1,
4359                         :8,
4360                         cq_id:16;
4361         uint32_t        rsvd12;
4362 #else
4363 #error big endian version not defined
4364 #endif
4365         sli4_bde_t      first_data_bde; /* reserved if performance hints disabled */
4366 } sli4_fcp_iread64_wqe_t;
4367
4368 /**
4369  * @brief WQE used to create an FCP initiator write.
4370  */
4371 typedef struct sli4_fcp_iwrite64_wqe_s {
4372         sli4_bde_t      bde;
4373 #if BYTE_ORDER == LITTLE_ENDIAN
4374         uint32_t        payload_offset_length:16,
4375                         fcp_cmd_buffer_length:16;
4376         uint32_t        total_transfer_length;
4377         uint32_t        initial_transfer_length;
4378         uint32_t        xri_tag:16,
4379                         context_tag:16;
4380         uint32_t        dif:2,
4381                         ct:2,
4382                         bs:3,
4383                         :1,
4384                         command:8,
4385                         class:3,
4386                         :1,
4387                         pu:2,
4388                         erp:1,
4389                         lnk:1,
4390                         timer:8;
4391         uint32_t        abort_tag;
4392         uint32_t        request_tag:16,
4393                         :16;
4394         uint32_t        ebde_cnt:4,
4395                         :3,
4396                         len_loc:2,
4397                         qosd:1,
4398                         :1,
4399                         xbl:1,
4400                         hlm:1,
4401                         iod:1,
4402                         dbde:1,
4403                         wqes:1,
4404                         pri:3,
4405                         pv:1,
4406                         eat:1,
4407                         xc:1,
4408                         :1,
4409                         ccpe:1,
4410                         ccp:8;
4411         uint32_t        cmd_type:4,
4412                         :3,
4413                         wqec:1,
4414                         :8,
4415                         cq_id:16;
4416         uint32_t        remote_n_port_id:24,
4417                         :8;
4418 #else
4419 #error big endian version not defined
4420 #endif
4421         sli4_bde_t      first_data_bde;
4422 } sli4_fcp_iwrite64_wqe_t;
4423
4424 typedef struct sli4_fcp_128byte_wqe_s {
4425         uint32_t dw[32];        
4426 } sli4_fcp_128byte_wqe_t;
4427
4428 /**
4429  * @brief WQE used to create an FCP target receive, and FCP target
4430  * receive continue.
4431  */
4432 typedef struct sli4_fcp_treceive64_wqe_s {
4433         sli4_bde_t      bde;
4434 #if BYTE_ORDER == LITTLE_ENDIAN
4435         uint32_t        payload_offset_length;
4436         uint32_t        relative_offset;
4437         /**
4438          * DWord 5 can either be the task retry identifier (HLM=0) or
4439          * the remote N_Port ID (HLM=1), or if implementing the Skyhawk
4440          * T10-PI workaround, the secondary xri tag
4441          */
4442         union {
4443                 uint32_t        sec_xri_tag:16,
4444                                 :16;
4445                 uint32_t        dword;
4446         } dword5;
4447         uint32_t        xri_tag:16,
4448                         context_tag:16;
4449         uint32_t        dif:2,
4450                         ct:2,
4451                         bs:3,
4452                         :1,
4453                         command:8,
4454                         class:3,
4455                         ar:1,
4456                         pu:2,
4457                         conf:1,
4458                         lnk:1,
4459                         timer:8;
4460         uint32_t        abort_tag;
4461         uint32_t        request_tag:16,
4462                         remote_xid:16;
4463         uint32_t        ebde_cnt:4,
4464                         :1,
4465                         app_id_valid:1,
4466                         :1,
4467                         len_loc:2,
4468                         qosd:1,
4469                         wchn:1,
4470                         xbl:1,
4471                         hlm:1,
4472                         iod:1,
4473                         dbde:1,
4474                         wqes:1,
4475                         pri:3,
4476                         pv:1,
4477                         eat:1,
4478                         xc:1,
4479                         sr:1,
4480                         ccpe:1,
4481                         ccp:8;
4482         uint32_t        cmd_type:4,
4483                         :3,
4484                         wqec:1,
4485                         :8,
4486                         cq_id:16;
4487         uint32_t        fcp_data_receive_length;
4488
4489 #else
4490 #error big endian version not defined
4491 #endif
4492         sli4_bde_t      first_data_bde; /* For performance hints */
4493
4494 } sli4_fcp_treceive64_wqe_t;
4495
4496 /**
4497  * @brief WQE used to create an FCP target response.
4498  */
4499 typedef struct sli4_fcp_trsp64_wqe_s {
4500         sli4_bde_t      bde;
4501 #if BYTE_ORDER == LITTLE_ENDIAN
4502         uint32_t        fcp_response_length;
4503         uint32_t        rsvd4;
4504         /**
4505          * DWord 5 can either be the task retry identifier (HLM=0) or
4506          * the remote N_Port ID (HLM=1)
4507          */
4508         uint32_t        dword5;
4509         uint32_t        xri_tag:16,
4510                         rpi:16;
4511         uint32_t        :2,
4512                         ct:2,
4513                         dnrx:1,
4514                         :3,
4515                         command:8,
4516                         class:3,
4517                         ag:1,
4518                         pu:2,
4519                         conf:1,
4520                         lnk:1,
4521                         timer:8;
4522         uint32_t        abort_tag;
4523         uint32_t        request_tag:16,
4524                         remote_xid:16;
4525         uint32_t        ebde_cnt:4,
4526                         :1,
4527                         app_id_valid:1,
4528                         :1,
4529                         len_loc:2,
4530                         qosd:1,
4531                         wchn:1,
4532                         xbl:1,
4533                         hlm:1,
4534                         iod:1,
4535                         dbde:1,
4536                         wqes:1,
4537                         pri:3,
4538                         pv:1,
4539                         eat:1,
4540                         xc:1,
4541                         sr:1,
4542                         ccpe:1,
4543                         ccp:8;
4544         uint32_t        cmd_type:4,
4545                         :3,
4546                         wqec:1,
4547                         :8,
4548                         cq_id:16;
4549         uint32_t        rsvd12;
4550         uint32_t        rsvd13;
4551         uint32_t        rsvd14;
4552         uint32_t        rsvd15;
4553 #else
4554 #error big endian version not defined
4555 #endif
4556 } sli4_fcp_trsp64_wqe_t;
4557
4558 /**
4559  * @brief WQE used to create an FCP target send (DATA IN).
4560  */
4561 typedef struct sli4_fcp_tsend64_wqe_s {
4562         sli4_bde_t      bde;
4563 #if BYTE_ORDER == LITTLE_ENDIAN
4564         uint32_t        payload_offset_length;
4565         uint32_t        relative_offset;
4566         /**
4567          * DWord 5 can either be the task retry identifier (HLM=0) or
4568          * the remote N_Port ID (HLM=1)
4569          */
4570         uint32_t        dword5;
4571         uint32_t        xri_tag:16,
4572                         rpi:16;
4573         uint32_t        dif:2,
4574                         ct:2,
4575                         bs:3,
4576                         :1,
4577                         command:8,
4578                         class:3,
4579                         ar:1,
4580                         pu:2,
4581                         conf:1,
4582                         lnk:1,
4583                         timer:8;
4584         uint32_t        abort_tag;
4585         uint32_t        request_tag:16,
4586                         remote_xid:16;
4587         uint32_t        ebde_cnt:4,
4588                         :1,
4589                         app_id_valid:1,
4590                         :1,
4591                         len_loc:2,
4592                         qosd:1,
4593                         wchn:1,
4594                         xbl:1,
4595                         hlm:1,
4596                         iod:1,
4597                         dbde:1,
4598                         wqes:1,
4599                         pri:3,
4600                         pv:1,
4601                         eat:1,
4602                         xc:1,
4603                         sr:1,
4604                         ccpe:1,
4605                         ccp:8;
4606         uint32_t        cmd_type:4,
4607                         :3,
4608                         wqec:1,
4609                         :8,
4610                         cq_id:16;
4611         uint32_t        fcp_data_transmit_length;
4612
4613 #else
4614 #error big endian version not defined
4615 #endif
4616         sli4_bde_t      first_data_bde; /* For performance hints */
4617 } sli4_fcp_tsend64_wqe_t;
4618
4619 #define SLI4_IO_CONTINUATION            BIT(0)  /** The XRI associated with this IO is already active */
4620 #define SLI4_IO_AUTO_GOOD_RESPONSE      BIT(1)  /** Automatically generate a good RSP frame */
4621 #define SLI4_IO_NO_ABORT                BIT(2)
4622 #define SLI4_IO_DNRX                    BIT(3)  /** Set the DNRX bit because no auto xref rdy buffer is posted */
4623
4624 /* WQE DIF field contents */
4625 #define SLI4_DIF_DISABLED               0
4626 #define SLI4_DIF_PASS_THROUGH           1
4627 #define SLI4_DIF_STRIP                  2
4628 #define SLI4_DIF_INSERT                 3
4629
4630 /**
4631  * @brief WQE used to create a general request.
4632  */
4633 typedef struct sli4_gen_request64_wqe_s {
4634         sli4_bde_t      bde;
4635 #if BYTE_ORDER == LITTLE_ENDIAN
4636         uint32_t        request_payload_length;
4637         uint32_t        relative_offset;
4638         uint32_t        :8,
4639                         df_ctl:8,
4640                         type:8,
4641                         r_ctl:8;
4642         uint32_t        xri_tag:16,
4643                         context_tag:16;
4644         uint32_t        :2,
4645                         ct:2,
4646                         :4,
4647                         command:8,
4648                         class:3,
4649                         :1,
4650                         pu:2,
4651                         :2,
4652                         timer:8;
4653         uint32_t        abort_tag;
4654         uint32_t        request_tag:16,
4655                         :16;
4656         uint32_t        ebde_cnt:4,
4657                         :3,
4658                         len_loc:2,
4659                         qosd:1,
4660                         :1,
4661                         xbl:1,
4662                         hlm:1,
4663                         iod:1,
4664                         dbde:1,
4665                         wqes:1,
4666                         pri:3,
4667                         pv:1,
4668                         eat:1,
4669                         xc:1,
4670                         :1,
4671                         ccpe:1,
4672                         ccp:8;
4673         uint32_t        cmd_type:4,
4674                         :3,
4675                         wqec:1,
4676                         :8,
4677                         cq_id:16;
4678         uint32_t        remote_n_port_id:24,
4679                         :8;
4680         uint32_t        rsvd13;
4681         uint32_t        rsvd14;
4682         uint32_t        max_response_payload_length;
4683 #else
4684 #error big endian version not defined
4685 #endif
4686 } sli4_gen_request64_wqe_t;
4687
4688 /**
4689  * @brief WQE used to create a send frame request.
4690  */
4691 typedef struct sli4_send_frame_wqe_s {
4692         sli4_bde_t      bde;
4693 #if BYTE_ORDER == LITTLE_ENDIAN
4694         uint32_t        frame_length;
4695         uint32_t        fc_header_0_1[2];
4696         uint32_t        xri_tag:16,
4697                         context_tag:16;
4698         uint32_t        :2,
4699                         ct:2,
4700                         :4,
4701                         command:8,
4702                         class:3,
4703                         :1,
4704                         pu:2,
4705                         :2,
4706                         timer:8;
4707         uint32_t        abort_tag;
4708         uint32_t        request_tag:16,
4709                         eof:8,
4710                         sof:8;
4711         uint32_t        ebde_cnt:4,
4712                         :3,
4713                         lenloc:2,
4714                         qosd:1,
4715                         wchn:1,
4716                         xbl:1,
4717                         hlm:1,
4718                         iod:1,
4719                         dbde:1,
4720                         wqes:1,
4721                         pri:3,
4722                         pv:1,
4723                         eat:1,
4724                         xc:1,
4725                         :1,
4726                         ccpe:1,
4727                         ccp:8;
4728         uint32_t        cmd_type:4,
4729                         :3,
4730                         wqec:1,
4731                         :8,
4732                         cq_id:16;
4733         uint32_t        fc_header_2_5[4];
4734 #else
4735 #error big endian version not defined
4736 #endif
4737 } sli4_send_frame_wqe_t;
4738
4739 /**
4740  * @brief WQE used to create a transmit sequence.
4741  */
4742 typedef struct sli4_xmit_sequence64_wqe_s {
4743         sli4_bde_t      bde;
4744 #if BYTE_ORDER == LITTLE_ENDIAN
4745         uint32_t        remote_n_port_id:24,
4746                         :8;
4747         uint32_t        relative_offset;
4748         uint32_t        :2,
4749                         si:1,
4750                         ft:1,
4751                         :2,
4752                         xo:1,
4753                         ls:1,
4754                         df_ctl:8,
4755                         type:8,
4756                         r_ctl:8;
4757         uint32_t        xri_tag:16,
4758                         context_tag:16;
4759         uint32_t        dif:2,
4760                         ct:2,
4761                         bs:3,
4762                         :1,
4763                         command:8,
4764                         class:3,
4765                         :1,
4766                         pu:2,
4767                         :2,
4768                         timer:8;
4769         uint32_t        abort_tag;
4770         uint32_t        request_tag:16,
4771                         remote_xid:16;
4772         uint32_t        ebde_cnt:4,
4773                         :3,
4774                         len_loc:2,
4775                         qosd:1,
4776                         :1,
4777                         xbl:1,
4778                         hlm:1,
4779                         iod:1,
4780                         dbde:1,
4781                         wqes:1,
4782                         pri:3,
4783                         pv:1,
4784                         eat:1,
4785                         xc:1,
4786                         sr:1,
4787                         ccpe:1,
4788                         ccp:8;
4789         uint32_t        cmd_type:4,
4790                         :3,
4791                         wqec:1,
4792                         :8,
4793                         cq_id:16;
4794         uint32_t        sequence_payload_len;
4795         uint32_t        rsvd13;
4796         uint32_t        rsvd14;
4797         uint32_t        rsvd15;
4798 #else
4799 #error big endian version not defined
4800 #endif
4801 } sli4_xmit_sequence64_wqe_t;
4802
4803 /**
4804  * @brief WQE used unblock the specified XRI and to release it to the SLI Port's free pool.
4805  */
4806 typedef struct sli4_requeue_xri_wqe_s {
4807         uint32_t        rsvd0;
4808         uint32_t        rsvd1;
4809         uint32_t        rsvd2;
4810         uint32_t        rsvd3;
4811         uint32_t        rsvd4;
4812         uint32_t        rsvd5;
4813 #if BYTE_ORDER == LITTLE_ENDIAN
4814         uint32_t        xri_tag:16,
4815                         context_tag:16;
4816         uint32_t        :2,
4817                         ct:2,
4818                         :4,
4819                         command:8,
4820                         class:3,
4821                         :1,
4822                         pu:2,
4823                         :2,
4824                         timer:8;
4825         uint32_t        rsvd8;
4826         uint32_t        request_tag:16,
4827                         :16;
4828         uint32_t        ebde_cnt:4,
4829                         :3,
4830                         len_loc:2,
4831                         qosd:1,
4832                         wchn:1,
4833                         xbl:1,
4834                         hlm:1,
4835                         iod:1,
4836                         dbde:1,
4837                         wqes:1,
4838                         pri:3,
4839                         pv:1,
4840                         eat:1,
4841                         xc:1,
4842                         :1,
4843                         ccpe:1,
4844                         ccp:8;
4845         uint32_t        cmd_type:4,
4846                         :3,
4847                         wqec:1,
4848                         :8,
4849                         cq_id:16;
4850         uint32_t        rsvd12;
4851         uint32_t        rsvd13;
4852         uint32_t        rsvd14;
4853         uint32_t        rsvd15;
4854 #else
4855 #error big endian version not defined
4856 #endif
4857 } sli4_requeue_xri_wqe_t;
4858
4859 /**
4860  * @brief WQE used to send a single frame sequence to broadcast address
4861  */
4862 typedef struct sli4_xmit_bcast64_wqe_s {
4863         sli4_bde_t      sequence_payload;
4864 #if BYTE_ORDER == LITTLE_ENDIAN
4865         uint32_t        sequence_payload_length;
4866         uint32_t        rsvd4;
4867         uint32_t        :8,
4868                         df_ctl:8,
4869                         type:8,
4870                         r_ctl:8;
4871         uint32_t        xri_tag:16,
4872                         context_tag:16;
4873         uint32_t        :2,
4874                         ct:2,
4875                         :4,
4876                         command:8,
4877                         class:3,
4878                         :1,
4879                         pu:2,
4880                         :2,
4881                         timer:8;
4882         uint32_t        abort_tag;
4883         uint32_t        request_tag:16,
4884                         temporary_rpi:16;
4885         uint32_t        ebde_cnt:4,
4886                         :3,
4887                         len_loc:2,
4888                         qosd:1,
4889                         :1,
4890                         xbl:1,
4891                         hlm:1,
4892                         iod:1,
4893                         dbde:1,
4894                         wqes:1,
4895                         pri:3,
4896                         pv:1,
4897                         eat:1,
4898                         xc:1,
4899                         :1,
4900                         ccpe:1,
4901                         ccp:8;
4902         uint32_t        cmd_type:4,
4903                         :3,
4904                         wqec:1,
4905                         :8,
4906                         cq_id:16;
4907         uint32_t        rsvd12;
4908         uint32_t        rsvd13;
4909         uint32_t        rsvd14;
4910         uint32_t        rsvd15;
4911 #else
4912 #error big endian version not defined
4913 #endif
4914 } sli4_xmit_bcast64_wqe_t;
4915
4916 /**
4917  * @brief WQE used to create a BLS response.
4918  */
4919 typedef struct sli4_xmit_bls_rsp_wqe_s {
4920 #if BYTE_ORDER == LITTLE_ENDIAN
4921         uint32_t        payload_word0;
4922         uint32_t        rx_id:16,
4923                         ox_id:16;
4924         uint32_t        high_seq_cnt:16,
4925                         low_seq_cnt:16;
4926         uint32_t        rsvd3;
4927         uint32_t        local_n_port_id:24,
4928                         :8;
4929         uint32_t        remote_id:24,
4930                         :6,
4931                         ar:1,
4932                         xo:1;
4933         uint32_t        xri_tag:16,
4934                         context_tag:16;
4935         uint32_t        :2,
4936                         ct:2,
4937                         :4,
4938                         command:8,
4939                         class:3,
4940                         :1,
4941                         pu:2,
4942                         :2,
4943                         timer:8;
4944         uint32_t        abort_tag;
4945         uint32_t        request_tag:16,
4946                         :16;
4947         uint32_t        ebde_cnt:4,
4948                         :3,
4949                         len_loc:2,
4950                         qosd:1,
4951                         :1,
4952                         xbl:1,
4953                         hlm:1,
4954                         iod:1,
4955                         dbde:1,
4956                         wqes:1,
4957                         pri:3,
4958                         pv:1,
4959                         eat:1,
4960                         xc:1,
4961                         :1,
4962                         ccpe:1,
4963                         ccp:8;
4964         uint32_t        cmd_type:4,
4965                         :3,
4966                         wqec:1,
4967                         :8,
4968                         cq_id:16;
4969         uint32_t        temporary_rpi:16,
4970                         :16;
4971         uint32_t        rsvd13;
4972         uint32_t        rsvd14;
4973         uint32_t        rsvd15;
4974 #else
4975 #error big endian version not defined
4976 #endif
4977 } sli4_xmit_bls_rsp_wqe_t;
4978
4979 typedef enum {
4980         SLI_BLS_ACC,
4981         SLI_BLS_RJT,
4982         SLI_BLS_MAX
4983 } sli_bls_type_e;
4984
4985 typedef struct sli_bls_payload_s {
4986         sli_bls_type_e  type;
4987         uint16_t        ox_id;
4988         uint16_t        rx_id;
4989         union {
4990                 struct {
4991                         uint32_t        seq_id_validity:8,
4992                                         seq_id_last:8,
4993                                         :16;
4994                         uint16_t        ox_id;
4995                         uint16_t        rx_id;
4996                         uint16_t        low_seq_cnt;
4997                         uint16_t        high_seq_cnt;
4998                 } acc;
4999                 struct {
5000                         uint32_t        vendor_unique:8,
5001                                         reason_explanation:8,
5002                                         reason_code:8,
5003                                         :8;
5004                 } rjt;
5005         } u;
5006 } sli_bls_payload_t;
5007
5008 /**
5009  * @brief WQE used to create an ELS response.
5010  */
5011 typedef struct sli4_xmit_els_rsp64_wqe_s {
5012         sli4_bde_t      els_response_payload;
5013 #if BYTE_ORDER == LITTLE_ENDIAN
5014         uint32_t        els_response_payload_length;
5015         uint32_t        s_id:24,
5016                         sp:1,
5017                         :7;
5018         uint32_t        remote_id:24,
5019                         :8;
5020         uint32_t        xri_tag:16,
5021                         context_tag:16;
5022         uint32_t        :2,
5023                         ct:2,
5024                         :4,
5025                         command:8,
5026                         class:3,
5027                         :1,
5028                         pu:2,
5029                         :2,
5030                         timer:8;
5031         uint32_t        abort_tag;
5032         uint32_t        request_tag:16,
5033                         ox_id:16;
5034         uint32_t        ebde_cnt:4,
5035                         :3,
5036                         len_loc:2,
5037                         qosd:1,
5038                         :1,
5039                         xbl:1,
5040                         hlm:1,
5041                         iod:1,
5042                         dbde:1,
5043                         wqes:1,
5044                         pri:3,
5045                         pv:1,
5046                         eat:1,
5047                         xc:1,
5048                         :1,
5049                         ccpe:1,
5050                         ccp:8;
5051         uint32_t        cmd_type:4,
5052                         :3,
5053                         wqec:1,
5054                         :8,
5055                         cq_id:16;
5056         uint32_t        temporary_rpi:16,
5057                         :16;
5058         uint32_t        rsvd13;
5059         uint32_t        rsvd14;
5060         uint32_t        rsvd15;
5061 #else
5062 #error big endian version not defined
5063 #endif
5064 } sli4_xmit_els_rsp64_wqe_t;
5065
5066 /**
5067  * @brief Asynchronouse Event: Link State ACQE.
5068  */
5069 typedef struct sli4_link_state_s {
5070 #if BYTE_ORDER == LITTLE_ENDIAN
5071         uint32_t        link_number:6,
5072                         link_type:2,
5073                         port_link_status:8,
5074                         port_duplex:8,
5075                         port_speed:8;
5076         uint32_t        port_fault:8,
5077                         :8,
5078                         logical_link_speed:16;
5079         uint32_t        event_tag;
5080         uint32_t        :8,
5081                         event_code:8,
5082                         event_type:8,   /** values are protocol specific */
5083                         :6,
5084                         ae:1,           /** async event - this is an ACQE */
5085                         val:1;          /** valid - contents of CQE are valid */
5086 #else
5087 #error big endian version not defined
5088 #endif
5089 } sli4_link_state_t;
5090
5091 #define SLI4_LINK_ATTN_TYPE_LINK_UP             0x01
5092 #define SLI4_LINK_ATTN_TYPE_LINK_DOWN           0x02
5093 #define SLI4_LINK_ATTN_TYPE_NO_HARD_ALPA        0x03
5094
5095 #define SLI4_LINK_ATTN_P2P                      0x01
5096 #define SLI4_LINK_ATTN_FC_AL                    0x02
5097 #define SLI4_LINK_ATTN_INTERNAL_LOOPBACK        0x03
5098 #define SLI4_LINK_ATTN_SERDES_LOOPBACK          0x04
5099
5100 #define SLI4_LINK_ATTN_1G                       0x01
5101 #define SLI4_LINK_ATTN_2G                       0x02
5102 #define SLI4_LINK_ATTN_4G                       0x04
5103 #define SLI4_LINK_ATTN_8G                       0x08
5104 #define SLI4_LINK_ATTN_10G                      0x0a
5105 #define SLI4_LINK_ATTN_16G                      0x10
5106
5107 #define SLI4_LINK_TYPE_ETHERNET                 0x0
5108 #define SLI4_LINK_TYPE_FC                       0x1
5109
5110 /**
5111  * @brief Asynchronouse Event: FC Link Attention Event.
5112  */
5113 typedef struct sli4_link_attention_s {
5114 #if BYTE_ORDER == LITTLE_ENDIAN
5115         uint32_t        link_number:8,
5116                         attn_type:8,
5117                         topology:8,
5118                         port_speed:8;
5119         uint32_t        port_fault:8,
5120                         shared_link_status:8,
5121                         logical_link_speed:16;
5122         uint32_t        event_tag;
5123         uint32_t        :8,
5124                         event_code:8,
5125                         event_type:8,   /** values are protocol specific */
5126                         :6,
5127                         ae:1,           /** async event - this is an ACQE */
5128                         val:1;          /** valid - contents of CQE are valid */
5129 #else
5130 #error big endian version not defined
5131 #endif
5132 } sli4_link_attention_t;
5133
5134 /**
5135  * @brief FC/FCoE event types.
5136  */
5137 #define SLI4_LINK_STATE_PHYSICAL                0x00
5138 #define SLI4_LINK_STATE_LOGICAL                 0x01
5139
5140 #define SLI4_FCOE_FIP_FCF_DISCOVERED            0x01
5141 #define SLI4_FCOE_FIP_FCF_TABLE_FULL            0x02
5142 #define SLI4_FCOE_FIP_FCF_DEAD                  0x03
5143 #define SLI4_FCOE_FIP_FCF_CLEAR_VLINK           0x04
5144 #define SLI4_FCOE_FIP_FCF_MODIFIED              0x05
5145
5146 #define SLI4_GRP5_QOS_SPEED                     0x01
5147
5148 #define SLI4_FC_EVENT_LINK_ATTENTION            0x01
5149 #define SLI4_FC_EVENT_SHARED_LINK_ATTENTION     0x02
5150
5151 #define SLI4_PORT_SPEED_NO_LINK                 0x0
5152 #define SLI4_PORT_SPEED_10_MBPS                 0x1
5153 #define SLI4_PORT_SPEED_100_MBPS                0x2
5154 #define SLI4_PORT_SPEED_1_GBPS                  0x3
5155 #define SLI4_PORT_SPEED_10_GBPS                 0x4
5156
5157 #define SLI4_PORT_DUPLEX_NONE                   0x0
5158 #define SLI4_PORT_DUPLEX_HWF                    0x1
5159 #define SLI4_PORT_DUPLEX_FULL                   0x2
5160
5161 #define SLI4_PORT_LINK_STATUS_PHYSICAL_DOWN     0x0
5162 #define SLI4_PORT_LINK_STATUS_PHYSICAL_UP       0x1
5163 #define SLI4_PORT_LINK_STATUS_LOGICAL_DOWN      0x2
5164 #define SLI4_PORT_LINK_STATUS_LOGICAL_UP        0x3
5165
5166 /**
5167  * @brief Asynchronouse Event: FCoE/FIP ACQE.
5168  */
5169 typedef struct sli4_fcoe_fip_s {
5170 #if BYTE_ORDER == LITTLE_ENDIAN
5171         uint32_t        event_information;
5172         uint32_t        fcf_count:16,
5173                         fcoe_event_type:16;
5174         uint32_t        event_tag;
5175         uint32_t        :8,
5176                         event_code:8,
5177                         event_type:8,   /** values are protocol specific */
5178                         :6,
5179                         ae:1,           /** async event - this is an ACQE */
5180                         val:1;          /** valid - contents of CQE are valid */
5181 #else
5182 #error big endian version not defined
5183 #endif
5184 } sli4_fcoe_fip_t;
5185
5186 /**
5187  * @brief FC/FCoE WQ completion queue entry.
5188  */
5189 typedef struct sli4_fc_wcqe_s {
5190 #if BYTE_ORDER == LITTLE_ENDIAN
5191         uint32_t        hw_status:8,
5192                         status:8,
5193                         request_tag:16;
5194         uint32_t        wqe_specific_1;
5195         uint32_t        wqe_specific_2;
5196         uint32_t        :15,
5197                         qx:1,
5198                         code:8,
5199                         pri:3,
5200                         pv:1,
5201                         xb:1,
5202                         :2,
5203                         vld:1;
5204 #else
5205 #error big endian version not defined
5206 #endif
5207 } sli4_fc_wcqe_t;
5208
5209 /**
5210  * @brief FC/FCoE WQ consumed CQ queue entry.
5211  */
5212 typedef struct sli4_fc_wqec_s {
5213 #if BYTE_ORDER == LITTLE_ENDIAN
5214         uint32_t        :32;
5215         uint32_t        :32;
5216         uint32_t        wqe_index:16,
5217                         wq_id:16;
5218         uint32_t        :16,
5219                         code:8,
5220                         :7,
5221                         vld:1;
5222 #else
5223 #error big endian version not defined
5224 #endif
5225 } sli4_fc_wqec_t;
5226
5227 /**
5228  * @brief FC/FCoE Completion Status Codes.
5229  */
5230 #define SLI4_FC_WCQE_STATUS_SUCCESS             0x00
5231 #define SLI4_FC_WCQE_STATUS_FCP_RSP_FAILURE     0x01
5232 #define SLI4_FC_WCQE_STATUS_REMOTE_STOP         0x02
5233 #define SLI4_FC_WCQE_STATUS_LOCAL_REJECT        0x03
5234 #define SLI4_FC_WCQE_STATUS_NPORT_RJT           0x04
5235 #define SLI4_FC_WCQE_STATUS_FABRIC_RJT          0x05
5236 #define SLI4_FC_WCQE_STATUS_NPORT_BSY           0x06
5237 #define SLI4_FC_WCQE_STATUS_FABRIC_BSY          0x07
5238 #define SLI4_FC_WCQE_STATUS_LS_RJT              0x09
5239 #define SLI4_FC_WCQE_STATUS_CMD_REJECT          0x0b
5240 #define SLI4_FC_WCQE_STATUS_FCP_TGT_LENCHECK    0x0c
5241 #define SLI4_FC_WCQE_STATUS_RQ_BUF_LEN_EXCEEDED 0x11
5242 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_BUF_NEEDED 0x12
5243 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_FRM_DISC  0x13
5244 #define SLI4_FC_WCQE_STATUS_RQ_DMA_FAILURE      0x14
5245 #define SLI4_FC_WCQE_STATUS_FCP_RSP_TRUNCATE    0x15
5246 #define SLI4_FC_WCQE_STATUS_DI_ERROR            0x16
5247 #define SLI4_FC_WCQE_STATUS_BA_RJT              0x17
5248 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_NEEDED 0x18
5249 #define SLI4_FC_WCQE_STATUS_RQ_INSUFF_XRI_DISC  0x19
5250 #define SLI4_FC_WCQE_STATUS_RX_ERROR_DETECT     0x1a
5251 #define SLI4_FC_WCQE_STATUS_RX_ABORT_REQUEST    0x1b
5252
5253 /* driver generated status codes; better not overlap with chip's status codes! */
5254 #define SLI4_FC_WCQE_STATUS_TARGET_WQE_TIMEOUT  0xff
5255 #define SLI4_FC_WCQE_STATUS_SHUTDOWN            0xfe
5256 #define SLI4_FC_WCQE_STATUS_DISPATCH_ERROR      0xfd
5257
5258 /**
5259  * @brief DI_ERROR Extended Status
5260  */
5261 #define SLI4_FC_DI_ERROR_GE     (1 << 0) /* Guard Error */
5262 #define SLI4_FC_DI_ERROR_AE     (1 << 1) /* Application Tag Error */
5263 #define SLI4_FC_DI_ERROR_RE     (1 << 2) /* Reference Tag Error */
5264 #define SLI4_FC_DI_ERROR_TDPV   (1 << 3) /* Total Data Placed Valid */
5265 #define SLI4_FC_DI_ERROR_UDB    (1 << 4) /* Uninitialized DIF Block */
5266 #define SLI4_FC_DI_ERROR_EDIR   (1 << 5) /* Error direction */
5267
5268 /**
5269  * @brief Local Reject Reason Codes.
5270  */
5271 #define SLI4_FC_LOCAL_REJECT_MISSING_CONTINUE   0x01
5272 #define SLI4_FC_LOCAL_REJECT_SEQUENCE_TIMEOUT   0x02
5273 #define SLI4_FC_LOCAL_REJECT_INTERNAL_ERROR     0x03
5274 #define SLI4_FC_LOCAL_REJECT_INVALID_RPI        0x04
5275 #define SLI4_FC_LOCAL_REJECT_NO_XRI             0x05
5276 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_COMMAND    0x06
5277 #define SLI4_FC_LOCAL_REJECT_XCHG_DROPPED       0x07
5278 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FIELD      0x08
5279 #define SLI4_FC_LOCAL_REJECT_NO_ABORT_MATCH     0x0c
5280 #define SLI4_FC_LOCAL_REJECT_TX_DMA_FAILED      0x0d
5281 #define SLI4_FC_LOCAL_REJECT_RX_DMA_FAILED      0x0e
5282 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_FRAME      0x0f
5283 #define SLI4_FC_LOCAL_REJECT_NO_RESOURCES       0x11
5284 #define SLI4_FC_LOCAL_REJECT_FCP_CONF_FAILURE   0x12
5285 #define SLI4_FC_LOCAL_REJECT_ILLEGAL_LENGTH     0x13
5286 #define SLI4_FC_LOCAL_REJECT_UNSUPPORTED_FEATURE 0x14
5287 #define SLI4_FC_LOCAL_REJECT_ABORT_IN_PROGRESS  0x15
5288 #define SLI4_FC_LOCAL_REJECT_ABORT_REQUESTED    0x16
5289 #define SLI4_FC_LOCAL_REJECT_RCV_BUFFER_TIMEOUT 0x17
5290 #define SLI4_FC_LOCAL_REJECT_LOOP_OPEN_FAILURE  0x18
5291 #define SLI4_FC_LOCAL_REJECT_LINK_DOWN          0x1a
5292 #define SLI4_FC_LOCAL_REJECT_CORRUPTED_DATA     0x1b
5293 #define SLI4_FC_LOCAL_REJECT_CORRUPTED_RPI      0x1c
5294 #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_DATA  0x1d
5295 #define SLI4_FC_LOCAL_REJECT_OUT_OF_ORDER_ACK   0x1e
5296 #define SLI4_FC_LOCAL_REJECT_DUP_FRAME          0x1f
5297 #define SLI4_FC_LOCAL_REJECT_LINK_CONTROL_FRAME 0x20
5298 #define SLI4_FC_LOCAL_REJECT_BAD_HOST_ADDRESS   0x21
5299 #define SLI4_FC_LOCAL_REJECT_MISSING_HDR_BUFFER 0x23
5300 #define SLI4_FC_LOCAL_REJECT_MSEQ_CHAIN_CORRUPTED 0x24
5301 #define SLI4_FC_LOCAL_REJECT_ABORTMULT_REQUESTED 0x25
5302 #define SLI4_FC_LOCAL_REJECT_BUFFER_SHORTAGE    0x28
5303 #define SLI4_FC_LOCAL_REJECT_RCV_XRIBUF_WAITING 0x29
5304 #define SLI4_FC_LOCAL_REJECT_INVALID_VPI        0x2e
5305 #define SLI4_FC_LOCAL_REJECT_MISSING_XRIBUF     0x30
5306 #define SLI4_FC_LOCAL_REJECT_INVALID_RELOFFSET  0x40
5307 #define SLI4_FC_LOCAL_REJECT_MISSING_RELOFFSET  0x41
5308 #define SLI4_FC_LOCAL_REJECT_INSUFF_BUFFERSPACE 0x42
5309 #define SLI4_FC_LOCAL_REJECT_MISSING_SI         0x43
5310 #define SLI4_FC_LOCAL_REJECT_MISSING_ES         0x44
5311 #define SLI4_FC_LOCAL_REJECT_INCOMPLETE_XFER    0x45
5312 #define SLI4_FC_LOCAL_REJECT_SLER_FAILURE       0x46
5313 #define SLI4_FC_LOCAL_REJECT_SLER_CMD_RCV_FAILURE 0x47
5314 #define SLI4_FC_LOCAL_REJECT_SLER_REC_RJT_ERR   0x48
5315 #define SLI4_FC_LOCAL_REJECT_SLER_REC_SRR_RETRY_ERR 0x49
5316 #define SLI4_FC_LOCAL_REJECT_SLER_SRR_RJT_ERR   0x4a
5317 #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RJT_ERR   0x4c
5318 #define SLI4_FC_LOCAL_REJECT_SLER_RRQ_RETRY_ERR 0x4d
5319 #define SLI4_FC_LOCAL_REJECT_SLER_ABTS_ERR      0x4e
5320
5321 typedef struct sli4_fc_async_rcqe_s {
5322 #if BYTE_ORDER == LITTLE_ENDIAN
5323         uint32_t        :8,
5324                         status:8,
5325                         rq_element_index:12,
5326                         :4;
5327         uint32_t        rsvd1;
5328         uint32_t        fcfi:6,
5329                         rq_id:10,
5330                         payload_data_placement_length:16;
5331         uint32_t        sof_byte:8,
5332                         eof_byte:8,
5333                         code:8,
5334                         header_data_placement_length:6,
5335                         :1,
5336                         vld:1;
5337 #else
5338 #error big endian version not defined
5339 #endif
5340 } sli4_fc_async_rcqe_t;
5341
5342 typedef struct sli4_fc_async_rcqe_v1_s {
5343 #if BYTE_ORDER == LITTLE_ENDIAN
5344         uint32_t        :8,
5345                         status:8,
5346                         rq_element_index:12,
5347                         :4;
5348         uint32_t        fcfi:6,
5349                         :26;
5350         uint32_t        rq_id:16,
5351                         payload_data_placement_length:16;
5352         uint32_t        sof_byte:8,
5353                         eof_byte:8,
5354                         code:8,
5355                         header_data_placement_length:6,
5356                         :1,
5357                         vld:1;
5358 #else
5359 #error big endian version not defined
5360 #endif
5361 } sli4_fc_async_rcqe_v1_t;
5362
5363 #define SLI4_FC_ASYNC_RQ_SUCCESS                0x10
5364 #define SLI4_FC_ASYNC_RQ_BUF_LEN_EXCEEDED       0x11
5365 #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_NEEDED      0x12
5366 #define SLI4_FC_ASYNC_RQ_INSUFF_BUF_FRM_DISC    0x13
5367 #define SLI4_FC_ASYNC_RQ_DMA_FAILURE            0x14
5368
5369 typedef struct sli4_fc_coalescing_rcqe_s {
5370 #if BYTE_ORDER == LITTLE_ENDIAN
5371         uint32_t        :8,
5372                         status:8,
5373                         rq_element_index:12,
5374                         :4;
5375         uint32_t        rsvd1;
5376         uint32_t        rq_id:16,
5377                         sequence_reporting_placement_length:16;
5378         uint32_t        :16,
5379                         code:8,
5380                         :7,
5381                         vld:1;
5382 #else
5383 #error big endian version not defined
5384 #endif
5385 } sli4_fc_coalescing_rcqe_t;
5386
5387 #define SLI4_FC_COALESCE_RQ_SUCCESS             0x10
5388 #define SLI4_FC_COALESCE_RQ_INSUFF_XRI_NEEDED   0x18
5389
5390 typedef struct sli4_fc_optimized_write_cmd_cqe_s {
5391 #if BYTE_ORDER == LITTLE_ENDIAN
5392         uint32_t        :8,
5393                         status:8,
5394                         rq_element_index:15,
5395                         iv:1;
5396         uint32_t        fcfi:6,
5397                         :8,
5398                         oox:1,
5399                         agxr:1,
5400                         xri:16;
5401         uint32_t        rq_id:16,
5402                         payload_data_placement_length:16;
5403         uint32_t        rpi:16,
5404                         code:8,
5405                         header_data_placement_length:6,
5406                         :1,
5407                         vld:1;
5408 #else
5409 #error big endian version not defined
5410 #endif
5411 } sli4_fc_optimized_write_cmd_cqe_t;
5412
5413 typedef struct sli4_fc_optimized_write_data_cqe_s {
5414 #if BYTE_ORDER == LITTLE_ENDIAN
5415         uint32_t        hw_status:8,
5416                         status:8,
5417                         xri:16;
5418         uint32_t        total_data_placed;
5419         uint32_t        extended_status;
5420         uint32_t        :16,
5421                         code:8,
5422                         pri:3,
5423                         pv:1,
5424                         xb:1,
5425                         rha:1,
5426                         :1,
5427                         vld:1;
5428 #else
5429 #error big endian version not defined
5430 #endif
5431 } sli4_fc_optimized_write_data_cqe_t;
5432
5433 typedef struct sli4_fc_xri_aborted_cqe_s {
5434 #if BYTE_ORDER == LITTLE_ENDIAN
5435         uint32_t        :8,
5436                         status:8,
5437                         :16;
5438         uint32_t        extended_status;
5439         uint32_t        xri:16,
5440                         remote_xid:16;
5441         uint32_t        :16,
5442                         code:8,
5443                         xr:1,
5444                         :3,
5445                         eo:1,
5446                         br:1,
5447                         ia:1,
5448                         vld:1;
5449 #else
5450 #error big endian version not defined
5451 #endif
5452 } sli4_fc_xri_aborted_cqe_t;
5453
5454 /**
5455  * Code definitions applicable to all FC/FCoE CQE types.
5456  */
5457 #define SLI4_CQE_CODE_OFFSET            14
5458
5459 #define SLI4_CQE_CODE_WORK_REQUEST_COMPLETION   0x01
5460 #define SLI4_CQE_CODE_RELEASE_WQE               0x02
5461 #define SLI4_CQE_CODE_RQ_ASYNC                  0x04
5462 #define SLI4_CQE_CODE_XRI_ABORTED               0x05
5463 #define SLI4_CQE_CODE_RQ_COALESCING             0x06
5464 #define SLI4_CQE_CODE_RQ_CONSUMPTION            0x07
5465 #define SLI4_CQE_CODE_MEASUREMENT_REPORTING     0x08
5466 #define SLI4_CQE_CODE_RQ_ASYNC_V1               0x09
5467 #define SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD       0x0B
5468 #define SLI4_CQE_CODE_OPTIMIZED_WRITE_DATA      0x0C
5469
5470 extern int32_t sli_fc_process_link_state(sli4_t *, void *);
5471 extern int32_t sli_fc_process_link_attention(sli4_t *, void *);
5472 extern int32_t sli_fc_cqe_parse(sli4_t *, sli4_queue_t *, uint8_t *, sli4_qentry_e *, uint16_t *);
5473 extern uint32_t sli_fc_response_length(sli4_t *, uint8_t *);
5474 extern uint32_t sli_fc_io_length(sli4_t *, uint8_t *);
5475 extern int32_t sli_fc_els_did(sli4_t *, uint8_t *, uint32_t *);
5476 extern uint32_t sli_fc_ext_status(sli4_t *, uint8_t *);
5477 extern int32_t sli_fc_rqe_rqid_and_index(sli4_t *, uint8_t *, uint16_t *, uint32_t *);
5478 extern int32_t sli_fc_process_fcoe(sli4_t *, void *);
5479 extern int32_t sli_cmd_fcoe_wq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
5480 extern int32_t sli_cmd_fcoe_wq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t);
5481 extern int32_t sli_cmd_fcoe_wq_destroy(sli4_t *, void *, size_t, uint16_t);
5482 extern int32_t sli_cmd_fcoe_post_sgl_pages(sli4_t *, void *, size_t, uint16_t, uint32_t, ocs_dma_t **, ocs_dma_t **,
5483 ocs_dma_t *);
5484 extern int32_t sli_cmd_fcoe_rq_create(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t);
5485 extern int32_t sli_cmd_fcoe_rq_create_v1(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t);
5486 extern int32_t sli_cmd_fcoe_rq_destroy(sli4_t *, void *, size_t, uint16_t);
5487 extern int32_t sli_cmd_fcoe_read_fcf_table(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t);
5488 extern int32_t sli_cmd_fcoe_post_hdr_templates(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, ocs_dma_t *);
5489 extern int32_t sli_cmd_fcoe_rediscover_fcf(sli4_t *, void *, size_t, uint16_t);
5490 extern int32_t sli_fc_rq_alloc(sli4_t *, sli4_queue_t *, uint32_t, uint32_t, sli4_queue_t *, uint16_t, uint8_t);
5491 extern int32_t sli_fc_rq_set_alloc(sli4_t *, uint32_t, sli4_queue_t *[], uint32_t, uint32_t, uint32_t, uint32_t, uint16_t);
5492 extern uint32_t sli_fc_get_rpi_requirements(sli4_t *, uint32_t);
5493 extern int32_t sli_abort_wqe(sli4_t *, void *, size_t, sli4_abort_type_e, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t);
5494
5495 extern int32_t sli_els_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint8_t, uint32_t, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *);
5496 extern int32_t sli_fcp_iread64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5497 extern int32_t sli_fcp_iwrite64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5498 extern int32_t sli_fcp_icmnd64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint8_t);
5499
5500 extern int32_t sli_fcp_treceive64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5501 extern int32_t sli_fcp_trsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint32_t);
5502 extern int32_t sli_fcp_tsend64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5503 extern int32_t sli_fcp_cont_treceive64_wqe(sli4_t *, void*, size_t, ocs_dma_t *, uint32_t, uint32_t, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, uint16_t, uint32_t, ocs_remote_node_t *, uint32_t, uint8_t, uint8_t, uint8_t, uint32_t);
5504 extern int32_t sli_gen_request64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint32_t,uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5505 extern int32_t sli_send_frame_wqe(sli4_t *sli4, void *buf, size_t size, uint8_t sof, uint8_t eof, uint32_t *hdr,
5506                                   ocs_dma_t *payload, uint32_t req_len, uint8_t timeout,
5507                                   uint16_t xri, uint16_t req_tag);
5508 extern int32_t sli_xmit_sequence64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5509 extern int32_t sli_xmit_bcast64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint8_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint8_t, uint8_t, uint8_t);
5510 extern int32_t sli_xmit_bls_rsp64_wqe(sli4_t *, void *, size_t, sli_bls_payload_t *, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t);
5511 extern int32_t sli_xmit_els_rsp64_wqe(sli4_t *, void *, size_t, ocs_dma_t *, uint32_t, uint16_t, uint16_t, uint16_t, uint16_t, ocs_remote_node_t *, uint32_t, uint32_t);
5512 extern int32_t sli_requeue_xri_wqe(sli4_t *, void *, size_t, uint16_t, uint16_t, uint16_t);
5513 extern void sli4_cmd_lowlevel_set_watchdog(sli4_t *sli4, void *buf, size_t size, uint16_t timeout);
5514
5515 /**
5516  * @ingroup sli_fc
5517  * @brief Retrieve the received header and payload length.
5518  *
5519  * @param sli4 SLI context.
5520  * @param cqe Pointer to the CQ entry.
5521  * @param len_hdr Pointer where the header length is written.
5522  * @param len_data Pointer where the payload length is written.
5523  *
5524  * @return Returns 0 on success, or a non-zero value on failure.
5525  */
5526 static inline int32_t
5527 sli_fc_rqe_length(sli4_t *sli4, void *cqe, uint32_t *len_hdr, uint32_t *len_data)
5528 {
5529         sli4_fc_async_rcqe_t    *rcqe = cqe;
5530
5531         *len_hdr = *len_data = 0;
5532
5533         if (SLI4_FC_ASYNC_RQ_SUCCESS == rcqe->status) {
5534                 *len_hdr  = rcqe->header_data_placement_length;
5535                 *len_data = rcqe->payload_data_placement_length;
5536                 return 0;
5537         } else {
5538                 return -1;
5539         }
5540 }
5541
5542 /**
5543  * @ingroup sli_fc
5544  * @brief Retrieve the received FCFI.
5545  *
5546  * @param sli4 SLI context.
5547  * @param cqe Pointer to the CQ entry.
5548  *
5549  * @return Returns the FCFI in the CQE. or UINT8_MAX if invalid CQE code.
5550  */
5551 static inline uint8_t
5552 sli_fc_rqe_fcfi(sli4_t *sli4, void *cqe)
5553 {
5554         uint8_t code = ((uint8_t*)cqe)[SLI4_CQE_CODE_OFFSET];
5555         uint8_t fcfi = UINT8_MAX;
5556
5557         switch(code) {
5558         case SLI4_CQE_CODE_RQ_ASYNC: {
5559                 sli4_fc_async_rcqe_t *rcqe = cqe;
5560                 fcfi = rcqe->fcfi;
5561                 break;
5562         }
5563         case SLI4_CQE_CODE_RQ_ASYNC_V1: {
5564                 sli4_fc_async_rcqe_v1_t *rcqev1 = cqe;
5565                 fcfi = rcqev1->fcfi;
5566                 break;
5567         }
5568         case SLI4_CQE_CODE_OPTIMIZED_WRITE_CMD: {
5569                 sli4_fc_optimized_write_cmd_cqe_t *opt_wr = cqe;
5570                 fcfi = opt_wr->fcfi;
5571                 break;
5572         }
5573         }
5574
5575         return fcfi;
5576 }
5577
5578 extern const char *sli_fc_get_status_string(uint32_t status);
5579
5580 #endif /* !_SLI4_H */