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 2009 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 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* 34 * SCSI Persistence Data 35 * 36 * Format of data returned as a result of PERSISTENCE RESERVER { IN | OUT } 37 */ 38 39 /* 40 * SPC-3 revision 23, Section 6.11.1, Table 102 41 * Persistent Reservations 42 * Persistent Reserve In service actions 43 */ 44 #define PR_IN_READ_KEYS 0x0 /* Read all registered reservation keys */ 45 #define PR_IN_READ_RESERVATION 0x1 /* Reads th persistent reservations */ 46 #define PR_IN_REPORT_CAPABILITIES 0x2 /* Returns capability information */ 47 #define PR_IN_READ_FULL_STATUS 0x3 /* Reads complete information about all */ 48 /* registrations and the persistent */ 49 /* reservations, if any */ 50 /* 51 * SPC-3 revision 23, Section 6.11.3.3, Table 106 52 * Persistent reservation scope codes 53 */ 54 #define PR_LU_SCOPE 0x0 /* Persistent reservation applies to */ 55 /* full logical unit */ 56 /* 57 * SPC-3 revision 23, Section 6.11.3.4, Table 107 58 * Persistent Reservations 59 * Persistent reservation type codes 60 */ 61 #define PGR_TYPE_WR_EX 0x1 /* Write Exclusive */ 62 #define PGR_TYPE_EX_AC 0x3 /* Exclusive Access */ 63 #define PGR_TYPE_WR_EX_RO 0x5 /* Write Exclusive, Registrants Only */ 64 #define PGR_TYPE_EX_AC_RO 0x6 /* Exclusive Access, Registrants Only */ 65 #define PGR_TYPE_WR_EX_AR 0x7 /* Write Exclusive, All Registrants */ 66 #define PGR_TYPE_EX_AC_AR 0x8 /* Exclusive Access, All Registrants */ 67 68 /* 69 * Information obtained from: 70 * SPC-3, Revision 23 71 * Section 6.11.5 PERSISTENCE RESERVE IN 72 * Table 111 - full status descriptor format 73 */ 74 /* Table 289 - iSCSI Initiator Device TransportID format */ 75 76 #define iSCSI_PROTOCOL_ID 0x5 /* Table 262 - iSCSI Protocol ID */ 77 #define WW_UID_DEVICE_NAME 0x0 /* Table 288 - iSCSI Transport IDs */ 78 79 80 #if defined(_BIT_FIELDS_LTOH) 81 /* 82 * Information obtained from: 83 * SPC-3, Revision 23 84 * Section 6.11.1 PERSISTENCE RESERVE IN 85 * Table 101 - PERSISTENCE RESERVE IN command 86 */ 87 typedef struct scsi_cdb_prin { 88 uint8_t cmd; 89 uint8_t action : 5, 90 resbits : 3; 91 uint8_t resbytes[5]; 92 uint8_t alloc_len[2]; 93 uint8_t control; 94 } scsi_cdb_prin_t; 95 96 /* 97 * Information obtained from: 98 * SPC-3, Revision 23 99 * Section 6.11.2 PERSISTENCE RESERVE IN 100 * Table 103/104/105 - parameter data for READS KEYS 101 */ 102 typedef struct scsi_prin_rsrvdesc { 103 uint8_t reservation_key[8]; 104 uint8_t obsolete1[4]; 105 uint8_t resbytes; 106 uint8_t type : 4, 107 scope : 4; 108 uint8_t obsolete2[2]; 109 } scsi_prin_rsrvdesc_t; 110 typedef struct scsi_prin_readrsrv { 111 uint8_t PRgeneration[4]; 112 uint8_t add_len[4]; 113 union { 114 uint64_t service_key[1]; 115 scsi_prin_rsrvdesc_t res_key_list[1]; 116 } key_list; 117 } scsi_prin_readrsrv_t; 118 119 /* 120 * Information obtained from: 121 * SPC-3, Revision 23 122 * Section 6.11.4 PERSISTENCE RESERVE IN 123 * Table 108 - parameter data for REPORT CAPABILTIES 124 */ 125 typedef struct scsi_per_res_type { 126 uint8_t resbits1 : 1, 127 wr_ex : 1, 128 resbits2 : 1, 129 ex_ac : 1, 130 resbits3 : 1, 131 wr_ex_ro : 1, 132 ex_ac_ro : 1, 133 wr_ex_ar : 1; 134 uint8_t ex_ac_ar : 1, 135 resbits4 : 7; 136 } scsi_per_res_type_t; 137 typedef struct scsi_prin_rpt_cap { 138 uint8_t length[2]; 139 uint8_t ptpl_c : 1, 140 resbits1 : 1, 141 atp_c : 1, 142 sip_c : 1, 143 crh : 1, 144 resbits2 : 3; 145 uint8_t ptpl_a : 1, 146 resbits3 : 6, 147 tmv : 1; 148 scsi_per_res_type_t pr_type; 149 uint8_t resbytes[2]; 150 } scsi_prin_rpt_cap_t; 151 152 /* 153 * Refer SPC-3, Revision 23 154 * Section 7.5.4 TransportID identifiers 155 */ 156 typedef struct scsi_transport_id { 157 uint8_t protocol_id : 4, 158 resbits : 2, 159 format_code : 2; 160 uint8_t protocol_data[1]; 161 } scsi_transport_id_t; 162 163 typedef struct scsi_fc_transport_id { 164 uint8_t protocol_id : 4, 165 resbits : 2, 166 format_code : 2; 167 uint8_t rsvbytes1[7]; 168 uint8_t port_name[8]; 169 uint8_t rsvbytes2[8]; 170 } scsi_fc_transport_id_t; 171 172 typedef struct iscsi_transport_id { 173 uint8_t protocol_id : 4, 174 resbits : 2, 175 format_code : 2; 176 uint8_t rsvbyte1; 177 uint8_t add_len[2]; 178 char iscsi_name[1]; 179 } iscsi_transport_id_t; 180 181 /* 182 * Information obtained from: 183 * SPC-3, Revision 23 184 * Section 6.11.5 PERSISTENCE RESERVE IN 185 * Table 110/111 - parameter data for READ FULL STATUS 186 * Table 281 - TransportId format 187 */ 188 189 typedef struct scsi_prin_status_t { 190 uint8_t reservation_key[8]; 191 uint8_t resbytes1[4]; 192 uint8_t r_holder : 1, 193 all_tg_pt : 1, 194 resbits : 6; 195 uint8_t type : 4, 196 scope : 4; 197 uint8_t resbytes2[4]; 198 uint8_t rel_tgt_port_id[2]; 199 uint8_t add_len[4]; 200 scsi_transport_id_t trans_id; 201 } scsi_prin_status_t; 202 typedef struct scsi_prin_full_status { 203 uint8_t PRgeneration[4]; 204 uint8_t add_len[4]; 205 scsi_prin_status_t full_desc[1]; 206 } scsi_prin_full_status_t; 207 208 /* 209 * Information obtained from: 210 * SPC-3, Revision 23 211 * Section 6.12.1 PERSISTENCE RESERVE OUT 212 * Table 112 - PERSISTENCE RESERVE OUT command 213 */ 214 typedef struct scsi_cdb_prout { 215 uint8_t cmd; 216 uint8_t action : 5, 217 resbits : 3; 218 uint8_t type : 4, 219 scope : 4; 220 uint8_t resbytes[2]; 221 uint8_t param_len[4]; 222 uint8_t control; 223 } scsi_cdb_prout_t; 224 225 /* 226 * Information obtained from: 227 * SPC-3, Revision 23 228 * Section 6.12.3 PERSISTENCE RESERVE OUT 229 * Table 114 - PERSISTENCE RESERVE OUT parameter list 230 */ 231 typedef struct scsi_prout_plist { 232 uint8_t reservation_key[8]; 233 uint8_t service_key[8]; 234 uint8_t obsolete1[4]; 235 uint8_t aptpl : 1, 236 resbits1 : 1, 237 all_tg_pt : 1, 238 spec_i_pt : 1, 239 resbits2 : 4; 240 uint8_t resbytes1; 241 uint8_t obsolete2[2]; 242 uint8_t apd[1]; 243 } scsi_prout_plist_t; 244 245 /* 246 * Information obtained from: 247 * SPC-3, Revision 23 248 * Section 6.12.4 PERSISTENCE RESERVE OUT command with REGISTER AND MOVE 249 * Table 117 - REGISTER and MOVE service action parameter list 250 */ 251 typedef struct scsi_prout_reg_move_plist { 252 uint8_t reservation_key[8]; 253 uint8_t service_key[8]; 254 uint8_t resbytes1; 255 uint8_t aptpl : 1, 256 unreg : 1, 257 resbits1 : 6; 258 uint8_t rel_tgt_port_id[2]; 259 uint8_t tptid_len[4]; 260 uint8_t tptid[1]; 261 } scsi_prout_reg_move_plist_t; 262 263 #elif defined(_BIT_FIELDS_HTOL) 264 /* 265 * Information obtained from: 266 * SPC-3, Revision 23 267 * Section 6.11.1 PERSISTENCE RESERVE IN 268 * Table 101 - PERSISTENCE RESERVE IN command 269 */ 270 typedef struct scsi_cdb_prin { 271 uint8_t cmd; 272 uint8_t resbits : 3, 273 action : 5; 274 uint8_t resbytes[5]; 275 uint8_t alloc_len[2]; 276 uint8_t control; 277 } scsi_cdb_prin_t; 278 279 /* 280 * Information obtained from: 281 * SPC-3, Revision 23 282 * Section 6.11.2 PERSISTENCE RESERVE IN 283 * Table 103/104/105 - parameter data for READS KEYS 284 */ 285 typedef struct scsi_prin_rsrvdesc { 286 uint8_t reservation_key[8]; 287 uint8_t obsolete1[4]; 288 uint8_t resbytes; 289 uint8_t scope : 4, 290 type : 4; 291 uint8_t obsolete2[2]; 292 } scsi_prin_rsrvdesc_t; 293 typedef struct scsi_prin_readrsrv { 294 uint8_t PRgeneration[4]; 295 uint8_t add_len[4]; 296 union { 297 uint64_t service_key[1]; 298 scsi_prin_rsrvdesc_t res_key_list[1]; 299 } key_list; 300 } scsi_prin_readrsrv_t; 301 302 /* 303 * Information obtained from: 304 * SPC-3, Revision 23 305 * Section 6.11.4 PERSISTENCE RESERVE IN 306 * Table 108 - parameter data for REPORT CAPABILTIES 307 */ 308 typedef struct scsi_per_res_type { 309 uint8_t wr_ex_ar : 1, 310 ex_ac_ro : 1, 311 wr_ex_ro : 1, 312 resbits3 : 1, 313 ex_ac : 1, 314 resbits2 : 1, 315 wr_ex : 1, 316 resbits1 : 1; 317 uint8_t resbits4 : 7, 318 ex_ac_ar : 1; 319 } scsi_per_res_type_t; 320 typedef struct scsi_prin_rpt_cap { 321 uint8_t length[2]; 322 uint8_t resbits2 : 3, 323 crh : 1, 324 sip_c : 1, 325 atp_c : 1, 326 resbits1 : 1, 327 ptpl_c : 1; 328 uint8_t tmv : 1, 329 resbits3 : 6, 330 ptpl_a : 1; 331 scsi_per_res_type_t pr_type; 332 uint8_t resbytes[2]; 333 } scsi_prin_rpt_cap_t; 334 335 /* 336 * Refer SPC-3, Revision 23 337 * Section 7.5.4 TransportID identifiers 338 */ 339 typedef struct scsi_transport_id { 340 uint8_t format_code : 2, 341 resbits : 2, 342 protocol_id : 4; 343 uint8_t protocol_data[1]; 344 } scsi_transport_id_t; 345 346 typedef struct scsi_fc_transport_id { 347 uint8_t format_code : 2, 348 resbits : 2, 349 protocol_id : 4; 350 uint8_t rsvbytes1[7]; 351 uint8_t port_name[8]; 352 uint8_t rsvbytes2[8]; 353 } scsi_fc_transport_id_t; 354 355 typedef struct iscsi_transport_id { 356 uint8_t format_code : 2, 357 resbits : 2, 358 protocol_id : 4; 359 uint8_t rsvbyte1; 360 uint8_t add_len[2]; 361 char iscsi_name[1]; 362 } iscsi_transport_id_t; 363 364 /* 365 * Information obtained from: 366 * SPC-3, Revision 23 367 * Section 6.11.5 PERSISTENCE RESERVE IN 368 * Table 110/111 - parameter data for READ FULL STATUS 369 * Table 281 - TransportId format 370 */ 371 372 typedef struct scsi_prin_status_t { 373 uint8_t reservation_key[8]; 374 uint8_t resbytes1[4]; 375 uint8_t resbits : 6, 376 all_tg_pt : 1, 377 r_holder : 1; 378 uint8_t scope : 4, 379 type : 4; 380 uint8_t resbytes2[4]; 381 uint8_t rel_tgt_port_id[2]; 382 uint8_t add_len[4]; 383 scsi_transport_id_t trans_id; 384 } scsi_prin_status_t; 385 typedef struct scsi_prin_full_status { 386 uint8_t PRgeneration[4]; 387 uint8_t add_len[4]; 388 scsi_prin_status_t full_desc[1]; 389 } scsi_prin_full_status_t; 390 391 /* 392 * Information obtained from: 393 * SPC-3, Revision 23 394 * Section 6.12.1 PERSISTENCE RESERVE OUT 395 * Table 112 - PERSISTENCE RESERVE OUT command 396 */ 397 typedef struct scsi_cdb_prout { 398 uint8_t cmd; 399 uint8_t resbits : 3, 400 action : 5; 401 uint8_t scope : 4, 402 type : 4; 403 uint8_t resbytes[2]; 404 uint8_t param_len[4]; 405 uint8_t control; 406 } scsi_cdb_prout_t; 407 408 /* 409 * Information obtained from: 410 * SPC-3, Revision 23 411 * Section 6.12.3 PERSISTENCE RESERVE OUT 412 * Table 114 - PERSISTENCE RESERVE OUT parameter list 413 */ 414 typedef struct scsi_prout_plist { 415 uint8_t reservation_key[8]; 416 uint8_t service_key[8]; 417 uint8_t obsolete1[4]; 418 uint8_t resbits1 : 4, 419 spec_i_pt : 1, 420 all_tg_pt : 1, 421 resbits2 : 1, 422 aptpl : 1; 423 uint8_t resbytes1; 424 uint8_t obsolete2[2]; 425 uint8_t apd[1]; 426 } scsi_prout_plist_t; 427 428 /* 429 * Information obtained from: 430 * SPC-3, Revision 23 431 * Section 6.12.4 PERSISTENCE RESERVE OUT command with REGISTER AND MOVE 432 * Table 117 - REGISTER and MOVE service action parameter list 433 */ 434 typedef struct scsi_prout_reg_move_plist { 435 uint8_t reservation_key[8]; 436 uint8_t service_key[8]; 437 uint8_t resbytes1; 438 uint8_t resbits1 : 6, 439 unreg : 1, 440 aptpl : 1; 441 uint8_t rel_tgt_port_id[2]; 442 uint8_t tptid_len[4]; 443 uint8_t tptid[1]; 444 } scsi_prout_reg_move_plist_t; 445 446 #else 447 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 448 #endif /* _BIT_FIELDS_LTOH */ 449 450 451 /* 452 * SPC-3 revision 23, Section 6.12.2, Table 113 453 * Persistent Reservations 454 * Persistent Reserve Out service action codes 455 */ 456 #define PR_OUT_REGISTER 0x0 /* Register/unregister a reservation */ 457 /* key with the device server */ 458 #define PR_OUT_RESERVE 0x1 /* Create a persistent reservation */ 459 /* having a specified SCOPE & TYPE */ 460 #define PR_OUT_RELEASE 0x2 /* Release the selected persistent */ 461 /* reservation */ 462 #define PR_OUT_CLEAR 0x3 /* Clears all reservation keys and */ 463 /* all persistent reservations */ 464 #define PR_OUT_PREEMPT 0x4 /* Preempts persistent reservations */ 465 /* and/or removes reservations */ 466 #define PR_OUT_PREEMPT_ABORT 0x5 /* Preempts persistent reservations */ 467 /* and/or removes reservations, and */ 468 /* aborts all tasks for all preempted */ 469 /* I_T nexuses */ 470 #define PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY 0x06 471 /* Register a reservation key with */ 472 /* the device server, or unregister a */ 473 /* reservation key */ 474 #define PR_OUT_REGISTER_MOVE 0x7 /* Register a reservation key for */ 475 /* another I_T nexus with the device */ 476 /* server and move a persistent */ 477 /* reservation to the I_T nexus */ 478 479 480 #ifdef __cplusplus 481 } 482 #endif 483 484 #endif /* _SYS_SCSI_GENERIC_PERSIST_H */ 485