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