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