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