1331766Sken/*-
2331766Sken * Copyright (c) 2017 Broadcom. All rights reserved.
3331766Sken * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
4331766Sken *
5331766Sken * Redistribution and use in source and binary forms, with or without
6331766Sken * modification, are permitted provided that the following conditions are met:
7331766Sken *
8331766Sken * 1. Redistributions of source code must retain the above copyright notice,
9331766Sken *    this list of conditions and the following disclaimer.
10331766Sken *
11331766Sken * 2. Redistributions in binary form must reproduce the above copyright notice,
12331766Sken *    this list of conditions and the following disclaimer in the documentation
13331766Sken *    and/or other materials provided with the distribution.
14331766Sken *
15331766Sken * 3. Neither the name of the copyright holder nor the names of its contributors
16331766Sken *    may be used to endorse or promote products derived from this software
17331766Sken *    without specific prior written permission.
18331766Sken *
19331766Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20331766Sken * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21331766Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22331766Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23331766Sken * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24331766Sken * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25331766Sken * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26331766Sken * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27331766Sken * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28331766Sken * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29331766Sken * POSSIBILITY OF SUCH DAMAGE.
30331766Sken *
31331766Sken * $FreeBSD: stable/11/sys/dev/ocs_fc/ocs_fcp.h 331766 2018-03-30 15:28:25Z ken $
32331766Sken */
33331766Sken
34331766Sken/**
35331766Sken * @file
36331766Sken * Define Fibre Channel types and structures.
37331766Sken */
38331766Sken
39331766Sken#ifndef _OCS_FCP_H
40331766Sken#define _OCS_FCP_H
41331766Sken
42331766Sken#define FC_ELS_CMD_RJT		0x01
43331766Sken#define FC_ELS_CMD_ACC		0x02
44331766Sken#define FC_ELS_CMD_PLOGI	0x03
45331766Sken#define FC_ELS_CMD_FLOGI	0x04
46331766Sken#define FC_ELS_CMD_LOGO		0x05
47331766Sken#define FC_ELS_CMD_RRQ		0x12
48331766Sken#define FC_ELS_CMD_PRLI		0x20
49331766Sken#define FC_ELS_CMD_PRLO		0x21
50331766Sken#define FC_ELS_CMD_PDISC	0x50
51331766Sken#define FC_ELS_CMD_FDISC	0x51
52331766Sken#define FC_ELS_CMD_ADISC	0x52
53331766Sken#define FC_ELS_CMD_RSCN		0x61
54331766Sken#define FC_ELS_CMD_SCR		0x62
55331766Sken
56331766Sken#define FC_TYPE_BASIC_LINK	0
57331766Sken#define FC_TYPE_FCP		0x08
58331766Sken#define FC_TYPE_GS		0x20
59331766Sken#define FC_TYPE_SW		0x22
60331766Sken
61331766Sken#define FC_ADDR_FABRIC			0xfffffe	/** well known fabric address */
62331766Sken#define FC_ADDR_CONTROLLER              0xfffffd        /** well known fabric controller address */
63331766Sken#define FC_ADDR_IS_DOMAIN_CTRL(x)	(((x) & 0xffff00) == 0xfffc00)	/** is well known domain controller */
64331766Sken#define FC_ADDR_GET_DOMAIN_CTRL(x)	((x) & 0x0000ff)	/** get domain controller number */
65331766Sken#define FC_ADDR_NAMESERVER              0xfffffc        /** well known directory server address */
66331766Sken
67331766Sken#define FC_GS_TYPE_ALIAS_SERVICE		0xf8
68331766Sken#define FC_GS_TYPE_MANAGEMENT_SERVICE		0xfa
69331766Sken#define FC_GS_TYPE_DIRECTORY_SERVICE		0xfc
70331766Sken
71331766Sken#define FC_GS_SUBTYPE_NAME_SERVER		0x02
72331766Sken
73331766Sken/**
74331766Sken * Generic Services FC Type Bit mask macros:
75331766Sken */
76331766Sken#define FC_GS_TYPE_WORD(type)	((type) >> 5)
77331766Sken#define FC_GS_TYPE_BIT(type)	((type) & 0x1f)
78331766Sken
79331766Sken/**
80331766Sken * Generic Services Name Server Request Command codes:
81331766Sken */
82331766Sken#define FC_GS_NAMESERVER_GPN_ID		0x0112
83331766Sken#define FC_GS_NAMESERVER_GNN_ID		0x0113
84331766Sken#define FC_GS_NAMESERVER_GFPN_ID	0x011c
85331766Sken#define FC_GS_NAMESERVER_GFF_ID		0x011f
86331766Sken#define FC_GS_NAMESERVER_GID_FT		0x0171
87331766Sken#define FC_GS_NAMESERVER_GID_PT		0x01a1
88331766Sken#define FC_GS_NAMESERVER_RHBA		0x0200
89331766Sken#define FC_GS_NAMESERVER_RPA		0x0211
90331766Sken#define FC_GS_NAMESERVER_RPN_ID		0x0212
91331766Sken#define FC_GS_NAMESERVER_RNN_ID		0x0213
92331766Sken#define FC_GS_NAMESERVER_RCS_ID		0x0214
93331766Sken#define FC_GS_NAMESERVER_RFT_ID		0x0217
94331766Sken#define FC_GS_NAMESERVER_RFF_ID		0x021f
95331766Sken#define FC_GS_NAMESERVER_RSNN_NN	0x0239
96331766Sken#define FC_GS_NAMESERVER_RSPN_ID	0x0218
97331766Sken
98331766Sken
99331766Sken#define FC_GS_REVISION		0x03
100331766Sken
101331766Sken#define FC_GS_IO_PARAMS		{ .fc_ct.r_ctl = 0x02, \
102331766Sken				.fc_ct.type = FC_TYPE_GS, \
103331766Sken				.fc_ct.df_ctl = 0x00 }
104331766Sken
105331766Skentypedef struct fc_vft_header_s {
106331766Sken	uint32_t	:1,
107331766Sken			vf_id:12,
108331766Sken			priority:3,
109331766Sken			e:1,
110331766Sken			:1,
111331766Sken			type:4,
112331766Sken			ver:2,
113331766Sken			r_ctl:8;
114331766Sken	uint32_t	:24,
115331766Sken			hopct:8;
116331766Sken} fc_vft_header_t;
117331766Sken
118331766Sken
119331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
120331766Skenstatic inline uint32_t fc_be24toh(uint32_t x) { return (ocs_be32toh(x) >> 8); }
121331766Sken#else
122331766Skenstatic inline uint32_t fc_be24toh(uint32_t x) { }
123331766Sken#endif
124331766Skenstatic inline uint32_t fc_htobe24(uint32_t x) { return fc_be24toh(x); }
125331766Sken
126331766Sken#define FC_SOFI3	0x2e
127331766Sken#define FC_SOFn3	0x36
128331766Sken#define FC_EOFN		0x41
129331766Sken#define FC_EOFT		0x42
130331766Sken
131331766Sken/**
132331766Sken * @brief FC header in big-endian order
133331766Sken */
134331766Skentypedef struct fc_header_s {
135331766Sken	uint32_t	info:4,
136331766Sken			r_ctl:4,
137331766Sken			d_id:24;
138331766Sken	uint32_t	cs_ctl:8,
139331766Sken			s_id:24;
140331766Sken	uint32_t	type:8,
141331766Sken			f_ctl:24;
142331766Sken	uint32_t	seq_id:8,
143331766Sken			df_ctl:8,
144331766Sken			seq_cnt:16;
145331766Sken	uint32_t	ox_id:16,
146331766Sken			rx_id:16;
147331766Sken	uint32_t	parameter;
148331766Sken} fc_header_t;
149331766Sken
150331766Sken
151331766Sken/**
152331766Sken * @brief FC header in little-endian order
153331766Sken */
154331766Skentypedef struct fc_header_le_s {
155331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
156331766Sken	uint32_t	d_id:24,
157331766Sken			info:4,
158331766Sken			r_ctl:4;
159331766Sken	uint32_t	s_id:24,
160331766Sken			cs_ctl:8;
161331766Sken	uint32_t	f_ctl:24,
162331766Sken			type:8;
163331766Sken	uint32_t	seq_cnt:16,
164331766Sken			df_ctl:8,
165331766Sken			seq_id:8;
166331766Sken	uint32_t	rx_id:16,
167331766Sken			ox_id:16;
168331766Sken	uint32_t	parameter;
169331766Sken#else
170331766Sken#error big endian version not defined
171331766Sken#endif
172331766Sken} fc_header_le_t;
173331766Sken
174331766Sken/**
175331766Sken * @brief FC VM header in big-endian order
176331766Sken */
177331766Skentypedef struct fc_vm_header_s {
178331766Sken	uint32_t	dst_vmid;
179331766Sken	uint32_t	src_vmid;
180331766Sken	uint32_t	rsvd0;
181331766Sken	uint32_t	rsvd1;
182331766Sken} fc_vm_header_t;
183331766Sken
184331766Sken#define FC_DFCTL_DEVICE_HDR_16_MASK	0x1
185331766Sken#define FC_DFCTL_NETWORK_HDR_MASK	0x20
186331766Sken#define FC_DFCTL_ESP_HDR_MASK		0x40
187331766Sken#define FC_DFCTL_NETWORK_HDR_SIZE	16
188331766Sken#define FC_DFCTL_ESP_HDR_SIZE		0 //FIXME
189331766Sken
190331766Sken#define FC_RCTL_FC4_DATA	0
191331766Sken#define FC_RCTL_ELS		2
192331766Sken#define FC_RCTL_BLS		8
193331766Sken
194331766Sken#define FC_RCTL_INFO_UNCAT	0
195331766Sken#define FC_RCTL_INFO_SOL_DATA	1
196331766Sken#define FC_RCTL_INFO_UNSOL_CTRL	2
197331766Sken#define FC_RCTL_INFO_SOL_CTRL	3
198331766Sken#define FC_RCTL_INFO_UNSOL_DATA	4
199331766Sken#define FC_RCTL_INFO_DATA_DESC	5
200331766Sken#define FC_RCTL_INFO_UNSOL_CMD	6
201331766Sken#define FC_RCTL_INFO_CMD_STATUS	7
202331766Sken
203331766Sken#define FC_FCTL_EXCHANGE_RESPONDER	0x800000
204331766Sken#define FC_FCTL_SEQUENCE_CONTEXT	0x400000
205331766Sken#define FC_FCTL_FIRST_SEQUENCE		0x200000
206331766Sken#define FC_FCTL_LAST_SEQUENCE		0x100000
207331766Sken#define FC_FCTL_END_SEQUENCE		0x080000
208331766Sken#define FC_FCTL_END_CONNECTION		0x040000
209331766Sken#define FC_FCTL_PRIORITY_ENABLE		0x020000
210331766Sken#define FC_FCTL_SEQUENCE_INITIATIVE	0x010000
211331766Sken#define FC_FCTL_FILL_DATA_BYTES_MASK	0x000003
212331766Sken
213331766Sken/**
214331766Sken * Common BLS definitions:
215331766Sken */
216331766Sken#define FC_INFO_NOP			0x0
217331766Sken#define FC_INFO_ABTS			0x1
218331766Sken#define FC_INFO_RMC			0x2
219331766Sken/* reserved				0x3 */
220331766Sken#define FC_INFO_BA_ACC			0x4
221331766Sken#define FC_INFO_BA_RJT			0x5
222331766Sken#define FC_INFO_PRMT			0x6
223331766Sken
224331766Sken/* (FC-LS) LS_RJT Reason Codes */
225331766Sken#define FC_REASON_INVALID_COMMAND_CODE		0x01
226331766Sken#define FC_REASON_LOGICAL_ERROR			0x03
227331766Sken#define FC_REASON_LOGICAL_BUSY			0x05
228331766Sken#define FC_REASON_PROTOCOL_ERROR		0x07
229331766Sken#define FC_REASON_UNABLE_TO_PERFORM		0x09
230331766Sken#define FC_REASON_COMMAND_NOT_SUPPORTED		0x0b
231331766Sken#define FC_REASON_COMMAND_IN_PROGRESS   	0x0e
232331766Sken#define FC_REASON_VENDOR_SPECIFIC		0xff
233331766Sken
234331766Sken/* (FC-LS) LS_RJT Reason Codes Explanations */
235331766Sken#define FC_EXPL_NO_ADDITIONAL			0x00
236331766Sken#define FC_EXPL_SPARAM_OPTIONS			0x01
237331766Sken#define FC_EXPL_SPARAM_INITIATOR		0x03
238331766Sken#define FC_EXPL_SPARAM_RECPIENT			0x05
239331766Sken#define FC_EXPL_SPARM_DATA_SIZE			0x07
240331766Sken#define FC_EXPL_SPARM_CONCURRENT		0x09
241331766Sken#define FC_EXPL_SPARM_CREDIT			0x0b
242331766Sken#define FC_EXPL_INV_PORT_NAME 			0x0d
243331766Sken#define FC_EXPL_INV_NODE_NAME 			0x0e
244331766Sken#define FC_EXPL_INV_COMMON_SPARAMS 		0x0f
245331766Sken#define FC_EXPL_INV_ASSOC_HEADER		0x11
246331766Sken#define FC_EXPL_ASSOC_HDR_REQUIRED		0x13
247331766Sken#define FC_EXPL_INV_ORIGINATOR_S_ID		0x15
248331766Sken#define FC_EXPL_INV_X_ID_COMBINATION		0x17
249331766Sken#define FC_EXPL_COMMAND_IN_PROGRESS		0x19
250331766Sken#define FC_EXPL_NPORT_LOGIN_REQUIRED		0x1e
251331766Sken#define FC_EXPL_N_PORT_ID			0x1f
252331766Sken#define FC_EXPL_INSUFFICIENT_RESOURCES		0x29
253331766Sken#define FC_EXPL_UNABLE_TO_SUPPLY_DATA		0x2a
254331766Sken#define FC_EXPL_REQUEST_NOT_SUPPORTED		0x2c
255331766Sken#define FC_EXPL_INV_PAYLOAD_LEN			0x1d
256331766Sken#define FC_EXPL_INV_PORT_NODE_NAME		0x44
257331766Sken#define FC_EXPL_LOGIN_EXT_NOT_SUPPORTED		0x46
258331766Sken#define FC_EXPL_AUTH_REQUIRED			0x48
259331766Sken#define FC_EXPL_SCAN_VALUE_NOT_ALLOWED		0x50
260331766Sken#define FC_EXPL_SCAN_VALUE_NOT_SUPPORTED 	0x51
261331766Sken#define FC_EXPL_NO_RESOURCES_ASSIGNED		0x52
262331766Sken#define FC_EXPL_MAC_ADDR_MODE_NOT_SUPPORTED	0x60
263331766Sken#define FC_EXPL_MAC_ADDR_INCORRECTLY_FORMED	0x61
264331766Sken#define FC_EXPL_VN2VN_PORT_NOT_IN_NEIGHBOR_SET	0x62
265331766Sken
266331766Sken#define FC_EXPL_INV_X_ID			0x03	/* invalid OX_ID - RX_ID combination */
267331766Sken#define FC_EXPL_SEQUENCE_ABORTED		0x05
268331766Sken
269331766Skentypedef struct fc_ba_acc_payload_s {
270331766Sken#define FC_SEQ_ID_VALID			0x80
271331766Sken#define FC_SEQ_ID_INVALID		0x00
272331766Sken	uint32_t	seq_id_validity:8,
273331766Sken			seq_id:8,
274331766Sken			:16;
275331766Sken	uint32_t	ox_id:16,
276331766Sken			rx_id:16;
277331766Sken	uint32_t	low_seq_cnt:16,
278331766Sken			high_seq_cnt:16;
279331766Sken} fc_ba_acc_payload_t;
280331766Sken
281331766Skentypedef struct fc_ba_rjt_payload_s {
282331766Sken	uint32_t	vendor_unique:8,
283331766Sken			reason_explanation:8,
284331766Sken			reason_code:8,
285331766Sken			:8;
286331766Sken} fc_ba_rjt_payload_t;
287331766Sken
288331766Skentypedef struct fc_els_gen_s {
289331766Sken	uint32_t	command_code: 8,
290331766Sken			resv1: 24;
291331766Sken} fc_els_gen_t;
292331766Sken
293331766Skentypedef struct fc_plogi_playload_s {
294331766Sken	uint32_t	command_code: 8,
295331766Sken			resv1: 24;
296331766Sken	uint32_t	common_service_parameters[4];
297331766Sken	uint32_t	port_name_hi;
298331766Sken	uint32_t	port_name_lo;
299331766Sken	uint32_t	node_name_hi;
300331766Sken	uint32_t	node_name_lo;
301331766Sken	uint32_t	class1_service_parameters[4];
302331766Sken	uint32_t	class2_service_parameters[4];
303331766Sken	uint32_t	class3_service_parameters[4];
304331766Sken	uint32_t	class4_service_parameters[4];
305331766Sken	uint32_t	vendor_version_level[4];
306331766Sken} fc_plogi_payload_t;
307331766Sken
308331766Skentypedef fc_plogi_payload_t fc_sparms_t;
309331766Sken
310331766Skentypedef struct fc_logo_payload_s {
311331766Sken	uint32_t	command_code: 8,
312331766Sken			resv1:24;
313331766Sken	uint32_t	:8,
314331766Sken			port_id:24;
315331766Sken	uint32_t	port_name_hi;
316331766Sken	uint32_t	port_name_lo;
317331766Sken} fc_logo_payload_t;
318331766Sken
319331766Skentypedef struct fc_acc_payload_s {
320331766Sken	uint32_t	command_code: 8,
321331766Sken			resv1:24;
322331766Sken} fc_acc_payload_t;
323331766Sken
324331766Sken
325331766Skentypedef struct fc_ls_rjt_payload_s {
326331766Sken	uint32_t	command_code:8,
327331766Sken			resv1:24;
328331766Sken	uint32_t	resv2:8,
329331766Sken			reason_code:8,
330331766Sken			reason_code_exp:8,
331331766Sken			vendor_unique:8;
332331766Sken} fc_ls_rjt_payload_t;
333331766Sken
334331766Skentypedef struct fc_prli_payload_s {
335331766Sken	uint32_t	command_code:8,
336331766Sken			page_length:8,
337331766Sken			payload_length:16;
338331766Sken	uint32_t	type:8,
339331766Sken			type_ext:8,
340331766Sken			flags:16;
341331766Sken	uint32_t	originator_pa;
342331766Sken	uint32_t	responder_pa;
343331766Sken	uint32_t	:16,
344331766Sken			service_params:16;
345331766Sken} fc_prli_payload_t;
346331766Sken
347331766Skentypedef struct fc_prlo_payload_s {
348331766Sken	uint32_t	command_code:8,
349331766Sken			page_length:8,
350331766Sken			payload_length:16;
351331766Sken	uint32_t	type:8,
352331766Sken			type_ext:8,
353331766Sken			:16;
354331766Sken	uint32_t	:32;
355331766Sken	uint32_t	:32;
356331766Sken	uint32_t	:32;
357331766Sken} fc_prlo_payload_t;
358331766Sken
359331766Skentypedef struct fc_prlo_acc_payload_s {
360331766Sken	uint32_t	command_code:8,
361331766Sken			page_length:8,
362331766Sken			payload_length:16;
363331766Sken	uint32_t	type:8,
364331766Sken			type_ext:8,
365331766Sken			:4,
366331766Sken			response_code:4,
367331766Sken			:8;
368331766Sken	uint32_t	:32;
369331766Sken	uint32_t	:32;
370331766Sken	uint32_t	:32;
371331766Sken} fc_prlo_acc_payload_t;
372331766Sken
373331766Skentypedef struct fc_adisc_payload_s {
374331766Sken	uint32_t	command_code:8,
375331766Sken			payload_length:24;
376331766Sken	uint32_t	:8,
377331766Sken			hard_address:24;
378331766Sken	uint32_t	port_name_hi;
379331766Sken	uint32_t	port_name_lo;
380331766Sken	uint32_t	node_name_hi;
381331766Sken	uint32_t	node_name_lo;
382331766Sken	uint32_t	:8,
383331766Sken			port_id:24;
384331766Sken} fc_adisc_payload_t;
385331766Sken
386331766Sken/* PRLI flags */
387331766Sken#define FC_PRLI_ORIGINATOR_PA_VALID	0x8000
388331766Sken#define FC_PRLI_RESPONDER_PA_VALID	0x4000
389331766Sken#define FC_PRLI_ESTABLISH_IMAGE_PAIR	0x2000
390331766Sken#define FC_PRLI_SERVICE_PARAM_INVALID	0x0800
391331766Sken#define FC_PRLI_REQUEST_EXECUTED	0x0100
392331766Sken
393331766Sken/* PRLI Service Parameters */
394331766Sken#define FC_PRLI_REC_SUPPORT		0x0400
395331766Sken#define FC_PRLI_TASK_RETRY_ID_REQ	0x0200
396331766Sken#define FC_PRLI_RETRY			0x0100
397331766Sken#define FC_PRLI_CONFIRMED_COMPLETION	0x0080
398331766Sken#define FC_PRLI_DATA_OVERLAY		0x0040
399331766Sken#define FC_PRLI_INITIATOR_FUNCTION      0x0020
400331766Sken#define FC_PRLI_TARGET_FUNCTION         0x0010
401331766Sken#define FC_PRLI_READ_XRDY_DISABLED	0x0002
402331766Sken#define FC_PRLI_WRITE_XRDY_DISABLED	0x0001
403331766Sken
404331766Sken/* PRLO Logout flags */
405331766Sken#define FC_PRLO_REQUEST_EXECUTED	0x0001
406331766Sken
407331766Skentypedef struct fc_scr_payload_s {
408331766Sken	uint32_t	command_code:8,
409331766Sken			:24;
410331766Sken	uint32_t	:24,
411331766Sken			function:8;
412331766Sken} fc_scr_payload_t;
413331766Sken
414331766Sken#define FC_SCR_REG_FABRIC		1
415331766Sken#define FC_SCR_REG_NPORT		2
416331766Sken#define FC_SCR_REG_FULL			3
417331766Sken
418331766Skentypedef struct {
419331766Sken	uint32_t :2,
420331766Sken		rscn_event_qualifier:4,
421331766Sken		address_format:2,
422331766Sken		port_id:24;
423331766Sken} fc_rscn_affected_port_id_page_t;
424331766Sken
425331766Skentypedef struct fc_rscn_payload_s {
426331766Sken	uint32_t	command_code:8,
427331766Sken			page_length:8,
428331766Sken			payload_length:16;
429331766Sken	fc_rscn_affected_port_id_page_t port_list[1];
430331766Sken} fc_rscn_payload_t;
431331766Sken
432331766Skentypedef struct fcct_iu_header_s {
433331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
434331766Sken	uint32_t	revision:8,
435331766Sken			in_id:24;
436331766Sken	uint32_t	gs_type:8,
437331766Sken			gs_subtype:8,
438331766Sken			options:8,
439331766Sken			resv1:8;
440331766Sken	uint32_t	cmd_rsp_code:16,
441331766Sken			max_residual_size:16;
442331766Sken	uint32_t	fragment_id:8,
443331766Sken			reason_code:8,
444331766Sken			reason_code_explanation:8,
445331766Sken			vendor_specific:8;
446331766Sken#else
447331766Sken#error big endian version not defined
448331766Sken#endif
449331766Sken} fcct_iu_header_t;
450331766Sken
451331766Sken#define FCCT_REJECT_INVALID_COMMAND_CODE	1
452331766Sken#define FCCT_REJECT_INVALID_VERSION_LEVEL	2
453331766Sken#define FCCT_LOGICAL_ERROR			3
454331766Sken#define FCCT_INVALID_CT_IU_SIZE			4
455331766Sken#define FCCT_LOGICAL_BUSY			5
456331766Sken#define FCCT_PROTOCOL_ERROR			7
457331766Sken#define FCCT_UNABLE_TO_PERFORM			9
458331766Sken#define FCCT_COMMAND_NOT_SUPPORTED		0x0b
459331766Sken#define FCCT_FABRIC_PORT_NAME_NOT_REGISTERED	0x0c
460331766Sken#define FCCT_SERVER_NOT_AVAILABLE		0x0d
461331766Sken#define FCCT_SESSION_COULD_NOT_BE_ESTABLISHED	0x0e
462331766Sken#define FCCT_VENDOR_SPECIFIC_ERROR		0xff
463331766Sken
464331766Sken#define FCCT_NO_ADDITIONAL_EXPLANATION		0
465331766Sken#define FCCT_AUTHORIZATION_EXCEPTION		0xf0
466331766Sken#define FCCT_AUTHENTICATION_EXCEPTION		0xf1
467331766Sken#define FCCT_DATA_BASE_FULL			0xf2
468331766Sken#define FCCT_DATA_BASE_EMPTY			0xf3
469331766Sken#define FCCT_PROCESSING_REQUEST			0xf4
470331766Sken#define FCCT_UNABLE_TO_VERIFY_CONNECTION	0xf5
471331766Sken#define FCCT_DEVICES_NOT_IN_COMMON_ZONE		0xf6
472331766Sken
473331766Skentypedef struct {
474331766Sken	fcct_iu_header_t hdr;
475331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
476331766Sken	uint32_t	port_id;
477331766Sken	uint32_t	fc4_types;
478331766Sken#else
479331766Sken#error big endian version not defined
480331766Sken#endif
481331766Sken} fcgs_rft_id_t;
482331766Sken
483331766Skentypedef struct {
484331766Sken	fcct_iu_header_t hdr;
485331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
486331766Sken	uint32_t	port_id;
487331766Sken	uint32_t	:16,
488331766Sken			fc4_features:8,
489331766Sken			type_code:8;
490331766Sken#else
491331766Sken#error big endian version not defined
492331766Sken#endif
493331766Sken} fcgs_rff_id_t;
494331766Sken
495331766Sken#pragma pack(1)
496331766Skentypedef struct {
497331766Sken	fcct_iu_header_t hdr;
498331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
499331766Sken	uint32_t	port_id;
500331766Sken	uint64_t	port_name;
501331766Sken#else
502331766Sken#error big endian version not defined
503331766Sken#endif
504331766Sken} fcgs_rpn_id_t;
505331766Sken#pragma pack()
506331766Sken
507331766Sken#pragma pack(1)
508331766Skentypedef struct {
509331766Sken	fcct_iu_header_t hdr;
510331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
511331766Sken	uint32_t	port_id;
512331766Sken	uint64_t	node_name;
513331766Sken#else
514331766Sken#error big endian version not defined
515331766Sken#endif
516331766Sken} fcgs_rnn_id_t;
517331766Sken#pragma pack()
518331766Sken
519331766Sken#define FCCT_CLASS_OF_SERVICE_F	0x1
520331766Sken#define FCCT_CLASS_OF_SERVICE_2	0x4
521331766Sken#define FCCT_CLASS_OF_SERVICE_3	0x8
522331766Sken#pragma pack(1)
523331766Skentypedef struct {
524331766Sken	fcct_iu_header_t hdr;
525331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
526331766Sken	uint32_t	port_id;
527331766Sken	uint32_t	class_of_srvc;
528331766Sken#else
529331766Sken#error big endian version not defined
530331766Sken#endif
531331766Sken} fcgs_rcs_id_t;
532331766Sken#pragma pack()
533331766Sken
534331766Sken#pragma pack(1)
535331766Skentypedef struct {
536331766Sken	fcct_iu_header_t hdr;
537331766Sken#if BYTE_ORDER == LITTLE_ENDIAN
538331766Sken	uint64_t	node_name;
539331766Sken	uint8_t		name_len;
540331766Sken	char		sym_node_name[1];
541331766Sken/*TODO: need name length and symbolic name */
542331766Sken#else
543331766Sken#error big endian version not defined
544331766Sken#endif
545331766Sken} fcgs_rsnn_nn_t;
546331766Sken#pragma pack()
547331766Sken
548331766Sken#define FCCT_HDR_CMDRSP_ACCEPT	0x8002
549331766Sken#define FCCT_HDR_CMDRSP_REJECT	0x8001
550331766Sken
551331766Skenstatic inline void fcct_build_req_header(fcct_iu_header_t *hdr, uint16_t cmd, uint16_t max_size)
552331766Sken{
553331766Sken	/* use old rev (1) to accommodate older switches */
554331766Sken	hdr->revision = 1;
555331766Sken	hdr->in_id = 0;
556331766Sken	hdr->gs_type = FC_GS_TYPE_DIRECTORY_SERVICE;
557331766Sken	hdr->gs_subtype = FC_GS_SUBTYPE_NAME_SERVER;
558331766Sken	hdr->options = 0;
559331766Sken	hdr->resv1 = 0;
560331766Sken	hdr->cmd_rsp_code = ocs_htobe16(cmd);
561331766Sken	hdr->max_residual_size = ocs_htobe16(max_size/(sizeof(uint32_t))); /* words */
562331766Sken	hdr->fragment_id = 0;
563331766Sken	hdr->reason_code = 0;
564331766Sken	hdr->reason_code_explanation = 0;
565331766Sken	hdr->vendor_specific = 0;
566331766Sken}
567331766Sken
568331766Skentypedef struct fcct_rftid_req_s {
569331766Sken	fcct_iu_header_t	hdr;
570331766Sken	uint32_t		port_id;
571331766Sken	uint32_t		fc4_types[8];
572331766Sken} fcct_rftid_req_t;
573331766Sken
574331766Sken#define FC4_FEATURE_TARGET	(1U << 0)
575331766Sken#define FC4_FEATURE_INITIATOR	(1U << 1)
576331766Sken
577331766Skentypedef struct fcct_rffid_req_s {
578331766Sken	fcct_iu_header_t	hdr;
579331766Sken	uint32_t		port_id;
580331766Sken	uint32_t		:16,
581331766Sken				fc4_feature_bits:8,
582331766Sken				type:8;
583331766Sken} fcct_rffid_req_t;
584331766Sken
585331766Skentypedef struct fcct_gnnid_req_s {
586331766Sken	fcct_iu_header_t	hdr;
587331766Sken	uint32_t		:8,
588331766Sken				port_id:24;
589331766Sken} fcct_gnnid_req_t;
590331766Sken
591331766Skentypedef struct fcct_gpnid_req_s {
592331766Sken	fcct_iu_header_t	hdr;
593331766Sken	uint32_t		:8,
594331766Sken				port_id:24;
595331766Sken} fcct_gpnid_req_t;
596331766Sken
597331766Skentypedef struct fcct_gffid_req_s {
598331766Sken	fcct_iu_header_t	hdr;
599331766Sken	uint32_t		:8,
600331766Sken				port_id:24;
601331766Sken} fcct_gffid_req_t;
602331766Sken
603331766Skentypedef struct fcct_gidft_req_s {
604331766Sken	fcct_iu_header_t	hdr;
605331766Sken	uint32_t		:8,
606331766Sken				domain_id_scope:8,
607331766Sken				area_id_scope:8,
608331766Sken				type:8;
609331766Sken} fcct_gidft_req_t;
610331766Sken
611331766Skentypedef struct fcct_gidpt_req_s {
612331766Sken	fcct_iu_header_t	hdr;
613331766Sken	uint32_t		port_type:8,
614331766Sken				domain_id_scope:8,
615331766Sken				area_id_scope:8,
616331766Sken				flags:8;
617331766Sken} fcct_gidpt_req_t;
618331766Sken
619331766Skentypedef struct fcct_gnnid_acc_s {
620331766Sken	fcct_iu_header_t	hdr;
621331766Sken	uint64_t		node_name;
622331766Sken} fcct_gnnid_acc_t;
623331766Sken
624331766Skentypedef struct fcct_gpnid_acc_s {
625331766Sken	fcct_iu_header_t	hdr;
626331766Sken	uint64_t		port_name;
627331766Sken} fcct_gpnid_acc_t;
628331766Sken
629331766Skentypedef struct fcct_gffid_acc_s {
630331766Sken	fcct_iu_header_t	hdr;
631331766Sken	uint8_t			fc4_feature_bits;
632331766Sken} fcct_gffid_acc_t;
633331766Sken
634331766Skentypedef struct fcct_gidft_acc_s {
635331766Sken	fcct_iu_header_t	hdr;
636331766Sken	struct {
637331766Sken		uint32_t	ctl:8,
638331766Sken				port_id:24;
639331766Sken	} port_list[1];
640331766Sken} fcct_gidft_acc_t;
641331766Sken
642331766Skentypedef struct fcct_gidpt_acc_s {
643331766Sken	fcct_iu_header_t	hdr;
644331766Sken	struct {
645331766Sken		uint32_t	ctl:8,
646331766Sken				port_id:24;
647331766Sken	} port_list[1];
648331766Sken} fcct_gidpt_acc_t;
649331766Sken
650331766Sken#define FCCT_GID_PT_LAST_ID	0x80
651331766Sken#define FCCT_GIDPT_ID_MASK	0x00ffffff
652331766Sken
653331766Skentypedef struct fcp_cmnd_iu_s {
654331766Sken	uint8_t		fcp_lun[8];
655331766Sken	uint8_t		command_reference_number;
656331766Sken	uint8_t		task_attribute:3,
657331766Sken			command_priority:4,
658331766Sken			:1;
659331766Sken	uint8_t		task_management_flags;
660331766Sken	uint8_t		wrdata:1,
661331766Sken			rddata:1,
662331766Sken			additional_fcp_cdb_length:6;
663331766Sken	uint8_t		fcp_cdb[16];
664331766Sken	uint8_t		fcp_cdb_and_dl[20];	/* < May contain up to 16 bytes of CDB, followed by fcp_dl */
665331766Sken} fcp_cmnd_iu_t;
666331766Sken
667331766Sken#define FCP_LUN_ADDRESS_METHOD_SHIFT	6
668331766Sken#define FCP_LUN_ADDRESS_METHOD_MASK	0xc0
669331766Sken#define FCP_LUN_ADDR_METHOD_PERIPHERAL	0x0
670331766Sken#define FCP_LUN_ADDR_METHOD_FLAT	0x1
671331766Sken#define FCP_LUN_ADDR_METHOD_LOGICAL	0x2
672331766Sken#define FCP_LUN_ADDR_METHOD_EXTENDED	0x3
673331766Sken
674331766Sken#define FCP_LUN_ADDR_SIMPLE_MAX		0xff
675331766Sken#define FCP_LUN_ADDR_FLAT_MAX		0x3fff
676331766Sken
677331766Sken#define FCP_TASK_ATTR_SIMPLE		0x0
678331766Sken#define FCP_TASK_ATTR_HEAD_OF_QUEUE	0x1
679331766Sken#define FCP_TASK_ATTR_ORDERED		0x2
680331766Sken#define FCP_TASK_ATTR_ACA		0x4
681331766Sken#define FCP_TASK_ATTR_UNTAGGED          0x5
682331766Sken
683331766Sken#define FCP_QUERY_TASK_SET		BIT(0)
684331766Sken#define FCP_ABORT_TASK_SET		BIT(1)
685331766Sken#define FCP_CLEAR_TASK_SET		BIT(2)
686331766Sken#define FCP_QUERY_ASYNCHRONOUS_EVENT	BIT(3)
687331766Sken#define FCP_LOGICAL_UNIT_RESET		BIT(4)
688331766Sken#define FCP_TARGET_RESET		BIT(5)
689331766Sken#define FCP_CLEAR_ACA			BIT(6)
690331766Sken
691331766Sken/* SPC-4 says that the maximum length of sense data is 252 bytes */
692331766Sken#define FCP_MAX_SENSE_LEN		252
693331766Sken#define FCP_MAX_RSP_LEN			  8
694331766Sken/*
695331766Sken * FCP_RSP buffer will either have sense or response data, but not both
696331766Sken * so pick the larger.
697331766Sken */
698331766Sken#define FCP_MAX_RSP_INFO_LEN		FCP_MAX_SENSE_LEN
699331766Sken
700331766Skentypedef struct fcp_rsp_iu_s {
701331766Sken	uint8_t		rsvd[8];
702331766Sken	uint8_t		status_qualifier[2];
703331766Sken	uint8_t		flags;
704331766Sken	uint8_t		scsi_status;
705331766Sken	uint8_t		fcp_resid[4];
706331766Sken	uint8_t		fcp_sns_len[4];
707331766Sken	uint8_t		fcp_rsp_len[4];
708331766Sken	uint8_t		data[FCP_MAX_RSP_INFO_LEN];
709331766Sken} fcp_rsp_iu_t;
710331766Sken
711331766Sken/** Flag field defines: */
712331766Sken#define FCP_RSP_LEN_VALID		BIT(0)
713331766Sken#define FCP_SNS_LEN_VALID		BIT(1)
714331766Sken#define FCP_RESID_OVER			BIT(2)
715331766Sken#define FCP_RESID_UNDER			BIT(3)
716331766Sken#define FCP_CONF_REQ			BIT(4)
717331766Sken#define FCP_BIDI_READ_RESID_OVER	BIT(5)
718331766Sken#define FCP_BIDI_READ_RESID_UNDER	BIT(6)
719331766Sken#define FCP_BIDI_RSP			BIT(7)
720331766Sken
721331766Sken/** Status values: */
722331766Sken#define FCP_TMF_COMPLETE		0x00
723331766Sken#define FCP_DATA_LENGTH_MISMATCH	0x01
724331766Sken#define FCP_INVALID_FIELD		0x02
725331766Sken#define FCP_DATA_RO_MISMATCH		0x03
726331766Sken#define FCP_TMF_REJECTED		0x04
727331766Sken#define FCP_TMF_FAILED			0x05
728331766Sken#define FCP_TMF_SUCCEEDED		0x08
729331766Sken#define FCP_TMF_INCORRECT_LUN		0x09
730331766Sken
731331766Sken/** FCP-4 Table 28, TMF response information: */
732331766Skentypedef struct fc_rsp_info_s {
733331766Sken	uint8_t addl_rsp_info[3];
734331766Sken	uint8_t rsp_code;
735331766Sken	uint32_t :32;
736331766Sken} fcp_rsp_info_t;
737331766Sken
738331766Skentypedef struct fcp_xfer_rdy_iu_s {
739331766Sken	uint8_t		fcp_data_ro[4];
740331766Sken	uint8_t		fcp_burst_len[4];
741331766Sken	uint8_t		rsvd[4];
742331766Sken} fcp_xfer_rdy_iu_t;
743331766Sken
744331766Sken#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))
745331766Sken
746331766Sken
747331766Sken#endif /* !_OCS_FCP_H */
748