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