xref: /freebsd/sys/cam/scsi/scsi_sa.h (revision 2ffd30f7ee15c87ee092cbac6a4438bcb3af923c)
1898b0535SWarner Losh /*-
229815710SSteve Price  * Structure and function declarations for the
376babe50SJustin T. Gibbs  * SCSI Sequential Access Peripheral driver for CAM.
476babe50SJustin T. Gibbs  *
54d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
6bec9534dSPedro F. Giffuni  *
747c27de5SMatt Jacob  * Copyright (c) 1999, 2000 Matthew Jacob
843518607SKenneth D. Merry  * Copyright (c) 2013, 2014, 2015 Spectra Logic Corporation
976babe50SJustin T. Gibbs  * All rights reserved.
1076babe50SJustin T. Gibbs  *
1176babe50SJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
1276babe50SJustin T. Gibbs  * modification, are permitted provided that the following conditions
1376babe50SJustin T. Gibbs  * are met:
1476babe50SJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
1576babe50SJustin T. Gibbs  *    notice, this list of conditions, and the following disclaimer,
1676babe50SJustin T. Gibbs  *    without modification, immediately at the beginning of the file.
1776babe50SJustin T. Gibbs  * 2. The name of the author may not be used to endorse or promote products
1876babe50SJustin T. Gibbs  *    derived from this software without specific prior written permission.
1976babe50SJustin T. Gibbs  *
2076babe50SJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2176babe50SJustin T. Gibbs  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2276babe50SJustin T. Gibbs  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2376babe50SJustin T. Gibbs  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
2476babe50SJustin T. Gibbs  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2576babe50SJustin T. Gibbs  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2676babe50SJustin T. Gibbs  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2776babe50SJustin T. Gibbs  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2876babe50SJustin T. Gibbs  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2976babe50SJustin T. Gibbs  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3076babe50SJustin T. Gibbs  * SUCH DAMAGE.
3176babe50SJustin T. Gibbs  */
3276babe50SJustin T. Gibbs 
3376babe50SJustin T. Gibbs #ifndef	_SCSI_SCSI_SA_H
3476babe50SJustin T. Gibbs #define _SCSI_SCSI_SA_H 1
3576babe50SJustin T. Gibbs 
3676babe50SJustin T. Gibbs 
3776babe50SJustin T. Gibbs struct scsi_read_block_limits
3876babe50SJustin T. Gibbs {
39*7c5d20a6SWarner Losh 	uint8_t opcode;
40*7c5d20a6SWarner Losh 	uint8_t byte2;
41*7c5d20a6SWarner Losh 	uint8_t unused[3];
42*7c5d20a6SWarner Losh 	uint8_t control;
4376babe50SJustin T. Gibbs };
4476babe50SJustin T. Gibbs 
4576babe50SJustin T. Gibbs struct scsi_read_block_limits_data
4676babe50SJustin T. Gibbs {
47*7c5d20a6SWarner Losh 	uint8_t gran;
4876babe50SJustin T. Gibbs #define	RBL_GRAN_MASK	0x1F
4976babe50SJustin T. Gibbs #define RBL_GRAN(rblim) ((rblim)->gran & RBL_GRAN_MASK)
50*7c5d20a6SWarner Losh 	uint8_t maximum[3];
51*7c5d20a6SWarner Losh 	uint8_t minimum[2];
5276babe50SJustin T. Gibbs };
5376babe50SJustin T. Gibbs 
5476babe50SJustin T. Gibbs struct scsi_sa_rw
5576babe50SJustin T. Gibbs {
56*7c5d20a6SWarner Losh 	uint8_t opcode;
57*7c5d20a6SWarner Losh         uint8_t sli_fixed;
5876babe50SJustin T. Gibbs #define SAR_SLI		0x02
5976babe50SJustin T. Gibbs #define SARW_FIXED	0x01
60*7c5d20a6SWarner Losh 	uint8_t length[3];
61*7c5d20a6SWarner Losh         uint8_t control;
6276babe50SJustin T. Gibbs };
6376babe50SJustin T. Gibbs 
6476babe50SJustin T. Gibbs struct scsi_load_unload
6576babe50SJustin T. Gibbs {
66*7c5d20a6SWarner Losh 	uint8_t opcode;
67*7c5d20a6SWarner Losh         uint8_t immediate;
6876babe50SJustin T. Gibbs #define SLU_IMMED	0x01
69*7c5d20a6SWarner Losh 	uint8_t reserved[2];
70*7c5d20a6SWarner Losh 	uint8_t eot_reten_load;
7176babe50SJustin T. Gibbs #define SLU_EOT		0x04
7276babe50SJustin T. Gibbs #define SLU_RETEN	0x02
7376babe50SJustin T. Gibbs #define SLU_LOAD	0x01
74*7c5d20a6SWarner Losh         uint8_t control;
7576babe50SJustin T. Gibbs };
7676babe50SJustin T. Gibbs 
7776babe50SJustin T. Gibbs struct scsi_rewind
7876babe50SJustin T. Gibbs {
79*7c5d20a6SWarner Losh 	uint8_t opcode;
80*7c5d20a6SWarner Losh         uint8_t immediate;
8176babe50SJustin T. Gibbs #define SREW_IMMED	0x01
82*7c5d20a6SWarner Losh 	uint8_t reserved[3];
83*7c5d20a6SWarner Losh         uint8_t control;
8476babe50SJustin T. Gibbs };
8576babe50SJustin T. Gibbs 
8676babe50SJustin T. Gibbs typedef enum {
8776babe50SJustin T. Gibbs 	SS_BLOCKS,
8876babe50SJustin T. Gibbs 	SS_FILEMARKS,
8976babe50SJustin T. Gibbs 	SS_SEQFILEMARKS,
9076babe50SJustin T. Gibbs 	SS_EOD,
9176babe50SJustin T. Gibbs 	SS_SETMARKS,
9276babe50SJustin T. Gibbs 	SS_SEQSETMARKS
9376babe50SJustin T. Gibbs } scsi_space_code;
9476babe50SJustin T. Gibbs 
9576babe50SJustin T. Gibbs struct scsi_space
9676babe50SJustin T. Gibbs {
97*7c5d20a6SWarner Losh 	uint8_t opcode;
98*7c5d20a6SWarner Losh         uint8_t code;
9976babe50SJustin T. Gibbs #define SREW_IMMED	0x01
100*7c5d20a6SWarner Losh 	uint8_t count[3];
101*7c5d20a6SWarner Losh         uint8_t control;
10276babe50SJustin T. Gibbs };
10376babe50SJustin T. Gibbs 
10476babe50SJustin T. Gibbs struct scsi_write_filemarks
10576babe50SJustin T. Gibbs {
106*7c5d20a6SWarner Losh 	uint8_t opcode;
107*7c5d20a6SWarner Losh         uint8_t byte2;
10876babe50SJustin T. Gibbs #define SWFMRK_IMMED	0x01
10976babe50SJustin T. Gibbs #define SWFMRK_WSMK	0x02
110*7c5d20a6SWarner Losh 	uint8_t num_marks[3];
111*7c5d20a6SWarner Losh         uint8_t control;
11276babe50SJustin T. Gibbs };
11376babe50SJustin T. Gibbs 
11476babe50SJustin T. Gibbs /*
11576babe50SJustin T. Gibbs  * Reserve and release unit have the same exact cdb format, but different
11676babe50SJustin T. Gibbs  * opcodes.
11776babe50SJustin T. Gibbs  */
11876babe50SJustin T. Gibbs struct scsi_reserve_release_unit
11976babe50SJustin T. Gibbs {
120*7c5d20a6SWarner Losh 	uint8_t opcode;
121*7c5d20a6SWarner Losh 	uint8_t lun_thirdparty;
12276babe50SJustin T. Gibbs #define SRRU_LUN_MASK	0xE0
12376babe50SJustin T. Gibbs #define SRRU_3RD_PARTY	0x10
12476babe50SJustin T. Gibbs #define SRRU_3RD_SHAMT	1
12576babe50SJustin T. Gibbs #define SRRU_3RD_MASK	0xE
126*7c5d20a6SWarner Losh 	uint8_t reserved[3];
127*7c5d20a6SWarner Losh 	uint8_t control;
12876babe50SJustin T. Gibbs };
12976babe50SJustin T. Gibbs 
13076babe50SJustin T. Gibbs /*
13176babe50SJustin T. Gibbs  * Erase a tape
13276babe50SJustin T. Gibbs  */
13376babe50SJustin T. Gibbs struct scsi_erase
13476babe50SJustin T. Gibbs {
135*7c5d20a6SWarner Losh 	uint8_t opcode;
136*7c5d20a6SWarner Losh 	uint8_t lun_imm_long;
13776babe50SJustin T. Gibbs #define SE_LUN_MASK	0xE0
13876babe50SJustin T. Gibbs #define SE_LONG		0x1
13976babe50SJustin T. Gibbs #define SE_IMMED	0x2
140*7c5d20a6SWarner Losh 	uint8_t reserved[3];
141*7c5d20a6SWarner Losh 	uint8_t control;
14276babe50SJustin T. Gibbs };
14376babe50SJustin T. Gibbs 
14476babe50SJustin T. Gibbs /*
14543518607SKenneth D. Merry  * Set tape capacity.
14643518607SKenneth D. Merry  */
14743518607SKenneth D. Merry struct scsi_set_capacity
14843518607SKenneth D. Merry {
149*7c5d20a6SWarner Losh 	uint8_t opcode;
150*7c5d20a6SWarner Losh 	uint8_t byte1;
15143518607SKenneth D. Merry #define	SA_SSC_IMMED		0x01
152*7c5d20a6SWarner Losh 	uint8_t reserved;
153*7c5d20a6SWarner Losh 	uint8_t cap_proportion[2];
154*7c5d20a6SWarner Losh 	uint8_t control;
15543518607SKenneth D. Merry };
15643518607SKenneth D. Merry 
15743518607SKenneth D. Merry /*
15843518607SKenneth D. Merry  * Format tape media.  The CDB opcode is the same as the disk-specific
15943518607SKenneth D. Merry  * FORMAT UNIT command, but the fields are different inside the CDB.  Thus
16043518607SKenneth D. Merry  * the reason for a separate definition here.
16143518607SKenneth D. Merry  */
16243518607SKenneth D. Merry struct scsi_format_medium
16343518607SKenneth D. Merry {
164*7c5d20a6SWarner Losh 	uint8_t opcode;
165*7c5d20a6SWarner Losh 	uint8_t byte1;
16643518607SKenneth D. Merry #define	SFM_IMMED		0x01
16743518607SKenneth D. Merry #define	SFM_VERIFY		0x02
168*7c5d20a6SWarner Losh 	uint8_t byte2;
16943518607SKenneth D. Merry #define	SFM_FORMAT_DEFAULT	0x00
17043518607SKenneth D. Merry #define	SFM_FORMAT_PARTITION	0x01
17143518607SKenneth D. Merry #define	SFM_FORMAT_DEF_PART	0x02
17243518607SKenneth D. Merry #define	SFM_FORMAT_MASK		0x0f
173*7c5d20a6SWarner Losh 	uint8_t length[2];
174*7c5d20a6SWarner Losh 	uint8_t control;
17543518607SKenneth D. Merry };
17643518607SKenneth D. Merry 
17743518607SKenneth D. Merry struct scsi_allow_overwrite
17843518607SKenneth D. Merry {
179*7c5d20a6SWarner Losh 	uint8_t opcode;
180*7c5d20a6SWarner Losh 	uint8_t reserved1;
181*7c5d20a6SWarner Losh 	uint8_t allow_overwrite;
18243518607SKenneth D. Merry #define	SAO_ALLOW_OVERWRITE_DISABLED	0x00
18343518607SKenneth D. Merry #define	SAO_ALLOW_OVERWRITE_CUR_POS	0x01
18443518607SKenneth D. Merry #define	SAO_ALLOW_OVERWRITE_FORMAT	0x02
185*7c5d20a6SWarner Losh 	uint8_t partition;
186*7c5d20a6SWarner Losh 	uint8_t logical_id[8];
187*7c5d20a6SWarner Losh 	uint8_t reserved2[3];
188*7c5d20a6SWarner Losh 	uint8_t control;
18943518607SKenneth D. Merry };
19043518607SKenneth D. Merry 
19143518607SKenneth D. Merry /*
19276babe50SJustin T. Gibbs  * Dev specific mode page masks.
19376babe50SJustin T. Gibbs  */
19476babe50SJustin T. Gibbs #define SMH_SA_WP		0x80
19576babe50SJustin T. Gibbs #define	SMH_SA_BUF_MODE_MASK	0x70
19676babe50SJustin T. Gibbs #define SMH_SA_BUF_MODE_NOBUF	0x00
19776babe50SJustin T. Gibbs #define SMH_SA_BUF_MODE_SIBUF	0x10	/* Single-Initiator buffering */
19876babe50SJustin T. Gibbs #define SMH_SA_BUF_MODE_MIBUF	0x20	/* Multi-Initiator buffering */
19976babe50SJustin T. Gibbs #define SMH_SA_SPEED_MASK	0x0F
20076babe50SJustin T. Gibbs #define SMH_SA_SPEED_DEFAULT	0x00
20176babe50SJustin T. Gibbs 
20276babe50SJustin T. Gibbs /*
20376babe50SJustin T. Gibbs  * Sequential-access specific mode page numbers.
20476babe50SJustin T. Gibbs  */
20576babe50SJustin T. Gibbs #define SA_DEVICE_CONFIGURATION_PAGE	0x10
20676babe50SJustin T. Gibbs #define SA_MEDIUM_PARTITION_PAGE_1	0x11
20776babe50SJustin T. Gibbs #define SA_MEDIUM_PARTITION_PAGE_2	0x12
20876babe50SJustin T. Gibbs #define SA_MEDIUM_PARTITION_PAGE_3	0x13
20976babe50SJustin T. Gibbs #define SA_MEDIUM_PARTITION_PAGE_4	0x14
21000bb66d7SMatt Jacob #define SA_DATA_COMPRESSION_PAGE	0x0f	/* SCSI-3 */
21176babe50SJustin T. Gibbs 
21276babe50SJustin T. Gibbs /*
21376babe50SJustin T. Gibbs  * Mode page definitions.
21476babe50SJustin T. Gibbs  */
21576babe50SJustin T. Gibbs 
21600bb66d7SMatt Jacob /* See SCSI-II spec 9.3.3.1 */
21700bb66d7SMatt Jacob struct scsi_dev_conf_page {
218*7c5d20a6SWarner Losh 	uint8_t pagecode;	/* 0x10 */
219*7c5d20a6SWarner Losh 	uint8_t pagelength;	/* 0x0e */
220*7c5d20a6SWarner Losh 	uint8_t byte2;		/* CAP, CAF, Active Format */
221*7c5d20a6SWarner Losh 	uint8_t active_partition;
222*7c5d20a6SWarner Losh 	uint8_t wb_full_ratio;
223*7c5d20a6SWarner Losh 	uint8_t rb_empty_ratio;
224*7c5d20a6SWarner Losh 	uint8_t wrdelay_time[2];
225*7c5d20a6SWarner Losh 	uint8_t byte8;
22600bb66d7SMatt Jacob #define	SA_DBR			0x80	/* data buffer recovery */
22700bb66d7SMatt Jacob #define	SA_BIS			0x40	/* block identifiers supported */
22800bb66d7SMatt Jacob #define	SA_RSMK			0x20	/* report setmarks */
22900bb66d7SMatt Jacob #define	SA_AVC			0x10	/* automatic velocity control */
23043518607SKenneth D. Merry #define	SA_SOCF_MASK		0x0c	/* stop on consecutive formats */
23143518607SKenneth D. Merry #define	SA_RBO			0x02	/* recover buffer order */
23243518607SKenneth D. Merry #define	SA_REW			0x01	/* report early warning */
233*7c5d20a6SWarner Losh 	uint8_t gap_size;
234*7c5d20a6SWarner Losh 	uint8_t byte10;
23543518607SKenneth D. Merry /* from SCSI-3: SSC-4 Working draft (2/14) 8.3.3 */
23643518607SKenneth D. Merry #define	SA_EOD_DEF_MASK		0xe0	/* EOD defined */
23743518607SKenneth D. Merry #define	SA_EEG			0x10	/* Enable EOD Generation */
23843518607SKenneth D. Merry #define	SA_SEW			0x08	/* Synchronize at Early Warning */
23943518607SKenneth D. Merry #define	SA_SOFT_WP		0x04	/* Software Write Protect */
24043518607SKenneth D. Merry #define	SA_BAML			0x02	/* Block Address Mode Lock */
24143518607SKenneth D. Merry #define	SA_BAM			0x01	/* Block Address Mode */
242*7c5d20a6SWarner Losh 	uint8_t ew_bufsize[3];
243*7c5d20a6SWarner Losh 	uint8_t sel_comp_alg;
24400bb66d7SMatt Jacob #define	SA_COMP_NONE		0x00
24500bb66d7SMatt Jacob #define	SA_COMP_DEFAULT		0x01
246eab2467fSMatt Jacob 	/* the following is 'reserved' in SCSI-2 but is defined in SSC-r22 */
247*7c5d20a6SWarner Losh 	uint8_t extra_wp;
248eab2467fSMatt Jacob #define	SA_ASOC_WP		0x04	/* Associated Write Protect */
249eab2467fSMatt Jacob #define	SA_PERS_WP		0x02	/* Persistent Write Protect */
250eab2467fSMatt Jacob #define	SA_PERM_WP		0x01	/* Permanent Write Protect */
25100bb66d7SMatt Jacob };
25200bb66d7SMatt Jacob 
25300bb66d7SMatt Jacob /* from SCSI-3: SSC-Rev10 (6/97) */
25476babe50SJustin T. Gibbs struct scsi_data_compression_page {
255*7c5d20a6SWarner Losh 	uint8_t page_code;	/* 0x0f */
256*7c5d20a6SWarner Losh 	uint8_t page_length;	/* 0x0e */
257*7c5d20a6SWarner Losh 	uint8_t dce_and_dcc;
25876babe50SJustin T. Gibbs #define SA_DCP_DCE		0x80 	/* Data compression enable */
25976babe50SJustin T. Gibbs #define SA_DCP_DCC		0x40	/* Data compression capable */
260*7c5d20a6SWarner Losh 	uint8_t dde_and_red;
26176babe50SJustin T. Gibbs #define SA_DCP_DDE		0x80	/* Data decompression enable */
26276babe50SJustin T. Gibbs #define SA_DCP_RED_MASK		0x60	/* Report Exception on Decomp. */
26376babe50SJustin T. Gibbs #define SA_DCP_RED_SHAMT	5
26476babe50SJustin T. Gibbs #define SA_DCP_RED_0		0x00
26576babe50SJustin T. Gibbs #define SA_DCP_RED_1		0x20
26676babe50SJustin T. Gibbs #define SA_DCP_RED_2		0x40
267*7c5d20a6SWarner Losh 	uint8_t comp_algorithm[4];
268*7c5d20a6SWarner Losh 	uint8_t decomp_algorithm[4];
269*7c5d20a6SWarner Losh 	uint8_t reserved[4];
27076babe50SJustin T. Gibbs };
27176babe50SJustin T. Gibbs 
27200bb66d7SMatt Jacob typedef union {
273*7c5d20a6SWarner Losh 	struct { uint8_t pagecode, pagelength; } hdr;
27400bb66d7SMatt Jacob 	struct scsi_dev_conf_page dconf;
27500bb66d7SMatt Jacob 	struct scsi_data_compression_page dcomp;
27600bb66d7SMatt Jacob } sa_comp_t;
27700bb66d7SMatt Jacob 
27843518607SKenneth D. Merry /*
27943518607SKenneth D. Merry  * Control Data Protection subpage.  This is as defined in SSC3r03.
28043518607SKenneth D. Merry  */
28143518607SKenneth D. Merry struct scsi_control_data_prot_subpage {
28243518607SKenneth D. Merry 	uint8_t page_code;
28343518607SKenneth D. Merry #define	SA_CTRL_DP_PAGE_CODE		0x0a
28443518607SKenneth D. Merry 	uint8_t subpage_code;
28543518607SKenneth D. Merry #define	SA_CTRL_DP_SUBPAGE_CODE		0xf0
28643518607SKenneth D. Merry 	uint8_t length[2];
28743518607SKenneth D. Merry 	uint8_t prot_method;
28843518607SKenneth D. Merry #define	SA_CTRL_DP_NO_LBP		0x00
28943518607SKenneth D. Merry #define	SA_CTRL_DP_REED_SOLOMON		0x01
29043518607SKenneth D. Merry #define	SA_CTRL_DP_METHOD_MAX		0xff
29143518607SKenneth D. Merry 	uint8_t pi_length;
29243518607SKenneth D. Merry #define	SA_CTRL_DP_PI_LENGTH_MASK	0x3f
29343518607SKenneth D. Merry #define	SA_CTRL_DP_RS_LENGTH		4
29443518607SKenneth D. Merry 	uint8_t prot_bits;
29543518607SKenneth D. Merry #define	SA_CTRL_DP_LBP_W		0x80
29643518607SKenneth D. Merry #define	SA_CTRL_DP_LBP_R		0x40
29743518607SKenneth D. Merry #define	SA_CTRL_DP_RBDP			0x20
29843518607SKenneth D. Merry 	uint8_t reserved[];
29943518607SKenneth D. Merry };
30043518607SKenneth D. Merry 
30143518607SKenneth D. Merry /*
30243518607SKenneth D. Merry  * This is the Read/Write Control mode page used on IBM Enterprise Tape
30343518607SKenneth D. Merry  * Drives.  They are known as 3592, TS, or Jaguar drives.  The SCSI inquiry
30443518607SKenneth D. Merry  * data will show a Product ID "03592XXX", where XXX is 'J1A', 'E05' (TS1120),
30543518607SKenneth D. Merry  * 'E06' (TS1130), 'E07' (TS1140) or 'E08' (TS1150).
30643518607SKenneth D. Merry  *
30743518607SKenneth D. Merry  * This page definition is current as of the 3592 SCSI Reference v6,
30843518607SKenneth D. Merry  * released on December 16th, 2014.
30943518607SKenneth D. Merry  */
31043518607SKenneth D. Merry struct scsi_tape_ibm_rw_control {
31143518607SKenneth D. Merry 	uint8_t page_code;
31243518607SKenneth D. Merry #define SA_IBM_RW_CTRL_PAGE_CODE		0x25
31343518607SKenneth D. Merry 	uint8_t page_length;
31443518607SKenneth D. Merry 	uint8_t ignore_seq_checks;
31543518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_LOC_IGNORE_SEQ		0x04
31643518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_SPC_BLK_IGNORE_SEQ	0x02
31743518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_SPC_FM_IGNORE_SEQ	0x01
31843518607SKenneth D. Merry 	uint8_t ignore_data_checks;
31943518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_LOC_IGNORE_DATA		0x04
32043518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_SPC_BLK_IGNORE_DATA	0x02
32143518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_SPC_FM_IGNORE_DATA	0x01
32243518607SKenneth D. Merry 	uint8_t reserved1;
32343518607SKenneth D. Merry 	uint8_t leop_method;
32443518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_LEOP_DEFAULT		0x00
32543518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_LEOP_MAX_CAP		0x01
32643518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_LEOP_CONST_CAP		0x02
32743518607SKenneth D. Merry 	uint8_t leop_ew[2];
32843518607SKenneth D. Merry 	uint8_t byte8;
32943518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_DISABLE_FASTSYNC		0x80
33043518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_DISABLE_SKIPSYNC		0x40
33143518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_DISABLE_CROSS_EOD	0x08
33243518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_DISABLE_CROSS_PERM_ERR	0x04
33343518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_REPORT_SEG_EW		0x02
33443518607SKenneth D. Merry #define	SA_IBM_RW_CTRL_REPORT_HOUSEKEEPING_ERR	0x01
33543518607SKenneth D. Merry 	uint8_t default_write_dens_bop_0;
33643518607SKenneth D. Merry 	uint8_t pending_write_dens_bop_0;
33743518607SKenneth D. Merry 	uint8_t reserved2[21];
33843518607SKenneth D. Merry };
33943518607SKenneth D. Merry 
340d902101eSMatt Jacob struct scsi_tape_read_position {
341*7c5d20a6SWarner Losh 	uint8_t opcode;		/* READ_POSITION */
342*7c5d20a6SWarner Losh 	uint8_t byte1;			/* set LSB to read hardware block pos */
34343518607SKenneth D. Merry #define	SA_RPOS_SHORT_FORM	0x00
34443518607SKenneth D. Merry #define	SA_RPOS_SHORT_VENDOR	0x01
34543518607SKenneth D. Merry #define	SA_RPOS_LONG_FORM	0x06
34643518607SKenneth D. Merry #define	SA_RPOS_EXTENDED_FORM	0x08
347*7c5d20a6SWarner Losh 	uint8_t reserved[5];
348*7c5d20a6SWarner Losh 	uint8_t length[2];
349*7c5d20a6SWarner Losh 	uint8_t control;
350d902101eSMatt Jacob };
351d902101eSMatt Jacob 
352d902101eSMatt Jacob struct scsi_tape_position_data	{	/* Short Form */
353*7c5d20a6SWarner Losh 	uint8_t flags;
354d902101eSMatt Jacob #define	SA_RPOS_BOP		0x80	/* Beginning of Partition */
355d902101eSMatt Jacob #define	SA_RPOS_EOP		0x40	/* End of Partition */
356d902101eSMatt Jacob #define	SA_RPOS_BCU		0x20	/* Block Count Unknown (SCSI3) */
357d902101eSMatt Jacob #define	SA_RPOS_BYCU		0x10	/* Byte Count Unknown (SCSI3) */
358d902101eSMatt Jacob #define	SA_RPOS_BPU		0x04	/* Block Position Unknown */
359d902101eSMatt Jacob #define	SA_RPOS_PERR		0x02	/* Position Error (SCSI3) */
36043518607SKenneth D. Merry #define	SA_RPOS_BPEW		0x01	/* Beyond Programmable Early Warning */
361d902101eSMatt Jacob #define	SA_RPOS_UNCERTAIN	SA_RPOS_BPU
362*7c5d20a6SWarner Losh 	uint8_t partition;
363*7c5d20a6SWarner Losh 	uint8_t reserved[2];
364*7c5d20a6SWarner Losh 	uint8_t firstblk[4];
365*7c5d20a6SWarner Losh 	uint8_t lastblk[4];
366*7c5d20a6SWarner Losh 	uint8_t reserved2;
367*7c5d20a6SWarner Losh 	uint8_t nbufblk[3];
368*7c5d20a6SWarner Losh 	uint8_t nbufbyte[4];
369d902101eSMatt Jacob };
370d902101eSMatt Jacob 
37143518607SKenneth D. Merry struct scsi_tape_position_long_data {
372*7c5d20a6SWarner Losh 	uint8_t flags;
37343518607SKenneth D. Merry #define	SA_RPOS_LONG_BOP	0x80	/* Beginning of Partition */
37443518607SKenneth D. Merry #define	SA_RPOS_LONG_EOP	0x40	/* End of Partition */
37543518607SKenneth D. Merry #define	SA_RPOS_LONG_MPU	0x08	/* Mark Position Unknown */
37643518607SKenneth D. Merry #define	SA_RPOS_LONG_LONU	0x04	/* Logical Object Number Unknown */
37743518607SKenneth D. Merry #define	SA_RPOS_LONG_BPEW	0x01	/* Beyond Programmable Early Warning */
378*7c5d20a6SWarner Losh 	uint8_t reserved[3];
379*7c5d20a6SWarner Losh 	uint8_t partition[4];
380*7c5d20a6SWarner Losh 	uint8_t logical_object_num[8];
381*7c5d20a6SWarner Losh 	uint8_t logical_file_num[8];
382*7c5d20a6SWarner Losh 	uint8_t set_id[8];
38343518607SKenneth D. Merry };
38443518607SKenneth D. Merry 
38543518607SKenneth D. Merry struct scsi_tape_position_ext_data {
386*7c5d20a6SWarner Losh 	uint8_t flags;
38743518607SKenneth D. Merry #define	SA_RPOS_EXT_BOP		0x80	/* Beginning of Partition */
38843518607SKenneth D. Merry #define	SA_RPOS_EXT_EOP		0x40	/* End of Partition */
38943518607SKenneth D. Merry #define	SA_RPOS_EXT_LOCU	0x20	/* Logical Object Count Unknown */
39043518607SKenneth D. Merry #define	SA_RPOS_EXT_BYCU	0x10	/* Byte Count Unknown */
39143518607SKenneth D. Merry #define	SA_RPOS_EXT_LOLU	0x04	/* Logical Object Location Unknown */
39243518607SKenneth D. Merry #define	SA_RPOS_EXT_PERR	0x02	/* Position Error */
39343518607SKenneth D. Merry #define	SA_RPOS_EXT_BPEW	0x01	/* Beyond Programmable Early Warning */
394*7c5d20a6SWarner Losh 	uint8_t partition;
395*7c5d20a6SWarner Losh 	uint8_t length[2];
396*7c5d20a6SWarner Losh 	uint8_t reserved;
397*7c5d20a6SWarner Losh 	uint8_t num_objects[3];
398*7c5d20a6SWarner Losh 	uint8_t first_object[8];
399*7c5d20a6SWarner Losh 	uint8_t last_object[8];
400*7c5d20a6SWarner Losh 	uint8_t bytes_in_buffer[8];
40143518607SKenneth D. Merry };
40243518607SKenneth D. Merry 
403d902101eSMatt Jacob struct scsi_tape_locate {
404*7c5d20a6SWarner Losh 	uint8_t opcode;
405*7c5d20a6SWarner Losh 	uint8_t byte1;
406d902101eSMatt Jacob #define	SA_SPOS_IMMED		0x01
407d902101eSMatt Jacob #define	SA_SPOS_CP		0x02
408d902101eSMatt Jacob #define	SA_SPOS_BT		0x04
409*7c5d20a6SWarner Losh 	uint8_t reserved1;
410*7c5d20a6SWarner Losh 	uint8_t blkaddr[4];
41143518607SKenneth D. Merry #define	SA_SPOS_MAX_BLK		0xffffffff
412*7c5d20a6SWarner Losh 	uint8_t reserved2;
413*7c5d20a6SWarner Losh 	uint8_t partition;
414*7c5d20a6SWarner Losh 	uint8_t control;
415d902101eSMatt Jacob };
416d902101eSMatt Jacob 
41743518607SKenneth D. Merry struct scsi_locate_16 {
418*7c5d20a6SWarner Losh 	uint8_t opcode;
419*7c5d20a6SWarner Losh 	uint8_t byte1;
42043518607SKenneth D. Merry #define	SA_LC_IMMEDIATE		0x01
42143518607SKenneth D. Merry #define	SA_LC_CP		0x02
42243518607SKenneth D. Merry #define	SA_LC_DEST_TYPE_MASK	0x38
42343518607SKenneth D. Merry #define	SA_LC_DEST_TYPE_SHIFT	3
42443518607SKenneth D. Merry #define	SA_LC_DEST_OBJECT	0x00
42543518607SKenneth D. Merry #define	SA_LC_DEST_FILE		0x01
42643518607SKenneth D. Merry #define	SA_LC_DEST_SET		0x02
42743518607SKenneth D. Merry #define	SA_LC_DEST_EOD		0x03
428*7c5d20a6SWarner Losh 	uint8_t byte2;
42943518607SKenneth D. Merry #define	SA_LC_BAM_IMPLICIT	0x00
43043518607SKenneth D. Merry #define	SA_LC_BAM_EXPLICIT	0x01
431*7c5d20a6SWarner Losh 	uint8_t partition;
432*7c5d20a6SWarner Losh 	uint8_t logical_id[8];
433*7c5d20a6SWarner Losh 	uint8_t reserved[3];
434*7c5d20a6SWarner Losh 	uint8_t control;
43543518607SKenneth D. Merry };
43643518607SKenneth D. Merry 
43743518607SKenneth D. Merry struct scsi_report_density_support {
438*7c5d20a6SWarner Losh 	uint8_t opcode;
439*7c5d20a6SWarner Losh 	uint8_t byte1;
44043518607SKenneth D. Merry #define	SRDS_MEDIA		0x01
44143518607SKenneth D. Merry #define	SRDS_MEDIUM_TYPE	0x02
442*7c5d20a6SWarner Losh 	uint8_t reserved[5];
443*7c5d20a6SWarner Losh 	uint8_t length[2];
44443518607SKenneth D. Merry #define	SRDS_MAX_LENGTH		0xffff
445*7c5d20a6SWarner Losh 	uint8_t control;
44643518607SKenneth D. Merry };
44743518607SKenneth D. Merry 
44843518607SKenneth D. Merry struct scsi_density_hdr {
449*7c5d20a6SWarner Losh 	uint8_t length[2];
450*7c5d20a6SWarner Losh 	uint8_t reserved[2];
451*7c5d20a6SWarner Losh 	uint8_t descriptor[];
45243518607SKenneth D. Merry };
45343518607SKenneth D. Merry 
45443518607SKenneth D. Merry struct scsi_density_data {
455*7c5d20a6SWarner Losh 	uint8_t primary_density_code;
456*7c5d20a6SWarner Losh 	uint8_t secondary_density_code;
457*7c5d20a6SWarner Losh 	uint8_t byte2;
45843518607SKenneth D. Merry #define	SDD_DLV			0x01
45943518607SKenneth D. Merry #define	SDD_DEFLT		0x20
46043518607SKenneth D. Merry #define	SDD_DUP			0x40
46143518607SKenneth D. Merry #define SDD_WRTOK		0x80
462*7c5d20a6SWarner Losh 	uint8_t length[2];
46343518607SKenneth D. Merry #define	SDD_DEFAULT_LENGTH	52
464*7c5d20a6SWarner Losh 	uint8_t bits_per_mm[3];
465*7c5d20a6SWarner Losh 	uint8_t media_width[2];
466*7c5d20a6SWarner Losh 	uint8_t tracks[2];
467*7c5d20a6SWarner Losh 	uint8_t capacity[4];
468*7c5d20a6SWarner Losh 	uint8_t assigning_org[8];
469*7c5d20a6SWarner Losh 	uint8_t density_name[8];
470*7c5d20a6SWarner Losh 	uint8_t description[20];
47143518607SKenneth D. Merry };
47243518607SKenneth D. Merry 
47343518607SKenneth D. Merry struct scsi_medium_type_data {
474*7c5d20a6SWarner Losh 	uint8_t medium_type;
475*7c5d20a6SWarner Losh 	uint8_t reserved1;
476*7c5d20a6SWarner Losh 	uint8_t length[2];
47743518607SKenneth D. Merry #define	SMTD_DEFAULT_LENGTH	52
478*7c5d20a6SWarner Losh 	uint8_t num_density_codes;
479*7c5d20a6SWarner Losh 	uint8_t primary_density_codes[9];
480*7c5d20a6SWarner Losh 	uint8_t media_width[2];
481*7c5d20a6SWarner Losh 	uint8_t medium_length[2];
482*7c5d20a6SWarner Losh 	uint8_t reserved2[2];
483*7c5d20a6SWarner Losh 	uint8_t assigning_org[8];
484*7c5d20a6SWarner Losh 	uint8_t medium_type_name[8];
485*7c5d20a6SWarner Losh 	uint8_t description[20];
48643518607SKenneth D. Merry };
48743518607SKenneth D. Merry 
48843518607SKenneth D. Merry /*
4894ab55886SKenneth D. Merry  * Manufacturer-assigned Serial Number VPD page.
4904ab55886SKenneth D. Merry  * Current as of SSC-5r03, 28 September 2016.
4914ab55886SKenneth D. Merry  */
4924ab55886SKenneth D. Merry struct scsi_vpd_mfg_serial_number
4934ab55886SKenneth D. Merry {
494*7c5d20a6SWarner Losh 	uint8_t device;
495*7c5d20a6SWarner Losh 	uint8_t page_code;
4964ab55886SKenneth D. Merry #define	SVPD_MFG_SERIAL_NUMBER_PAGE_CODE 0xB1
497*7c5d20a6SWarner Losh 	uint8_t page_length[2];
498*7c5d20a6SWarner Losh 	uint8_t mfg_serial_num[];
4994ab55886SKenneth D. Merry };
5004ab55886SKenneth D. Merry 
5014ab55886SKenneth D. Merry /*
50243518607SKenneth D. Merry  * Security Protocol Specific values for the Tape Data Encryption protocol
50343518607SKenneth D. Merry  * (0x20) used with SECURITY PROTOCOL IN.  See below for values used with
50443518607SKenneth D. Merry  * SECURITY PROTOCOL OUT.  Current as of SSC4r03.
50543518607SKenneth D. Merry  */
50643518607SKenneth D. Merry #define	TDE_IN_SUPPORT_PAGE		0x0000
50743518607SKenneth D. Merry #define	TDE_OUT_SUPPORT_PAGE		0x0001
50843518607SKenneth D. Merry #define	TDE_DATA_ENC_CAP_PAGE		0x0010
50943518607SKenneth D. Merry #define	TDE_SUPPORTED_KEY_FORMATS_PAGE	0x0011
51043518607SKenneth D. Merry #define	TDE_DATA_ENC_MAN_CAP_PAGE	0x0012
51143518607SKenneth D. Merry #define	TDE_DATA_ENC_STATUS_PAGE	0x0020
51243518607SKenneth D. Merry #define	TDE_NEXT_BLOCK_ENC_STATUS_PAGE	0x0021
51343518607SKenneth D. Merry #define	TDE_GET_ENC_MAN_ATTR_PAGE	0x0022
51443518607SKenneth D. Merry #define	TDE_RANDOM_NUM_PAGE		0x0030
51543518607SKenneth D. Merry #define	TDE_KEY_WRAP_PK_PAGE		0x0031
51643518607SKenneth D. Merry 
51743518607SKenneth D. Merry /*
51843518607SKenneth D. Merry  * Tape Data Encryption protocol pages used with SECURITY PROTOCOL IN and
51943518607SKenneth D. Merry  * SECURITY PROTOCOL OUT.
52043518607SKenneth D. Merry  */
52143518607SKenneth D. Merry /*
52243518607SKenneth D. Merry  * Tape Data Encryption In Support page (0x0000).
52343518607SKenneth D. Merry  */
52443518607SKenneth D. Merry struct tde_in_support_page {
52543518607SKenneth D. Merry 	uint8_t page_code[2];
52643518607SKenneth D. Merry 	uint8_t page_length[2];
52743518607SKenneth D. Merry 	uint8_t page_codes[];
52843518607SKenneth D. Merry };
52943518607SKenneth D. Merry 
53043518607SKenneth D. Merry /*
53143518607SKenneth D. Merry  * Tape Data Encryption Out Support page (0x0001).
53243518607SKenneth D. Merry  */
53343518607SKenneth D. Merry struct tde_out_support_page {
53443518607SKenneth D. Merry 	uint8_t page_code[2];
53543518607SKenneth D. Merry 	uint8_t page_length[2];
53643518607SKenneth D. Merry 	uint8_t page_codes[];
53743518607SKenneth D. Merry };
53843518607SKenneth D. Merry 
53943518607SKenneth D. Merry /*
54043518607SKenneth D. Merry  * Logical block encryption algorithm descriptor.  This is reported in the
54143518607SKenneth D. Merry  * Data Encryption Capabilities page.
54243518607SKenneth D. Merry  */
54343518607SKenneth D. Merry struct tde_block_enc_alg_desc {
54443518607SKenneth D. Merry 	uint8_t alg_index;
54543518607SKenneth D. Merry 	uint8_t reserved1;
54643518607SKenneth D. Merry 	uint8_t desc_length[2];
54743518607SKenneth D. Merry 	uint8_t byte4;
54843518607SKenneth D. Merry #define	TDE_BEA_AVFMV			0x80
54943518607SKenneth D. Merry #define	TDE_BEA_SDK_C			0x40
55043518607SKenneth D. Merry #define	TDE_BEA_MAC_C			0x20
55143518607SKenneth D. Merry #define	TDE_BEA_DELB_C			0x10
55243518607SKenneth D. Merry #define	TDE_BEA_DECRYPT_C_MASK		0x0c
55343518607SKenneth D. Merry #define	TDE_BEA_DECRYPT_C_EXT		0x0c
55443518607SKenneth D. Merry #define	TDE_BEA_DECRYPT_C_HARD		0x08
55543518607SKenneth D. Merry #define	TDE_BEA_DECRYPT_C_SOFT		0x04
55643518607SKenneth D. Merry #define	TDE_BEA_DECRYPT_C_NO_CAP	0x00
55743518607SKenneth D. Merry #define	TDE_BEA_ENCRYPT_C_MASK		0x03
55843518607SKenneth D. Merry #define	TDE_BEA_ENCRYPT_C_EXT		0x03
55943518607SKenneth D. Merry #define	TDE_BEA_ENCRYPT_C_HARD		0x02
56043518607SKenneth D. Merry #define	TDE_BEA_ENCRYPT_C_SOFT		0x01
56143518607SKenneth D. Merry #define	TDE_BEA_ENCRYPT_C_NO_CAP	0x00
56243518607SKenneth D. Merry 	uint8_t byte5;
56343518607SKenneth D. Merry #define	TDE_BEA_AVFCLP_MASK		0xc0
56443518607SKenneth D. Merry #define	TDE_BEA_AVFCLP_VALID		0x80
56543518607SKenneth D. Merry #define	TDE_BEA_AVFCLP_NOT_VALID	0x40
56643518607SKenneth D. Merry #define	TDE_BEA_AVFCLP_NOT_APP		0x00
56743518607SKenneth D. Merry #define	TDE_BEA_NONCE_C_MASK		0x30
56843518607SKenneth D. Merry #define	TDE_BEA_NONCE_C_SUPPORTED	0x30
56943518607SKenneth D. Merry #define	TDE_BEA_NONCE_C_PROVIDED	0x20
57043518607SKenneth D. Merry #define	TDE_BEA_NONCE_C_GENERATED	0x10
57143518607SKenneth D. Merry #define	TDE_BEA_NONCE_C_NOT_REQUIRED	0x00
57243518607SKenneth D. Merry #define	TDE_BEA_KADF_C			0x08
57343518607SKenneth D. Merry #define	TDE_BEA_VCELB_C			0x04
57443518607SKenneth D. Merry #define	TDE_BEA_UKADF			0x02
57543518607SKenneth D. Merry #define	TDE_BEA_AKADF			0x01
57643518607SKenneth D. Merry 	uint8_t max_unauth_key_bytes[2];
57743518607SKenneth D. Merry 	uint8_t max_auth_key_bytes[2];
57843518607SKenneth D. Merry 	uint8_t lbe_key_size[2];
57943518607SKenneth D. Merry 	uint8_t byte12;
58043518607SKenneth D. Merry #define	TDE_BEA_DKAD_C_MASK		0xc0
58143518607SKenneth D. Merry #define	TDE_BEA_DKAD_C_CAPABLE		0xc0
58243518607SKenneth D. Merry #define	TDE_BEA_DKAD_C_NOT_ALLOWED	0x80
58343518607SKenneth D. Merry #define	TDE_BEA_DKAD_C_REQUIRED		0x40
58443518607SKenneth D. Merry #define	TDE_BEA_EEMC_C_MASK		0x30
58543518607SKenneth D. Merry #define	TDE_BEA_EEMC_C_ALLOWED		0x20
58643518607SKenneth D. Merry #define	TDE_BEA_EEMC_C_NOT_ALLOWED	0x10
58743518607SKenneth D. Merry #define	TDE_BEA_EEMC_C_NOT_SPECIFIED	0x00
58843518607SKenneth D. Merry 	/*
58943518607SKenneth D. Merry 	 * Raw Decryption Mode Control Capabilities (RDMC_C) field.  The
59043518607SKenneth D. Merry 	 * descriptions are too complex to represent as a simple name.
59143518607SKenneth D. Merry 	 */
59243518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MASK		0x0e
59343518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MODE_7		0x0e
59443518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MODE_6		0x0c
59543518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MODE_5		0x0a
59643518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MODE_4		0x08
59743518607SKenneth D. Merry #define	TDE_BEA_RDMC_C_MODE_1		0x02
59843518607SKenneth D. Merry #define	TDE_BEA_EAREM			0x01
59943518607SKenneth D. Merry 	uint8_t byte13;
60043518607SKenneth D. Merry #define	TDE_BEA_MAX_EEDKS_MASK		0x0f
60143518607SKenneth D. Merry 	uint8_t msdk_count[2];
60243518607SKenneth D. Merry 	uint8_t max_eedk_size[2];
60343518607SKenneth D. Merry 	uint8_t reserved2[2];
60443518607SKenneth D. Merry 	uint8_t security_algo_code[4];
60543518607SKenneth D. Merry };
60643518607SKenneth D. Merry 
60743518607SKenneth D. Merry /*
60843518607SKenneth D. Merry  * Data Encryption Capabilities page (0x0010).
60943518607SKenneth D. Merry  */
61043518607SKenneth D. Merry struct tde_data_enc_cap_page {
61143518607SKenneth D. Merry 	uint8_t page_code[2];
61243518607SKenneth D. Merry 	uint8_t page_length;
61343518607SKenneth D. Merry 	uint8_t byte4;
61443518607SKenneth D. Merry #define	DATA_ENC_CAP_EXTDECC_MASK		0x0c
61543518607SKenneth D. Merry #define	DATA_ENC_CAP_EXTDECC_NOT_REPORTED	0x00
61643518607SKenneth D. Merry #define	DATA_ENC_CAP_EXTDECC_NOT_CAPABLE	0x04
61743518607SKenneth D. Merry #define	DATA_ENC_CAP_EXTDECC_CAPABLE		0x08
61843518607SKenneth D. Merry #define	DATA_ENC_CAP_CFG_P_MASK			0x03
61943518607SKenneth D. Merry #define	DATA_ENC_CAP_CFG_P_NOT_REPORTED		0x00
62043518607SKenneth D. Merry #define	DATA_ENC_CAP_CFG_P_ALLOWED		0x01
62143518607SKenneth D. Merry #define	DATA_ENC_CAP_CFG_P_NOT_ALLOWED		0x02
62243518607SKenneth D. Merry 	uint8_t reserved[15];
62343518607SKenneth D. Merry 	struct tde_block_enc_alg_desc alg_descs[];
62443518607SKenneth D. Merry };
62543518607SKenneth D. Merry 
62643518607SKenneth D. Merry /*
62743518607SKenneth D. Merry  * Tape Data Encryption Supported Key Formats page (0x0011).
62843518607SKenneth D. Merry  */
62943518607SKenneth D. Merry struct tde_supported_key_formats_page {
63043518607SKenneth D. Merry 	uint8_t page_code[2];
63143518607SKenneth D. Merry 	uint8_t page_length[2];
63243518607SKenneth D. Merry 	uint8_t key_formats_list[];
63343518607SKenneth D. Merry };
63443518607SKenneth D. Merry 
63543518607SKenneth D. Merry /*
63643518607SKenneth D. Merry  * Tape Data Encryption Management Capabilities page (0x0012).
63743518607SKenneth D. Merry  */
63843518607SKenneth D. Merry struct tde_data_enc_man_cap_page {
63943518607SKenneth D. Merry 	uint8_t page_code[2];
64043518607SKenneth D. Merry 	uint8_t page_length[2];
64143518607SKenneth D. Merry 	uint8_t byte4;
64243518607SKenneth D. Merry #define	TDE_DEMC_LOCK_C		0x01
64343518607SKenneth D. Merry 	uint8_t byte5;
64443518607SKenneth D. Merry #define	TDE_DEMC_CKOD_C		0x04
64543518607SKenneth D. Merry #define	TDE_DEMC_CKORP_C	0x02
64643518607SKenneth D. Merry #define	TDE_DEMC_CKORL_C	0x01
64743518607SKenneth D. Merry 	uint8_t reserved1;
64843518607SKenneth D. Merry 	uint8_t byte7;
64943518607SKenneth D. Merry #define	TDE_DEMC_AITN_C		0x04
65043518607SKenneth D. Merry #define	TDE_DEMC_LOCAL_C	0x02
65143518607SKenneth D. Merry #define	TDE_DEMC_PUBLIC_C	0x01
65243518607SKenneth D. Merry 	uint8_t reserved2[8];
65343518607SKenneth D. Merry };
65443518607SKenneth D. Merry 
65543518607SKenneth D. Merry /*
65643518607SKenneth D. Merry  * Tape Data Encryption Status Page (0x0020).
65743518607SKenneth D. Merry  */
65843518607SKenneth D. Merry struct tde_data_enc_status_page {
65943518607SKenneth D. Merry 	uint8_t page_code[2];
66043518607SKenneth D. Merry 	uint8_t page_length[2];
66143518607SKenneth D. Merry 	uint8_t scope;
66243518607SKenneth D. Merry #define	TDE_DES_IT_NEXUS_SCOPE_MASK	0xe0
66343518607SKenneth D. Merry #define	TDE_DES_LBE_SCOPE_MASK		0x07
66443518607SKenneth D. Merry 	uint8_t encryption_mode;
66543518607SKenneth D. Merry 	uint8_t decryption_mode;
66643518607SKenneth D. Merry 	uint8_t algo_index;
66743518607SKenneth D. Merry 	uint8_t key_instance_counter[4];
66843518607SKenneth D. Merry 	uint8_t byte12;
66943518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_MASK		0x70
67043518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_MGMT		0x40
67143518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_CHANGER	0x30
67243518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_DRIVE	0x20
67343518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_EXT		0x10
67443518607SKenneth D. Merry #define	TDE_DES_PARAM_CTRL_NOT_REPORTED	0x00
67543518607SKenneth D. Merry #define	TDE_DES_VCELB			0x08
67643518607SKenneth D. Merry #define	TDE_DES_CEEMS_MASK		0x06
67743518607SKenneth D. Merry #define	TDE_DES_RDMD			0x01
67843518607SKenneth D. Merry 	uint8_t enc_params_kad_format;
67943518607SKenneth D. Merry 	uint8_t asdk_count[2];
68043518607SKenneth D. Merry 	uint8_t reserved[8];
68143518607SKenneth D. Merry 	uint8_t key_assoc_data_desc[];
68243518607SKenneth D. Merry };
68343518607SKenneth D. Merry 
68443518607SKenneth D. Merry /*
68543518607SKenneth D. Merry  * Tape Data Encryption Next Block Encryption Status page (0x0021).
68643518607SKenneth D. Merry  */
68743518607SKenneth D. Merry struct tde_next_block_enc_status_page {
68843518607SKenneth D. Merry 	uint8_t page_code[2];
68943518607SKenneth D. Merry 	uint8_t page_length[2];
69043518607SKenneth D. Merry 	uint8_t logical_obj_number[8];
69143518607SKenneth D. Merry 	uint8_t status;
69243518607SKenneth D. Merry #define	TDE_NBES_COMP_STATUS_MASK	0xf0
69343518607SKenneth D. Merry #define	TDE_NBES_COMP_INCAPABLE		0x00
69443518607SKenneth D. Merry #define	TDE_NBES_COMP_NOT_YET		0x10
69543518607SKenneth D. Merry #define	TDE_NBES_COMP_NOT_A_BLOCK	0x20
69643518607SKenneth D. Merry #define	TDE_NBES_COMP_NOT_COMPRESSED	0x30
69743518607SKenneth D. Merry #define	TDE_NBES_COMP_COMPRESSED	0x40
69843518607SKenneth D. Merry #define	TDE_NBES_ENC_STATUS_MASK	0x0f
69943518607SKenneth D. Merry #define	TDE_NBES_ENC_INCAPABLE		0x00
70043518607SKenneth D. Merry #define	TDE_NBES_ENC_NOT_YET		0x01
70143518607SKenneth D. Merry #define	TDE_NBES_ENC_NOT_A_BLOCK	0x02
70243518607SKenneth D. Merry #define	TDE_NBES_ENC_NOT_ENCRYPTED	0x03
70343518607SKenneth D. Merry #define	TDE_NBES_ENC_ALG_NOT_SUPPORTED	0x04
70443518607SKenneth D. Merry #define	TDE_NBES_ENC_SUPPORTED_ALG	0x05
70543518607SKenneth D. Merry #define	TDE_NBES_ENC_NO_KEY		0x06
70643518607SKenneth D. Merry 	uint8_t algo_index;
70743518607SKenneth D. Merry 	uint8_t byte14;
70843518607SKenneth D. Merry #define	TDE_NBES_EMES			0x02
70943518607SKenneth D. Merry #define	TDE_NBES_RDMDS			0x01
71043518607SKenneth D. Merry 	uint8_t next_block_kad_format;
71143518607SKenneth D. Merry 	uint8_t key_assoc_data_desc[];
71243518607SKenneth D. Merry };
71343518607SKenneth D. Merry 
71443518607SKenneth D. Merry /*
71543518607SKenneth D. Merry  * Tape Data Encryption Get Encryption Management Attributes page (0x0022).
71643518607SKenneth D. Merry  */
71743518607SKenneth D. Merry struct tde_get_enc_man_attr_page {
71843518607SKenneth D. Merry 	uint8_t page_code[2];
71943518607SKenneth D. Merry 	uint8_t reserved[3];
72043518607SKenneth D. Merry 	uint8_t byte5;
72143518607SKenneth D. Merry #define	TDE_GEMA_CAOD			0x01
72243518607SKenneth D. Merry 	uint8_t page_length[2];
72343518607SKenneth D. Merry 	uint8_t enc_mgmt_attr_desc[];
72443518607SKenneth D. Merry };
72543518607SKenneth D. Merry 
72643518607SKenneth D. Merry /*
72743518607SKenneth D. Merry  * Tape Data Encryption Random Number page (0x0030).
72843518607SKenneth D. Merry  */
72943518607SKenneth D. Merry struct tde_random_num_page {
73043518607SKenneth D. Merry 	uint8_t page_code[2];
73143518607SKenneth D. Merry 	uint8_t page_length[2];
73243518607SKenneth D. Merry 	uint8_t random_number[32];
73343518607SKenneth D. Merry };
73443518607SKenneth D. Merry 
73543518607SKenneth D. Merry /*
73643518607SKenneth D. Merry  * Tape Data Encryption Device Server Key Wrapping Public Key page (0x0031).
73743518607SKenneth D. Merry  */
73843518607SKenneth D. Merry struct tde_key_wrap_pk_page {
73943518607SKenneth D. Merry 	uint8_t page_code[2];
74043518607SKenneth D. Merry 	uint8_t page_length[2];
74143518607SKenneth D. Merry 	uint8_t public_key_type[4];
74243518607SKenneth D. Merry 	uint8_t public_key_format[4];
74343518607SKenneth D. Merry 	uint8_t public_key_length[2];
74443518607SKenneth D. Merry 	uint8_t public_key[];
74543518607SKenneth D. Merry };
74643518607SKenneth D. Merry 
74743518607SKenneth D. Merry /*
74843518607SKenneth D. Merry  * Security Protocol Specific values for the Tape Data Encryption protocol
74943518607SKenneth D. Merry  * (0x20) used with SECURITY PROTOCOL OUT.  See above for values used with
75043518607SKenneth D. Merry  * SECURITY PROTOCOL IN.  Current as of SSCr03.
75143518607SKenneth D. Merry  */
75243518607SKenneth D. Merry #define	TDE_SET_DATA_ENC_PAGE		0x0010
75343518607SKenneth D. Merry #define	TDE_SA_ENCAP_PAGE		0x0011
75443518607SKenneth D. Merry #define	TDE_SET_ENC_MGMT_ATTR_PAGE	0x0022
75543518607SKenneth D. Merry 
75643518607SKenneth D. Merry /*
75743518607SKenneth D. Merry  * Tape Data Encryption Set Data Encryption page (0x0010).
75843518607SKenneth D. Merry  */
75943518607SKenneth D. Merry struct tde_set_data_enc_page {
76043518607SKenneth D. Merry 	uint8_t page_code[2];
76143518607SKenneth D. Merry 	uint8_t page_length[2];
76243518607SKenneth D. Merry 	uint8_t byte4;
76343518607SKenneth D. Merry #define	TDE_SDE_SCOPE_MASK		0xe0
76443518607SKenneth D. Merry #define	TDE_SDE_SCOPE_ALL_IT_NEXUS	0x80
76543518607SKenneth D. Merry #define	TDE_SDE_SCOPE_LOCAL		0x40
76643518607SKenneth D. Merry #define	TDE_SDE_SCOPE_PUBLIC		0x00
76743518607SKenneth D. Merry #define	TDE_SDE_LOCK			0x01
76843518607SKenneth D. Merry 	uint8_t byte5;
76943518607SKenneth D. Merry #define	TDE_SDE_CEEM_MASK		0xc0
77043518607SKenneth D. Merry #define	TDE_SDE_CEEM_ENCRYPT		0xc0
77143518607SKenneth D. Merry #define	TDE_SDE_CEEM_EXTERNAL		0x80
77243518607SKenneth D. Merry #define	TDE_SDE_CEEM_NO_CHECK		0x40
77343518607SKenneth D. Merry #define	TDE_SDE_RDMC_MASK		0x30
77443518607SKenneth D. Merry #define	TDE_SDE_RDMC_DISABLED		0x30
77543518607SKenneth D. Merry #define	TDE_SDE_RDMC_ENABLED		0x20
77643518607SKenneth D. Merry #define	TDE_SDE_RDMC_DEFAULT		0x00
77743518607SKenneth D. Merry #define	TDE_SDE_SDK			0x08
77843518607SKenneth D. Merry #define	TDE_SDE_CKOD			0x04
77943518607SKenneth D. Merry #define	TDE_SDE_CKORP			0x02
78043518607SKenneth D. Merry #define	TDE_SDE_CKORL			0x01
78143518607SKenneth D. Merry 	uint8_t encryption_mode;
78243518607SKenneth D. Merry #define	TDE_SDE_ENC_MODE_DISABLE	0x00
78343518607SKenneth D. Merry #define	TDE_SDE_ENC_MODE_EXTERNAL	0x01
78443518607SKenneth D. Merry #define	TDE_SDE_ENC_MODE_ENCRYPT	0x02
78543518607SKenneth D. Merry 	uint8_t decryption_mode;
78643518607SKenneth D. Merry #define	TDE_SDE_DEC_MODE_DISABLE	0x00
78743518607SKenneth D. Merry #define	TDE_SDE_DEC_MODE_RAW		0x01
78843518607SKenneth D. Merry #define	TDE_SDE_DEC_MODE_DECRYPT	0x02
78943518607SKenneth D. Merry #define	TDE_SDE_DEC_MODE_MIXED		0x03
79043518607SKenneth D. Merry 	uint8_t algo_index;
79143518607SKenneth D. Merry 	uint8_t lbe_key_format;
79243518607SKenneth D. Merry #define	TDE_SDE_KEY_PLAINTEXT		0x00
79343518607SKenneth D. Merry #define	TDE_SDE_KEY_VENDOR_SPEC		0x01
79443518607SKenneth D. Merry #define	TDE_SDE_KEY_PUBLIC_WRAP		0x02
79543518607SKenneth D. Merry #define	TDE_SDE_KEY_ESP_SCSI		0x03
79643518607SKenneth D. Merry 	uint8_t kad_format;
79743518607SKenneth D. Merry #define	TDE_SDE_KAD_ASCII		0x02
79843518607SKenneth D. Merry #define	TDE_SDE_KAD_BINARY		0x01
79943518607SKenneth D. Merry #define	TDE_SDE_KAD_UNSPECIFIED		0x00
80043518607SKenneth D. Merry 	uint8_t reserved[7];
80143518607SKenneth D. Merry 	uint8_t lbe_key_length[2];
80243518607SKenneth D. Merry 	uint8_t lbe_key[];
80343518607SKenneth D. Merry };
80443518607SKenneth D. Merry 
80543518607SKenneth D. Merry /*
80643518607SKenneth D. Merry  * Used for the Vendor Specific key format (0x01).
80743518607SKenneth D. Merry  */
80843518607SKenneth D. Merry struct tde_key_format_vendor {
80943518607SKenneth D. Merry 	uint8_t t10_vendor_id[8];
81043518607SKenneth D. Merry 	uint8_t vendor_key[];
81143518607SKenneth D. Merry };
81243518607SKenneth D. Merry 
81343518607SKenneth D. Merry /*
81443518607SKenneth D. Merry  * Used for the public key wrapped format (0x02).
81543518607SKenneth D. Merry  */
81643518607SKenneth D. Merry struct tde_key_format_public_wrap {
81743518607SKenneth D. Merry 	uint8_t parameter_set[2];
81843518607SKenneth D. Merry #define	TDE_PARAM_SET_RSA2048		0x0000
81943518607SKenneth D. Merry #define	TDE_PARAM_SET_ECC521		0x0010
82043518607SKenneth D. Merry 	uint8_t label_length[2];
82143518607SKenneth D. Merry 	uint8_t label[];
82243518607SKenneth D. Merry };
82343518607SKenneth D. Merry 
82443518607SKenneth D. Merry /*
82543518607SKenneth D. Merry  * Tape Data Encryption SA Encapsulation page (0x0011).
82643518607SKenneth D. Merry  */
82743518607SKenneth D. Merry struct tde_sa_encap_page {
82843518607SKenneth D. Merry 	uint8_t page_code[2];
82943518607SKenneth D. Merry 	uint8_t data_desc[];
83043518607SKenneth D. Merry };
83143518607SKenneth D. Merry 
83243518607SKenneth D. Merry /*
83343518607SKenneth D. Merry  * Tape Data Encryption Set Encryption Management Attributes page (0x0022).
83443518607SKenneth D. Merry  */
83543518607SKenneth D. Merry struct tde_set_enc_mgmt_attr_page {
83643518607SKenneth D. Merry 	uint8_t page_code[2];
83743518607SKenneth D. Merry 	uint8_t reserved[3];
83843518607SKenneth D. Merry 	uint8_t byte5;
83943518607SKenneth D. Merry #define	TDE_SEMA_CAOD			0x01
84043518607SKenneth D. Merry 	uint8_t page_length[2];
84143518607SKenneth D. Merry 	uint8_t attr_desc[];
84243518607SKenneth D. Merry };
84343518607SKenneth D. Merry 
84443518607SKenneth D. Merry /*
84543518607SKenneth D. Merry  * Tape Data Encryption descriptor format.
84643518607SKenneth D. Merry  * SSC4r03 Section 8.5.4.2.1 Table 197
84743518607SKenneth D. Merry  */
84843518607SKenneth D. Merry struct tde_data_enc_desc {
84943518607SKenneth D. Merry 	uint8_t key_desc_type;
85043518607SKenneth D. Merry #define	TDE_KEY_DESC_WK_KAD		0x04
85143518607SKenneth D. Merry #define	TDE_KEY_DESC_M_KAD		0x03
85243518607SKenneth D. Merry #define	TDE_KEY_DESC_NONCE_VALUE	0x02
85343518607SKenneth D. Merry #define	TDE_KEY_DESC_A_KAD		0x01
85443518607SKenneth D. Merry #define	TDE_KEY_DESC_U_KAD		0x00
85543518607SKenneth D. Merry 	uint8_t byte2;
85643518607SKenneth D. Merry #define	TDE_KEY_DESC_AUTH_MASK		0x07
85743518607SKenneth D. Merry #define	TDE_KEY_DESC_AUTH_FAILED	0x04
85843518607SKenneth D. Merry #define	TDE_KEY_DESC_AUTH_SUCCESS	0x03
85943518607SKenneth D. Merry #define	TDE_KEY_DESC_AUTH_NO_ATTEMPT	0x02
86043518607SKenneth D. Merry #define	TDE_KEY_DESC_AUTH_U_KAD		0x01
86143518607SKenneth D. Merry 	uint8_t key_desc_length[2];
86243518607SKenneth D. Merry 	uint8_t key_desc[];
86343518607SKenneth D. Merry };
86443518607SKenneth D. Merry 
86543518607SKenneth D. Merry /*
86643518607SKenneth D. Merry  * Wrapped Key descriptor format.
86743518607SKenneth D. Merry  * SSC4r03 Section 8.5.4.3.1 Table 200
86843518607SKenneth D. Merry  */
86943518607SKenneth D. Merry struct tde_wrapped_key_desc {
87043518607SKenneth D. Merry 	uint8_t wrapped_key_type;
87143518607SKenneth D. Merry #define	TDE_WRAP_KEY_DESC_LENGTH	0x04
87243518607SKenneth D. Merry #define	TDE_WRAP_KEY_DESC_IDENT		0x03
87343518607SKenneth D. Merry #define	TDE_WRAP_KEY_DESC_INFO		0x02
87443518607SKenneth D. Merry #define	TDE_WRAP_KEY_DESC_ENTITY_ID	0x01
87543518607SKenneth D. Merry #define	TDE_WRAP_KEY_DESC_DEVICE_ID	0x00
87643518607SKenneth D. Merry 	uint8_t reserved;
87743518607SKenneth D. Merry 	uint8_t wrapped_desc_length[2];
87843518607SKenneth D. Merry 	uint8_t wrapped_desc[];
87943518607SKenneth D. Merry };
88043518607SKenneth D. Merry 
88143518607SKenneth D. Merry /*
88243518607SKenneth D. Merry  * Encryption management attributes descriptor format.
88343518607SKenneth D. Merry  * SSC4r03 Section 8.5.4.4.1 Table 202
88443518607SKenneth D. Merry  */
88543518607SKenneth D. Merry struct tde_enc_mgmt_attr_desc {
88643518607SKenneth D. Merry 	uint8_t enc_mgmt_attr_type[2];
88743518607SKenneth D. Merry #define	TDE_EMAD_DESIRED_KEY_MGR_OP	0x0000
88843518607SKenneth D. Merry #define	TDE_EMAD_LOG_BLOCK_ENC_KEY_CRIT	0x0001
88943518607SKenneth D. Merry #define	TDE_EMAD_LOG_BLOCK_ENC_KEY_WRAP	0x0002
89043518607SKenneth D. Merry 	uint8_t reserved;
89143518607SKenneth D. Merry 	uint8_t byte2;
89243518607SKenneth D. Merry #define	TDE_EMAD_CRIT			0x80
89343518607SKenneth D. Merry 	uint8_t attr_length[2];
89443518607SKenneth D. Merry 	uint8_t attributes[];
89543518607SKenneth D. Merry #define	TDE_EMAD_DESIRED_KEY_CREATE	0x0001
89643518607SKenneth D. Merry #define	TDE_EMAD_DESIRED_KEY_RESOLVE	0x0002
89743518607SKenneth D. Merry };
89843518607SKenneth D. Merry 
89943518607SKenneth D. Merry /*
90043518607SKenneth D. Merry  * Logical block encryption key selection criteria descriptor format.
90143518607SKenneth D. Merry  * SSC4r03 Section 8.5.4.4.3.1 Table 206
90243518607SKenneth D. Merry  */
90343518607SKenneth D. Merry struct tde_lb_enc_key_sel_desc {
90443518607SKenneth D. Merry 	uint8_t lbe_key_sel_crit_type[2];
90543518607SKenneth D. Merry 	/*
90643518607SKenneth D. Merry 	 * The CRIT bit is the top bit of the first byte of the type.
90743518607SKenneth D. Merry 	 */
90843518607SKenneth D. Merry #define	TDE_LBE_KEY_SEL_CRIT		0x80
90943518607SKenneth D. Merry #define	TDE_LBE_KEY_SEL_ALGO		0x0001
91043518607SKenneth D. Merry #define	TDE_LBE_KEY_SEL_ID		0x0002
91143518607SKenneth D. Merry 	uint8_t lbe_key_sel_crit_length[2];
91243518607SKenneth D. Merry 	uint8_t lbe_key_sel_crit[];
91343518607SKenneth D. Merry };
91443518607SKenneth D. Merry 
91543518607SKenneth D. Merry /*
91643518607SKenneth D. Merry  * Logical block encryption key wrapping attribute descriptor format.
91743518607SKenneth D. Merry  * SSC4r03 Section 8.5.4.4.4.1 Table 209
91843518607SKenneth D. Merry  */
91943518607SKenneth D. Merry struct tde_lb_enc_key_wrap_desc {
92043518607SKenneth D. Merry 	uint8_t lbe_key_wrap_type[2];
92143518607SKenneth D. Merry 	/*
92243518607SKenneth D. Merry 	 * The CRIT bit is the top bit of the first byte of the type.
92343518607SKenneth D. Merry 	 */
92443518607SKenneth D. Merry #define	TDE_LBE_KEY_WRAP_CRIT		0x80
92543518607SKenneth D. Merry #define	TDE_LBE_KEY_WRAP_KEKS		0x0001
92643518607SKenneth D. Merry 	uint8_t lbe_key_wrap_length[2];
92743518607SKenneth D. Merry 	uint8_t lbe_key_wrap_attr[];
92843518607SKenneth D. Merry };
92943518607SKenneth D. Merry 
93076babe50SJustin T. Gibbs /*
93176babe50SJustin T. Gibbs  * Opcodes
93276babe50SJustin T. Gibbs  */
93376babe50SJustin T. Gibbs #define REWIND			0x01
93443518607SKenneth D. Merry #define FORMAT_MEDIUM		0x04
93576babe50SJustin T. Gibbs #define READ_BLOCK_LIMITS	0x05
93676babe50SJustin T. Gibbs #define SA_READ			0x08
93776babe50SJustin T. Gibbs #define SA_WRITE		0x0A
93843518607SKenneth D. Merry #define SET_CAPACITY		0x0B
93976babe50SJustin T. Gibbs #define WRITE_FILEMARKS		0x10
94076babe50SJustin T. Gibbs #define SPACE			0x11
94176babe50SJustin T. Gibbs #define RESERVE_UNIT		0x16
94276babe50SJustin T. Gibbs #define RELEASE_UNIT		0x17
94376babe50SJustin T. Gibbs #define ERASE			0x19
94476babe50SJustin T. Gibbs #define LOAD_UNLOAD		0x1B
945d902101eSMatt Jacob #define	LOCATE			0x2B
946d902101eSMatt Jacob #define	READ_POSITION		0x34
94743518607SKenneth D. Merry #define	REPORT_DENSITY_SUPPORT	0x44
94843518607SKenneth D. Merry #define	ALLOW_OVERWRITE		0x82
94943518607SKenneth D. Merry #define	LOCATE_16		0x92
95076babe50SJustin T. Gibbs 
95130382683SMatt Jacob /*
95230382683SMatt Jacob  * Tape specific density codes- only enough of them here to recognize
95330382683SMatt Jacob  * some specific older units so we can choose 2FM@EOD or FIXED blocksize
95430382683SMatt Jacob  * quirks.
95530382683SMatt Jacob  */
95630382683SMatt Jacob #define SCSI_DENSITY_HALFINCH_800	0x01
95730382683SMatt Jacob #define SCSI_DENSITY_HALFINCH_1600	0x02
95830382683SMatt Jacob #define SCSI_DENSITY_HALFINCH_6250	0x03
95930382683SMatt Jacob #define SCSI_DENSITY_HALFINCH_6250C	0xC3	/* HP Compressed 6250 */
96030382683SMatt Jacob #define SCSI_DENSITY_QIC_11_4TRK	0x04
96130382683SMatt Jacob #define SCSI_DENSITY_QIC_11_9TRK	0x84	/* Vendor Unique Emulex */
96230382683SMatt Jacob #define SCSI_DENSITY_QIC_24		0x05
96330382683SMatt Jacob #define SCSI_DENSITY_HALFINCH_PE	0x06
96430382683SMatt Jacob #define SCSI_DENSITY_QIC_120		0x0f
96530382683SMatt Jacob #define SCSI_DENSITY_QIC_150		0x10
966d032c79fSMatt Jacob #define	SCSI_DENSITY_QIC_525_320	0x11
967d032c79fSMatt Jacob #define	SCSI_DENSITY_QIC_1320		0x12
96800bb66d7SMatt Jacob #define	SCSI_DENSITY_QIC_2GB		0x22
96900bb66d7SMatt Jacob #define	SCSI_DENSITY_QIC_4GB		0x26
970d032c79fSMatt Jacob #define	SCSI_DENSITY_QIC_3080		0x29
97130382683SMatt Jacob 
97276babe50SJustin T. Gibbs __BEGIN_DECLS
973*7c5d20a6SWarner Losh void	scsi_read_block_limits(struct ccb_scsiio *, uint32_t,
97476babe50SJustin T. Gibbs 			       void (*cbfcnp)(struct cam_periph *, union ccb *),
975*7c5d20a6SWarner Losh 			       uint8_t, struct scsi_read_block_limits_data *,
976*7c5d20a6SWarner Losh 			       uint8_t , uint32_t);
97776babe50SJustin T. Gibbs 
978*7c5d20a6SWarner Losh void	scsi_sa_read_write(struct ccb_scsiio *csio, uint32_t retries,
97976babe50SJustin T. Gibbs 			   void (*cbfcnp)(struct cam_periph *, union ccb *),
980*7c5d20a6SWarner Losh 			   uint8_t tag_action, int readop, int sli,
981*7c5d20a6SWarner Losh 			   int fixed, uint32_t length, uint8_t *data_ptr,
982*7c5d20a6SWarner Losh 			   uint32_t dxfer_len, uint8_t sense_len,
983*7c5d20a6SWarner Losh 			   uint32_t timeout);
98476babe50SJustin T. Gibbs 
985*7c5d20a6SWarner Losh void	scsi_rewind(struct ccb_scsiio *csio, uint32_t retries,
98676babe50SJustin T. Gibbs 		    void (*cbfcnp)(struct cam_periph *, union ccb *),
987*7c5d20a6SWarner Losh 		    uint8_t tag_action, int immediate, uint8_t sense_len,
988*7c5d20a6SWarner Losh 		    uint32_t timeout);
98976babe50SJustin T. Gibbs 
990*7c5d20a6SWarner Losh void	scsi_space(struct ccb_scsiio *csio, uint32_t retries,
99176babe50SJustin T. Gibbs 		   void (*cbfcnp)(struct cam_periph *, union ccb *),
992*7c5d20a6SWarner Losh 		   uint8_t tag_action, scsi_space_code code,
993*7c5d20a6SWarner Losh 		   uint32_t count, uint8_t sense_len, uint32_t timeout);
99476babe50SJustin T. Gibbs 
995*7c5d20a6SWarner Losh void	scsi_load_unload(struct ccb_scsiio *csio, uint32_t retries,
99676babe50SJustin T. Gibbs 			 void (*cbfcnp)(struct cam_periph *, union ccb *),
997*7c5d20a6SWarner Losh 			 uint8_t tag_action, int immediate,   int eot,
998*7c5d20a6SWarner Losh 			 int reten, int load, uint8_t sense_len,
999*7c5d20a6SWarner Losh 			 uint32_t timeout);
100076babe50SJustin T. Gibbs 
1001*7c5d20a6SWarner Losh void	scsi_write_filemarks(struct ccb_scsiio *csio, uint32_t retries,
100276babe50SJustin T. Gibbs 			     void (*cbfcnp)(struct cam_periph *, union ccb *),
1003*7c5d20a6SWarner Losh 			     uint8_t tag_action, int immediate, int setmark,
1004*7c5d20a6SWarner Losh 			     uint32_t num_marks, uint8_t sense_len,
1005*7c5d20a6SWarner Losh 			     uint32_t timeout);
100676babe50SJustin T. Gibbs 
1007*7c5d20a6SWarner Losh void	scsi_reserve_release_unit(struct ccb_scsiio *csio, uint32_t retries,
100876babe50SJustin T. Gibbs 				  void (*cbfcnp)(struct cam_periph *,
1009*7c5d20a6SWarner Losh 				  union ccb *), uint8_t tag_action,
101076babe50SJustin T. Gibbs 				  int third_party, int third_party_id,
1011*7c5d20a6SWarner Losh 				  uint8_t sense_len, uint32_t timeout,
101276babe50SJustin T. Gibbs 				  int reserve);
101376babe50SJustin T. Gibbs 
1014*7c5d20a6SWarner Losh void	scsi_erase(struct ccb_scsiio *csio, uint32_t retries,
101576babe50SJustin T. Gibbs 		   void (*cbfcnp)(struct cam_periph *, union ccb *),
1016*7c5d20a6SWarner Losh 		   uint8_t tag_action, int immediate, int long_erase,
1017*7c5d20a6SWarner Losh 		   uint8_t sense_len, uint32_t timeout);
101876babe50SJustin T. Gibbs 
101976babe50SJustin T. Gibbs void	scsi_data_comp_page(struct scsi_data_compression_page *page,
1020*7c5d20a6SWarner Losh 			    uint8_t dce, uint8_t dde, uint8_t red,
1021*7c5d20a6SWarner Losh 			    uint32_t comp_algorithm,
1022*7c5d20a6SWarner Losh 			    uint32_t decomp_algorithm);
1023d902101eSMatt Jacob 
1024*7c5d20a6SWarner Losh void	scsi_read_position(struct ccb_scsiio *csio, uint32_t retries,
1025d902101eSMatt Jacob                            void (*cbfcnp)(struct cam_periph *, union ccb *),
1026*7c5d20a6SWarner Losh                            uint8_t tag_action, int hardsoft,
1027d902101eSMatt Jacob                            struct scsi_tape_position_data *sbp,
1028*7c5d20a6SWarner Losh                            uint8_t sense_len, uint32_t timeout);
1029*7c5d20a6SWarner Losh void	scsi_read_position_10(struct ccb_scsiio *csio, uint32_t retries,
103043518607SKenneth D. Merry 			      void (*cbfcnp)(struct cam_periph *, union ccb *),
1031*7c5d20a6SWarner Losh 			      uint8_t tag_action, int service_action,
1032*7c5d20a6SWarner Losh 			      uint8_t *data_ptr, uint32_t length,
1033*7c5d20a6SWarner Losh 			      uint32_t sense_len, uint32_t timeout);
1034d902101eSMatt Jacob 
1035*7c5d20a6SWarner Losh void	scsi_set_position(struct ccb_scsiio *csio, uint32_t retries,
1036d902101eSMatt Jacob                          void (*cbfcnp)(struct cam_periph *, union ccb *),
1037*7c5d20a6SWarner Losh                          uint8_t tag_action, int hardsoft, uint32_t blkno,
1038*7c5d20a6SWarner Losh                          uint8_t sense_len, uint32_t timeout);
103943518607SKenneth D. Merry 
1040*7c5d20a6SWarner Losh void	scsi_locate_10(struct ccb_scsiio *csio, uint32_t retries,
104143518607SKenneth D. Merry 		       void (*cbfcnp)(struct cam_periph *, union ccb *),
1042*7c5d20a6SWarner Losh 		       uint8_t tag_action, int immed, int cp, int hard,
1043*7c5d20a6SWarner Losh 		       int64_t partition, uint32_t block_address,
1044*7c5d20a6SWarner Losh 		       int sense_len, uint32_t timeout);
104543518607SKenneth D. Merry 
1046*7c5d20a6SWarner Losh void	scsi_locate_16(struct ccb_scsiio *csio, uint32_t retries,
104743518607SKenneth D. Merry 		       void (*cbfcnp)(struct cam_periph *, union ccb *),
1048*7c5d20a6SWarner Losh 		       uint8_t tag_action, int immed, int cp,
1049*7c5d20a6SWarner Losh 		       uint8_t dest_type, int bam, int64_t partition,
1050*7c5d20a6SWarner Losh 		       uint64_t logical_id, int sense_len,
1051*7c5d20a6SWarner Losh 		       uint32_t timeout);
105243518607SKenneth D. Merry 
1053*7c5d20a6SWarner Losh void	scsi_report_density_support(struct ccb_scsiio *csio, uint32_t retries,
105443518607SKenneth D. Merry 				    void (*cbfcnp)(struct cam_periph *,
105543518607SKenneth D. Merry 						   union ccb *),
1056*7c5d20a6SWarner Losh 				    uint8_t tag_action, int media,
1057*7c5d20a6SWarner Losh 				    int medium_type, uint8_t *data_ptr,
1058*7c5d20a6SWarner Losh 				    uint32_t length, uint32_t sense_len,
1059*7c5d20a6SWarner Losh 				    uint32_t timeout);
106043518607SKenneth D. Merry 
1061*7c5d20a6SWarner Losh void	scsi_set_capacity(struct ccb_scsiio *csio, uint32_t retries,
106243518607SKenneth D. Merry 			  void (*cbfcnp)(struct cam_periph *, union ccb *),
1063*7c5d20a6SWarner Losh 			  uint8_t tag_action, int byte1, uint32_t proportion,
1064*7c5d20a6SWarner Losh 			  uint32_t sense_len, uint32_t timeout);
106543518607SKenneth D. Merry 
1066*7c5d20a6SWarner Losh void	scsi_format_medium(struct ccb_scsiio *csio, uint32_t retries,
106743518607SKenneth D. Merry 			   void (*cbfcnp)(struct cam_periph *, union ccb *),
1068*7c5d20a6SWarner Losh 			   uint8_t tag_action, int byte1, int byte2,
1069*7c5d20a6SWarner Losh 			   uint8_t *data_ptr, uint32_t length,
1070*7c5d20a6SWarner Losh 			   uint32_t sense_len, uint32_t timeout);
107143518607SKenneth D. Merry 
1072*7c5d20a6SWarner Losh void	scsi_allow_overwrite(struct ccb_scsiio *csio, uint32_t retries,
107343518607SKenneth D. Merry 			     void (*cbfcnp)(struct cam_periph *, union ccb *),
1074*7c5d20a6SWarner Losh 			     uint8_t tag_action, int allow_overwrite,
1075*7c5d20a6SWarner Losh 			     int partition, uint64_t logical_id,
1076*7c5d20a6SWarner Losh 			     uint32_t sense_len, uint32_t timeout);
107743518607SKenneth D. Merry 
107876babe50SJustin T. Gibbs __END_DECLS
107976babe50SJustin T. Gibbs 
108076babe50SJustin T. Gibbs #endif /* _SCSI_SCSI_SA_H */
1081