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