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