1139743Simp/*- 270946Ssteve * Structure and function declarations for the 339213Sgibbs * SCSI Sequential Access Peripheral driver for CAM. 439213Sgibbs * 568116Smjacob * Copyright (c) 1999, 2000 Matthew Jacob 6280438Sken * Copyright (c) 2013, 2014, 2015 Spectra Logic Corporation 739213Sgibbs * All rights reserved. 839213Sgibbs * 939213Sgibbs * Redistribution and use in source and binary forms, with or without 1039213Sgibbs * modification, are permitted provided that the following conditions 1139213Sgibbs * are met: 1239213Sgibbs * 1. Redistributions of source code must retain the above copyright 1339213Sgibbs * notice, this list of conditions, and the following disclaimer, 1439213Sgibbs * without modification, immediately at the beginning of the file. 1539213Sgibbs * 2. The name of the author may not be used to endorse or promote products 1639213Sgibbs * derived from this software without specific prior written permission. 1739213Sgibbs * 1839213Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1939213Sgibbs * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2039213Sgibbs * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2139213Sgibbs * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 2239213Sgibbs * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2339213Sgibbs * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2439213Sgibbs * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2539213Sgibbs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2639213Sgibbs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2739213Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2839213Sgibbs * SUCH DAMAGE. 2939213Sgibbs * 3050477Speter * $FreeBSD: releng/10.3/sys/cam/scsi/scsi_sa.h 280438 2015-03-24 14:36:10Z ken $ 3139213Sgibbs */ 3239213Sgibbs 3339213Sgibbs#ifndef _SCSI_SCSI_SA_H 3439213Sgibbs#define _SCSI_SCSI_SA_H 1 3539213Sgibbs 3639213Sgibbs#include <sys/cdefs.h> 3739213Sgibbs 3839213Sgibbsstruct scsi_read_block_limits 3939213Sgibbs{ 4039213Sgibbs u_int8_t opcode; 4139213Sgibbs u_int8_t byte2; 4239213Sgibbs u_int8_t unused[3]; 4339213Sgibbs u_int8_t control; 4439213Sgibbs}; 4539213Sgibbs 4639213Sgibbsstruct scsi_read_block_limits_data 4739213Sgibbs{ 4839213Sgibbs u_int8_t gran; 4939213Sgibbs#define RBL_GRAN_MASK 0x1F 5039213Sgibbs#define RBL_GRAN(rblim) ((rblim)->gran & RBL_GRAN_MASK) 5139213Sgibbs u_int8_t maximum[3]; 5239213Sgibbs u_int8_t minimum[2]; 5339213Sgibbs}; 5439213Sgibbs 5539213Sgibbsstruct scsi_sa_rw 5639213Sgibbs{ 5739213Sgibbs u_int8_t opcode; 5839213Sgibbs u_int8_t sli_fixed; 5939213Sgibbs#define SAR_SLI 0x02 6039213Sgibbs#define SARW_FIXED 0x01 6139213Sgibbs u_int8_t length[3]; 6239213Sgibbs u_int8_t control; 6339213Sgibbs}; 6439213Sgibbs 6539213Sgibbsstruct scsi_load_unload 6639213Sgibbs{ 6739213Sgibbs u_int8_t opcode; 6839213Sgibbs u_int8_t immediate; 6939213Sgibbs#define SLU_IMMED 0x01 7039213Sgibbs u_int8_t reserved[2]; 7139213Sgibbs u_int8_t eot_reten_load; 7239213Sgibbs#define SLU_EOT 0x04 7339213Sgibbs#define SLU_RETEN 0x02 7439213Sgibbs#define SLU_LOAD 0x01 7539213Sgibbs u_int8_t control; 7639213Sgibbs}; 7739213Sgibbs 7839213Sgibbsstruct scsi_rewind 7939213Sgibbs{ 8039213Sgibbs u_int8_t opcode; 8139213Sgibbs u_int8_t immediate; 8239213Sgibbs#define SREW_IMMED 0x01 8339213Sgibbs u_int8_t reserved[3]; 8439213Sgibbs u_int8_t control; 8539213Sgibbs}; 8639213Sgibbs 8739213Sgibbstypedef enum { 8839213Sgibbs SS_BLOCKS, 8939213Sgibbs SS_FILEMARKS, 9039213Sgibbs SS_SEQFILEMARKS, 9139213Sgibbs SS_EOD, 9239213Sgibbs SS_SETMARKS, 9339213Sgibbs SS_SEQSETMARKS 9439213Sgibbs} scsi_space_code; 9539213Sgibbs 9639213Sgibbsstruct scsi_space 9739213Sgibbs{ 9839213Sgibbs u_int8_t opcode; 9939213Sgibbs u_int8_t code; 10039213Sgibbs#define SREW_IMMED 0x01 10139213Sgibbs u_int8_t count[3]; 10239213Sgibbs u_int8_t control; 10339213Sgibbs}; 10439213Sgibbs 10539213Sgibbsstruct scsi_write_filemarks 10639213Sgibbs{ 10739213Sgibbs u_int8_t opcode; 10839213Sgibbs u_int8_t byte2; 10939213Sgibbs#define SWFMRK_IMMED 0x01 11039213Sgibbs#define SWFMRK_WSMK 0x02 11139213Sgibbs u_int8_t num_marks[3]; 11239213Sgibbs u_int8_t control; 11339213Sgibbs}; 11439213Sgibbs 11539213Sgibbs/* 11639213Sgibbs * Reserve and release unit have the same exact cdb format, but different 11739213Sgibbs * opcodes. 11839213Sgibbs */ 11939213Sgibbsstruct scsi_reserve_release_unit 12039213Sgibbs{ 12139213Sgibbs u_int8_t opcode; 12239213Sgibbs u_int8_t lun_thirdparty; 12339213Sgibbs#define SRRU_LUN_MASK 0xE0 12439213Sgibbs#define SRRU_3RD_PARTY 0x10 12539213Sgibbs#define SRRU_3RD_SHAMT 1 12639213Sgibbs#define SRRU_3RD_MASK 0xE 12739213Sgibbs u_int8_t reserved[3]; 12839213Sgibbs u_int8_t control; 12939213Sgibbs}; 13039213Sgibbs 13139213Sgibbs/* 13239213Sgibbs * Erase a tape 13339213Sgibbs */ 13439213Sgibbsstruct scsi_erase 13539213Sgibbs{ 13639213Sgibbs u_int8_t opcode; 13739213Sgibbs u_int8_t lun_imm_long; 13839213Sgibbs#define SE_LUN_MASK 0xE0 13939213Sgibbs#define SE_LONG 0x1 14039213Sgibbs#define SE_IMMED 0x2 14139213Sgibbs u_int8_t reserved[3]; 14239213Sgibbs u_int8_t control; 14339213Sgibbs}; 14439213Sgibbs 14539213Sgibbs/* 146280438Sken * Set tape capacity. 147280438Sken */ 148280438Skenstruct scsi_set_capacity 149280438Sken{ 150280438Sken u_int8_t opcode; 151280438Sken u_int8_t byte1; 152280438Sken#define SA_SSC_IMMED 0x01 153280438Sken u_int8_t reserved; 154280438Sken u_int8_t cap_proportion[2]; 155280438Sken u_int8_t control; 156280438Sken}; 157280438Sken 158280438Sken/* 159280438Sken * Format tape media. The CDB opcode is the same as the disk-specific 160280438Sken * FORMAT UNIT command, but the fields are different inside the CDB. Thus 161280438Sken * the reason for a separate definition here. 162280438Sken */ 163280438Skenstruct scsi_format_medium 164280438Sken{ 165280438Sken u_int8_t opcode; 166280438Sken u_int8_t byte1; 167280438Sken#define SFM_IMMED 0x01 168280438Sken#define SFM_VERIFY 0x02 169280438Sken u_int8_t byte2; 170280438Sken#define SFM_FORMAT_DEFAULT 0x00 171280438Sken#define SFM_FORMAT_PARTITION 0x01 172280438Sken#define SFM_FORMAT_DEF_PART 0x02 173280438Sken#define SFM_FORMAT_MASK 0x0f 174280438Sken u_int8_t length[2]; 175280438Sken u_int8_t control; 176280438Sken}; 177280438Sken 178280438Skenstruct scsi_allow_overwrite 179280438Sken{ 180280438Sken u_int8_t opcode; 181280438Sken u_int8_t reserved1; 182280438Sken u_int8_t allow_overwrite; 183280438Sken#define SAO_ALLOW_OVERWRITE_DISABLED 0x00 184280438Sken#define SAO_ALLOW_OVERWRITE_CUR_POS 0x01 185280438Sken#define SAO_ALLOW_OVERWRITE_FORMAT 0x02 186280438Sken u_int8_t partition; 187280438Sken u_int8_t logical_id[8]; 188280438Sken u_int8_t reserved2[3]; 189280438Sken u_int8_t control; 190280438Sken}; 191280438Sken 192280438Sken/* 19339213Sgibbs * Dev specific mode page masks. 19439213Sgibbs */ 19539213Sgibbs#define SMH_SA_WP 0x80 19639213Sgibbs#define SMH_SA_BUF_MODE_MASK 0x70 19739213Sgibbs#define SMH_SA_BUF_MODE_NOBUF 0x00 19839213Sgibbs#define SMH_SA_BUF_MODE_SIBUF 0x10 /* Single-Initiator buffering */ 19939213Sgibbs#define SMH_SA_BUF_MODE_MIBUF 0x20 /* Multi-Initiator buffering */ 20039213Sgibbs#define SMH_SA_SPEED_MASK 0x0F 20139213Sgibbs#define SMH_SA_SPEED_DEFAULT 0x00 20239213Sgibbs 20339213Sgibbs/* 20439213Sgibbs * Sequential-access specific mode page numbers. 20539213Sgibbs */ 20639213Sgibbs#define SA_DEVICE_CONFIGURATION_PAGE 0x10 20739213Sgibbs#define SA_MEDIUM_PARTITION_PAGE_1 0x11 20839213Sgibbs#define SA_MEDIUM_PARTITION_PAGE_2 0x12 20939213Sgibbs#define SA_MEDIUM_PARTITION_PAGE_3 0x13 21039213Sgibbs#define SA_MEDIUM_PARTITION_PAGE_4 0x14 21146950Smjacob#define SA_DATA_COMPRESSION_PAGE 0x0f /* SCSI-3 */ 21239213Sgibbs 21339213Sgibbs/* 21439213Sgibbs * Mode page definitions. 21539213Sgibbs */ 21639213Sgibbs 21746950Smjacob/* See SCSI-II spec 9.3.3.1 */ 21846950Smjacobstruct scsi_dev_conf_page { 21946950Smjacob u_int8_t pagecode; /* 0x10 */ 22046950Smjacob u_int8_t pagelength; /* 0x0e */ 22168114Smjacob u_int8_t byte2; /* CAP, CAF, Active Format */ 22246950Smjacob u_int8_t active_partition; 22346950Smjacob u_int8_t wb_full_ratio; 22446950Smjacob u_int8_t rb_empty_ratio; 22546950Smjacob u_int8_t wrdelay_time[2]; 22646950Smjacob u_int8_t byte8; 22746950Smjacob#define SA_DBR 0x80 /* data buffer recovery */ 22846950Smjacob#define SA_BIS 0x40 /* block identifiers supported */ 22946950Smjacob#define SA_RSMK 0x20 /* report setmarks */ 23046950Smjacob#define SA_AVC 0x10 /* automatic velocity control */ 231280438Sken#define SA_SOCF_MASK 0x0c /* stop on consecutive formats */ 232280438Sken#define SA_RBO 0x02 /* recover buffer order */ 233280438Sken#define SA_REW 0x01 /* report early warning */ 23446950Smjacob u_int8_t gap_size; 23546950Smjacob u_int8_t byte10; 236280438Sken/* from SCSI-3: SSC-4 Working draft (2/14) 8.3.3 */ 237280438Sken#define SA_EOD_DEF_MASK 0xe0 /* EOD defined */ 238280438Sken#define SA_EEG 0x10 /* Enable EOD Generation */ 239280438Sken#define SA_SEW 0x08 /* Synchronize at Early Warning */ 240280438Sken#define SA_SOFT_WP 0x04 /* Software Write Protect */ 241280438Sken#define SA_BAML 0x02 /* Block Address Mode Lock */ 242280438Sken#define SA_BAM 0x01 /* Block Address Mode */ 24346950Smjacob u_int8_t ew_bufsize[3]; 24446950Smjacob u_int8_t sel_comp_alg; 24546950Smjacob#define SA_COMP_NONE 0x00 24646950Smjacob#define SA_COMP_DEFAULT 0x01 24768114Smjacob /* the following is 'reserved' in SCSI-2 but is defined in SSC-r22 */ 24868114Smjacob u_int8_t extra_wp; 24968114Smjacob#define SA_ASOC_WP 0x04 /* Associated Write Protect */ 25068114Smjacob#define SA_PERS_WP 0x02 /* Persistent Write Protect */ 25168114Smjacob#define SA_PERM_WP 0x01 /* Permanent Write Protect */ 25246950Smjacob}; 25346950Smjacob 25446950Smjacob/* from SCSI-3: SSC-Rev10 (6/97) */ 25539213Sgibbsstruct scsi_data_compression_page { 25646950Smjacob u_int8_t page_code; /* 0x0f */ 25768114Smjacob u_int8_t page_length; /* 0x0e */ 25868114Smjacob u_int8_t dce_and_dcc; 25939213Sgibbs#define SA_DCP_DCE 0x80 /* Data compression enable */ 26039213Sgibbs#define SA_DCP_DCC 0x40 /* Data compression capable */ 26168114Smjacob u_int8_t dde_and_red; 26239213Sgibbs#define SA_DCP_DDE 0x80 /* Data decompression enable */ 26339213Sgibbs#define SA_DCP_RED_MASK 0x60 /* Report Exception on Decomp. */ 26439213Sgibbs#define SA_DCP_RED_SHAMT 5 26539213Sgibbs#define SA_DCP_RED_0 0x00 26639213Sgibbs#define SA_DCP_RED_1 0x20 26739213Sgibbs#define SA_DCP_RED_2 0x40 26839213Sgibbs u_int8_t comp_algorithm[4]; 26939213Sgibbs u_int8_t decomp_algorithm[4]; 27039213Sgibbs u_int8_t reserved[4]; 27139213Sgibbs}; 27239213Sgibbs 27346950Smjacobtypedef union { 27446950Smjacob struct { u_int8_t pagecode, pagelength; } hdr; 27546950Smjacob struct scsi_dev_conf_page dconf; 27646950Smjacob struct scsi_data_compression_page dcomp; 27746950Smjacob} sa_comp_t; 27846950Smjacob 279280438Sken/* 280280438Sken * Control Data Protection subpage. This is as defined in SSC3r03. 281280438Sken */ 282280438Skenstruct scsi_control_data_prot_subpage { 283280438Sken uint8_t page_code; 284280438Sken#define SA_CTRL_DP_PAGE_CODE 0x0a 285280438Sken uint8_t subpage_code; 286280438Sken#define SA_CTRL_DP_SUBPAGE_CODE 0xf0 287280438Sken uint8_t length[2]; 288280438Sken uint8_t prot_method; 289280438Sken#define SA_CTRL_DP_NO_LBP 0x00 290280438Sken#define SA_CTRL_DP_REED_SOLOMON 0x01 291280438Sken#define SA_CTRL_DP_METHOD_MAX 0xff 292280438Sken uint8_t pi_length; 293280438Sken#define SA_CTRL_DP_PI_LENGTH_MASK 0x3f 294280438Sken#define SA_CTRL_DP_RS_LENGTH 4 295280438Sken uint8_t prot_bits; 296280438Sken#define SA_CTRL_DP_LBP_W 0x80 297280438Sken#define SA_CTRL_DP_LBP_R 0x40 298280438Sken#define SA_CTRL_DP_RBDP 0x20 299280438Sken uint8_t reserved[]; 300280438Sken}; 301280438Sken 302280438Sken/* 303280438Sken * This is the Read/Write Control mode page used on IBM Enterprise Tape 304280438Sken * Drives. They are known as 3592, TS, or Jaguar drives. The SCSI inquiry 305280438Sken * data will show a Product ID "03592XXX", where XXX is 'J1A', 'E05' (TS1120), 306280438Sken * 'E06' (TS1130), 'E07' (TS1140) or 'E08' (TS1150). 307280438Sken * 308280438Sken * This page definition is current as of the 3592 SCSI Reference v6, 309280438Sken * released on December 16th, 2014. 310280438Sken */ 311280438Skenstruct scsi_tape_ibm_rw_control { 312280438Sken uint8_t page_code; 313280438Sken#define SA_IBM_RW_CTRL_PAGE_CODE 0x25 314280438Sken uint8_t page_length; 315280438Sken uint8_t ignore_seq_checks; 316280438Sken#define SA_IBM_RW_CTRL_LOC_IGNORE_SEQ 0x04 317280438Sken#define SA_IBM_RW_CTRL_SPC_BLK_IGNORE_SEQ 0x02 318280438Sken#define SA_IBM_RW_CTRL_SPC_FM_IGNORE_SEQ 0x01 319280438Sken uint8_t ignore_data_checks; 320280438Sken#define SA_IBM_RW_CTRL_LOC_IGNORE_DATA 0x04 321280438Sken#define SA_IBM_RW_CTRL_SPC_BLK_IGNORE_DATA 0x02 322280438Sken#define SA_IBM_RW_CTRL_SPC_FM_IGNORE_DATA 0x01 323280438Sken uint8_t reserved1; 324280438Sken uint8_t leop_method; 325280438Sken#define SA_IBM_RW_CTRL_LEOP_DEFAULT 0x00 326280438Sken#define SA_IBM_RW_CTRL_LEOP_MAX_CAP 0x01 327280438Sken#define SA_IBM_RW_CTRL_LEOP_CONST_CAP 0x02 328280438Sken uint8_t leop_ew[2]; 329280438Sken uint8_t byte8; 330280438Sken#define SA_IBM_RW_CTRL_DISABLE_FASTSYNC 0x80 331280438Sken#define SA_IBM_RW_CTRL_DISABLE_SKIPSYNC 0x40 332280438Sken#define SA_IBM_RW_CTRL_DISABLE_CROSS_EOD 0x08 333280438Sken#define SA_IBM_RW_CTRL_DISABLE_CROSS_PERM_ERR 0x04 334280438Sken#define SA_IBM_RW_CTRL_REPORT_SEG_EW 0x02 335280438Sken#define SA_IBM_RW_CTRL_REPORT_HOUSEKEEPING_ERR 0x01 336280438Sken uint8_t default_write_dens_bop_0; 337280438Sken uint8_t pending_write_dens_bop_0; 338280438Sken uint8_t reserved2[21]; 339280438Sken}; 340280438Sken 34141917Smjacobstruct scsi_tape_read_position { 34241917Smjacob u_int8_t opcode; /* READ_POSITION */ 34341917Smjacob u_int8_t byte1; /* set LSB to read hardware block pos */ 344280438Sken#define SA_RPOS_SHORT_FORM 0x00 345280438Sken#define SA_RPOS_SHORT_VENDOR 0x01 346280438Sken#define SA_RPOS_LONG_FORM 0x06 347280438Sken#define SA_RPOS_EXTENDED_FORM 0x08 348280438Sken u_int8_t reserved[5]; 349280438Sken u_int8_t length[2]; 350280438Sken u_int8_t control; 35141917Smjacob}; 35241917Smjacob 35341917Smjacobstruct scsi_tape_position_data { /* Short Form */ 35441917Smjacob u_int8_t flags; 35541917Smjacob#define SA_RPOS_BOP 0x80 /* Beginning of Partition */ 35641917Smjacob#define SA_RPOS_EOP 0x40 /* End of Partition */ 35741917Smjacob#define SA_RPOS_BCU 0x20 /* Block Count Unknown (SCSI3) */ 35841917Smjacob#define SA_RPOS_BYCU 0x10 /* Byte Count Unknown (SCSI3) */ 35941917Smjacob#define SA_RPOS_BPU 0x04 /* Block Position Unknown */ 36041917Smjacob#define SA_RPOS_PERR 0x02 /* Position Error (SCSI3) */ 361280438Sken#define SA_RPOS_BPEW 0x01 /* Beyond Programmable Early Warning */ 36241917Smjacob#define SA_RPOS_UNCERTAIN SA_RPOS_BPU 36341917Smjacob u_int8_t partition; 36441917Smjacob u_int8_t reserved[2]; 36541917Smjacob u_int8_t firstblk[4]; 36641917Smjacob u_int8_t lastblk[4]; 36741917Smjacob u_int8_t reserved2; 36841917Smjacob u_int8_t nbufblk[3]; 36941917Smjacob u_int8_t nbufbyte[4]; 37041917Smjacob}; 37141917Smjacob 372280438Skenstruct scsi_tape_position_long_data { 373280438Sken u_int8_t flags; 374280438Sken#define SA_RPOS_LONG_BOP 0x80 /* Beginning of Partition */ 375280438Sken#define SA_RPOS_LONG_EOP 0x40 /* End of Partition */ 376280438Sken#define SA_RPOS_LONG_MPU 0x08 /* Mark Position Unknown */ 377280438Sken#define SA_RPOS_LONG_LONU 0x04 /* Logical Object Number Unknown */ 378280438Sken#define SA_RPOS_LONG_BPEW 0x01 /* Beyond Programmable Early Warning */ 379280438Sken u_int8_t reserved[3]; 380280438Sken u_int8_t partition[4]; 381280438Sken u_int8_t logical_object_num[8]; 382280438Sken u_int8_t logical_file_num[8]; 383280438Sken u_int8_t set_id[8]; 384280438Sken}; 385280438Sken 386280438Skenstruct scsi_tape_position_ext_data { 387280438Sken u_int8_t flags; 388280438Sken#define SA_RPOS_EXT_BOP 0x80 /* Beginning of Partition */ 389280438Sken#define SA_RPOS_EXT_EOP 0x40 /* End of Partition */ 390280438Sken#define SA_RPOS_EXT_LOCU 0x20 /* Logical Object Count Unknown */ 391280438Sken#define SA_RPOS_EXT_BYCU 0x10 /* Byte Count Unknown */ 392280438Sken#define SA_RPOS_EXT_LOLU 0x04 /* Logical Object Location Unknown */ 393280438Sken#define SA_RPOS_EXT_PERR 0x02 /* Position Error */ 394280438Sken#define SA_RPOS_EXT_BPEW 0x01 /* Beyond Programmable Early Warning */ 395280438Sken u_int8_t partition; 396280438Sken u_int8_t length[2]; 397280438Sken u_int8_t reserved; 398280438Sken u_int8_t num_objects[3]; 399280438Sken u_int8_t first_object[8]; 400280438Sken u_int8_t last_object[8]; 401280438Sken u_int8_t bytes_in_buffer[8]; 402280438Sken}; 403280438Sken 40441917Smjacobstruct scsi_tape_locate { 40541917Smjacob u_int8_t opcode; 40641917Smjacob u_int8_t byte1; 40741917Smjacob#define SA_SPOS_IMMED 0x01 40841917Smjacob#define SA_SPOS_CP 0x02 40941917Smjacob#define SA_SPOS_BT 0x04 41041917Smjacob u_int8_t reserved1; 41141917Smjacob u_int8_t blkaddr[4]; 412280438Sken#define SA_SPOS_MAX_BLK 0xffffffff 41341917Smjacob u_int8_t reserved2; 41441917Smjacob u_int8_t partition; 41541917Smjacob u_int8_t control; 41641917Smjacob}; 41741917Smjacob 418280438Skenstruct scsi_locate_16 { 419280438Sken u_int8_t opcode; 420280438Sken u_int8_t byte1; 421280438Sken#define SA_LC_IMMEDIATE 0x01 422280438Sken#define SA_LC_CP 0x02 423280438Sken#define SA_LC_DEST_TYPE_MASK 0x38 424280438Sken#define SA_LC_DEST_TYPE_SHIFT 3 425280438Sken#define SA_LC_DEST_OBJECT 0x00 426280438Sken#define SA_LC_DEST_FILE 0x01 427280438Sken#define SA_LC_DEST_SET 0x02 428280438Sken#define SA_LC_DEST_EOD 0x03 429280438Sken u_int8_t byte2; 430280438Sken#define SA_LC_BAM_IMPLICIT 0x00 431280438Sken#define SA_LC_BAM_EXPLICIT 0x01 432280438Sken u_int8_t partition; 433280438Sken u_int8_t logical_id[8]; 434280438Sken u_int8_t reserved[3]; 435280438Sken u_int8_t control; 436280438Sken}; 437280438Sken 438280438Skenstruct scsi_report_density_support { 439280438Sken u_int8_t opcode; 440280438Sken u_int8_t byte1; 441280438Sken#define SRDS_MEDIA 0x01 442280438Sken#define SRDS_MEDIUM_TYPE 0x02 443280438Sken u_int8_t reserved[5]; 444280438Sken u_int8_t length[2]; 445280438Sken#define SRDS_MAX_LENGTH 0xffff 446280438Sken u_int8_t control; 447280438Sken}; 448280438Sken 449280438Skenstruct scsi_density_hdr { 450280438Sken u_int8_t length[2]; 451280438Sken u_int8_t reserved[2]; 452280438Sken u_int8_t descriptor[]; 453280438Sken}; 454280438Sken 455280438Skenstruct scsi_density_data { 456280438Sken u_int8_t primary_density_code; 457280438Sken u_int8_t secondary_density_code; 458280438Sken u_int8_t byte2; 459280438Sken#define SDD_DLV 0x01 460280438Sken#define SDD_DEFLT 0x20 461280438Sken#define SDD_DUP 0x40 462280438Sken#define SDD_WRTOK 0x80 463280438Sken u_int8_t length[2]; 464280438Sken#define SDD_DEFAULT_LENGTH 52 465280438Sken u_int8_t bits_per_mm[3]; 466280438Sken u_int8_t media_width[2]; 467280438Sken u_int8_t tracks[2]; 468280438Sken u_int8_t capacity[4]; 469280438Sken u_int8_t assigning_org[8]; 470280438Sken u_int8_t density_name[8]; 471280438Sken u_int8_t description[20]; 472280438Sken}; 473280438Sken 474280438Skenstruct scsi_medium_type_data { 475280438Sken u_int8_t medium_type; 476280438Sken u_int8_t reserved1; 477280438Sken u_int8_t length[2]; 478280438Sken#define SMTD_DEFAULT_LENGTH 52 479280438Sken u_int8_t num_density_codes; 480280438Sken u_int8_t primary_density_codes[9]; 481280438Sken u_int8_t media_width[2]; 482280438Sken u_int8_t medium_length[2]; 483280438Sken u_int8_t reserved2[2]; 484280438Sken u_int8_t assigning_org[8]; 485280438Sken u_int8_t medium_type_name[8]; 486280438Sken u_int8_t description[20]; 487280438Sken}; 488280438Sken 48939213Sgibbs/* 490280438Sken * Security Protocol Specific values for the Tape Data Encryption protocol 491280438Sken * (0x20) used with SECURITY PROTOCOL IN. See below for values used with 492280438Sken * SECURITY PROTOCOL OUT. Current as of SSC4r03. 493280438Sken */ 494280438Sken#define TDE_IN_SUPPORT_PAGE 0x0000 495280438Sken#define TDE_OUT_SUPPORT_PAGE 0x0001 496280438Sken#define TDE_DATA_ENC_CAP_PAGE 0x0010 497280438Sken#define TDE_SUPPORTED_KEY_FORMATS_PAGE 0x0011 498280438Sken#define TDE_DATA_ENC_MAN_CAP_PAGE 0x0012 499280438Sken#define TDE_DATA_ENC_STATUS_PAGE 0x0020 500280438Sken#define TDE_NEXT_BLOCK_ENC_STATUS_PAGE 0x0021 501280438Sken#define TDE_GET_ENC_MAN_ATTR_PAGE 0x0022 502280438Sken#define TDE_RANDOM_NUM_PAGE 0x0030 503280438Sken#define TDE_KEY_WRAP_PK_PAGE 0x0031 504280438Sken 505280438Sken/* 506280438Sken * Tape Data Encryption protocol pages used with SECURITY PROTOCOL IN and 507280438Sken * SECURITY PROTOCOL OUT. 508280438Sken */ 509280438Sken/* 510280438Sken * Tape Data Encryption In Support page (0x0000). 511280438Sken */ 512280438Skenstruct tde_in_support_page { 513280438Sken uint8_t page_code[2]; 514280438Sken uint8_t page_length[2]; 515280438Sken uint8_t page_codes[]; 516280438Sken}; 517280438Sken 518280438Sken/* 519280438Sken * Tape Data Encryption Out Support page (0x0001). 520280438Sken */ 521280438Skenstruct tde_out_support_page { 522280438Sken uint8_t page_code[2]; 523280438Sken uint8_t page_length[2]; 524280438Sken uint8_t page_codes[]; 525280438Sken}; 526280438Sken 527280438Sken/* 528280438Sken * Logical block encryption algorithm descriptor. This is reported in the 529280438Sken * Data Encryption Capabilities page. 530280438Sken */ 531280438Skenstruct tde_block_enc_alg_desc { 532280438Sken uint8_t alg_index; 533280438Sken uint8_t reserved1; 534280438Sken uint8_t desc_length[2]; 535280438Sken uint8_t byte4; 536280438Sken#define TDE_BEA_AVFMV 0x80 537280438Sken#define TDE_BEA_SDK_C 0x40 538280438Sken#define TDE_BEA_MAC_C 0x20 539280438Sken#define TDE_BEA_DELB_C 0x10 540280438Sken#define TDE_BEA_DECRYPT_C_MASK 0x0c 541280438Sken#define TDE_BEA_DECRYPT_C_EXT 0x0c 542280438Sken#define TDE_BEA_DECRYPT_C_HARD 0x08 543280438Sken#define TDE_BEA_DECRYPT_C_SOFT 0x04 544280438Sken#define TDE_BEA_DECRYPT_C_NO_CAP 0x00 545280438Sken#define TDE_BEA_ENCRYPT_C_MASK 0x03 546280438Sken#define TDE_BEA_ENCRYPT_C_EXT 0x03 547280438Sken#define TDE_BEA_ENCRYPT_C_HARD 0x02 548280438Sken#define TDE_BEA_ENCRYPT_C_SOFT 0x01 549280438Sken#define TDE_BEA_ENCRYPT_C_NO_CAP 0x00 550280438Sken uint8_t byte5; 551280438Sken#define TDE_BEA_AVFCLP_MASK 0xc0 552280438Sken#define TDE_BEA_AVFCLP_VALID 0x80 553280438Sken#define TDE_BEA_AVFCLP_NOT_VALID 0x40 554280438Sken#define TDE_BEA_AVFCLP_NOT_APP 0x00 555280438Sken#define TDE_BEA_NONCE_C_MASK 0x30 556280438Sken#define TDE_BEA_NONCE_C_SUPPORTED 0x30 557280438Sken#define TDE_BEA_NONCE_C_PROVIDED 0x20 558280438Sken#define TDE_BEA_NONCE_C_GENERATED 0x10 559280438Sken#define TDE_BEA_NONCE_C_NOT_REQUIRED 0x00 560280438Sken#define TDE_BEA_KADF_C 0x08 561280438Sken#define TDE_BEA_VCELB_C 0x04 562280438Sken#define TDE_BEA_UKADF 0x02 563280438Sken#define TDE_BEA_AKADF 0x01 564280438Sken uint8_t max_unauth_key_bytes[2]; 565280438Sken uint8_t max_auth_key_bytes[2]; 566280438Sken uint8_t lbe_key_size[2]; 567280438Sken uint8_t byte12; 568280438Sken#define TDE_BEA_DKAD_C_MASK 0xc0 569280438Sken#define TDE_BEA_DKAD_C_CAPABLE 0xc0 570280438Sken#define TDE_BEA_DKAD_C_NOT_ALLOWED 0x80 571280438Sken#define TDE_BEA_DKAD_C_REQUIRED 0x40 572280438Sken#define TDE_BEA_EEMC_C_MASK 0x30 573280438Sken#define TDE_BEA_EEMC_C_ALLOWED 0x20 574280438Sken#define TDE_BEA_EEMC_C_NOT_ALLOWED 0x10 575280438Sken#define TDE_BEA_EEMC_C_NOT_SPECIFIED 0x00 576280438Sken /* 577280438Sken * Raw Decryption Mode Control Capabilities (RDMC_C) field. The 578280438Sken * descriptions are too complex to represent as a simple name. 579280438Sken */ 580280438Sken#define TDE_BEA_RDMC_C_MASK 0x0e 581280438Sken#define TDE_BEA_RDMC_C_MODE_7 0x0e 582280438Sken#define TDE_BEA_RDMC_C_MODE_6 0x0c 583280438Sken#define TDE_BEA_RDMC_C_MODE_5 0x0a 584280438Sken#define TDE_BEA_RDMC_C_MODE_4 0x08 585280438Sken#define TDE_BEA_RDMC_C_MODE_1 0x02 586280438Sken#define TDE_BEA_EAREM 0x01 587280438Sken uint8_t byte13; 588280438Sken#define TDE_BEA_MAX_EEDKS_MASK 0x0f 589280438Sken uint8_t msdk_count[2]; 590280438Sken uint8_t max_eedk_size[2]; 591280438Sken uint8_t reserved2[2]; 592280438Sken uint8_t security_algo_code[4]; 593280438Sken}; 594280438Sken 595280438Sken/* 596280438Sken * Data Encryption Capabilities page (0x0010). 597280438Sken */ 598280438Skenstruct tde_data_enc_cap_page { 599280438Sken uint8_t page_code[2]; 600280438Sken uint8_t page_length; 601280438Sken uint8_t byte4; 602280438Sken#define DATA_ENC_CAP_EXTDECC_MASK 0x0c 603280438Sken#define DATA_ENC_CAP_EXTDECC_NOT_REPORTED 0x00 604280438Sken#define DATA_ENC_CAP_EXTDECC_NOT_CAPABLE 0x04 605280438Sken#define DATA_ENC_CAP_EXTDECC_CAPABLE 0x08 606280438Sken#define DATA_ENC_CAP_CFG_P_MASK 0x03 607280438Sken#define DATA_ENC_CAP_CFG_P_NOT_REPORTED 0x00 608280438Sken#define DATA_ENC_CAP_CFG_P_ALLOWED 0x01 609280438Sken#define DATA_ENC_CAP_CFG_P_NOT_ALLOWED 0x02 610280438Sken uint8_t reserved[15]; 611280438Sken struct tde_block_enc_alg_desc alg_descs[]; 612280438Sken}; 613280438Sken 614280438Sken/* 615280438Sken * Tape Data Encryption Supported Key Formats page (0x0011). 616280438Sken */ 617280438Skenstruct tde_supported_key_formats_page { 618280438Sken uint8_t page_code[2]; 619280438Sken uint8_t page_length[2]; 620280438Sken uint8_t key_formats_list[]; 621280438Sken}; 622280438Sken 623280438Sken/* 624280438Sken * Tape Data Encryption Management Capabilities page (0x0012). 625280438Sken */ 626280438Skenstruct tde_data_enc_man_cap_page { 627280438Sken uint8_t page_code[2]; 628280438Sken uint8_t page_length[2]; 629280438Sken uint8_t byte4; 630280438Sken#define TDE_DEMC_LOCK_C 0x01 631280438Sken uint8_t byte5; 632280438Sken#define TDE_DEMC_CKOD_C 0x04 633280438Sken#define TDE_DEMC_CKORP_C 0x02 634280438Sken#define TDE_DEMC_CKORL_C 0x01 635280438Sken uint8_t reserved1; 636280438Sken uint8_t byte7; 637280438Sken#define TDE_DEMC_AITN_C 0x04 638280438Sken#define TDE_DEMC_LOCAL_C 0x02 639280438Sken#define TDE_DEMC_PUBLIC_C 0x01 640280438Sken uint8_t reserved2[8]; 641280438Sken}; 642280438Sken 643280438Sken/* 644280438Sken * Tape Data Encryption Status Page (0x0020). 645280438Sken */ 646280438Skenstruct tde_data_enc_status_page { 647280438Sken uint8_t page_code[2]; 648280438Sken uint8_t page_length[2]; 649280438Sken uint8_t scope; 650280438Sken#define TDE_DES_IT_NEXUS_SCOPE_MASK 0xe0 651280438Sken#define TDE_DES_LBE_SCOPE_MASK 0x07 652280438Sken uint8_t encryption_mode; 653280438Sken uint8_t decryption_mode; 654280438Sken uint8_t algo_index; 655280438Sken uint8_t key_instance_counter[4]; 656280438Sken uint8_t byte12; 657280438Sken#define TDE_DES_PARAM_CTRL_MASK 0x70 658280438Sken#define TDE_DES_PARAM_CTRL_MGMT 0x40 659280438Sken#define TDE_DES_PARAM_CTRL_CHANGER 0x30 660280438Sken#define TDE_DES_PARAM_CTRL_DRIVE 0x20 661280438Sken#define TDE_DES_PARAM_CTRL_EXT 0x10 662280438Sken#define TDE_DES_PARAM_CTRL_NOT_REPORTED 0x00 663280438Sken#define TDE_DES_VCELB 0x08 664280438Sken#define TDE_DES_CEEMS_MASK 0x06 665280438Sken#define TDE_DES_RDMD 0x01 666280438Sken uint8_t enc_params_kad_format; 667280438Sken uint8_t asdk_count[2]; 668280438Sken uint8_t reserved[8]; 669280438Sken uint8_t key_assoc_data_desc[]; 670280438Sken}; 671280438Sken 672280438Sken/* 673280438Sken * Tape Data Encryption Next Block Encryption Status page (0x0021). 674280438Sken */ 675280438Skenstruct tde_next_block_enc_status_page { 676280438Sken uint8_t page_code[2]; 677280438Sken uint8_t page_length[2]; 678280438Sken uint8_t logical_obj_number[8]; 679280438Sken uint8_t status; 680280438Sken#define TDE_NBES_COMP_STATUS_MASK 0xf0 681280438Sken#define TDE_NBES_COMP_INCAPABLE 0x00 682280438Sken#define TDE_NBES_COMP_NOT_YET 0x10 683280438Sken#define TDE_NBES_COMP_NOT_A_BLOCK 0x20 684280438Sken#define TDE_NBES_COMP_NOT_COMPRESSED 0x30 685280438Sken#define TDE_NBES_COMP_COMPRESSED 0x40 686280438Sken#define TDE_NBES_ENC_STATUS_MASK 0x0f 687280438Sken#define TDE_NBES_ENC_INCAPABLE 0x00 688280438Sken#define TDE_NBES_ENC_NOT_YET 0x01 689280438Sken#define TDE_NBES_ENC_NOT_A_BLOCK 0x02 690280438Sken#define TDE_NBES_ENC_NOT_ENCRYPTED 0x03 691280438Sken#define TDE_NBES_ENC_ALG_NOT_SUPPORTED 0x04 692280438Sken#define TDE_NBES_ENC_SUPPORTED_ALG 0x05 693280438Sken#define TDE_NBES_ENC_NO_KEY 0x06 694280438Sken uint8_t algo_index; 695280438Sken uint8_t byte14; 696280438Sken#define TDE_NBES_EMES 0x02 697280438Sken#define TDE_NBES_RDMDS 0x01 698280438Sken uint8_t next_block_kad_format; 699280438Sken uint8_t key_assoc_data_desc[]; 700280438Sken}; 701280438Sken 702280438Sken/* 703280438Sken * Tape Data Encryption Get Encryption Management Attributes page (0x0022). 704280438Sken */ 705280438Skenstruct tde_get_enc_man_attr_page { 706280438Sken uint8_t page_code[2]; 707280438Sken uint8_t reserved[3]; 708280438Sken uint8_t byte5; 709280438Sken#define TDE_GEMA_CAOD 0x01 710280438Sken uint8_t page_length[2]; 711280438Sken uint8_t enc_mgmt_attr_desc[]; 712280438Sken}; 713280438Sken 714280438Sken/* 715280438Sken * Tape Data Encryption Random Number page (0x0030). 716280438Sken */ 717280438Skenstruct tde_random_num_page { 718280438Sken uint8_t page_code[2]; 719280438Sken uint8_t page_length[2]; 720280438Sken uint8_t random_number[32]; 721280438Sken}; 722280438Sken 723280438Sken/* 724280438Sken * Tape Data Encryption Device Server Key Wrapping Public Key page (0x0031). 725280438Sken */ 726280438Skenstruct tde_key_wrap_pk_page { 727280438Sken uint8_t page_code[2]; 728280438Sken uint8_t page_length[2]; 729280438Sken uint8_t public_key_type[4]; 730280438Sken uint8_t public_key_format[4]; 731280438Sken uint8_t public_key_length[2]; 732280438Sken uint8_t public_key[]; 733280438Sken}; 734280438Sken 735280438Sken/* 736280438Sken * Security Protocol Specific values for the Tape Data Encryption protocol 737280438Sken * (0x20) used with SECURITY PROTOCOL OUT. See above for values used with 738280438Sken * SECURITY PROTOCOL IN. Current as of SSCr03. 739280438Sken */ 740280438Sken#define TDE_SET_DATA_ENC_PAGE 0x0010 741280438Sken#define TDE_SA_ENCAP_PAGE 0x0011 742280438Sken#define TDE_SET_ENC_MGMT_ATTR_PAGE 0x0022 743280438Sken 744280438Sken/* 745280438Sken * Tape Data Encryption Set Data Encryption page (0x0010). 746280438Sken */ 747280438Skenstruct tde_set_data_enc_page { 748280438Sken uint8_t page_code[2]; 749280438Sken uint8_t page_length[2]; 750280438Sken uint8_t byte4; 751280438Sken#define TDE_SDE_SCOPE_MASK 0xe0 752280438Sken#define TDE_SDE_SCOPE_ALL_IT_NEXUS 0x80 753280438Sken#define TDE_SDE_SCOPE_LOCAL 0x40 754280438Sken#define TDE_SDE_SCOPE_PUBLIC 0x00 755280438Sken#define TDE_SDE_LOCK 0x01 756280438Sken uint8_t byte5; 757280438Sken#define TDE_SDE_CEEM_MASK 0xc0 758280438Sken#define TDE_SDE_CEEM_ENCRYPT 0xc0 759280438Sken#define TDE_SDE_CEEM_EXTERNAL 0x80 760280438Sken#define TDE_SDE_CEEM_NO_CHECK 0x40 761280438Sken#define TDE_SDE_RDMC_MASK 0x30 762280438Sken#define TDE_SDE_RDMC_DISABLED 0x30 763280438Sken#define TDE_SDE_RDMC_ENABLED 0x20 764280438Sken#define TDE_SDE_RDMC_DEFAULT 0x00 765280438Sken#define TDE_SDE_SDK 0x08 766280438Sken#define TDE_SDE_CKOD 0x04 767280438Sken#define TDE_SDE_CKORP 0x02 768280438Sken#define TDE_SDE_CKORL 0x01 769280438Sken uint8_t encryption_mode; 770280438Sken#define TDE_SDE_ENC_MODE_DISABLE 0x00 771280438Sken#define TDE_SDE_ENC_MODE_EXTERNAL 0x01 772280438Sken#define TDE_SDE_ENC_MODE_ENCRYPT 0x02 773280438Sken uint8_t decryption_mode; 774280438Sken#define TDE_SDE_DEC_MODE_DISABLE 0x00 775280438Sken#define TDE_SDE_DEC_MODE_RAW 0x01 776280438Sken#define TDE_SDE_DEC_MODE_DECRYPT 0x02 777280438Sken#define TDE_SDE_DEC_MODE_MIXED 0x03 778280438Sken uint8_t algo_index; 779280438Sken uint8_t lbe_key_format; 780280438Sken#define TDE_SDE_KEY_PLAINTEXT 0x00 781280438Sken#define TDE_SDE_KEY_VENDOR_SPEC 0x01 782280438Sken#define TDE_SDE_KEY_PUBLIC_WRAP 0x02 783280438Sken#define TDE_SDE_KEY_ESP_SCSI 0x03 784280438Sken uint8_t kad_format; 785280438Sken#define TDE_SDE_KAD_ASCII 0x02 786280438Sken#define TDE_SDE_KAD_BINARY 0x01 787280438Sken#define TDE_SDE_KAD_UNSPECIFIED 0x00 788280438Sken uint8_t reserved[7]; 789280438Sken uint8_t lbe_key_length[2]; 790280438Sken uint8_t lbe_key[]; 791280438Sken}; 792280438Sken 793280438Sken/* 794280438Sken * Used for the Vendor Specific key format (0x01). 795280438Sken */ 796280438Skenstruct tde_key_format_vendor { 797280438Sken uint8_t t10_vendor_id[8]; 798280438Sken uint8_t vendor_key[]; 799280438Sken}; 800280438Sken 801280438Sken/* 802280438Sken * Used for the public key wrapped format (0x02). 803280438Sken */ 804280438Skenstruct tde_key_format_public_wrap { 805280438Sken uint8_t parameter_set[2]; 806280438Sken#define TDE_PARAM_SET_RSA2048 0x0000 807280438Sken#define TDE_PARAM_SET_ECC521 0x0010 808280438Sken uint8_t label_length[2]; 809280438Sken uint8_t label[]; 810280438Sken}; 811280438Sken 812280438Sken/* 813280438Sken * Tape Data Encryption SA Encapsulation page (0x0011). 814280438Sken */ 815280438Skenstruct tde_sa_encap_page { 816280438Sken uint8_t page_code[2]; 817280438Sken uint8_t data_desc[]; 818280438Sken}; 819280438Sken 820280438Sken/* 821280438Sken * Tape Data Encryption Set Encryption Management Attributes page (0x0022). 822280438Sken */ 823280438Skenstruct tde_set_enc_mgmt_attr_page { 824280438Sken uint8_t page_code[2]; 825280438Sken uint8_t reserved[3]; 826280438Sken uint8_t byte5; 827280438Sken#define TDE_SEMA_CAOD 0x01 828280438Sken uint8_t page_length[2]; 829280438Sken uint8_t attr_desc[]; 830280438Sken}; 831280438Sken 832280438Sken/* 833280438Sken * Tape Data Encryption descriptor format. 834280438Sken * SSC4r03 Section 8.5.4.2.1 Table 197 835280438Sken */ 836280438Skenstruct tde_data_enc_desc { 837280438Sken uint8_t key_desc_type; 838280438Sken#define TDE_KEY_DESC_WK_KAD 0x04 839280438Sken#define TDE_KEY_DESC_M_KAD 0x03 840280438Sken#define TDE_KEY_DESC_NONCE_VALUE 0x02 841280438Sken#define TDE_KEY_DESC_A_KAD 0x01 842280438Sken#define TDE_KEY_DESC_U_KAD 0x00 843280438Sken uint8_t byte2; 844280438Sken#define TDE_KEY_DESC_AUTH_MASK 0x07 845280438Sken#define TDE_KEY_DESC_AUTH_FAILED 0x04 846280438Sken#define TDE_KEY_DESC_AUTH_SUCCESS 0x03 847280438Sken#define TDE_KEY_DESC_AUTH_NO_ATTEMPT 0x02 848280438Sken#define TDE_KEY_DESC_AUTH_U_KAD 0x01 849280438Sken uint8_t key_desc_length[2]; 850280438Sken uint8_t key_desc[]; 851280438Sken}; 852280438Sken 853280438Sken/* 854280438Sken * Wrapped Key descriptor format. 855280438Sken * SSC4r03 Section 8.5.4.3.1 Table 200 856280438Sken */ 857280438Skenstruct tde_wrapped_key_desc { 858280438Sken uint8_t wrapped_key_type; 859280438Sken#define TDE_WRAP_KEY_DESC_LENGTH 0x04 860280438Sken#define TDE_WRAP_KEY_DESC_IDENT 0x03 861280438Sken#define TDE_WRAP_KEY_DESC_INFO 0x02 862280438Sken#define TDE_WRAP_KEY_DESC_ENTITY_ID 0x01 863280438Sken#define TDE_WRAP_KEY_DESC_DEVICE_ID 0x00 864280438Sken uint8_t reserved; 865280438Sken uint8_t wrapped_desc_length[2]; 866280438Sken uint8_t wrapped_desc[]; 867280438Sken}; 868280438Sken 869280438Sken/* 870280438Sken * Encryption management attributes descriptor format. 871280438Sken * SSC4r03 Section 8.5.4.4.1 Table 202 872280438Sken */ 873280438Skenstruct tde_enc_mgmt_attr_desc { 874280438Sken uint8_t enc_mgmt_attr_type[2]; 875280438Sken#define TDE_EMAD_DESIRED_KEY_MGR_OP 0x0000 876280438Sken#define TDE_EMAD_LOG_BLOCK_ENC_KEY_CRIT 0x0001 877280438Sken#define TDE_EMAD_LOG_BLOCK_ENC_KEY_WRAP 0x0002 878280438Sken uint8_t reserved; 879280438Sken uint8_t byte2; 880280438Sken#define TDE_EMAD_CRIT 0x80 881280438Sken uint8_t attr_length[2]; 882280438Sken uint8_t attributes[]; 883280438Sken#define TDE_EMAD_DESIRED_KEY_CREATE 0x0001 884280438Sken#define TDE_EMAD_DESIRED_KEY_RESOLVE 0x0002 885280438Sken}; 886280438Sken 887280438Sken/* 888280438Sken * Logical block encryption key selection criteria descriptor format. 889280438Sken * SSC4r03 Section 8.5.4.4.3.1 Table 206 890280438Sken */ 891280438Skenstruct tde_lb_enc_key_sel_desc { 892280438Sken uint8_t lbe_key_sel_crit_type[2]; 893280438Sken /* 894280438Sken * The CRIT bit is the top bit of the first byte of the type. 895280438Sken */ 896280438Sken#define TDE_LBE_KEY_SEL_CRIT 0x80 897280438Sken#define TDE_LBE_KEY_SEL_ALGO 0x0001 898280438Sken#define TDE_LBE_KEY_SEL_ID 0x0002 899280438Sken uint8_t lbe_key_sel_crit_length[2]; 900280438Sken uint8_t lbe_key_sel_crit[]; 901280438Sken}; 902280438Sken 903280438Sken/* 904280438Sken * Logical block encryption key wrapping attribute descriptor format. 905280438Sken * SSC4r03 Section 8.5.4.4.4.1 Table 209 906280438Sken */ 907280438Skenstruct tde_lb_enc_key_wrap_desc { 908280438Sken uint8_t lbe_key_wrap_type[2]; 909280438Sken /* 910280438Sken * The CRIT bit is the top bit of the first byte of the type. 911280438Sken */ 912280438Sken#define TDE_LBE_KEY_WRAP_CRIT 0x80 913280438Sken#define TDE_LBE_KEY_WRAP_KEKS 0x0001 914280438Sken uint8_t lbe_key_wrap_length[2]; 915280438Sken uint8_t lbe_key_wrap_attr[]; 916280438Sken}; 917280438Sken 918280438Sken/* 91939213Sgibbs * Opcodes 92039213Sgibbs */ 92139213Sgibbs#define REWIND 0x01 922280438Sken#define FORMAT_MEDIUM 0x04 92339213Sgibbs#define READ_BLOCK_LIMITS 0x05 92439213Sgibbs#define SA_READ 0x08 92539213Sgibbs#define SA_WRITE 0x0A 926280438Sken#define SET_CAPACITY 0x0B 92739213Sgibbs#define WRITE_FILEMARKS 0x10 92839213Sgibbs#define SPACE 0x11 92939213Sgibbs#define RESERVE_UNIT 0x16 93039213Sgibbs#define RELEASE_UNIT 0x17 93139213Sgibbs#define ERASE 0x19 93239213Sgibbs#define LOAD_UNLOAD 0x1B 93341917Smjacob#define LOCATE 0x2B 93441917Smjacob#define READ_POSITION 0x34 935280438Sken#define REPORT_DENSITY_SUPPORT 0x44 936280438Sken#define ALLOW_OVERWRITE 0x82 937280438Sken#define LOCATE_16 0x92 93839213Sgibbs 93941907Smjacob/* 94041907Smjacob * Tape specific density codes- only enough of them here to recognize 94141907Smjacob * some specific older units so we can choose 2FM@EOD or FIXED blocksize 94241907Smjacob * quirks. 94341907Smjacob */ 94441907Smjacob#define SCSI_DENSITY_HALFINCH_800 0x01 94541907Smjacob#define SCSI_DENSITY_HALFINCH_1600 0x02 94641907Smjacob#define SCSI_DENSITY_HALFINCH_6250 0x03 94741907Smjacob#define SCSI_DENSITY_HALFINCH_6250C 0xC3 /* HP Compressed 6250 */ 94841907Smjacob#define SCSI_DENSITY_QIC_11_4TRK 0x04 94941907Smjacob#define SCSI_DENSITY_QIC_11_9TRK 0x84 /* Vendor Unique Emulex */ 95041907Smjacob#define SCSI_DENSITY_QIC_24 0x05 95141907Smjacob#define SCSI_DENSITY_HALFINCH_PE 0x06 95241907Smjacob#define SCSI_DENSITY_QIC_120 0x0f 95341907Smjacob#define SCSI_DENSITY_QIC_150 0x10 95443635Smjacob#define SCSI_DENSITY_QIC_525_320 0x11 95543635Smjacob#define SCSI_DENSITY_QIC_1320 0x12 95646950Smjacob#define SCSI_DENSITY_QIC_2GB 0x22 95746950Smjacob#define SCSI_DENSITY_QIC_4GB 0x26 95843635Smjacob#define SCSI_DENSITY_QIC_3080 0x29 95941907Smjacob 96039213Sgibbs__BEGIN_DECLS 96139213Sgibbsvoid scsi_read_block_limits(struct ccb_scsiio *, u_int32_t, 96239213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 96339213Sgibbs u_int8_t, struct scsi_read_block_limits_data *, 96439213Sgibbs u_int8_t , u_int32_t); 96539213Sgibbs 96639213Sgibbsvoid scsi_sa_read_write(struct ccb_scsiio *csio, u_int32_t retries, 96739213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 96839213Sgibbs u_int8_t tag_action, int readop, int sli, 96939213Sgibbs int fixed, u_int32_t length, u_int8_t *data_ptr, 97039213Sgibbs u_int32_t dxfer_len, u_int8_t sense_len, 97139213Sgibbs u_int32_t timeout); 97239213Sgibbs 97339213Sgibbsvoid scsi_rewind(struct ccb_scsiio *csio, u_int32_t retries, 97439213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 97539213Sgibbs u_int8_t tag_action, int immediate, u_int8_t sense_len, 97639213Sgibbs u_int32_t timeout); 97739213Sgibbs 97839213Sgibbsvoid scsi_space(struct ccb_scsiio *csio, u_int32_t retries, 97939213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 98039213Sgibbs u_int8_t tag_action, scsi_space_code code, 98139213Sgibbs u_int32_t count, u_int8_t sense_len, u_int32_t timeout); 98239213Sgibbs 98339213Sgibbsvoid scsi_load_unload(struct ccb_scsiio *csio, u_int32_t retries, 98439213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 98539213Sgibbs u_int8_t tag_action, int immediate, int eot, 98639213Sgibbs int reten, int load, u_int8_t sense_len, 98739213Sgibbs u_int32_t timeout); 98839213Sgibbs 98939213Sgibbsvoid scsi_write_filemarks(struct ccb_scsiio *csio, u_int32_t retries, 99039213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 99139213Sgibbs u_int8_t tag_action, int immediate, int setmark, 99239213Sgibbs u_int32_t num_marks, u_int8_t sense_len, 99339213Sgibbs u_int32_t timeout); 99439213Sgibbs 99539213Sgibbsvoid scsi_reserve_release_unit(struct ccb_scsiio *csio, u_int32_t retries, 99639213Sgibbs void (*cbfcnp)(struct cam_periph *, 99739213Sgibbs union ccb *), u_int8_t tag_action, 99839213Sgibbs int third_party, int third_party_id, 99939213Sgibbs u_int8_t sense_len, u_int32_t timeout, 100039213Sgibbs int reserve); 100139213Sgibbs 100239213Sgibbsvoid scsi_erase(struct ccb_scsiio *csio, u_int32_t retries, 100339213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 100439213Sgibbs u_int8_t tag_action, int immediate, int long_erase, 100539213Sgibbs u_int8_t sense_len, u_int32_t timeout); 100639213Sgibbs 100739213Sgibbsvoid scsi_data_comp_page(struct scsi_data_compression_page *page, 100839213Sgibbs u_int8_t dce, u_int8_t dde, u_int8_t red, 100939213Sgibbs u_int32_t comp_algorithm, 101039213Sgibbs u_int32_t decomp_algorithm); 101141917Smjacob 101241917Smjacobvoid scsi_read_position(struct ccb_scsiio *csio, u_int32_t retries, 101341917Smjacob void (*cbfcnp)(struct cam_periph *, union ccb *), 101441917Smjacob u_int8_t tag_action, int hardsoft, 101541917Smjacob struct scsi_tape_position_data *sbp, 101641917Smjacob u_int8_t sense_len, u_int32_t timeout); 1017280438Skenvoid scsi_read_position_10(struct ccb_scsiio *csio, u_int32_t retries, 1018280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1019280438Sken u_int8_t tag_action, int service_action, 1020280438Sken u_int8_t *data_ptr, u_int32_t length, 1021280438Sken u_int32_t sense_len, u_int32_t timeout); 102241917Smjacob 102341917Smjacobvoid scsi_set_position(struct ccb_scsiio *csio, u_int32_t retries, 102441917Smjacob void (*cbfcnp)(struct cam_periph *, union ccb *), 102541917Smjacob u_int8_t tag_action, int hardsoft, u_int32_t blkno, 102641917Smjacob u_int8_t sense_len, u_int32_t timeout); 1027280438Sken 1028280438Skenvoid scsi_locate_10(struct ccb_scsiio *csio, u_int32_t retries, 1029280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1030280438Sken u_int8_t tag_action, int immed, int cp, int hard, 1031280438Sken int64_t partition, u_int32_t block_address, 1032280438Sken int sense_len, u_int32_t timeout); 1033280438Sken 1034280438Skenvoid scsi_locate_16(struct ccb_scsiio *csio, u_int32_t retries, 1035280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1036280438Sken u_int8_t tag_action, int immed, int cp, 1037280438Sken u_int8_t dest_type, int bam, int64_t partition, 1038280438Sken u_int64_t logical_id, int sense_len, 1039280438Sken u_int32_t timeout); 1040280438Sken 1041280438Skenvoid scsi_report_density_support(struct ccb_scsiio *csio, u_int32_t retries, 1042280438Sken void (*cbfcnp)(struct cam_periph *, 1043280438Sken union ccb *), 1044280438Sken u_int8_t tag_action, int media, 1045280438Sken int medium_type, u_int8_t *data_ptr, 1046280438Sken u_int32_t length, u_int32_t sense_len, 1047280438Sken u_int32_t timeout); 1048280438Sken 1049280438Skenvoid scsi_set_capacity(struct ccb_scsiio *csio, u_int32_t retries, 1050280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1051280438Sken u_int8_t tag_action, int byte1, u_int32_t proportion, 1052280438Sken u_int32_t sense_len, u_int32_t timeout); 1053280438Sken 1054280438Skenvoid scsi_format_medium(struct ccb_scsiio *csio, u_int32_t retries, 1055280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1056280438Sken u_int8_t tag_action, int byte1, int byte2, 1057280438Sken u_int8_t *data_ptr, u_int32_t length, 1058280438Sken u_int32_t sense_len, u_int32_t timeout); 1059280438Sken 1060280438Skenvoid scsi_allow_overwrite(struct ccb_scsiio *csio, u_int32_t retries, 1061280438Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 1062280438Sken u_int8_t tag_action, int allow_overwrite, 1063280438Sken int partition, u_int64_t logical_id, 1064280438Sken u_int32_t sense_len, u_int32_t timeout); 1065280438Sken 106639213Sgibbs__END_DECLS 106739213Sgibbs 106839213Sgibbs#endif /* _SCSI_SCSI_SA_H */ 1069