1 /* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */
2 /*
3  *  FC Transport BSG Interface
4  *
5  *  Copyright (C) 2008   James Smart, Emulex Corporation
6  */
7 
8 #ifndef SCSI_BSG_FC_H
9 #define SCSI_BSG_FC_H
10 
11 #include <linux/types.h>
12 
13 /*
14  * This file intended to be included by both kernel and user space
15  */
16 
17 /*
18  * FC Transport SGIO v4 BSG Message Support
19  */
20 
21 /* Default BSG request timeout (in seconds) */
22 #define FC_DEFAULT_BSG_TIMEOUT		(10 * HZ)
23 
24 
25 /*
26  * Request Message Codes supported by the FC Transport
27  */
28 
29 /* define the class masks for the message codes */
30 #define FC_BSG_CLS_MASK		0xF0000000	/* find object class */
31 #define FC_BSG_HST_MASK		0x80000000	/* fc host class */
32 #define FC_BSG_RPT_MASK		0x40000000	/* fc rport class */
33 
34 	/* fc_host Message Codes */
35 #define FC_BSG_HST_ADD_RPORT		(FC_BSG_HST_MASK | 0x00000001)
36 #define FC_BSG_HST_DEL_RPORT		(FC_BSG_HST_MASK | 0x00000002)
37 #define FC_BSG_HST_ELS_NOLOGIN		(FC_BSG_HST_MASK | 0x00000003)
38 #define FC_BSG_HST_CT			(FC_BSG_HST_MASK | 0x00000004)
39 #define FC_BSG_HST_VENDOR		(FC_BSG_HST_MASK | 0x000000FF)
40 
41 	/* fc_rport Message Codes */
42 #define FC_BSG_RPT_ELS			(FC_BSG_RPT_MASK | 0x00000001)
43 #define FC_BSG_RPT_CT			(FC_BSG_RPT_MASK | 0x00000002)
44 
45 
46 
47 /*
48  * FC Address Identifiers in Message Structures :
49  *
50  *   Whenever a command payload contains a FC Address Identifier
51  *   (aka port_id), the value is effectively in big-endian
52  *   order, thus the array elements are decoded as follows:
53  *     element [0] is bits 23:16 of the FC Address Identifier
54  *     element [1] is bits 15:8 of the FC Address Identifier
55  *     element [2] is bits 7:0 of the FC Address Identifier
56  */
57 
58 
59 /*
60  * FC Host Messages
61  */
62 
63 /* FC_BSG_HST_ADDR_PORT : */
64 
65 /* Request:
66  * This message requests the FC host to login to the remote port
67  * at the specified N_Port_Id.  The remote port is to be enumerated
68  * with the transport upon completion of the login.
69  */
70 struct fc_bsg_host_add_rport {
71 	__u8	reserved;
72 
73 	/* FC Address Identier of the remote port to login to */
74 	__u8	port_id[3];
75 };
76 
77 /* Response:
78  * There is no additional response data - fc_bsg_reply->result is sufficient
79  */
80 
81 
82 /* FC_BSG_HST_DEL_RPORT : */
83 
84 /* Request:
85  * This message requests the FC host to remove an enumerated
86  * remote port and to terminate the login to it.
87  *
88  * Note: The driver is free to reject this request if it desires to
89  * remain logged in with the remote port.
90  */
91 struct fc_bsg_host_del_rport {
92 	__u8	reserved;
93 
94 	/* FC Address Identier of the remote port to logout of */
95 	__u8	port_id[3];
96 };
97 
98 /* Response:
99  * There is no additional response data - fc_bsg_reply->result is sufficient
100  */
101 
102 
103 /* FC_BSG_HST_ELS_NOLOGIN : */
104 
105 /* Request:
106  * This message requests the FC_Host to send an ELS to a specific
107  * N_Port_ID. The host does not need to log into the remote port,
108  * nor does it need to enumerate the rport for further traffic
109  * (although, the FC host is free to do so if it desires).
110  */
111 struct fc_bsg_host_els {
112 	/*
113 	 * ELS Command Code being sent (must be the same as byte 0
114 	 * of the payload)
115 	 */
116 	__u8	command_code;
117 
118 	/* FC Address Identier of the remote port to send the ELS to */
119 	__u8	port_id[3];
120 };
121 
122 /* Response:
123  */
124 /* fc_bsg_ctels_reply->status values */
125 #define FC_CTELS_STATUS_OK	0x00000000
126 #define FC_CTELS_STATUS_REJECT	0x00000001
127 #define FC_CTELS_STATUS_P_RJT	0x00000002
128 #define FC_CTELS_STATUS_F_RJT	0x00000003
129 #define FC_CTELS_STATUS_P_BSY	0x00000004
130 #define FC_CTELS_STATUS_F_BSY	0x00000006
131 struct fc_bsg_ctels_reply {
132 	/*
133 	 * Note: An ELS LS_RJT may be reported in 2 ways:
134 	 *  a) A status of FC_CTELS_STATUS_OK is returned. The caller
135 	 *     is to look into the ELS receive payload to determine
136 	 *     LS_ACC or LS_RJT (by contents of word 0). The reject
137 	 *     data will be in word 1.
138 	 *  b) A status of FC_CTELS_STATUS_REJECT is returned, The
139 	 *     rjt_data field will contain valid data.
140 	 *
141 	 * Note: ELS LS_ACC is determined by an FC_CTELS_STATUS_OK, and
142 	 *   the receive payload word 0 indicates LS_ACC
143 	 *   (e.g. value is 0x02xxxxxx).
144 	 *
145 	 * Note: Similarly, a CT Reject may be reported in 2 ways:
146 	 *  a) A status of FC_CTELS_STATUS_OK is returned. The caller
147 	 *     is to look into the CT receive payload to determine
148 	 *     Accept or Reject (by contents of word 2). The reject
149 	 *     data will be in word 3.
150 	 *  b) A status of FC_CTELS_STATUS_REJECT is returned, The
151 	 *     rjt_data field will contain valid data.
152 	 *
153 	 * Note: x_RJT/BSY status will indicae that the rjt_data field
154 	 *   is valid and contains the reason/explanation values.
155 	 */
156 	__u32	status;		/* See FC_CTELS_STATUS_xxx */
157 
158 	/* valid if status is not FC_CTELS_STATUS_OK */
159 	struct	{
160 		__u8	action;		/* fragment_id for CT REJECT */
161 		__u8	reason_code;
162 		__u8	reason_explanation;
163 		__u8	vendor_unique;
164 	} rjt_data;
165 };
166 
167 
168 /* FC_BSG_HST_CT : */
169 
170 /* Request:
171  * This message requests that a CT Request be performed with the
172  * indicated N_Port_ID. The driver is responsible for logging in with
173  * the fabric and/or N_Port_ID, etc as per FC rules. This request does
174  * not mandate that the driver must enumerate the destination in the
175  * transport. The driver is allowed to decide whether to enumerate it,
176  * and whether to tear it down after the request.
177  */
178 struct fc_bsg_host_ct {
179 	__u8	reserved;
180 
181 	/* FC Address Identier of the remote port to send the ELS to */
182 	__u8	port_id[3];
183 
184 	/*
185 	 * We need words 0-2 of the generic preamble for the LLD's
186 	 */
187 	__u32	preamble_word0;	/* revision & IN_ID */
188 	__u32	preamble_word1;	/* GS_Type, GS_SubType, Options, Rsvd */
189 	__u32	preamble_word2;	/* Cmd Code, Max Size */
190 
191 };
192 /* Response:
193  *
194  * The reply structure is an fc_bsg_ctels_reply structure
195  */
196 
197 
198 /* FC_BSG_HST_VENDOR : */
199 
200 /* Request:
201  * Note: When specifying vendor_id, be sure to read the Vendor Type and ID
202  *   formatting requirements specified in scsi_netlink.h
203  */
204 struct fc_bsg_host_vendor {
205 	/*
206 	 * Identifies the vendor that the message is formatted for. This
207 	 * should be the recipient of the message.
208 	 */
209 	__u64 vendor_id;
210 
211 	/* start of vendor command area */
212 	__u32 vendor_cmd[];
213 };
214 
215 /* Response:
216  */
217 struct fc_bsg_host_vendor_reply {
218 	/* start of vendor response area */
219 	__DECLARE_FLEX_ARRAY(__u32, vendor_rsp);
220 };
221 
222 
223 
224 /*
225  * FC Remote Port Messages
226  */
227 
228 /* FC_BSG_RPT_ELS : */
229 
230 /* Request:
231  * This message requests that an ELS be performed with the rport.
232  */
233 struct fc_bsg_rport_els {
234 	/*
235 	 * ELS Command Code being sent (must be the same as
236 	 * byte 0 of the payload)
237 	 */
238 	__u8 els_code;
239 };
240 
241 /* Response:
242  *
243  * The reply structure is an fc_bsg_ctels_reply structure
244  */
245 
246 
247 /* FC_BSG_RPT_CT : */
248 
249 /* Request:
250  * This message requests that a CT Request be performed with the rport.
251  */
252 struct fc_bsg_rport_ct {
253 	/*
254 	 * We need words 0-2 of the generic preamble for the LLD's
255 	 */
256 	__u32	preamble_word0;	/* revision & IN_ID */
257 	__u32	preamble_word1;	/* GS_Type, GS_SubType, Options, Rsvd */
258 	__u32	preamble_word2;	/* Cmd Code, Max Size */
259 };
260 /* Response:
261  *
262  * The reply structure is an fc_bsg_ctels_reply structure
263  */
264 
265 
266 
267 
268 /* request (CDB) structure of the sg_io_v4 */
269 struct fc_bsg_request {
270 	__u32 msgcode;
271 	union {
272 		struct fc_bsg_host_add_rport	h_addrport;
273 		struct fc_bsg_host_del_rport	h_delrport;
274 		struct fc_bsg_host_els		h_els;
275 		struct fc_bsg_host_ct		h_ct;
276 		struct fc_bsg_host_vendor	h_vendor;
277 
278 		struct fc_bsg_rport_els		r_els;
279 		struct fc_bsg_rport_ct		r_ct;
280 	} rqst_data;
281 } __attribute__((packed));
282 
283 
284 /* response (request sense data) structure of the sg_io_v4 */
285 struct fc_bsg_reply {
286 	/*
287 	 * The completion result. Result exists in two forms:
288 	 *  if negative, it is an -Exxx system errno value. There will
289 	 *    be no further reply information supplied.
290 	 *  else, it's the 4-byte scsi error result, with driver, host,
291 	 *    msg and status fields. The per-msgcode reply structure
292 	 *    will contain valid data.
293 	 */
294 	__u32 result;
295 
296 	/* If there was reply_payload, how much was recevied ? */
297 	__u32 reply_payload_rcv_len;
298 
299 	union {
300 		struct fc_bsg_host_vendor_reply		vendor_reply;
301 
302 		struct fc_bsg_ctels_reply		ctels_reply;
303 	} reply_data;
304 };
305 
306 
307 #endif /* SCSI_BSG_FC_H */
308 
309