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 138 /* 139 * Refer SPC-3, Revision 23 140 * Section 6.11.4 REPORT CAPABILITIES service action 141 */ 142 typedef struct scsi_prin_rpt_cap { 143 uint8_t length[2]; 144 uint8_t ptpl_c : 1, 145 resbits1 : 1, 146 atp_c : 1, 147 sip_c : 1, 148 crh : 1, 149 resbits2 : 3; 150 uint8_t ptpl_a : 1, 151 resbits3 : 6, 152 tmv : 1; 153 scsi_per_res_type_t pr_type; 154 uint8_t resbytes[2]; 155 } scsi_prin_rpt_cap_t; 156 157 /* 158 * Refer SPC-3, Revision 23 159 * Section 7.5.4 TransportID identifiers 160 */ 161 typedef struct scsi_transport_id { 162 uint8_t protocol_id : 4, 163 resbits : 2, 164 format_code : 2; 165 uint8_t protocol_data[1]; 166 } scsi_transport_id_t; 167 168 typedef struct scsi_fc_transport_id { 169 uint8_t protocol_id : 4, 170 resbits : 2, 171 format_code : 2; 172 uint8_t rsvbytes1[7]; 173 uint8_t port_name[8]; 174 uint8_t rsvbytes2[8]; 175 } scsi_fc_transport_id_t; 176 177 typedef struct iscsi_transport_id { 178 uint8_t protocol_id : 4, 179 resbits : 2, 180 format_code : 2; 181 uint8_t rsvbyte1; 182 uint8_t add_len[2]; 183 char iscsi_name[1]; 184 } iscsi_transport_id_t; 185 186 typedef struct scsi_srp_transport_id { 187 uint8_t protocol_id : 4, 188 resbits : 2, 189 format_code : 2; 190 uint8_t rsvbytes1[7]; 191 uint8_t srp_name[16]; 192 } scsi_srp_transport_id_t; 193 194 /* 195 * Information obtained from: 196 * SPC-3, Revision 23 197 * Section 6.11.5 PERSISTENCE RESERVE IN 198 * Table 110/111 - parameter data for READ FULL STATUS 199 * Table 281 - TransportId format 200 */ 201 202 typedef struct scsi_prin_status_t { 203 uint8_t reservation_key[8]; 204 uint8_t resbytes1[4]; 205 uint8_t r_holder : 1, 206 all_tg_pt : 1, 207 resbits : 6; 208 uint8_t type : 4, 209 scope : 4; 210 uint8_t resbytes2[4]; 211 uint8_t rel_tgt_port_id[2]; 212 uint8_t add_len[4]; 213 scsi_transport_id_t trans_id; 214 } scsi_prin_status_t; 215 216 typedef struct scsi_prin_full_status { 217 uint8_t PRgeneration[4]; 218 uint8_t add_len[4]; 219 scsi_prin_status_t full_desc[1]; 220 } scsi_prin_full_status_t; 221 222 /* 223 * Information obtained from: 224 * SPC-3, Revision 23 225 * Section 6.12.1 PERSISTENCE RESERVE OUT 226 * Table 112 - PERSISTENCE RESERVE OUT command 227 */ 228 typedef struct scsi_cdb_prout { 229 uint8_t cmd; 230 uint8_t action : 5, 231 resbits : 3; 232 uint8_t type : 4, 233 scope : 4; 234 uint8_t resbytes[2]; 235 uint8_t param_len[4]; 236 uint8_t control; 237 } scsi_cdb_prout_t; 238 239 /* 240 * Information obtained from: 241 * SPC-3, Revision 23 242 * Section 6.12.3 PERSISTENCE RESERVE OUT 243 * Table 114 - PERSISTENCE RESERVE OUT parameter list 244 */ 245 typedef struct scsi_prout_plist { 246 uint8_t reservation_key[8]; 247 uint8_t service_key[8]; 248 uint8_t obsolete1[4]; 249 uint8_t aptpl : 1, 250 resbits1 : 1, 251 all_tg_pt : 1, 252 spec_i_pt : 1, 253 resbits2 : 4; 254 uint8_t resbytes1; 255 uint8_t obsolete2[2]; 256 uint8_t apd[1]; 257 } scsi_prout_plist_t; 258 259 /* 260 * Information obtained from: 261 * SPC-3, Revision 23 262 * Section 6.12.4 PERSISTENCE RESERVE OUT command with REGISTER AND MOVE 263 * Table 117 - REGISTER and MOVE service action parameter list 264 */ 265 typedef struct scsi_prout_reg_move_plist { 266 uint8_t reservation_key[8]; 267 uint8_t service_key[8]; 268 uint8_t resbytes1; 269 uint8_t aptpl : 1, 270 unreg : 1, 271 resbits1 : 6; 272 uint8_t rel_tgt_port_id[2]; 273 uint8_t tptid_len[4]; 274 uint8_t tptid[1]; 275 } scsi_prout_reg_move_plist_t; 276 277 #elif defined(_BIT_FIELDS_HTOL) 278 /* 279 * Information obtained from: 280 * SPC-3, Revision 23 281 * Section 6.11.1 PERSISTENCE RESERVE IN 282 * Table 101 - PERSISTENCE RESERVE IN command 283 */ 284 typedef struct scsi_cdb_prin { 285 uint8_t cmd; 286 uint8_t resbits : 3, 287 action : 5; 288 uint8_t resbytes[5]; 289 uint8_t alloc_len[2]; 290 uint8_t control; 291 } scsi_cdb_prin_t; 292 293 /* 294 * Information obtained from: 295 * SPC-3, Revision 23 296 * Section 6.11.2 PERSISTENCE RESERVE IN 297 * Table 103/104/105 - parameter data for READS KEYS 298 */ 299 typedef struct scsi_prin_rsrvdesc { 300 uint8_t reservation_key[8]; 301 uint8_t obsolete1[4]; 302 uint8_t resbytes; 303 uint8_t scope : 4, 304 type : 4; 305 uint8_t obsolete2[2]; 306 } scsi_prin_rsrvdesc_t; 307 typedef struct scsi_prin_readrsrv { 308 uint8_t PRgeneration[4]; 309 uint8_t add_len[4]; 310 union { 311 uint64_t service_key[1]; 312 scsi_prin_rsrvdesc_t res_key_list[1]; 313 } key_list; 314 } scsi_prin_readrsrv_t; 315 316 /* 317 * Information obtained from: 318 * SPC-3, Revision 23 319 * Section 6.11.4 PERSISTENCE RESERVE IN 320 * Table 108 - parameter data for REPORT CAPABILTIES 321 */ 322 typedef struct scsi_per_res_type { 323 uint8_t wr_ex_ar : 1, 324 ex_ac_ro : 1, 325 wr_ex_ro : 1, 326 resbits3 : 1, 327 ex_ac : 1, 328 resbits2 : 1, 329 wr_ex : 1, 330 resbits1 : 1; 331 uint8_t resbits4 : 7, 332 ex_ac_ar : 1; 333 } scsi_per_res_type_t; 334 /* 335 * Refer SPC-3, Revision 23 336 * Section 6.11.4 REPORT CAPABILITIES service action 337 */ 338 typedef struct scsi_prin_rpt_cap { 339 uint8_t length[2]; 340 uint8_t resbits2 : 3, 341 crh : 1, 342 sip_c : 1, 343 atp_c : 1, 344 resbits1 : 1, 345 ptpl_c : 1; 346 uint8_t tmv : 1, 347 resbits3 : 6, 348 ptpl_a : 1; 349 scsi_per_res_type_t pr_type; 350 uint8_t resbytes[2]; 351 } scsi_prin_rpt_cap_t; 352 353 /* 354 * Refer SPC-3, Revision 23 355 * Section 7.5.4 TransportID identifiers 356 */ 357 typedef struct scsi_transport_id { 358 uint8_t format_code : 2, 359 resbits : 2, 360 protocol_id : 4; 361 uint8_t protocol_data[1]; 362 } scsi_transport_id_t; 363 364 typedef struct scsi_fc_transport_id { 365 uint8_t format_code : 2, 366 resbits : 2, 367 protocol_id : 4; 368 uint8_t rsvbytes1[7]; 369 uint8_t port_name[8]; 370 uint8_t rsvbytes2[8]; 371 } scsi_fc_transport_id_t; 372 373 typedef struct iscsi_transport_id { 374 uint8_t format_code : 2, 375 resbits : 2, 376 protocol_id : 4; 377 uint8_t rsvbyte1; 378 uint8_t add_len[2]; 379 char iscsi_name[1]; 380 } iscsi_transport_id_t; 381 382 383 typedef struct scsi_srp_transport_id { 384 uint8_t format_code : 2, 385 resbits : 2, 386 protocol_id : 4; 387 uint8_t rsvbytes1[7]; 388 uint8_t srp_name[16]; 389 } scsi_srp_transport_id_t; 390 391 /* 392 * Information obtained from: 393 * SPC-3, Revision 23 394 * Section 6.11.5 PERSISTENCE RESERVE IN 395 * Table 110/111 - parameter data for READ FULL STATUS 396 * Table 281 - TransportId format 397 */ 398 399 typedef struct scsi_prin_status_t { 400 uint8_t reservation_key[8]; 401 uint8_t resbytes1[4]; 402 uint8_t resbits : 6, 403 all_tg_pt : 1, 404 r_holder : 1; 405 uint8_t scope : 4, 406 type : 4; 407 uint8_t resbytes2[4]; 408 uint8_t rel_tgt_port_id[2]; 409 uint8_t add_len[4]; 410 scsi_transport_id_t trans_id; 411 } scsi_prin_status_t; 412 typedef struct scsi_prin_full_status { 413 uint8_t PRgeneration[4]; 414 uint8_t add_len[4]; 415 scsi_prin_status_t full_desc[1]; 416 } scsi_prin_full_status_t; 417 418 /* 419 * Information obtained from: 420 * SPC-3, Revision 23 421 * Section 6.12.1 PERSISTENCE RESERVE OUT 422 * Table 112 - PERSISTENCE RESERVE OUT command 423 */ 424 typedef struct scsi_cdb_prout { 425 uint8_t cmd; 426 uint8_t resbits : 3, 427 action : 5; 428 uint8_t scope : 4, 429 type : 4; 430 uint8_t resbytes[2]; 431 uint8_t param_len[4]; 432 uint8_t control; 433 } scsi_cdb_prout_t; 434 435 /* 436 * Information obtained from: 437 * SPC-3, Revision 23 438 * Section 6.12.3 PERSISTENCE RESERVE OUT 439 * Table 114 - PERSISTENCE RESERVE OUT parameter list 440 */ 441 typedef struct scsi_prout_plist { 442 uint8_t reservation_key[8]; 443 uint8_t service_key[8]; 444 uint8_t obsolete1[4]; 445 uint8_t resbits1 : 4, 446 spec_i_pt : 1, 447 all_tg_pt : 1, 448 resbits2 : 1, 449 aptpl : 1; 450 uint8_t resbytes1; 451 uint8_t obsolete2[2]; 452 uint8_t apd[1]; 453 } scsi_prout_plist_t; 454 455 /* 456 * Information obtained from: 457 * SPC-3, Revision 23 458 * Section 6.12.4 PERSISTENCE RESERVE OUT command with REGISTER AND MOVE 459 * Table 117 - REGISTER and MOVE service action parameter list 460 */ 461 typedef struct scsi_prout_reg_move_plist { 462 uint8_t reservation_key[8]; 463 uint8_t service_key[8]; 464 uint8_t resbytes1; 465 uint8_t resbits1 : 6, 466 unreg : 1, 467 aptpl : 1; 468 uint8_t rel_tgt_port_id[2]; 469 uint8_t tptid_len[4]; 470 uint8_t tptid[1]; 471 } scsi_prout_reg_move_plist_t; 472 473 #else 474 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined 475 #endif /* _BIT_FIELDS_LTOH */ 476 477 478 /* 479 * SPC-3 revision 23, Section 6.12.2, Table 113 480 * Persistent Reservations 481 * Persistent Reserve Out service action codes 482 */ 483 #define PR_OUT_REGISTER 0x0 /* Register/unregister a reservation */ 484 /* key with the device server */ 485 #define PR_OUT_RESERVE 0x1 /* Create a persistent reservation */ 486 /* having a specified SCOPE & TYPE */ 487 #define PR_OUT_RELEASE 0x2 /* Release the selected persistent */ 488 /* reservation */ 489 #define PR_OUT_CLEAR 0x3 /* Clears all reservation keys and */ 490 /* all persistent reservations */ 491 #define PR_OUT_PREEMPT 0x4 /* Preempts persistent reservations */ 492 /* and/or removes reservations */ 493 #define PR_OUT_PREEMPT_ABORT 0x5 /* Preempts persistent reservations */ 494 /* and/or removes reservations, and */ 495 /* aborts all tasks for all preempted */ 496 /* I_T nexuses */ 497 #define PR_OUT_REGISTER_AND_IGNORE_EXISTING_KEY 0x06 498 /* Register a reservation key with */ 499 /* the device server, or unregister a */ 500 /* reservation key */ 501 #define PR_OUT_REGISTER_MOVE 0x7 /* Register a reservation key for */ 502 /* another I_T nexus with the device */ 503 /* server and move a persistent */ 504 /* reservation to the I_T nexus */ 505 506 507 #ifdef __cplusplus 508 } 509 #endif 510 511 #endif /* _SYS_SCSI_GENERIC_PERSIST_H */ 512