1 /*- 2 * Structure and function declarations for the 3 * SCSI Sequential Access Peripheral driver for CAM. 4 * 5 * Copyright (c) 1999, 2000 Matthew Jacob 6 * Copyright (c) 2013, 2014, 2015 Spectra Logic Corporation 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions, and the following disclaimer, 14 * without modification, immediately at the beginning of the file. 15 * 2. The name of the author may not be used to endorse or promote products 16 * derived from this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 22 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * 30 * $FreeBSD$ 31 */ 32 33 #ifndef _SCSI_SCSI_SA_H 34 #define _SCSI_SCSI_SA_H 1 35 36 #include <sys/cdefs.h> 37 38 struct scsi_read_block_limits 39 { 40 u_int8_t opcode; 41 u_int8_t byte2; 42 u_int8_t unused[3]; 43 u_int8_t control; 44 }; 45 46 struct scsi_read_block_limits_data 47 { 48 u_int8_t gran; 49 #define RBL_GRAN_MASK 0x1F 50 #define RBL_GRAN(rblim) ((rblim)->gran & RBL_GRAN_MASK) 51 u_int8_t maximum[3]; 52 u_int8_t minimum[2]; 53 }; 54 55 struct scsi_sa_rw 56 { 57 u_int8_t opcode; 58 u_int8_t sli_fixed; 59 #define SAR_SLI 0x02 60 #define SARW_FIXED 0x01 61 u_int8_t length[3]; 62 u_int8_t control; 63 }; 64 65 struct scsi_load_unload 66 { 67 u_int8_t opcode; 68 u_int8_t immediate; 69 #define SLU_IMMED 0x01 70 u_int8_t reserved[2]; 71 u_int8_t eot_reten_load; 72 #define SLU_EOT 0x04 73 #define SLU_RETEN 0x02 74 #define SLU_LOAD 0x01 75 u_int8_t control; 76 }; 77 78 struct scsi_rewind 79 { 80 u_int8_t opcode; 81 u_int8_t immediate; 82 #define SREW_IMMED 0x01 83 u_int8_t reserved[3]; 84 u_int8_t control; 85 }; 86 87 typedef enum { 88 SS_BLOCKS, 89 SS_FILEMARKS, 90 SS_SEQFILEMARKS, 91 SS_EOD, 92 SS_SETMARKS, 93 SS_SEQSETMARKS 94 } scsi_space_code; 95 96 struct scsi_space 97 { 98 u_int8_t opcode; 99 u_int8_t code; 100 #define SREW_IMMED 0x01 101 u_int8_t count[3]; 102 u_int8_t control; 103 }; 104 105 struct scsi_write_filemarks 106 { 107 u_int8_t opcode; 108 u_int8_t byte2; 109 #define SWFMRK_IMMED 0x01 110 #define SWFMRK_WSMK 0x02 111 u_int8_t num_marks[3]; 112 u_int8_t control; 113 }; 114 115 /* 116 * Reserve and release unit have the same exact cdb format, but different 117 * opcodes. 118 */ 119 struct scsi_reserve_release_unit 120 { 121 u_int8_t opcode; 122 u_int8_t lun_thirdparty; 123 #define SRRU_LUN_MASK 0xE0 124 #define SRRU_3RD_PARTY 0x10 125 #define SRRU_3RD_SHAMT 1 126 #define SRRU_3RD_MASK 0xE 127 u_int8_t reserved[3]; 128 u_int8_t control; 129 }; 130 131 /* 132 * Erase a tape 133 */ 134 struct scsi_erase 135 { 136 u_int8_t opcode; 137 u_int8_t lun_imm_long; 138 #define SE_LUN_MASK 0xE0 139 #define SE_LONG 0x1 140 #define SE_IMMED 0x2 141 u_int8_t reserved[3]; 142 u_int8_t control; 143 }; 144 145 /* 146 * Set tape capacity. 147 */ 148 struct scsi_set_capacity 149 { 150 u_int8_t opcode; 151 u_int8_t byte1; 152 #define SA_SSC_IMMED 0x01 153 u_int8_t reserved; 154 u_int8_t cap_proportion[2]; 155 u_int8_t control; 156 }; 157 158 /* 159 * Format tape media. The CDB opcode is the same as the disk-specific 160 * FORMAT UNIT command, but the fields are different inside the CDB. Thus 161 * the reason for a separate definition here. 162 */ 163 struct scsi_format_medium 164 { 165 u_int8_t opcode; 166 u_int8_t byte1; 167 #define SFM_IMMED 0x01 168 #define SFM_VERIFY 0x02 169 u_int8_t byte2; 170 #define SFM_FORMAT_DEFAULT 0x00 171 #define SFM_FORMAT_PARTITION 0x01 172 #define SFM_FORMAT_DEF_PART 0x02 173 #define SFM_FORMAT_MASK 0x0f 174 u_int8_t length[2]; 175 u_int8_t control; 176 }; 177 178 struct scsi_allow_overwrite 179 { 180 u_int8_t opcode; 181 u_int8_t reserved1; 182 u_int8_t allow_overwrite; 183 #define SAO_ALLOW_OVERWRITE_DISABLED 0x00 184 #define SAO_ALLOW_OVERWRITE_CUR_POS 0x01 185 #define SAO_ALLOW_OVERWRITE_FORMAT 0x02 186 u_int8_t partition; 187 u_int8_t logical_id[8]; 188 u_int8_t reserved2[3]; 189 u_int8_t control; 190 }; 191 192 /* 193 * Dev specific mode page masks. 194 */ 195 #define SMH_SA_WP 0x80 196 #define SMH_SA_BUF_MODE_MASK 0x70 197 #define SMH_SA_BUF_MODE_NOBUF 0x00 198 #define SMH_SA_BUF_MODE_SIBUF 0x10 /* Single-Initiator buffering */ 199 #define SMH_SA_BUF_MODE_MIBUF 0x20 /* Multi-Initiator buffering */ 200 #define SMH_SA_SPEED_MASK 0x0F 201 #define SMH_SA_SPEED_DEFAULT 0x00 202 203 /* 204 * Sequential-access specific mode page numbers. 205 */ 206 #define SA_DEVICE_CONFIGURATION_PAGE 0x10 207 #define SA_MEDIUM_PARTITION_PAGE_1 0x11 208 #define SA_MEDIUM_PARTITION_PAGE_2 0x12 209 #define SA_MEDIUM_PARTITION_PAGE_3 0x13 210 #define SA_MEDIUM_PARTITION_PAGE_4 0x14 211 #define SA_DATA_COMPRESSION_PAGE 0x0f /* SCSI-3 */ 212 213 /* 214 * Mode page definitions. 215 */ 216 217 /* See SCSI-II spec 9.3.3.1 */ 218 struct scsi_dev_conf_page { 219 u_int8_t pagecode; /* 0x10 */ 220 u_int8_t pagelength; /* 0x0e */ 221 u_int8_t byte2; /* CAP, CAF, Active Format */ 222 u_int8_t active_partition; 223 u_int8_t wb_full_ratio; 224 u_int8_t rb_empty_ratio; 225 u_int8_t wrdelay_time[2]; 226 u_int8_t byte8; 227 #define SA_DBR 0x80 /* data buffer recovery */ 228 #define SA_BIS 0x40 /* block identifiers supported */ 229 #define SA_RSMK 0x20 /* report setmarks */ 230 #define SA_AVC 0x10 /* automatic velocity control */ 231 #define SA_SOCF_MASK 0x0c /* stop on consecutive formats */ 232 #define SA_RBO 0x02 /* recover buffer order */ 233 #define SA_REW 0x01 /* report early warning */ 234 u_int8_t gap_size; 235 u_int8_t byte10; 236 /* from SCSI-3: SSC-4 Working draft (2/14) 8.3.3 */ 237 #define SA_EOD_DEF_MASK 0xe0 /* EOD defined */ 238 #define SA_EEG 0x10 /* Enable EOD Generation */ 239 #define SA_SEW 0x08 /* Synchronize at Early Warning */ 240 #define SA_SOFT_WP 0x04 /* Software Write Protect */ 241 #define SA_BAML 0x02 /* Block Address Mode Lock */ 242 #define SA_BAM 0x01 /* Block Address Mode */ 243 u_int8_t ew_bufsize[3]; 244 u_int8_t sel_comp_alg; 245 #define SA_COMP_NONE 0x00 246 #define SA_COMP_DEFAULT 0x01 247 /* the following is 'reserved' in SCSI-2 but is defined in SSC-r22 */ 248 u_int8_t extra_wp; 249 #define SA_ASOC_WP 0x04 /* Associated Write Protect */ 250 #define SA_PERS_WP 0x02 /* Persistent Write Protect */ 251 #define SA_PERM_WP 0x01 /* Permanent Write Protect */ 252 }; 253 254 /* from SCSI-3: SSC-Rev10 (6/97) */ 255 struct scsi_data_compression_page { 256 u_int8_t page_code; /* 0x0f */ 257 u_int8_t page_length; /* 0x0e */ 258 u_int8_t dce_and_dcc; 259 #define SA_DCP_DCE 0x80 /* Data compression enable */ 260 #define SA_DCP_DCC 0x40 /* Data compression capable */ 261 u_int8_t dde_and_red; 262 #define SA_DCP_DDE 0x80 /* Data decompression enable */ 263 #define SA_DCP_RED_MASK 0x60 /* Report Exception on Decomp. */ 264 #define SA_DCP_RED_SHAMT 5 265 #define SA_DCP_RED_0 0x00 266 #define SA_DCP_RED_1 0x20 267 #define SA_DCP_RED_2 0x40 268 u_int8_t comp_algorithm[4]; 269 u_int8_t decomp_algorithm[4]; 270 u_int8_t reserved[4]; 271 }; 272 273 typedef union { 274 struct { u_int8_t pagecode, pagelength; } hdr; 275 struct scsi_dev_conf_page dconf; 276 struct scsi_data_compression_page dcomp; 277 } sa_comp_t; 278 279 /* 280 * Control Data Protection subpage. This is as defined in SSC3r03. 281 */ 282 struct scsi_control_data_prot_subpage { 283 uint8_t page_code; 284 #define SA_CTRL_DP_PAGE_CODE 0x0a 285 uint8_t subpage_code; 286 #define SA_CTRL_DP_SUBPAGE_CODE 0xf0 287 uint8_t length[2]; 288 uint8_t prot_method; 289 #define SA_CTRL_DP_NO_LBP 0x00 290 #define SA_CTRL_DP_REED_SOLOMON 0x01 291 #define SA_CTRL_DP_METHOD_MAX 0xff 292 uint8_t pi_length; 293 #define SA_CTRL_DP_PI_LENGTH_MASK 0x3f 294 #define SA_CTRL_DP_RS_LENGTH 4 295 uint8_t prot_bits; 296 #define SA_CTRL_DP_LBP_W 0x80 297 #define SA_CTRL_DP_LBP_R 0x40 298 #define SA_CTRL_DP_RBDP 0x20 299 uint8_t reserved[]; 300 }; 301 302 /* 303 * This is the Read/Write Control mode page used on IBM Enterprise Tape 304 * Drives. They are known as 3592, TS, or Jaguar drives. The SCSI inquiry 305 * data will show a Product ID "03592XXX", where XXX is 'J1A', 'E05' (TS1120), 306 * 'E06' (TS1130), 'E07' (TS1140) or 'E08' (TS1150). 307 * 308 * This page definition is current as of the 3592 SCSI Reference v6, 309 * released on December 16th, 2014. 310 */ 311 struct scsi_tape_ibm_rw_control { 312 uint8_t page_code; 313 #define SA_IBM_RW_CTRL_PAGE_CODE 0x25 314 uint8_t page_length; 315 uint8_t ignore_seq_checks; 316 #define SA_IBM_RW_CTRL_LOC_IGNORE_SEQ 0x04 317 #define SA_IBM_RW_CTRL_SPC_BLK_IGNORE_SEQ 0x02 318 #define SA_IBM_RW_CTRL_SPC_FM_IGNORE_SEQ 0x01 319 uint8_t ignore_data_checks; 320 #define SA_IBM_RW_CTRL_LOC_IGNORE_DATA 0x04 321 #define SA_IBM_RW_CTRL_SPC_BLK_IGNORE_DATA 0x02 322 #define SA_IBM_RW_CTRL_SPC_FM_IGNORE_DATA 0x01 323 uint8_t reserved1; 324 uint8_t leop_method; 325 #define SA_IBM_RW_CTRL_LEOP_DEFAULT 0x00 326 #define SA_IBM_RW_CTRL_LEOP_MAX_CAP 0x01 327 #define SA_IBM_RW_CTRL_LEOP_CONST_CAP 0x02 328 uint8_t leop_ew[2]; 329 uint8_t byte8; 330 #define SA_IBM_RW_CTRL_DISABLE_FASTSYNC 0x80 331 #define SA_IBM_RW_CTRL_DISABLE_SKIPSYNC 0x40 332 #define SA_IBM_RW_CTRL_DISABLE_CROSS_EOD 0x08 333 #define SA_IBM_RW_CTRL_DISABLE_CROSS_PERM_ERR 0x04 334 #define SA_IBM_RW_CTRL_REPORT_SEG_EW 0x02 335 #define SA_IBM_RW_CTRL_REPORT_HOUSEKEEPING_ERR 0x01 336 uint8_t default_write_dens_bop_0; 337 uint8_t pending_write_dens_bop_0; 338 uint8_t reserved2[21]; 339 }; 340 341 struct scsi_tape_read_position { 342 u_int8_t opcode; /* READ_POSITION */ 343 u_int8_t byte1; /* set LSB to read hardware block pos */ 344 #define SA_RPOS_SHORT_FORM 0x00 345 #define SA_RPOS_SHORT_VENDOR 0x01 346 #define SA_RPOS_LONG_FORM 0x06 347 #define SA_RPOS_EXTENDED_FORM 0x08 348 u_int8_t reserved[5]; 349 u_int8_t length[2]; 350 u_int8_t control; 351 }; 352 353 struct scsi_tape_position_data { /* Short Form */ 354 u_int8_t flags; 355 #define SA_RPOS_BOP 0x80 /* Beginning of Partition */ 356 #define SA_RPOS_EOP 0x40 /* End of Partition */ 357 #define SA_RPOS_BCU 0x20 /* Block Count Unknown (SCSI3) */ 358 #define SA_RPOS_BYCU 0x10 /* Byte Count Unknown (SCSI3) */ 359 #define SA_RPOS_BPU 0x04 /* Block Position Unknown */ 360 #define SA_RPOS_PERR 0x02 /* Position Error (SCSI3) */ 361 #define SA_RPOS_BPEW 0x01 /* Beyond Programmable Early Warning */ 362 #define SA_RPOS_UNCERTAIN SA_RPOS_BPU 363 u_int8_t partition; 364 u_int8_t reserved[2]; 365 u_int8_t firstblk[4]; 366 u_int8_t lastblk[4]; 367 u_int8_t reserved2; 368 u_int8_t nbufblk[3]; 369 u_int8_t nbufbyte[4]; 370 }; 371 372 struct scsi_tape_position_long_data { 373 u_int8_t flags; 374 #define SA_RPOS_LONG_BOP 0x80 /* Beginning of Partition */ 375 #define SA_RPOS_LONG_EOP 0x40 /* End of Partition */ 376 #define SA_RPOS_LONG_MPU 0x08 /* Mark Position Unknown */ 377 #define SA_RPOS_LONG_LONU 0x04 /* Logical Object Number Unknown */ 378 #define SA_RPOS_LONG_BPEW 0x01 /* Beyond Programmable Early Warning */ 379 u_int8_t reserved[3]; 380 u_int8_t partition[4]; 381 u_int8_t logical_object_num[8]; 382 u_int8_t logical_file_num[8]; 383 u_int8_t set_id[8]; 384 }; 385 386 struct scsi_tape_position_ext_data { 387 u_int8_t flags; 388 #define SA_RPOS_EXT_BOP 0x80 /* Beginning of Partition */ 389 #define SA_RPOS_EXT_EOP 0x40 /* End of Partition */ 390 #define SA_RPOS_EXT_LOCU 0x20 /* Logical Object Count Unknown */ 391 #define SA_RPOS_EXT_BYCU 0x10 /* Byte Count Unknown */ 392 #define SA_RPOS_EXT_LOLU 0x04 /* Logical Object Location Unknown */ 393 #define SA_RPOS_EXT_PERR 0x02 /* Position Error */ 394 #define SA_RPOS_EXT_BPEW 0x01 /* Beyond Programmable Early Warning */ 395 u_int8_t partition; 396 u_int8_t length[2]; 397 u_int8_t reserved; 398 u_int8_t num_objects[3]; 399 u_int8_t first_object[8]; 400 u_int8_t last_object[8]; 401 u_int8_t bytes_in_buffer[8]; 402 }; 403 404 struct scsi_tape_locate { 405 u_int8_t opcode; 406 u_int8_t byte1; 407 #define SA_SPOS_IMMED 0x01 408 #define SA_SPOS_CP 0x02 409 #define SA_SPOS_BT 0x04 410 u_int8_t reserved1; 411 u_int8_t blkaddr[4]; 412 #define SA_SPOS_MAX_BLK 0xffffffff 413 u_int8_t reserved2; 414 u_int8_t partition; 415 u_int8_t control; 416 }; 417 418 struct scsi_locate_16 { 419 u_int8_t opcode; 420 u_int8_t byte1; 421 #define SA_LC_IMMEDIATE 0x01 422 #define SA_LC_CP 0x02 423 #define SA_LC_DEST_TYPE_MASK 0x38 424 #define SA_LC_DEST_TYPE_SHIFT 3 425 #define SA_LC_DEST_OBJECT 0x00 426 #define SA_LC_DEST_FILE 0x01 427 #define SA_LC_DEST_SET 0x02 428 #define SA_LC_DEST_EOD 0x03 429 u_int8_t byte2; 430 #define SA_LC_BAM_IMPLICIT 0x00 431 #define SA_LC_BAM_EXPLICIT 0x01 432 u_int8_t partition; 433 u_int8_t logical_id[8]; 434 u_int8_t reserved[3]; 435 u_int8_t control; 436 }; 437 438 struct scsi_report_density_support { 439 u_int8_t opcode; 440 u_int8_t byte1; 441 #define SRDS_MEDIA 0x01 442 #define SRDS_MEDIUM_TYPE 0x02 443 u_int8_t reserved[5]; 444 u_int8_t length[2]; 445 #define SRDS_MAX_LENGTH 0xffff 446 u_int8_t control; 447 }; 448 449 struct scsi_density_hdr { 450 u_int8_t length[2]; 451 u_int8_t reserved[2]; 452 u_int8_t descriptor[]; 453 }; 454 455 struct scsi_density_data { 456 u_int8_t primary_density_code; 457 u_int8_t secondary_density_code; 458 u_int8_t byte2; 459 #define SDD_DLV 0x01 460 #define SDD_DEFLT 0x20 461 #define SDD_DUP 0x40 462 #define SDD_WRTOK 0x80 463 u_int8_t length[2]; 464 #define SDD_DEFAULT_LENGTH 52 465 u_int8_t bits_per_mm[3]; 466 u_int8_t media_width[2]; 467 u_int8_t tracks[2]; 468 u_int8_t capacity[4]; 469 u_int8_t assigning_org[8]; 470 u_int8_t density_name[8]; 471 u_int8_t description[20]; 472 }; 473 474 struct scsi_medium_type_data { 475 u_int8_t medium_type; 476 u_int8_t reserved1; 477 u_int8_t length[2]; 478 #define SMTD_DEFAULT_LENGTH 52 479 u_int8_t num_density_codes; 480 u_int8_t primary_density_codes[9]; 481 u_int8_t media_width[2]; 482 u_int8_t medium_length[2]; 483 u_int8_t reserved2[2]; 484 u_int8_t assigning_org[8]; 485 u_int8_t medium_type_name[8]; 486 u_int8_t description[20]; 487 }; 488 489 /* 490 * Security Protocol Specific values for the Tape Data Encryption protocol 491 * (0x20) used with SECURITY PROTOCOL IN. See below for values used with 492 * SECURITY PROTOCOL OUT. Current as of SSC4r03. 493 */ 494 #define TDE_IN_SUPPORT_PAGE 0x0000 495 #define TDE_OUT_SUPPORT_PAGE 0x0001 496 #define TDE_DATA_ENC_CAP_PAGE 0x0010 497 #define TDE_SUPPORTED_KEY_FORMATS_PAGE 0x0011 498 #define TDE_DATA_ENC_MAN_CAP_PAGE 0x0012 499 #define TDE_DATA_ENC_STATUS_PAGE 0x0020 500 #define TDE_NEXT_BLOCK_ENC_STATUS_PAGE 0x0021 501 #define TDE_GET_ENC_MAN_ATTR_PAGE 0x0022 502 #define TDE_RANDOM_NUM_PAGE 0x0030 503 #define TDE_KEY_WRAP_PK_PAGE 0x0031 504 505 /* 506 * Tape Data Encryption protocol pages used with SECURITY PROTOCOL IN and 507 * SECURITY PROTOCOL OUT. 508 */ 509 /* 510 * Tape Data Encryption In Support page (0x0000). 511 */ 512 struct tde_in_support_page { 513 uint8_t page_code[2]; 514 uint8_t page_length[2]; 515 uint8_t page_codes[]; 516 }; 517 518 /* 519 * Tape Data Encryption Out Support page (0x0001). 520 */ 521 struct tde_out_support_page { 522 uint8_t page_code[2]; 523 uint8_t page_length[2]; 524 uint8_t page_codes[]; 525 }; 526 527 /* 528 * Logical block encryption algorithm descriptor. This is reported in the 529 * Data Encryption Capabilities page. 530 */ 531 struct tde_block_enc_alg_desc { 532 uint8_t alg_index; 533 uint8_t reserved1; 534 uint8_t desc_length[2]; 535 uint8_t byte4; 536 #define TDE_BEA_AVFMV 0x80 537 #define TDE_BEA_SDK_C 0x40 538 #define TDE_BEA_MAC_C 0x20 539 #define TDE_BEA_DELB_C 0x10 540 #define TDE_BEA_DECRYPT_C_MASK 0x0c 541 #define TDE_BEA_DECRYPT_C_EXT 0x0c 542 #define TDE_BEA_DECRYPT_C_HARD 0x08 543 #define TDE_BEA_DECRYPT_C_SOFT 0x04 544 #define TDE_BEA_DECRYPT_C_NO_CAP 0x00 545 #define TDE_BEA_ENCRYPT_C_MASK 0x03 546 #define TDE_BEA_ENCRYPT_C_EXT 0x03 547 #define TDE_BEA_ENCRYPT_C_HARD 0x02 548 #define TDE_BEA_ENCRYPT_C_SOFT 0x01 549 #define TDE_BEA_ENCRYPT_C_NO_CAP 0x00 550 uint8_t byte5; 551 #define TDE_BEA_AVFCLP_MASK 0xc0 552 #define TDE_BEA_AVFCLP_VALID 0x80 553 #define TDE_BEA_AVFCLP_NOT_VALID 0x40 554 #define TDE_BEA_AVFCLP_NOT_APP 0x00 555 #define TDE_BEA_NONCE_C_MASK 0x30 556 #define TDE_BEA_NONCE_C_SUPPORTED 0x30 557 #define TDE_BEA_NONCE_C_PROVIDED 0x20 558 #define TDE_BEA_NONCE_C_GENERATED 0x10 559 #define TDE_BEA_NONCE_C_NOT_REQUIRED 0x00 560 #define TDE_BEA_KADF_C 0x08 561 #define TDE_BEA_VCELB_C 0x04 562 #define TDE_BEA_UKADF 0x02 563 #define TDE_BEA_AKADF 0x01 564 uint8_t max_unauth_key_bytes[2]; 565 uint8_t max_auth_key_bytes[2]; 566 uint8_t lbe_key_size[2]; 567 uint8_t byte12; 568 #define TDE_BEA_DKAD_C_MASK 0xc0 569 #define TDE_BEA_DKAD_C_CAPABLE 0xc0 570 #define TDE_BEA_DKAD_C_NOT_ALLOWED 0x80 571 #define TDE_BEA_DKAD_C_REQUIRED 0x40 572 #define TDE_BEA_EEMC_C_MASK 0x30 573 #define TDE_BEA_EEMC_C_ALLOWED 0x20 574 #define TDE_BEA_EEMC_C_NOT_ALLOWED 0x10 575 #define TDE_BEA_EEMC_C_NOT_SPECIFIED 0x00 576 /* 577 * Raw Decryption Mode Control Capabilities (RDMC_C) field. The 578 * descriptions are too complex to represent as a simple name. 579 */ 580 #define TDE_BEA_RDMC_C_MASK 0x0e 581 #define TDE_BEA_RDMC_C_MODE_7 0x0e 582 #define TDE_BEA_RDMC_C_MODE_6 0x0c 583 #define TDE_BEA_RDMC_C_MODE_5 0x0a 584 #define TDE_BEA_RDMC_C_MODE_4 0x08 585 #define TDE_BEA_RDMC_C_MODE_1 0x02 586 #define TDE_BEA_EAREM 0x01 587 uint8_t byte13; 588 #define TDE_BEA_MAX_EEDKS_MASK 0x0f 589 uint8_t msdk_count[2]; 590 uint8_t max_eedk_size[2]; 591 uint8_t reserved2[2]; 592 uint8_t security_algo_code[4]; 593 }; 594 595 /* 596 * Data Encryption Capabilities page (0x0010). 597 */ 598 struct tde_data_enc_cap_page { 599 uint8_t page_code[2]; 600 uint8_t page_length; 601 uint8_t byte4; 602 #define DATA_ENC_CAP_EXTDECC_MASK 0x0c 603 #define DATA_ENC_CAP_EXTDECC_NOT_REPORTED 0x00 604 #define DATA_ENC_CAP_EXTDECC_NOT_CAPABLE 0x04 605 #define DATA_ENC_CAP_EXTDECC_CAPABLE 0x08 606 #define DATA_ENC_CAP_CFG_P_MASK 0x03 607 #define DATA_ENC_CAP_CFG_P_NOT_REPORTED 0x00 608 #define DATA_ENC_CAP_CFG_P_ALLOWED 0x01 609 #define DATA_ENC_CAP_CFG_P_NOT_ALLOWED 0x02 610 uint8_t reserved[15]; 611 struct tde_block_enc_alg_desc alg_descs[]; 612 }; 613 614 /* 615 * Tape Data Encryption Supported Key Formats page (0x0011). 616 */ 617 struct tde_supported_key_formats_page { 618 uint8_t page_code[2]; 619 uint8_t page_length[2]; 620 uint8_t key_formats_list[]; 621 }; 622 623 /* 624 * Tape Data Encryption Management Capabilities page (0x0012). 625 */ 626 struct tde_data_enc_man_cap_page { 627 uint8_t page_code[2]; 628 uint8_t page_length[2]; 629 uint8_t byte4; 630 #define TDE_DEMC_LOCK_C 0x01 631 uint8_t byte5; 632 #define TDE_DEMC_CKOD_C 0x04 633 #define TDE_DEMC_CKORP_C 0x02 634 #define TDE_DEMC_CKORL_C 0x01 635 uint8_t reserved1; 636 uint8_t byte7; 637 #define TDE_DEMC_AITN_C 0x04 638 #define TDE_DEMC_LOCAL_C 0x02 639 #define TDE_DEMC_PUBLIC_C 0x01 640 uint8_t reserved2[8]; 641 }; 642 643 /* 644 * Tape Data Encryption Status Page (0x0020). 645 */ 646 struct tde_data_enc_status_page { 647 uint8_t page_code[2]; 648 uint8_t page_length[2]; 649 uint8_t scope; 650 #define TDE_DES_IT_NEXUS_SCOPE_MASK 0xe0 651 #define TDE_DES_LBE_SCOPE_MASK 0x07 652 uint8_t encryption_mode; 653 uint8_t decryption_mode; 654 uint8_t algo_index; 655 uint8_t key_instance_counter[4]; 656 uint8_t byte12; 657 #define TDE_DES_PARAM_CTRL_MASK 0x70 658 #define TDE_DES_PARAM_CTRL_MGMT 0x40 659 #define TDE_DES_PARAM_CTRL_CHANGER 0x30 660 #define TDE_DES_PARAM_CTRL_DRIVE 0x20 661 #define TDE_DES_PARAM_CTRL_EXT 0x10 662 #define TDE_DES_PARAM_CTRL_NOT_REPORTED 0x00 663 #define TDE_DES_VCELB 0x08 664 #define TDE_DES_CEEMS_MASK 0x06 665 #define TDE_DES_RDMD 0x01 666 uint8_t enc_params_kad_format; 667 uint8_t asdk_count[2]; 668 uint8_t reserved[8]; 669 uint8_t key_assoc_data_desc[]; 670 }; 671 672 /* 673 * Tape Data Encryption Next Block Encryption Status page (0x0021). 674 */ 675 struct tde_next_block_enc_status_page { 676 uint8_t page_code[2]; 677 uint8_t page_length[2]; 678 uint8_t logical_obj_number[8]; 679 uint8_t status; 680 #define TDE_NBES_COMP_STATUS_MASK 0xf0 681 #define TDE_NBES_COMP_INCAPABLE 0x00 682 #define TDE_NBES_COMP_NOT_YET 0x10 683 #define TDE_NBES_COMP_NOT_A_BLOCK 0x20 684 #define TDE_NBES_COMP_NOT_COMPRESSED 0x30 685 #define TDE_NBES_COMP_COMPRESSED 0x40 686 #define TDE_NBES_ENC_STATUS_MASK 0x0f 687 #define TDE_NBES_ENC_INCAPABLE 0x00 688 #define TDE_NBES_ENC_NOT_YET 0x01 689 #define TDE_NBES_ENC_NOT_A_BLOCK 0x02 690 #define TDE_NBES_ENC_NOT_ENCRYPTED 0x03 691 #define TDE_NBES_ENC_ALG_NOT_SUPPORTED 0x04 692 #define TDE_NBES_ENC_SUPPORTED_ALG 0x05 693 #define TDE_NBES_ENC_NO_KEY 0x06 694 uint8_t algo_index; 695 uint8_t byte14; 696 #define TDE_NBES_EMES 0x02 697 #define TDE_NBES_RDMDS 0x01 698 uint8_t next_block_kad_format; 699 uint8_t key_assoc_data_desc[]; 700 }; 701 702 /* 703 * Tape Data Encryption Get Encryption Management Attributes page (0x0022). 704 */ 705 struct tde_get_enc_man_attr_page { 706 uint8_t page_code[2]; 707 uint8_t reserved[3]; 708 uint8_t byte5; 709 #define TDE_GEMA_CAOD 0x01 710 uint8_t page_length[2]; 711 uint8_t enc_mgmt_attr_desc[]; 712 }; 713 714 /* 715 * Tape Data Encryption Random Number page (0x0030). 716 */ 717 struct tde_random_num_page { 718 uint8_t page_code[2]; 719 uint8_t page_length[2]; 720 uint8_t random_number[32]; 721 }; 722 723 /* 724 * Tape Data Encryption Device Server Key Wrapping Public Key page (0x0031). 725 */ 726 struct tde_key_wrap_pk_page { 727 uint8_t page_code[2]; 728 uint8_t page_length[2]; 729 uint8_t public_key_type[4]; 730 uint8_t public_key_format[4]; 731 uint8_t public_key_length[2]; 732 uint8_t public_key[]; 733 }; 734 735 /* 736 * Security Protocol Specific values for the Tape Data Encryption protocol 737 * (0x20) used with SECURITY PROTOCOL OUT. See above for values used with 738 * SECURITY PROTOCOL IN. Current as of SSCr03. 739 */ 740 #define TDE_SET_DATA_ENC_PAGE 0x0010 741 #define TDE_SA_ENCAP_PAGE 0x0011 742 #define TDE_SET_ENC_MGMT_ATTR_PAGE 0x0022 743 744 /* 745 * Tape Data Encryption Set Data Encryption page (0x0010). 746 */ 747 struct tde_set_data_enc_page { 748 uint8_t page_code[2]; 749 uint8_t page_length[2]; 750 uint8_t byte4; 751 #define TDE_SDE_SCOPE_MASK 0xe0 752 #define TDE_SDE_SCOPE_ALL_IT_NEXUS 0x80 753 #define TDE_SDE_SCOPE_LOCAL 0x40 754 #define TDE_SDE_SCOPE_PUBLIC 0x00 755 #define TDE_SDE_LOCK 0x01 756 uint8_t byte5; 757 #define TDE_SDE_CEEM_MASK 0xc0 758 #define TDE_SDE_CEEM_ENCRYPT 0xc0 759 #define TDE_SDE_CEEM_EXTERNAL 0x80 760 #define TDE_SDE_CEEM_NO_CHECK 0x40 761 #define TDE_SDE_RDMC_MASK 0x30 762 #define TDE_SDE_RDMC_DISABLED 0x30 763 #define TDE_SDE_RDMC_ENABLED 0x20 764 #define TDE_SDE_RDMC_DEFAULT 0x00 765 #define TDE_SDE_SDK 0x08 766 #define TDE_SDE_CKOD 0x04 767 #define TDE_SDE_CKORP 0x02 768 #define TDE_SDE_CKORL 0x01 769 uint8_t encryption_mode; 770 #define TDE_SDE_ENC_MODE_DISABLE 0x00 771 #define TDE_SDE_ENC_MODE_EXTERNAL 0x01 772 #define TDE_SDE_ENC_MODE_ENCRYPT 0x02 773 uint8_t decryption_mode; 774 #define TDE_SDE_DEC_MODE_DISABLE 0x00 775 #define TDE_SDE_DEC_MODE_RAW 0x01 776 #define TDE_SDE_DEC_MODE_DECRYPT 0x02 777 #define TDE_SDE_DEC_MODE_MIXED 0x03 778 uint8_t algo_index; 779 uint8_t lbe_key_format; 780 #define TDE_SDE_KEY_PLAINTEXT 0x00 781 #define TDE_SDE_KEY_VENDOR_SPEC 0x01 782 #define TDE_SDE_KEY_PUBLIC_WRAP 0x02 783 #define TDE_SDE_KEY_ESP_SCSI 0x03 784 uint8_t kad_format; 785 #define TDE_SDE_KAD_ASCII 0x02 786 #define TDE_SDE_KAD_BINARY 0x01 787 #define TDE_SDE_KAD_UNSPECIFIED 0x00 788 uint8_t reserved[7]; 789 uint8_t lbe_key_length[2]; 790 uint8_t lbe_key[]; 791 }; 792 793 /* 794 * Used for the Vendor Specific key format (0x01). 795 */ 796 struct tde_key_format_vendor { 797 uint8_t t10_vendor_id[8]; 798 uint8_t vendor_key[]; 799 }; 800 801 /* 802 * Used for the public key wrapped format (0x02). 803 */ 804 struct tde_key_format_public_wrap { 805 uint8_t parameter_set[2]; 806 #define TDE_PARAM_SET_RSA2048 0x0000 807 #define TDE_PARAM_SET_ECC521 0x0010 808 uint8_t label_length[2]; 809 uint8_t label[]; 810 }; 811 812 /* 813 * Tape Data Encryption SA Encapsulation page (0x0011). 814 */ 815 struct tde_sa_encap_page { 816 uint8_t page_code[2]; 817 uint8_t data_desc[]; 818 }; 819 820 /* 821 * Tape Data Encryption Set Encryption Management Attributes page (0x0022). 822 */ 823 struct tde_set_enc_mgmt_attr_page { 824 uint8_t page_code[2]; 825 uint8_t reserved[3]; 826 uint8_t byte5; 827 #define TDE_SEMA_CAOD 0x01 828 uint8_t page_length[2]; 829 uint8_t attr_desc[]; 830 }; 831 832 /* 833 * Tape Data Encryption descriptor format. 834 * SSC4r03 Section 8.5.4.2.1 Table 197 835 */ 836 struct tde_data_enc_desc { 837 uint8_t key_desc_type; 838 #define TDE_KEY_DESC_WK_KAD 0x04 839 #define TDE_KEY_DESC_M_KAD 0x03 840 #define TDE_KEY_DESC_NONCE_VALUE 0x02 841 #define TDE_KEY_DESC_A_KAD 0x01 842 #define TDE_KEY_DESC_U_KAD 0x00 843 uint8_t byte2; 844 #define TDE_KEY_DESC_AUTH_MASK 0x07 845 #define TDE_KEY_DESC_AUTH_FAILED 0x04 846 #define TDE_KEY_DESC_AUTH_SUCCESS 0x03 847 #define TDE_KEY_DESC_AUTH_NO_ATTEMPT 0x02 848 #define TDE_KEY_DESC_AUTH_U_KAD 0x01 849 uint8_t key_desc_length[2]; 850 uint8_t key_desc[]; 851 }; 852 853 /* 854 * Wrapped Key descriptor format. 855 * SSC4r03 Section 8.5.4.3.1 Table 200 856 */ 857 struct tde_wrapped_key_desc { 858 uint8_t wrapped_key_type; 859 #define TDE_WRAP_KEY_DESC_LENGTH 0x04 860 #define TDE_WRAP_KEY_DESC_IDENT 0x03 861 #define TDE_WRAP_KEY_DESC_INFO 0x02 862 #define TDE_WRAP_KEY_DESC_ENTITY_ID 0x01 863 #define TDE_WRAP_KEY_DESC_DEVICE_ID 0x00 864 uint8_t reserved; 865 uint8_t wrapped_desc_length[2]; 866 uint8_t wrapped_desc[]; 867 }; 868 869 /* 870 * Encryption management attributes descriptor format. 871 * SSC4r03 Section 8.5.4.4.1 Table 202 872 */ 873 struct tde_enc_mgmt_attr_desc { 874 uint8_t enc_mgmt_attr_type[2]; 875 #define TDE_EMAD_DESIRED_KEY_MGR_OP 0x0000 876 #define TDE_EMAD_LOG_BLOCK_ENC_KEY_CRIT 0x0001 877 #define TDE_EMAD_LOG_BLOCK_ENC_KEY_WRAP 0x0002 878 uint8_t reserved; 879 uint8_t byte2; 880 #define TDE_EMAD_CRIT 0x80 881 uint8_t attr_length[2]; 882 uint8_t attributes[]; 883 #define TDE_EMAD_DESIRED_KEY_CREATE 0x0001 884 #define TDE_EMAD_DESIRED_KEY_RESOLVE 0x0002 885 }; 886 887 /* 888 * Logical block encryption key selection criteria descriptor format. 889 * SSC4r03 Section 8.5.4.4.3.1 Table 206 890 */ 891 struct tde_lb_enc_key_sel_desc { 892 uint8_t lbe_key_sel_crit_type[2]; 893 /* 894 * The CRIT bit is the top bit of the first byte of the type. 895 */ 896 #define TDE_LBE_KEY_SEL_CRIT 0x80 897 #define TDE_LBE_KEY_SEL_ALGO 0x0001 898 #define TDE_LBE_KEY_SEL_ID 0x0002 899 uint8_t lbe_key_sel_crit_length[2]; 900 uint8_t lbe_key_sel_crit[]; 901 }; 902 903 /* 904 * Logical block encryption key wrapping attribute descriptor format. 905 * SSC4r03 Section 8.5.4.4.4.1 Table 209 906 */ 907 struct tde_lb_enc_key_wrap_desc { 908 uint8_t lbe_key_wrap_type[2]; 909 /* 910 * The CRIT bit is the top bit of the first byte of the type. 911 */ 912 #define TDE_LBE_KEY_WRAP_CRIT 0x80 913 #define TDE_LBE_KEY_WRAP_KEKS 0x0001 914 uint8_t lbe_key_wrap_length[2]; 915 uint8_t lbe_key_wrap_attr[]; 916 }; 917 918 /* 919 * Opcodes 920 */ 921 #define REWIND 0x01 922 #define FORMAT_MEDIUM 0x04 923 #define READ_BLOCK_LIMITS 0x05 924 #define SA_READ 0x08 925 #define SA_WRITE 0x0A 926 #define SET_CAPACITY 0x0B 927 #define WRITE_FILEMARKS 0x10 928 #define SPACE 0x11 929 #define RESERVE_UNIT 0x16 930 #define RELEASE_UNIT 0x17 931 #define ERASE 0x19 932 #define LOAD_UNLOAD 0x1B 933 #define LOCATE 0x2B 934 #define READ_POSITION 0x34 935 #define REPORT_DENSITY_SUPPORT 0x44 936 #define ALLOW_OVERWRITE 0x82 937 #define LOCATE_16 0x92 938 939 /* 940 * Tape specific density codes- only enough of them here to recognize 941 * some specific older units so we can choose 2FM@EOD or FIXED blocksize 942 * quirks. 943 */ 944 #define SCSI_DENSITY_HALFINCH_800 0x01 945 #define SCSI_DENSITY_HALFINCH_1600 0x02 946 #define SCSI_DENSITY_HALFINCH_6250 0x03 947 #define SCSI_DENSITY_HALFINCH_6250C 0xC3 /* HP Compressed 6250 */ 948 #define SCSI_DENSITY_QIC_11_4TRK 0x04 949 #define SCSI_DENSITY_QIC_11_9TRK 0x84 /* Vendor Unique Emulex */ 950 #define SCSI_DENSITY_QIC_24 0x05 951 #define SCSI_DENSITY_HALFINCH_PE 0x06 952 #define SCSI_DENSITY_QIC_120 0x0f 953 #define SCSI_DENSITY_QIC_150 0x10 954 #define SCSI_DENSITY_QIC_525_320 0x11 955 #define SCSI_DENSITY_QIC_1320 0x12 956 #define SCSI_DENSITY_QIC_2GB 0x22 957 #define SCSI_DENSITY_QIC_4GB 0x26 958 #define SCSI_DENSITY_QIC_3080 0x29 959 960 __BEGIN_DECLS 961 void scsi_read_block_limits(struct ccb_scsiio *, u_int32_t, 962 void (*cbfcnp)(struct cam_periph *, union ccb *), 963 u_int8_t, struct scsi_read_block_limits_data *, 964 u_int8_t , u_int32_t); 965 966 void scsi_sa_read_write(struct ccb_scsiio *csio, u_int32_t retries, 967 void (*cbfcnp)(struct cam_periph *, union ccb *), 968 u_int8_t tag_action, int readop, int sli, 969 int fixed, u_int32_t length, u_int8_t *data_ptr, 970 u_int32_t dxfer_len, u_int8_t sense_len, 971 u_int32_t timeout); 972 973 void scsi_rewind(struct ccb_scsiio *csio, u_int32_t retries, 974 void (*cbfcnp)(struct cam_periph *, union ccb *), 975 u_int8_t tag_action, int immediate, u_int8_t sense_len, 976 u_int32_t timeout); 977 978 void scsi_space(struct ccb_scsiio *csio, u_int32_t retries, 979 void (*cbfcnp)(struct cam_periph *, union ccb *), 980 u_int8_t tag_action, scsi_space_code code, 981 u_int32_t count, u_int8_t sense_len, u_int32_t timeout); 982 983 void scsi_load_unload(struct ccb_scsiio *csio, u_int32_t retries, 984 void (*cbfcnp)(struct cam_periph *, union ccb *), 985 u_int8_t tag_action, int immediate, int eot, 986 int reten, int load, u_int8_t sense_len, 987 u_int32_t timeout); 988 989 void scsi_write_filemarks(struct ccb_scsiio *csio, u_int32_t retries, 990 void (*cbfcnp)(struct cam_periph *, union ccb *), 991 u_int8_t tag_action, int immediate, int setmark, 992 u_int32_t num_marks, u_int8_t sense_len, 993 u_int32_t timeout); 994 995 void scsi_reserve_release_unit(struct ccb_scsiio *csio, u_int32_t retries, 996 void (*cbfcnp)(struct cam_periph *, 997 union ccb *), u_int8_t tag_action, 998 int third_party, int third_party_id, 999 u_int8_t sense_len, u_int32_t timeout, 1000 int reserve); 1001 1002 void scsi_erase(struct ccb_scsiio *csio, u_int32_t retries, 1003 void (*cbfcnp)(struct cam_periph *, union ccb *), 1004 u_int8_t tag_action, int immediate, int long_erase, 1005 u_int8_t sense_len, u_int32_t timeout); 1006 1007 void scsi_data_comp_page(struct scsi_data_compression_page *page, 1008 u_int8_t dce, u_int8_t dde, u_int8_t red, 1009 u_int32_t comp_algorithm, 1010 u_int32_t decomp_algorithm); 1011 1012 void scsi_read_position(struct ccb_scsiio *csio, u_int32_t retries, 1013 void (*cbfcnp)(struct cam_periph *, union ccb *), 1014 u_int8_t tag_action, int hardsoft, 1015 struct scsi_tape_position_data *sbp, 1016 u_int8_t sense_len, u_int32_t timeout); 1017 void scsi_read_position_10(struct ccb_scsiio *csio, u_int32_t retries, 1018 void (*cbfcnp)(struct cam_periph *, union ccb *), 1019 u_int8_t tag_action, int service_action, 1020 u_int8_t *data_ptr, u_int32_t length, 1021 u_int32_t sense_len, u_int32_t timeout); 1022 1023 void scsi_set_position(struct ccb_scsiio *csio, u_int32_t retries, 1024 void (*cbfcnp)(struct cam_periph *, union ccb *), 1025 u_int8_t tag_action, int hardsoft, u_int32_t blkno, 1026 u_int8_t sense_len, u_int32_t timeout); 1027 1028 void scsi_locate_10(struct ccb_scsiio *csio, u_int32_t retries, 1029 void (*cbfcnp)(struct cam_periph *, union ccb *), 1030 u_int8_t tag_action, int immed, int cp, int hard, 1031 int64_t partition, u_int32_t block_address, 1032 int sense_len, u_int32_t timeout); 1033 1034 void scsi_locate_16(struct ccb_scsiio *csio, u_int32_t retries, 1035 void (*cbfcnp)(struct cam_periph *, union ccb *), 1036 u_int8_t tag_action, int immed, int cp, 1037 u_int8_t dest_type, int bam, int64_t partition, 1038 u_int64_t logical_id, int sense_len, 1039 u_int32_t timeout); 1040 1041 void scsi_report_density_support(struct ccb_scsiio *csio, u_int32_t retries, 1042 void (*cbfcnp)(struct cam_periph *, 1043 union ccb *), 1044 u_int8_t tag_action, int media, 1045 int medium_type, u_int8_t *data_ptr, 1046 u_int32_t length, u_int32_t sense_len, 1047 u_int32_t timeout); 1048 1049 void scsi_set_capacity(struct ccb_scsiio *csio, u_int32_t retries, 1050 void (*cbfcnp)(struct cam_periph *, union ccb *), 1051 u_int8_t tag_action, int byte1, u_int32_t proportion, 1052 u_int32_t sense_len, u_int32_t timeout); 1053 1054 void scsi_format_medium(struct ccb_scsiio *csio, u_int32_t retries, 1055 void (*cbfcnp)(struct cam_periph *, union ccb *), 1056 u_int8_t tag_action, int byte1, int byte2, 1057 u_int8_t *data_ptr, u_int32_t length, 1058 u_int32_t sense_len, u_int32_t timeout); 1059 1060 void scsi_allow_overwrite(struct ccb_scsiio *csio, u_int32_t retries, 1061 void (*cbfcnp)(struct cam_periph *, union ccb *), 1062 u_int8_t tag_action, int allow_overwrite, 1063 int partition, u_int64_t logical_id, 1064 u_int32_t sense_len, u_int32_t timeout); 1065 1066 __END_DECLS 1067 1068 #endif /* _SCSI_SCSI_SA_H */ 1069