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