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