]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ocs_fc/ocs_fcp.h
MFV r356365:
[FreeBSD/FreeBSD.git] / sys / dev / ocs_fc / ocs_fcp.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 Fibre Channel types and structures.
37  */
38
39 #ifndef _OCS_FCP_H
40 #define _OCS_FCP_H
41
42 #define FC_ELS_CMD_RJT          0x01
43 #define FC_ELS_CMD_ACC          0x02
44 #define FC_ELS_CMD_PLOGI        0x03
45 #define FC_ELS_CMD_FLOGI        0x04
46 #define FC_ELS_CMD_LOGO         0x05
47 #define FC_ELS_CMD_RRQ          0x12
48 #define FC_ELS_CMD_PRLI         0x20
49 #define FC_ELS_CMD_PRLO         0x21
50 #define FC_ELS_CMD_PDISC        0x50
51 #define FC_ELS_CMD_FDISC        0x51
52 #define FC_ELS_CMD_ADISC        0x52
53 #define FC_ELS_CMD_RSCN         0x61
54 #define FC_ELS_CMD_SCR          0x62
55
56 #define FC_TYPE_BASIC_LINK      0
57 #define FC_TYPE_FCP             0x08
58 #define FC_TYPE_GS              0x20
59 #define FC_TYPE_SW              0x22
60
61 #define FC_ADDR_FABRIC                  0xfffffe        /** well known fabric address */
62 #define FC_ADDR_CONTROLLER              0xfffffd        /** well known fabric controller address */
63 #define FC_ADDR_IS_DOMAIN_CTRL(x)       (((x) & 0xffff00) == 0xfffc00)  /** is well known domain controller */
64 #define FC_ADDR_GET_DOMAIN_CTRL(x)      ((x) & 0x0000ff)        /** get domain controller number */
65 #define FC_ADDR_NAMESERVER              0xfffffc        /** well known directory server address */
66
67 #define FC_GS_TYPE_ALIAS_SERVICE                0xf8
68 #define FC_GS_TYPE_MANAGEMENT_SERVICE           0xfa
69 #define FC_GS_TYPE_DIRECTORY_SERVICE            0xfc
70
71 #define FC_GS_SUBTYPE_NAME_SERVER               0x02
72
73 /**
74  * Generic Services FC Type Bit mask macros:
75  */
76 #define FC_GS_TYPE_WORD(type)   ((type) >> 5)
77 #define FC_GS_TYPE_BIT(type)    ((type) & 0x1f)
78
79 /**
80  * Generic Services Name Server Request Command codes:
81  */
82 #define FC_GS_NAMESERVER_GPN_ID         0x0112
83 #define FC_GS_NAMESERVER_GNN_ID         0x0113
84 #define FC_GS_NAMESERVER_GFPN_ID        0x011c
85 #define FC_GS_NAMESERVER_GFF_ID         0x011f
86 #define FC_GS_NAMESERVER_GID_FT         0x0171
87 #define FC_GS_NAMESERVER_GID_PT         0x01a1
88 #define FC_GS_NAMESERVER_RHBA           0x0200
89 #define FC_GS_NAMESERVER_RPA            0x0211
90 #define FC_GS_NAMESERVER_RPN_ID         0x0212
91 #define FC_GS_NAMESERVER_RNN_ID         0x0213
92 #define FC_GS_NAMESERVER_RCS_ID         0x0214
93 #define FC_GS_NAMESERVER_RFT_ID         0x0217
94 #define FC_GS_NAMESERVER_RFF_ID         0x021f
95 #define FC_GS_NAMESERVER_RSNN_NN        0x0239
96 #define FC_GS_NAMESERVER_RSPN_ID        0x0218
97
98
99 #define FC_GS_REVISION          0x03
100
101 #define FC_GS_IO_PARAMS         { .fc_ct.r_ctl = 0x02, \
102                                 .fc_ct.type = FC_TYPE_GS, \
103                                 .fc_ct.df_ctl = 0x00 }
104
105 typedef struct fc_vft_header_s {
106         uint32_t        :1,
107                         vf_id:12,
108                         priority:3,
109                         e:1,
110                         :1,
111                         type:4,
112                         ver:2,
113                         r_ctl:8;
114         uint32_t        :24,
115                         hopct:8;
116 } fc_vft_header_t;
117
118
119 #if BYTE_ORDER == LITTLE_ENDIAN
120 static inline uint32_t fc_be24toh(uint32_t x) { return (ocs_be32toh(x) >> 8); }
121 #else
122 static inline uint32_t fc_be24toh(uint32_t x) { }
123 #endif
124 static inline uint32_t fc_htobe24(uint32_t x) { return fc_be24toh(x); }
125
126 #define FC_SOFI3        0x2e
127 #define FC_SOFn3        0x36
128 #define FC_EOFN         0x41
129 #define FC_EOFT         0x42
130
131 /**
132  * @brief FC header in big-endian order
133  */
134 typedef struct fc_header_s {
135         uint32_t        info:4,
136                         r_ctl:4,
137                         d_id:24;
138         uint32_t        cs_ctl:8,
139                         s_id:24;
140         uint32_t        type:8,
141                         f_ctl:24;
142         uint32_t        seq_id:8,
143                         df_ctl:8,
144                         seq_cnt:16;
145         uint32_t        ox_id:16,
146                         rx_id:16;
147         uint32_t        parameter;
148 } fc_header_t;
149
150
151 /**
152  * @brief FC header in little-endian order
153  */
154 typedef struct fc_header_le_s {
155 #if BYTE_ORDER == LITTLE_ENDIAN
156         uint32_t        d_id:24,
157                         info:4,
158                         r_ctl:4;
159         uint32_t        s_id:24,
160                         cs_ctl:8;
161         uint32_t        f_ctl:24,
162                         type:8;
163         uint32_t        seq_cnt:16,
164                         df_ctl:8,
165                         seq_id:8;
166         uint32_t        rx_id:16,
167                         ox_id:16;
168         uint32_t        parameter;
169 #else
170 #error big endian version not defined
171 #endif
172 } fc_header_le_t;
173
174 /**
175  * @brief FC VM header in big-endian order
176  */
177 typedef struct fc_vm_header_s {
178         uint32_t        dst_vmid;
179         uint32_t        src_vmid;
180         uint32_t        rsvd0;
181         uint32_t        rsvd1;
182 } fc_vm_header_t;
183
184 #define FC_DFCTL_DEVICE_HDR_16_MASK     0x1
185 #define FC_DFCTL_NETWORK_HDR_MASK       0x20    
186 #define FC_DFCTL_ESP_HDR_MASK           0x40                            
187 #define FC_DFCTL_NETWORK_HDR_SIZE       16      
188 #define FC_DFCTL_ESP_HDR_SIZE           0 //FIXME                               
189
190 #define FC_RCTL_FC4_DATA        0
191 #define FC_RCTL_ELS             2
192 #define FC_RCTL_BLS             8
193
194 #define FC_RCTL_INFO_UNCAT      0
195 #define FC_RCTL_INFO_SOL_DATA   1
196 #define FC_RCTL_INFO_UNSOL_CTRL 2
197 #define FC_RCTL_INFO_SOL_CTRL   3
198 #define FC_RCTL_INFO_UNSOL_DATA 4
199 #define FC_RCTL_INFO_DATA_DESC  5
200 #define FC_RCTL_INFO_UNSOL_CMD  6
201 #define FC_RCTL_INFO_CMD_STATUS 7
202
203 #define FC_FCTL_EXCHANGE_RESPONDER      0x800000
204 #define FC_FCTL_SEQUENCE_CONTEXT        0x400000
205 #define FC_FCTL_FIRST_SEQUENCE          0x200000
206 #define FC_FCTL_LAST_SEQUENCE           0x100000
207 #define FC_FCTL_END_SEQUENCE            0x080000
208 #define FC_FCTL_END_CONNECTION          0x040000
209 #define FC_FCTL_PRIORITY_ENABLE         0x020000
210 #define FC_FCTL_SEQUENCE_INITIATIVE     0x010000
211 #define FC_FCTL_FILL_DATA_BYTES_MASK    0x000003
212
213 /**
214  * Common BLS definitions:
215  */
216 #define FC_INFO_NOP                     0x0
217 #define FC_INFO_ABTS                    0x1
218 #define FC_INFO_RMC                     0x2
219 /* reserved                             0x3 */
220 #define FC_INFO_BA_ACC                  0x4
221 #define FC_INFO_BA_RJT                  0x5
222 #define FC_INFO_PRMT                    0x6
223
224 /* (FC-LS) LS_RJT Reason Codes */
225 #define FC_REASON_INVALID_COMMAND_CODE          0x01
226 #define FC_REASON_LOGICAL_ERROR                 0x03
227 #define FC_REASON_LOGICAL_BUSY                  0x05
228 #define FC_REASON_PROTOCOL_ERROR                0x07
229 #define FC_REASON_UNABLE_TO_PERFORM             0x09
230 #define FC_REASON_COMMAND_NOT_SUPPORTED         0x0b
231 #define FC_REASON_COMMAND_IN_PROGRESS           0x0e
232 #define FC_REASON_VENDOR_SPECIFIC               0xff
233
234 /* (FC-LS) LS_RJT Reason Codes Explanations */
235 #define FC_EXPL_NO_ADDITIONAL                   0x00
236 #define FC_EXPL_SPARAM_OPTIONS                  0x01
237 #define FC_EXPL_SPARAM_INITIATOR                0x03
238 #define FC_EXPL_SPARAM_RECPIENT                 0x05
239 #define FC_EXPL_SPARM_DATA_SIZE                 0x07
240 #define FC_EXPL_SPARM_CONCURRENT                0x09
241 #define FC_EXPL_SPARM_CREDIT                    0x0b
242 #define FC_EXPL_INV_PORT_NAME                   0x0d
243 #define FC_EXPL_INV_NODE_NAME                   0x0e
244 #define FC_EXPL_INV_COMMON_SPARAMS              0x0f
245 #define FC_EXPL_INV_ASSOC_HEADER                0x11
246 #define FC_EXPL_ASSOC_HDR_REQUIRED              0x13
247 #define FC_EXPL_INV_ORIGINATOR_S_ID             0x15
248 #define FC_EXPL_INV_X_ID_COMBINATION            0x17
249 #define FC_EXPL_COMMAND_IN_PROGRESS             0x19
250 #define FC_EXPL_NPORT_LOGIN_REQUIRED            0x1e
251 #define FC_EXPL_N_PORT_ID                       0x1f
252 #define FC_EXPL_INSUFFICIENT_RESOURCES          0x29
253 #define FC_EXPL_UNABLE_TO_SUPPLY_DATA           0x2a
254 #define FC_EXPL_REQUEST_NOT_SUPPORTED           0x2c
255 #define FC_EXPL_INV_PAYLOAD_LEN                 0x1d
256 #define FC_EXPL_INV_PORT_NODE_NAME              0x44
257 #define FC_EXPL_LOGIN_EXT_NOT_SUPPORTED         0x46
258 #define FC_EXPL_AUTH_REQUIRED                   0x48
259 #define FC_EXPL_SCAN_VALUE_NOT_ALLOWED          0x50
260 #define FC_EXPL_SCAN_VALUE_NOT_SUPPORTED        0x51
261 #define FC_EXPL_NO_RESOURCES_ASSIGNED           0x52
262 #define FC_EXPL_MAC_ADDR_MODE_NOT_SUPPORTED     0x60
263 #define FC_EXPL_MAC_ADDR_INCORRECTLY_FORMED     0x61
264 #define FC_EXPL_VN2VN_PORT_NOT_IN_NEIGHBOR_SET  0x62
265
266 #define FC_EXPL_INV_X_ID                        0x03    /* invalid OX_ID - RX_ID combination */
267 #define FC_EXPL_SEQUENCE_ABORTED                0x05
268
269 typedef struct fc_ba_acc_payload_s {
270 #define FC_SEQ_ID_VALID                 0x80
271 #define FC_SEQ_ID_INVALID               0x00
272         uint32_t        seq_id_validity:8,
273                         seq_id:8,
274                         :16;
275         uint32_t        ox_id:16,
276                         rx_id:16;
277         uint32_t        low_seq_cnt:16,
278                         high_seq_cnt:16;
279 } fc_ba_acc_payload_t;
280
281 typedef struct fc_ba_rjt_payload_s {
282         uint32_t        vendor_unique:8,
283                         reason_explanation:8,
284                         reason_code:8,
285                         :8;
286 } fc_ba_rjt_payload_t;
287
288 typedef struct fc_els_gen_s {
289         uint32_t        command_code: 8,
290                         resv1: 24;
291 } fc_els_gen_t;
292
293 typedef struct fc_plogi_playload_s {
294         uint32_t        command_code: 8,
295                         resv1: 24;
296         uint32_t        common_service_parameters[4];
297         uint32_t        port_name_hi;
298         uint32_t        port_name_lo;
299         uint32_t        node_name_hi;
300         uint32_t        node_name_lo;
301         uint32_t        class1_service_parameters[4];
302         uint32_t        class2_service_parameters[4];
303         uint32_t        class3_service_parameters[4];
304         uint32_t        class4_service_parameters[4];
305         uint32_t        vendor_version_level[4];
306 } fc_plogi_payload_t;
307
308 typedef fc_plogi_payload_t fc_sparms_t;
309
310 typedef struct fc_logo_payload_s {
311         uint32_t        command_code: 8,
312                         resv1:24;
313         uint32_t        :8,
314                         port_id:24;
315         uint32_t        port_name_hi;
316         uint32_t        port_name_lo;
317 } fc_logo_payload_t;
318
319 typedef struct fc_acc_payload_s {
320         uint32_t        command_code: 8,
321                         resv1:24;
322 } fc_acc_payload_t;
323
324
325 typedef struct fc_ls_rjt_payload_s {
326         uint32_t        command_code:8,
327                         resv1:24;
328         uint32_t        resv2:8,
329                         reason_code:8,
330                         reason_code_exp:8,
331                         vendor_unique:8;
332 } fc_ls_rjt_payload_t;
333
334 typedef struct fc_prli_payload_s {
335         uint32_t        command_code:8,
336                         page_length:8,
337                         payload_length:16;
338         uint32_t        type:8,
339                         type_ext:8,
340                         flags:16;
341         uint32_t        originator_pa;
342         uint32_t        responder_pa;
343         uint32_t        :16,
344                         service_params:16;
345 } fc_prli_payload_t;
346
347 typedef struct fc_prlo_payload_s {
348         uint32_t        command_code:8,
349                         page_length:8,
350                         payload_length:16;
351         uint32_t        type:8,
352                         type_ext:8,
353                         :16;
354         uint32_t        :32;
355         uint32_t        :32;
356         uint32_t        :32;
357 } fc_prlo_payload_t;
358
359 typedef struct fc_prlo_acc_payload_s {
360         uint32_t        command_code:8,
361                         page_length:8,
362                         payload_length:16;
363         uint32_t        type:8,
364                         type_ext:8,
365                         :4,
366                         response_code:4,
367                         :8;
368         uint32_t        :32;
369         uint32_t        :32;
370         uint32_t        :32;
371 } fc_prlo_acc_payload_t;
372
373 typedef struct fc_adisc_payload_s {
374         uint32_t        command_code:8,
375                         payload_length:24;
376         uint32_t        :8,
377                         hard_address:24;
378         uint32_t        port_name_hi;
379         uint32_t        port_name_lo;
380         uint32_t        node_name_hi;
381         uint32_t        node_name_lo;
382         uint32_t        :8,
383                         port_id:24;
384 } fc_adisc_payload_t;
385
386 /* PRLI flags */
387 #define FC_PRLI_ORIGINATOR_PA_VALID     0x8000
388 #define FC_PRLI_RESPONDER_PA_VALID      0x4000
389 #define FC_PRLI_ESTABLISH_IMAGE_PAIR    0x2000
390 #define FC_PRLI_SERVICE_PARAM_INVALID   0x0800
391 #define FC_PRLI_REQUEST_EXECUTED        0x0100
392
393 /* PRLI Service Parameters */
394 #define FC_PRLI_REC_SUPPORT             0x0400
395 #define FC_PRLI_TASK_RETRY_ID_REQ       0x0200
396 #define FC_PRLI_RETRY                   0x0100
397 #define FC_PRLI_CONFIRMED_COMPLETION    0x0080
398 #define FC_PRLI_DATA_OVERLAY            0x0040
399 #define FC_PRLI_INITIATOR_FUNCTION      0x0020
400 #define FC_PRLI_TARGET_FUNCTION         0x0010
401 #define FC_PRLI_READ_XRDY_DISABLED      0x0002
402 #define FC_PRLI_WRITE_XRDY_DISABLED     0x0001
403
404 /* PRLO Logout flags */
405 #define FC_PRLO_REQUEST_EXECUTED        0x0001
406
407 typedef struct fc_scr_payload_s {
408         uint32_t        command_code:8,
409                         :24;
410         uint32_t        :24,
411                         function:8;
412 } fc_scr_payload_t;
413
414 #define FC_SCR_REG_FABRIC               1
415 #define FC_SCR_REG_NPORT                2
416 #define FC_SCR_REG_FULL                 3
417
418 typedef struct {
419         uint32_t :2,
420                 rscn_event_qualifier:4,
421                 address_format:2,
422                 port_id:24;
423 } fc_rscn_affected_port_id_page_t;
424
425 typedef struct fc_rscn_payload_s {
426         uint32_t        command_code:8,
427                         page_length:8,
428                         payload_length:16;
429         fc_rscn_affected_port_id_page_t port_list[1];
430 } fc_rscn_payload_t;
431
432 typedef struct fcct_iu_header_s {
433 #if BYTE_ORDER == LITTLE_ENDIAN
434         uint32_t        revision:8,
435                         in_id:24;
436         uint32_t        gs_type:8,
437                         gs_subtype:8,
438                         options:8,
439                         resv1:8;
440         uint32_t        cmd_rsp_code:16,
441                         max_residual_size:16;
442         uint32_t        fragment_id:8,
443                         reason_code:8,
444                         reason_code_explanation:8,
445                         vendor_specific:8;
446 #else
447 #error big endian version not defined
448 #endif
449 } fcct_iu_header_t;
450
451 #define FCCT_REJECT_INVALID_COMMAND_CODE        1
452 #define FCCT_REJECT_INVALID_VERSION_LEVEL       2
453 #define FCCT_LOGICAL_ERROR                      3
454 #define FCCT_INVALID_CT_IU_SIZE                 4
455 #define FCCT_LOGICAL_BUSY                       5
456 #define FCCT_PROTOCOL_ERROR                     7
457 #define FCCT_UNABLE_TO_PERFORM                  9
458 #define FCCT_COMMAND_NOT_SUPPORTED              0x0b
459 #define FCCT_FABRIC_PORT_NAME_NOT_REGISTERED    0x0c
460 #define FCCT_SERVER_NOT_AVAILABLE               0x0d
461 #define FCCT_SESSION_COULD_NOT_BE_ESTABLISHED   0x0e
462 #define FCCT_VENDOR_SPECIFIC_ERROR              0xff
463
464 #define FCCT_NO_ADDITIONAL_EXPLANATION          0
465 #define FCCT_AUTHORIZATION_EXCEPTION            0xf0
466 #define FCCT_AUTHENTICATION_EXCEPTION           0xf1
467 #define FCCT_DATA_BASE_FULL                     0xf2
468 #define FCCT_DATA_BASE_EMPTY                    0xf3
469 #define FCCT_PROCESSING_REQUEST                 0xf4
470 #define FCCT_UNABLE_TO_VERIFY_CONNECTION        0xf5
471 #define FCCT_DEVICES_NOT_IN_COMMON_ZONE         0xf6
472
473 typedef struct {
474         fcct_iu_header_t hdr;
475 #if BYTE_ORDER == LITTLE_ENDIAN
476         uint32_t        port_id;
477         uint32_t        fc4_types;
478 #else
479 #error big endian version not defined
480 #endif
481 } fcgs_rft_id_t;
482
483 typedef struct {
484         fcct_iu_header_t hdr;
485 #if BYTE_ORDER == LITTLE_ENDIAN
486         uint32_t        port_id;
487         uint32_t        :16,
488                         fc4_features:8,
489                         type_code:8;
490 #else
491 #error big endian version not defined
492 #endif
493 } fcgs_rff_id_t;
494
495 #pragma pack(1)
496 typedef struct {
497         fcct_iu_header_t hdr;
498 #if BYTE_ORDER == LITTLE_ENDIAN
499         uint32_t        port_id;
500         uint64_t        port_name;
501 #else
502 #error big endian version not defined
503 #endif
504 } fcgs_rpn_id_t;
505 #pragma pack()
506
507 #pragma pack(1)
508 typedef struct {
509         fcct_iu_header_t hdr;
510 #if BYTE_ORDER == LITTLE_ENDIAN
511         uint32_t        port_id;
512         uint64_t        node_name;
513 #else
514 #error big endian version not defined
515 #endif
516 } fcgs_rnn_id_t;
517 #pragma pack()
518
519 #define FCCT_CLASS_OF_SERVICE_F 0x1
520 #define FCCT_CLASS_OF_SERVICE_2 0x4
521 #define FCCT_CLASS_OF_SERVICE_3 0x8
522 #pragma pack(1)
523 typedef struct {
524         fcct_iu_header_t hdr;
525 #if BYTE_ORDER == LITTLE_ENDIAN
526         uint32_t        port_id;
527         uint32_t        class_of_srvc;
528 #else
529 #error big endian version not defined
530 #endif
531 } fcgs_rcs_id_t;
532 #pragma pack()
533
534 #pragma pack(1)
535 typedef struct {
536         fcct_iu_header_t hdr;
537 #if BYTE_ORDER == LITTLE_ENDIAN
538         uint64_t        node_name;
539         uint8_t         name_len;
540         char            sym_node_name[1];
541 /*TODO: need name length and symbolic name */
542 #else
543 #error big endian version not defined
544 #endif
545 } fcgs_rsnn_nn_t;
546 #pragma pack()
547
548 #define FCCT_HDR_CMDRSP_ACCEPT  0x8002
549 #define FCCT_HDR_CMDRSP_REJECT  0x8001
550
551 static inline void fcct_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint16_t max_size)
552 {
553         /* use old rev (1) to accommodate older switches */
554         hdr->revision = 1;
555         hdr->in_id = 0;
556         hdr->gs_type = FC_GS_TYPE_DIRECTORY_SERVICE;
557         hdr->gs_subtype = FC_GS_SUBTYPE_NAME_SERVER;
558         hdr->options = 0;
559         hdr->resv1 = 0;
560         hdr->cmd_rsp_code = ocs_htobe16(cmd);
561         hdr->max_residual_size = ocs_htobe16(max_size/(sizeof(uint32_t))); /* words */
562         hdr->fragment_id = 0;
563         hdr->reason_code = 0;
564         hdr->reason_code_explanation = 0;
565         hdr->vendor_specific = 0;
566 }
567
568 typedef struct fcct_rftid_req_s {
569         fcct_iu_header_t        hdr;
570         uint32_t                port_id;
571         uint32_t                fc4_types[8];
572 } fcct_rftid_req_t;
573
574 #define FC4_FEATURE_TARGET      (1U << 0)
575 #define FC4_FEATURE_INITIATOR   (1U << 1)
576
577 typedef struct fcct_rffid_req_s {
578         fcct_iu_header_t        hdr;
579         uint32_t                port_id;
580         uint32_t                :16,
581                                 fc4_feature_bits:8,
582                                 type:8;
583 } fcct_rffid_req_t;
584
585 typedef struct fcct_gnnid_req_s {
586         fcct_iu_header_t        hdr;
587         uint32_t                :8,
588                                 port_id:24;
589 } fcct_gnnid_req_t;
590
591 typedef struct fcct_gpnid_req_s {
592         fcct_iu_header_t        hdr;
593         uint32_t                :8,
594                                 port_id:24;
595 } fcct_gpnid_req_t;
596
597 typedef struct fcct_gffid_req_s {
598         fcct_iu_header_t        hdr;
599         uint32_t                :8,
600                                 port_id:24;
601 } fcct_gffid_req_t;
602
603 typedef struct fcct_gidft_req_s {
604         fcct_iu_header_t        hdr;
605         uint32_t                :8,
606                                 domain_id_scope:8,
607                                 area_id_scope:8,
608                                 type:8;
609 } fcct_gidft_req_t;
610
611 typedef struct fcct_gidpt_req_s {
612         fcct_iu_header_t        hdr;
613         uint32_t                port_type:8,
614                                 domain_id_scope:8,
615                                 area_id_scope:8,
616                                 flags:8;
617 } fcct_gidpt_req_t;
618
619 typedef struct fcct_gnnid_acc_s {
620         fcct_iu_header_t        hdr;
621         uint64_t                node_name;
622 } fcct_gnnid_acc_t;
623
624 typedef struct fcct_gpnid_acc_s {
625         fcct_iu_header_t        hdr;
626         uint64_t                port_name;
627 } fcct_gpnid_acc_t;
628
629 typedef struct fcct_gffid_acc_s {
630         fcct_iu_header_t        hdr;
631         uint8_t                 fc4_feature_bits;
632 } fcct_gffid_acc_t;
633
634 typedef struct fcct_gidft_acc_s {
635         fcct_iu_header_t        hdr;
636         struct {
637                 uint32_t        ctl:8,
638                                 port_id:24;
639         } port_list[1];
640 } fcct_gidft_acc_t;
641
642 typedef struct fcct_gidpt_acc_s {
643         fcct_iu_header_t        hdr;
644         struct {
645                 uint32_t        ctl:8,
646                                 port_id:24;
647         } port_list[1];
648 } fcct_gidpt_acc_t;
649
650 #define FCCT_GID_PT_LAST_ID     0x80
651 #define FCCT_GIDPT_ID_MASK      0x00ffffff
652
653 typedef struct fcp_cmnd_iu_s {
654         uint8_t         fcp_lun[8];
655         uint8_t         command_reference_number;
656         uint8_t         task_attribute:3,
657                         command_priority:4,
658                         :1;
659         uint8_t         task_management_flags;
660         uint8_t         wrdata:1,
661                         rddata:1,
662                         additional_fcp_cdb_length:6;
663         uint8_t         fcp_cdb[16];
664         uint8_t         fcp_cdb_and_dl[20];     /* < May contain up to 16 bytes of CDB, followed by fcp_dl */
665 } fcp_cmnd_iu_t;
666
667 #define FCP_LUN_ADDRESS_METHOD_SHIFT    6
668 #define FCP_LUN_ADDRESS_METHOD_MASK     0xc0
669 #define FCP_LUN_ADDR_METHOD_PERIPHERAL  0x0
670 #define FCP_LUN_ADDR_METHOD_FLAT        0x1
671 #define FCP_LUN_ADDR_METHOD_LOGICAL     0x2
672 #define FCP_LUN_ADDR_METHOD_EXTENDED    0x3
673
674 #define FCP_LUN_ADDR_SIMPLE_MAX         0xff
675 #define FCP_LUN_ADDR_FLAT_MAX           0x3fff
676
677 #define FCP_TASK_ATTR_SIMPLE            0x0
678 #define FCP_TASK_ATTR_HEAD_OF_QUEUE     0x1
679 #define FCP_TASK_ATTR_ORDERED           0x2
680 #define FCP_TASK_ATTR_ACA               0x4
681 #define FCP_TASK_ATTR_UNTAGGED          0x5
682
683 #define FCP_QUERY_TASK_SET              BIT(0)
684 #define FCP_ABORT_TASK_SET              BIT(1)
685 #define FCP_CLEAR_TASK_SET              BIT(2)
686 #define FCP_QUERY_ASYNCHRONOUS_EVENT    BIT(3)
687 #define FCP_LOGICAL_UNIT_RESET          BIT(4)
688 #define FCP_TARGET_RESET                BIT(5)
689 #define FCP_CLEAR_ACA                   BIT(6)
690
691 /* SPC-4 says that the maximum length of sense data is 252 bytes */
692 #define FCP_MAX_SENSE_LEN               252
693 #define FCP_MAX_RSP_LEN                   8
694 /*
695  * FCP_RSP buffer will either have sense or response data, but not both
696  * so pick the larger.
697  */
698 #define FCP_MAX_RSP_INFO_LEN            FCP_MAX_SENSE_LEN
699
700 typedef struct fcp_rsp_iu_s {
701         uint8_t         rsvd[8];
702         uint8_t         status_qualifier[2];
703         uint8_t         flags;
704         uint8_t         scsi_status;
705         uint8_t         fcp_resid[4];
706         uint8_t         fcp_sns_len[4];
707         uint8_t         fcp_rsp_len[4];
708         uint8_t         data[FCP_MAX_RSP_INFO_LEN];
709 } fcp_rsp_iu_t;
710
711 /** Flag field defines: */
712 #define FCP_RSP_LEN_VALID               BIT(0)
713 #define FCP_SNS_LEN_VALID               BIT(1)
714 #define FCP_RESID_OVER                  BIT(2)
715 #define FCP_RESID_UNDER                 BIT(3)
716 #define FCP_CONF_REQ                    BIT(4)
717 #define FCP_BIDI_READ_RESID_OVER        BIT(5)
718 #define FCP_BIDI_READ_RESID_UNDER       BIT(6)
719 #define FCP_BIDI_RSP                    BIT(7)
720
721 /** Status values: */
722 #define FCP_TMF_COMPLETE                0x00
723 #define FCP_DATA_LENGTH_MISMATCH        0x01
724 #define FCP_INVALID_FIELD               0x02
725 #define FCP_DATA_RO_MISMATCH            0x03
726 #define FCP_TMF_REJECTED                0x04
727 #define FCP_TMF_FAILED                  0x05
728 #define FCP_TMF_SUCCEEDED               0x08
729 #define FCP_TMF_INCORRECT_LUN           0x09
730
731 /** FCP-4 Table 28, TMF response information: */
732 typedef struct fc_rsp_info_s {
733         uint8_t addl_rsp_info[3];
734         uint8_t rsp_code;
735         uint32_t :32;
736 } fcp_rsp_info_t;
737
738 typedef struct fcp_xfer_rdy_iu_s {
739         uint8_t         fcp_data_ro[4];
740         uint8_t         fcp_burst_len[4];
741         uint8_t         rsvd[4];
742 } fcp_xfer_rdy_iu_t;
743
744 #define MAX_ACC_REJECT_PAYLOAD (sizeof(fc_ls_rjt_payload_t) > sizeof(fc_acc_payload_t) ? sizeof(fc_ls_rjt_payload_t) : sizeof(fc_acc_payload_t))
745
746
747 #endif /* !_OCS_FCP_H */