1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_SCSI_GENERIC_PERSIST_H
27 #define	_SYS_SCSI_GENERIC_PERSIST_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 /*
36  * SCSI Persistence Data
37  *
38  * Format of data returned as a result of PERSISTENCE RESERVER { IN | OUT }
39  */
40 
41 /*
42  * SPC-3 revision 23, Section 6.11.1, Table 102
43  * Persistent Reservations
44  * Persistent Reserve In service actions
45  */
46 #define	PR_IN_READ_KEYS		0x0 /* Read all registered reservation keys */
47 #define	PR_IN_READ_RESERVATION	0x1 /* Reads th persistent reservations */
48 #define	PR_IN_REPORT_CAPABILITIES 0x2 /* Returns capability information */
49 #define	PR_IN_READ_FULL_STATUS	0x3 /* Reads complete information about all */
50 				    /* registrations and the persistent */
51 				    /* reservations, if any */
52 /*
53  * SPC-3 revision 23, Section 6.11.3.3, Table 106
54  * Persistent reservation scope codes
55  */
56 #define	PR_LU_SCOPE		0x0	/* Persistent reservation applies to */
57 					/* full logical unit */
58 /*
59  * SPC-3 revision 23, Section 6.11.3.4, Table 107
60  * Persistent Reservations
61  * Persistent reservation type codes
62  */
63 #define	PGR_TYPE_WR_EX		0x1	/* Write Exclusive */
64 #define	PGR_TYPE_EX_AC		0x3	/* Exclusive Access */
65 #define	PGR_TYPE_WR_EX_RO	0x5	/* Write Exclusive, Registrants Only */
66 #define	PGR_TYPE_EX_AC_RO	0x6	/* Exclusive Access, Registrants Only */
67 #define	PGR_TYPE_WR_EX_AR	0x7	/* Write Exclusive, All Registrants */
68 #define	PGR_TYPE_EX_AC_AR	0x8	/* Exclusive Access, All Registrants */
69 
70 /*
71  * Information obtained from:
72  *	SPC-3, Revision 23
73  *	Section 6.11.5 PERSISTENCE RESERVE IN
74  *	Table 111 - full status descriptor format
75  */
76 /* Table 289 - iSCSI Initiator Device TransportID format */
77 
78 #define	iSCSI_PROTOCOL_ID	0x5	/* Table 262 - iSCSI Protocol ID  */
79 #define	WW_UID_DEVICE_NAME	0x0	/* Table 288 - iSCSI Transport IDs */
80 
81 
82 #if defined(_BIT_FIELDS_LTOH)
83 /*
84  * Information obtained from:
85  *	SPC-3, Revision 23
86  *	Section 6.11.1 PERSISTENCE RESERVE IN
87  *	Table 101 - PERSISTENCE RESERVE IN command
88  */
89 typedef struct scsi_cdb_prin {
90 	uint8_t			cmd;
91 	uint8_t			action : 5,
92 				resbits : 3;
93 	uint8_t			resbytes[5];
94 	uint8_t			alloc_len[2];
95 	uint8_t			control;
96 } scsi_cdb_prin_t;
97 
98 /*
99  * Information obtained from:
100  *	SPC-3, Revision 23
101  *	Section 6.11.2 PERSISTENCE RESERVE IN
102  *	Table 103/104/105 - parameter data for READS KEYS
103  */
104 typedef struct scsi_prin_rsrvdesc {
105 	uint8_t			reservation_key[8];
106 	uint8_t			obsolete1[4];
107 	uint8_t			resbytes;
108 	uint8_t			type : 4,
109 				scope : 4;
110 	uint8_t			obsolete2[2];
111 } scsi_prin_rsrvdesc_t;
112 typedef struct scsi_prin_readrsrv {
113 	uint8_t			PRgeneration[4];
114 	uint8_t			add_len[4];
115 	union {
116 		uint64_t		service_key[1];
117 		scsi_prin_rsrvdesc_t	res_key_list[1];
118 	} key_list;
119 } scsi_prin_readrsrv_t;
120 
121 /*
122  * Information obtained from:
123  *	SPC-3, Revision 23
124  *	Section 6.11.4 PERSISTENCE RESERVE IN
125  * 	Table 108 - parameter data for REPORT CAPABILTIES
126  */
127 typedef struct scsi_per_res_type {
128 	uint8_t			resbits1 : 1,
129 				wr_ex : 1,
130 				resbits2 : 1,
131 				ex_ac : 1,
132 				resbits3 : 1,
133 				wr_ex_ro : 1,
134 				ex_ac_ro : 1,
135 				wr_ex_ar : 1;
136 	uint8_t			ex_ac_ar : 1,
137 				resbits4 : 7;
138 } scsi_per_res_type_t;
139 typedef struct scsi_prin_rpt_cap {
140 	uint8_t			length[2];
141 	uint8_t			ptpl_c : 1,
142 				resbits1 : 1,
143 				atp_c : 1,
144 				sip_c : 1,
145 				crh : 1,
146 				resbits2 : 3;
147 	uint8_t			ptpl_a : 1,
148 				resbits3 : 6,
149 				tmv : 1;
150 	scsi_per_res_type_t	pr_type;
151 	uint8_t			resbytes[2];
152 } scsi_prin_rpt_cap_t;
153 
154 /*
155  * Information obtained from:
156  *	SPC-3, Revision 23
157  *	Section 6.11.5 PERSISTENCE RESERVE IN
158  * 	Table 110/111 - parameter data for READ FULL STATUS
159  *	Table 281 - TransportId format
160  */
161 typedef struct scsi_transport_id {
162 	uint8_t			protocol_id : 4,
163 				resbits : 2,
164 				format_code : 2;
165 	uint8_t			add_len[2];
166 	char			iscsi_name[1];
167 } scsi_transport_id_t;
168 typedef struct scsi_prin_status_t {
169 	uint8_t			reservation_key[8];
170 	uint8_t			resbytes1[4];
171 	uint8_t			r_holder : 1,
172 				all_tg_pt : 1,
173 				resbits : 6;
174 	uint8_t			type : 4,
175 				scope : 4;
176 	uint8_t			resbytes2[4];
177 	uint8_t			rel_tgt_port_id[2];
178 	uint8_t			add_len[4];
179 	scsi_transport_id_t	trans_id;
180 } scsi_prin_status_t;
181 typedef struct scsi_prin_full_status {
182 	uint8_t			PRgeneration[4];
183 	uint8_t			add_len[4];
184 	scsi_prin_status_t	full_desc[1];
185 } scsi_prin_full_status_t;
186 
187 /*
188  * Information obtained from:
189  *	SPC-3, Revision 23
190  *	Section 6.12.1 PERSISTENCE RESERVE OUT
191  *	Table 112 - PERSISTENCE RESERVE OUT command
192  */
193 typedef struct scsi_cdb_prout {
194 	uint8_t			cmd;
195 	uint8_t			action : 5,
196 				resbits : 3;
197 	uint8_t			type : 4,
198 				scope : 4;
199 	uint8_t			resbytes[2];
200 	uint8_t			param_len[4];
201 	uint8_t			control;
202 } scsi_cdb_prout_t;
203 
204 /*
205  * Information obtained from:
206  *	SPC-3, Revision 23
207  *	Section 6.12.3 PERSISTENCE RESERVE OUT
208  *	Table 114 - PERSISTENCE RESERVE OUT parameter list
209  */
210 typedef struct scsi_prout_plist {
211 	uint8_t			reservation_key[8];
212 	uint8_t			service_key[8];
213 	uint8_t			obsolete1[4];
214 	uint8_t			aptpl : 1,
215 				resbits1 : 1,
216 				all_tg_pt : 1,
217 				spec_i_pt : 1,
218 				resbits2 : 4;
219 	uint8_t			resbytes1;
220 	uint8_t			obsolete2[2];
221 	uint8_t			apd[1];
222 } scsi_prout_plist_t;
223 
224 #elif defined(_BIT_FIELDS_HTOL)
225 /*
226  * Information obtained from:
227  *	SPC-3, Revision 23
228  *	Section 6.11.1 PERSISTENCE RESERVE IN
229  *	Table 101 - PERSISTENCE RESERVE IN command
230  */
231 typedef struct scsi_cdb_prin {
232 	uint8_t			cmd;
233 	uint8_t			resbits : 3,
234 				action : 5;
235 	uint8_t			resbytes[5];
236 	uint8_t			alloc_len[2];
237 	uint8_t			control;
238 } scsi_cdb_prin_t;
239 
240 /*
241  * Information obtained from:
242  *	SPC-3, Revision 23
243  *	Section 6.11.2 PERSISTENCE RESERVE IN
244  *	Table 103/104/105 - parameter data for READS KEYS
245  */
246 typedef struct scsi_prin_rsrvdesc {
247 	uint8_t			reservation_key[8];
248 	uint8_t			obsolete1[4];
249 	uint8_t			resbytes;
250 	uint8_t			scope : 4,
251 				type : 4;
252 	uint8_t			obsolete2[2];
253 } scsi_prin_rsrvdesc_t;
254 typedef struct scsi_prin_readrsrv {
255 	uint8_t			PRgeneration[4];
256 	uint8_t			add_len[4];
257 	union {
258 		uint64_t		service_key[1];
259 		scsi_prin_rsrvdesc_t	res_key_list[1];
260 	} key_list;
261 } scsi_prin_readrsrv_t;
262 
263 /*
264  * Information obtained from:
265  *	SPC-3, Revision 23
266  *	Section 6.11.4 PERSISTENCE RESERVE IN
267  * 	Table 108 - parameter data for REPORT CAPABILTIES
268  */
269 typedef struct scsi_per_res_type {
270 	uint8_t			wr_ex_ar : 1,
271 				ex_ac_ro : 1,
272 				wr_ex_ro : 1,
273 				resbits3 : 1,
274 				ex_ac : 1,
275 				resbits2 : 1,
276 				wr_ex : 1,
277 				resbits1 : 1;
278 	uint8_t			resbits4 : 7,
279 				ex_ac_ar : 1;
280 } scsi_per_res_type_t;
281 typedef struct scsi_prin_rpt_cap {
282 	uint8_t			length[2];
283 	uint8_t			resbits2 : 3,
284 				crh : 1,
285 				sip_c : 1,
286 				atp_c : 1,
287 				resbits1 : 1,
288 				ptpl_c : 1;
289 	uint8_t			tmv : 1,
290 				resbits3 : 6,
291 				ptpl_a : 1;
292 	scsi_per_res_type_t	pr_type;
293 	uint8_t			resbytes[2];
294 } scsi_prin_rpt_cap_t;
295 
296 /*
297  * Information obtained from:
298  *	SPC-3, Revision 23
299  *	Section 6.11.5 PERSISTENCE RESERVE IN
300  * 	Table 110/111 - parameter data for READ FULL STATUS
301  *	Table 281 - TransportId format
302  */
303 typedef struct scsi_transport_id {
304 	uint8_t			format_code : 2,
305 				resbits : 2,
306 				protocol_id : 4;
307 	uint8_t			add_len[2];
308 	char			iscsi_name[1];
309 } scsi_transport_id_t;
310 typedef struct scsi_prin_status_t {
311 	uint8_t			reservation_key[8];
312 	uint8_t			resbytes1[4];
313 	uint8_t			resbits : 6,
314 				all_tg_pt : 1,
315 				r_holder : 1;
316 	uint8_t			scope : 4,
317 				type : 4;
318 	uint8_t			resbytes2[4];
319 	uint8_t			rel_tgt_port_id[2];
320 	uint8_t			add_len[4];
321 	scsi_transport_id_t	trans_id;
322 } scsi_prin_status_t;
323 typedef struct scsi_prin_full_status {
324 	uint8_t			PRgeneration[4];
325 	uint8_t			add_len[4];
326 	scsi_prin_status_t	full_desc[1];
327 } scsi_prin_full_status_t;
328 
329 /*
330  * Information obtained from:
331  *	SPC-3, Revision 23
332  *	Section 6.12.1 PERSISTENCE RESERVE OUT
333  *	Table 112 - PERSISTENCE RESERVE OUT command
334  */
335 typedef struct scsi_cdb_prout {
336 	uint8_t			cmd;
337 	uint8_t			resbits : 3,
338 				action : 5;
339 	uint8_t			scope : 4,
340 				type : 4;
341 	uint8_t			resbytes[2];
342 	uint8_t			param_len[4];
343 	uint8_t			control;
344 } scsi_cdb_prout_t;
345 
346 /*
347  * Information obtained from:
348  *	SPC-3, Revision 23
349  *	Section 6.12.3 PERSISTENCE RESERVE OUT
350  *	Table 114 - PERSISTENCE RESERVE OUT parameter list
351  */
352 typedef struct scsi_prout_plist {
353 	uint8_t			reservation_key[8];
354 	uint8_t			service_key[8];
355 	uint8_t			obsolete1[4];
356 	uint8_t			resbits1 : 4,
357 				spec_i_pt : 1,
358 				all_tg_pt : 1,
359 				resbits2 : 1,
360 				aptpl : 1;
361 	uint8_t			resbytes1;
362 	uint8_t			obsolete2[2];
363 	uint8_t			apd[1];
364 } scsi_prout_plist_t;
365 
366 #else
367 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
368 #endif	/* _BIT_FIELDS_LTOH */
369 
370 
371 /*
372  * SPC-3 revision 23, Section 6.12.2, Table 113
373  * Persistent Reservations
374  * Persistent Reserve Out service action codes
375  */
376 #define	PR_OUT_REGISTER		0x0	/* Register/unregister a reservation */
377 					/* key with the device server */
378 #define	PR_OUT_RESERVE		0x1	/* Create a persistent reservation */
379 					/* having a specified SCOPE & TYPE */
380 #define	PR_OUT_RELEASE		0x2	/* Release the selected persistent */
381 					/* reservation */
382 #define	PR_OUT_CLEAR		0x3	/* Clears all reservation keys and */
383 					/* all persistent reservations */
384 #define	PR_OUT_PREEMPT		0x4	/* Preempts persistent reservations */
385 					/* and/or removes reservations */
386 #define	PR_OUT_PREEMPT_ABORT	0x5	/* Preempts persistent reservations */
387 					/* and/or removes reservations, and */
388 					/* aborts all tasks for all preempted */
389 					/* I_T nexuses */
390 #define	PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY	0x06
391 					/* Register a reservation key with */
392 					/* the device server, or unregister a */
393 					/* reservation key */
394 #define	PR_OUT_REGISTER_MOVE	0x7	/* Register a reservation key for */
395 					/* another I_T nexus with the device */
396 					/* server and move a persistent */
397 					/* reservation to the I_T nexus */
398 
399 
400 #ifdef	__cplusplus
401 }
402 #endif
403 
404 #endif	/* _SYS_SCSI_GENERIC_PERSIST_H */
405