xref: /dragonfly/sys/bus/cam/scsi/scsi_cd.h (revision 9348a738)
1 /*-
2  * Copyright (c) 2000, 2002 Kenneth D. Merry
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification, immediately at the beginning of the file.
11  * 2. The name of the author may not be used to endorse or promote products
12  *    derived from this software without specific prior written permission.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
18  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  */
27 /*
28  * Written by Julian Elischer (julian@tfs.com)
29  * for TRW Financial Systems.
30  *
31  * TRW Financial Systems, in accordance with their agreement with Carnegie
32  * Mellon University, makes this software available to CMU to distribute
33  * or use in any manner that they see fit as long as this message is kept with
34  * the software. For this reason TFS also grants any other persons or
35  * organisations permission to use or modify this software.
36  *
37  * TFS supplies this software to be publicly redistributed
38  * on the understanding that TFS is not responsible for the correct
39  * functioning of this software in any circumstances.
40  *
41  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
42  *
43  *	from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter Exp $
44  * $FreeBSD: src/sys/cam/scsi/scsi_cd.h,v 1.2.6.3 2003/08/24 03:26:38 ken Exp $
45  * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.h,v 1.4 2007/11/24 02:36:13 pavalos Exp $
46  */
47 #ifndef	_SCSI_SCSI_CD_H
48 #define _SCSI_SCSI_CD_H 1
49 
50 /*
51  *	Define two bits always in the same place in byte 2 (flag byte)
52  */
53 #define	CD_RELADDR	0x01
54 #define	CD_MSF		0x02
55 
56 /*
57  * SCSI command format
58  */
59 
60 struct scsi_pause
61 {
62 	u_int8_t op_code;
63 	u_int8_t byte2;
64 	u_int8_t unused[6];
65 	u_int8_t resume;
66 	u_int8_t control;
67 };
68 #define	PA_PAUSE	1
69 #define PA_RESUME	0
70 
71 struct scsi_play_msf
72 {
73 	u_int8_t op_code;
74 	u_int8_t byte2;
75 	u_int8_t unused;
76 	u_int8_t start_m;
77 	u_int8_t start_s;
78 	u_int8_t start_f;
79 	u_int8_t end_m;
80 	u_int8_t end_s;
81 	u_int8_t end_f;
82 	u_int8_t control;
83 };
84 
85 struct scsi_play_track
86 {
87 	u_int8_t op_code;
88 	u_int8_t byte2;
89 	u_int8_t unused[2];
90 	u_int8_t start_track;
91 	u_int8_t start_index;
92 	u_int8_t unused1;
93 	u_int8_t end_track;
94 	u_int8_t end_index;
95 	u_int8_t control;
96 };
97 
98 struct scsi_play_10
99 {
100 	u_int8_t op_code;
101 	u_int8_t byte2;
102 	u_int8_t blk_addr[4];
103 	u_int8_t unused;
104 	u_int8_t xfer_len[2];
105 	u_int8_t control;
106 };
107 
108 struct scsi_play_12
109 {
110 	u_int8_t op_code;
111 	u_int8_t byte2;	/* same as above */
112 	u_int8_t blk_addr[4];
113 	u_int8_t xfer_len[4];
114 	u_int8_t unused;
115 	u_int8_t control;
116 };
117 
118 struct scsi_play_rel_12
119 {
120 	u_int8_t op_code;
121 	u_int8_t byte2;	/* same as above */
122 	u_int8_t blk_addr[4];
123 	u_int8_t xfer_len[4];
124 	u_int8_t track;
125 	u_int8_t control;
126 };
127 
128 struct scsi_read_header
129 {
130 	u_int8_t op_code;
131 	u_int8_t byte2;
132 	u_int8_t blk_addr[4];
133 	u_int8_t unused;
134 	u_int8_t data_len[2];
135 	u_int8_t control;
136 };
137 
138 struct scsi_read_subchannel
139 {
140 	u_int8_t op_code;
141 	u_int8_t byte1;
142 	u_int8_t byte2;
143 #define	SRS_SUBQ	0x40
144 	u_int8_t subchan_format;
145 	u_int8_t unused[2];
146 	u_int8_t track;
147 	u_int8_t data_len[2];
148 	u_int8_t control;
149 };
150 
151 struct scsi_read_toc
152 {
153 	u_int8_t op_code;
154 	u_int8_t byte2;
155 	u_int8_t unused[4];
156 	u_int8_t from_track;
157 	u_int8_t data_len[2];
158 	u_int8_t control;
159 };
160 
161 struct scsi_read_cd_capacity
162 {
163 	u_int8_t op_code;
164 	u_int8_t byte2;
165 	u_int8_t addr_3;	/* Most Significant */
166 	u_int8_t addr_2;
167 	u_int8_t addr_1;
168 	u_int8_t addr_0;	/* Least Significant */
169 	u_int8_t unused[3];
170 	u_int8_t control;
171 };
172 
173 struct scsi_set_speed
174 {
175 	u_int8_t opcode;
176 	u_int8_t byte2;
177 	u_int8_t readspeed[2];
178 	u_int8_t writespeed[2];
179 	u_int8_t reserved[5];
180 	u_int8_t control;
181 };
182 
183 struct scsi_report_key
184 {
185 	u_int8_t opcode;
186 	u_int8_t reserved0;
187 	u_int8_t lba[4];
188 	u_int8_t reserved1[2];
189 	u_int8_t alloc_len[2];
190 	u_int8_t agid_keyformat;
191 #define RK_KF_AGID_MASK		0xc0
192 #define RK_KF_AGID_SHIFT	6
193 #define RK_KF_KEYFORMAT_MASK	0x3f
194 #define RK_KF_AGID		0x00
195 #define RK_KF_CHALLENGE		0x01
196 #define RF_KF_KEY1		0x02
197 #define RK_KF_KEY2		0x03
198 #define RF_KF_TITLE		0x04
199 #define RF_KF_ASF		0x05
200 #define RK_KF_RPC_SET		0x06
201 #define RF_KF_RPC_REPORT	0x08
202 #define RF_KF_INV_AGID		0x3f
203 	u_int8_t control;
204 };
205 
206 /*
207  * See the report key structure for key format and AGID definitions.
208  */
209 struct scsi_send_key
210 {
211 	u_int8_t opcode;
212 	u_int8_t reserved[7];
213 	u_int8_t param_len[2];
214 	u_int8_t agid_keyformat;
215 	u_int8_t control;
216 };
217 
218 struct scsi_read_dvd_structure
219 {
220 	u_int8_t opcode;
221 	u_int8_t reserved;
222 	u_int8_t address[4];
223 	u_int8_t layer_number;
224 	u_int8_t format;
225 #define RDS_FORMAT_PHYSICAL		0x00
226 #define RDS_FORMAT_COPYRIGHT		0x01
227 #define RDS_FORMAT_DISC_KEY		0x02
228 #define RDS_FORMAT_BCA			0x03
229 #define RDS_FORMAT_MANUFACTURER		0x04
230 #define RDS_FORMAT_CMGS_CPM		0x05
231 #define RDS_FORMAT_PROT_DISCID		0x06
232 #define RDS_FORMAT_DISC_KEY_BLOCK	0x07
233 #define RDS_FORMAT_DDS			0x08
234 #define RDS_FORMAT_DVDRAM_MEDIA_STAT	0x09
235 #define RDS_FORMAT_SPARE_AREA		0x0a
236 #define RDS_FORMAT_RMD_BORDEROUT	0x0c
237 #define RDS_FORMAT_RMD			0x0d
238 #define RDS_FORMAT_LEADIN		0x0e
239 #define RDS_FORMAT_DISC_ID		0x0f
240 #define RDS_FORMAT_DCB			0x30
241 #define RDS_FORMAT_WRITE_PROT		0xc0
242 #define RDS_FORMAT_STRUCTURE_LIST	0xff
243 	u_int8_t alloc_len[2];
244 	u_int8_t agid;
245 	u_int8_t control;
246 };
247 
248 /*
249  * Opcodes
250  */
251 #define READ_CD_CAPACITY	0x25	/* slightly different from disk */
252 #define READ_SUBCHANNEL		0x42	/* cdrom read Subchannel */
253 #define READ_TOC		0x43	/* cdrom read TOC */
254 #define READ_HEADER		0x44	/* cdrom read header */
255 #define PLAY_10			0x45	/* cdrom play  'play audio' mode */
256 #define PLAY_MSF		0x47	/* cdrom play Min,Sec,Frames mode */
257 #define PLAY_TRACK		0x48	/* cdrom play track/index mode */
258 #define PLAY_TRACK_REL		0x49	/* cdrom play track/index mode */
259 #define PAUSE			0x4b	/* cdrom pause in 'play audio' mode */
260 #define SEND_KEY		0xa3	/* dvd send key command */
261 #define REPORT_KEY		0xa4	/* dvd report key command */
262 #define PLAY_12			0xa5	/* cdrom pause in 'play audio' mode */
263 #define PLAY_TRACK_REL_BIG	0xa9	/* cdrom play track/index mode */
264 #define READ_DVD_STRUCTURE	0xad	/* read dvd structure */
265 #define SET_CD_SPEED		0xbb	/* set c/dvd speed */
266 
267 struct scsi_report_key_data_header
268 {
269 	u_int8_t data_len[2];
270 	u_int8_t reserved[2];
271 };
272 
273 struct scsi_report_key_data_agid
274 {
275 	u_int8_t data_len[2];
276 	u_int8_t reserved[5];
277 	u_int8_t agid;
278 #define RKD_AGID_MASK	0xc0
279 #define RKD_AGID_SHIFT	6
280 };
281 
282 struct scsi_report_key_data_challenge
283 {
284 	u_int8_t data_len[2];
285 	u_int8_t reserved0[2];
286 	u_int8_t challenge_key[10];
287 	u_int8_t reserved1[2];
288 };
289 
290 struct scsi_report_key_data_key1_key2
291 {
292 	u_int8_t data_len[2];
293 	u_int8_t reserved0[2];
294 	u_int8_t key1[5];
295 	u_int8_t reserved1[3];
296 };
297 
298 struct scsi_report_key_data_title
299 {
300 	u_int8_t data_len[2];
301 	u_int8_t reserved0[2];
302 	u_int8_t byte0;
303 #define RKD_TITLE_CPM		0x80
304 #define RKD_TITLE_CPM_SHIFT	7
305 #define RKD_TITLE_CP_SEC	0x40
306 #define RKD_TITLE_CP_SEC_SHIFT	6
307 #define RKD_TITLE_CMGS_MASK	0x30
308 #define RKD_TITLE_CMGS_SHIFT	4
309 #define RKD_TITLE_CMGS_NO_RST	0x00
310 #define RKD_TITLE_CMGS_RSVD	0x10
311 #define RKD_TITLE_CMGS_1_GEN	0x20
312 #define RKD_TITLE_CMGS_NO_COPY	0x30
313 	u_int8_t title_key[5];
314 	u_int8_t reserved1[2];
315 };
316 
317 struct scsi_report_key_data_asf
318 {
319 	u_int8_t data_len[2];
320 	u_int8_t reserved[5];
321 	u_int8_t success;
322 #define RKD_ASF_SUCCESS	0x01
323 };
324 
325 struct scsi_report_key_data_rpc
326 {
327 	u_int8_t data_len[2];
328 	u_int8_t rpc_scheme0;
329 #define RKD_RPC_SCHEME_UNKNOWN		0x00
330 #define RKD_RPC_SCHEME_PHASE_II		0x01
331 	u_int8_t reserved0;
332 	u_int8_t byte4;
333 #define RKD_RPC_TYPE_MASK		0xC0
334 #define RKD_RPC_TYPE_SHIFT		6
335 #define RKD_RPC_TYPE_NONE		0x00
336 #define RKD_RPC_TYPE_SET		0x40
337 #define RKD_RPC_TYPE_LAST_CHANCE	0x80
338 #define RKD_RPC_TYPE_PERM		0xC0
339 #define RKD_RPC_VENDOR_RESET_MASK	0x38
340 #define RKD_RPC_VENDOR_RESET_SHIFT	3
341 #define RKD_RPC_USER_RESET_MASK		0x07
342 #define RKD_RPC_USER_RESET_SHIFT	0
343 	u_int8_t region_mask;
344 	u_int8_t rpc_scheme1;
345 	u_int8_t reserved1;
346 };
347 
348 struct scsi_send_key_data_rpc
349 {
350 	u_int8_t data_len[2];
351 	u_int8_t reserved0[2];
352 	u_int8_t region_code;
353 	u_int8_t reserved1[3];
354 };
355 
356 /*
357  * Common header for the return data from the READ DVD STRUCTURE command.
358  */
359 struct scsi_read_dvd_struct_data_header
360 {
361 	u_int8_t data_len[2];
362 	u_int8_t reserved[2];
363 };
364 
365 struct scsi_read_dvd_struct_data_layer_desc
366 {
367 	u_int8_t book_type_version;
368 #define RDSD_BOOK_TYPE_DVD_ROM	0x00
369 #define RDSD_BOOK_TYPE_DVD_RAM	0x10
370 #define RDSD_BOOK_TYPE_DVD_R	0x20
371 #define RDSD_BOOK_TYPE_DVD_RW	0x30
372 #define RDSD_BOOK_TYPE_DVD_PRW	0x90
373 #define RDSD_BOOK_TYPE_MASK	0xf0
374 #define RDSD_BOOK_TYPE_SHIFT	4
375 #define RDSD_BOOK_VERSION_MASK	0x0f
376 	/*
377 	 * The lower 4 bits of this field is referred to as the "minimum
378 	 * rate" field in MMC2, and the "maximum rate" field in MMC3.  Ugh.
379 	 */
380 	u_int8_t disc_size_max_rate;
381 #define RDSD_DISC_SIZE_120MM	0x00
382 #define RDSD_DISC_SIZE_80MM	0x10
383 #define RDSD_DISC_SIZE_MASK	0xf0
384 #define RDSD_DISC_SIZE_SHIFT	4
385 #define RDSD_MAX_RATE_0252	0x00
386 #define RDSD_MAX_RATE_0504	0x01
387 #define RDSD_MAX_RATE_1008	0x02
388 #define RDSD_MAX_RATE_NOT_SPEC	0x0f
389 #define RDSD_MAX_RATE_MASK	0x0f
390 	u_int8_t layer_info;
391 #define RDSD_NUM_LAYERS_MASK	0x60
392 #define RDSD_NUM_LAYERS_SHIFT	5
393 #define RDSD_NL_ONE_LAYER	0x00
394 #define RDSD_NL_TWO_LAYERS	0x20
395 #define RDSD_TRACK_PATH_MASK	0x10
396 #define RDSD_TRACK_PATH_SHIFT	4
397 #define RDSD_TP_PTP		0x00
398 #define RDSD_TP_OTP		0x10
399 #define RDSD_LAYER_TYPE_RO	0x01
400 #define RDSD_LAYER_TYPE_RECORD	0x02
401 #define RDSD_LAYER_TYPE_RW	0x04
402 #define RDSD_LAYER_TYPE_MASK	0x0f
403 	u_int8_t density;
404 #define RDSD_LIN_DENSITY_0267		0x00
405 #define RDSD_LIN_DENSITY_0293		0x10
406 #define RDSD_LIN_DENSITY_0409_0435	0x20
407 #define RDSD_LIN_DENSITY_0280_0291	0x40
408 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
409 #define RDSD_LIN_DENSITY_0353		0x80
410 #define RDSD_LIN_DENSITY_MASK		0xf0
411 #define RDSD_LIN_DENSITY_SHIFT		4
412 #define RDSD_TRACK_DENSITY_074		0x00
413 #define RDSD_TRACK_DENSITY_080		0x01
414 #define RDSD_TRACK_DENSITY_0615		0x02
415 #define RDSD_TRACK_DENSITY_MASK		0x0f
416 	u_int8_t zeros0;
417 	u_int8_t main_data_start[3];
418 #define RDSD_MAIN_DATA_START_DVD_RO	0x30000
419 #define RDSD_MAIN_DATA_START_DVD_RW	0x31000
420 	u_int8_t zeros1;
421 	u_int8_t main_data_end[3];
422 	u_int8_t zeros2;
423 	u_int8_t end_sector_layer0[3];
424 	u_int8_t bca;
425 #define RDSD_BCA	0x80
426 #define RDSD_BCA_MASK	0x80
427 #define RDSD_BCA_SHIFT	7
428 	u_int8_t media_specific[2031];
429 };
430 
431 struct scsi_read_dvd_struct_data_physical
432 {
433 	u_int8_t data_len[2];
434 	u_int8_t reserved[2];
435 	struct scsi_read_dvd_struct_data_layer_desc layer_desc;
436 };
437 
438 struct scsi_read_dvd_struct_data_copyright
439 {
440 	u_int8_t data_len[2];
441 	u_int8_t reserved0[2];
442 	u_int8_t cps_type;
443 #define RDSD_CPS_NOT_PRESENT	0x00
444 #define RDSD_CPS_DATA_EXISTS	0x01
445 	u_int8_t region_info;
446 	u_int8_t reserved1[2];
447 };
448 
449 struct scsi_read_dvd_struct_data_disc_key
450 {
451 	u_int8_t data_len[2];
452 	u_int8_t reserved[2];
453 	u_int8_t disc_key[2048];
454 };
455 
456 struct scsi_read_dvd_struct_data_bca
457 {
458 	u_int8_t data_len[2];
459 	u_int8_t reserved[2];
460 	u_int8_t bca_info[188]; /* XXX 12-188 bytes */
461 };
462 
463 struct scsi_read_dvd_struct_data_manufacturer
464 {
465 	u_int8_t data_len[2];
466 	u_int8_t reserved[2];
467 	u_int8_t manuf_info[2048];
468 };
469 
470 struct scsi_read_dvd_struct_data_copy_manage
471 {
472 	u_int8_t data_len[2];
473 	u_int8_t reserved0[2];
474 	u_int8_t byte4;
475 #define RDSD_CPM_NO_COPYRIGHT	0x00
476 #define RDSD_CPM_HAS_COPYRIGHT	0x80
477 #define RDSD_CPM_MASK		0x80
478 #define RDSD_CMGS_COPY_ALLOWED	0x00
479 #define RDSD_CMGS_ONE_COPY	0x20
480 #define RDSD_CMGS_NO_COPIES	0x30
481 #define RDSD_CMGS_MASK		0x30
482 	u_int8_t reserved1[3];
483 };
484 
485 struct scsi_read_dvd_struct_data_prot_discid
486 {
487 	u_int8_t data_len[2];
488 	u_int8_t reserved[2];
489 	u_int8_t prot_discid_data[16];
490 };
491 
492 struct scsi_read_dvd_struct_data_disc_key_blk
493 {
494 	/*
495 	 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
496 	 */
497 	u_int8_t data_len[2];
498 	u_int8_t reserved;
499 	u_int8_t total_packs;
500 	u_int8_t disc_key_pack_data[28668];
501 };
502 struct scsi_read_dvd_struct_data_dds
503 {
504 	u_int8_t data_len[2];
505 	u_int8_t reserved[2];
506 	u_int8_t dds_info[2048];
507 };
508 
509 struct scsi_read_dvd_struct_data_medium_status
510 {
511 	u_int8_t data_len[2];
512 	u_int8_t reserved0[2];
513 	u_int8_t byte4;
514 #define RDSD_MS_CARTRIDGE	0x80
515 #define RDSD_MS_OUT		0x40
516 #define RDSD_MS_MSWI		0x08
517 #define RDSD_MS_CWP		0x04
518 #define RDSD_MS_PWP		0x02
519 	u_int8_t disc_type_id;
520 #define RDSD_DT_NEED_CARTRIDGE	0x00
521 #define RDSD_DT_NO_CART_NEEDED	0x01
522 	u_int8_t reserved1;
523 	u_int8_t ram_swi_info;
524 #define RDSD_SWI_NO_BARE	0x01
525 #define RDSD_SWI_UNSPEC		0xff
526 };
527 
528 struct scsi_read_dvd_struct_data_spare_area
529 {
530 	u_int8_t data_len[2];
531 	u_int8_t reserved[2];
532 	u_int8_t unused_primary[4];
533 	u_int8_t unused_supl[4];
534 	u_int8_t allocated_supl[4];
535 };
536 
537 struct scsi_read_dvd_struct_data_rmd_borderout
538 {
539 	u_int8_t data_len[2];
540 	u_int8_t reserved[2];
541 	u_int8_t rmd[30720]; 	/* maximum is 30720 bytes */
542 };
543 
544 struct scsi_read_dvd_struct_data_rmd
545 {
546 	u_int8_t data_len[2];
547 	u_int8_t reserved[2];
548 	u_int8_t last_sector_num[4];
549 	u_int8_t rmd_bytes[32768];  /* This is the maximum */
550 };
551 
552 /*
553  * XXX KDM this is the MMC2 version of the structure.
554  * The variable positions have changed (in a semi-conflicting way) in the
555  * MMC3 spec, although the overall length of the structure is the same.
556  */
557 struct scsi_read_dvd_struct_data_leadin
558 {
559 	u_int8_t data_len[2];
560 	u_int8_t reserved0[2];
561 	u_int8_t field_id_1;
562 	u_int8_t app_code;
563 	u_int8_t disc_physical_data;
564 	u_int8_t last_addr[3];
565 	u_int8_t reserved1[2];
566 	u_int8_t field_id_2;
567 	u_int8_t rwp;
568 	u_int8_t rwp_wavelength;
569 	u_int8_t optimum_write_strategy;
570 	u_int8_t reserved2[4];
571 	u_int8_t field_id_3;
572 	u_int8_t manuf_id_17_12[6];
573 	u_int8_t reserved3;
574 	u_int8_t field_id_4;
575 	u_int8_t manuf_id_11_6[6];
576 	u_int8_t reserved4;
577 	u_int8_t field_id_5;
578 	u_int8_t manuf_id_5_0[6];
579 	u_int8_t reserved5[25];
580 };
581 
582 struct scsi_read_dvd_struct_data_disc_id
583 {
584 	u_int8_t data_len[2];
585 	u_int8_t reserved[4];
586 	u_int8_t random_num[2];
587 	u_int8_t year[4];
588 	u_int8_t month[2];
589 	u_int8_t day[2];
590 	u_int8_t hour[2];
591 	u_int8_t minute[2];
592 	u_int8_t second[2];
593 };
594 
595 struct scsi_read_dvd_struct_data_generic_dcb
596 {
597 	u_int8_t content_desc[4];
598 #define SCSI_RCB
599 	u_int8_t unknown_desc_actions[4];
600 #define RDSD_ACTION_RECORDING	0x0001
601 #define RDSD_ACTION_READING	0x0002
602 #define RDSD_ACTION_FORMAT	0x0004
603 #define RDSD_ACTION_MODIFY_DCB	0x0008
604 	u_int8_t vendor_id[32];
605 	u_int8_t dcb_data[32728];
606 };
607 
608 struct scsi_read_dvd_struct_data_dcb
609 {
610 	u_int8_t data_len[2];
611 	u_int8_t reserved[2];
612 	struct scsi_read_dvd_struct_data_generic_dcb dcb;
613 };
614 
615 struct read_dvd_struct_write_prot
616 {
617 	u_int8_t data_len[2];
618 	u_int8_t reserved0[2];
619 	u_int8_t write_prot_status;
620 #define RDSD_WPS_MSWI		0x08
621 #define RDSD_WPS_CWP		0x04
622 #define RDSD_WPS_PWP		0x02
623 #define RDSD_WPS_SWPP		0x01
624 	u_int8_t reserved[3];
625 };
626 
627 struct read_dvd_struct_list_entry
628 {
629 	u_int8_t format_code;
630 	u_int8_t sds_rds;
631 #define RDSD_SDS_NOT_WRITEABLE	0x00
632 #define RDSD_SDS_WRITEABLE	0x80
633 #define RDSD_SDS_MASK		0x80
634 #define RDSD_RDS_NOT_READABLE	0x00
635 #define RDSD_RDS_READABLE	0x40
636 #define RDSD_RDS_MASK		0x40
637 	u_int8_t struct_len[2];
638 };
639 
640 struct read_dvd_struct_data_list
641 {
642 	u_int8_t data_len[2];
643 	u_int8_t reserved[2];
644 	struct read_dvd_struct_list_entry entries[0];
645 };
646 
647 struct scsi_read_cd_cap_data
648 {
649 	u_int8_t addr_3;	/* Most significant */
650 	u_int8_t addr_2;
651 	u_int8_t addr_1;
652 	u_int8_t addr_0;	/* Least significant */
653 	u_int8_t length_3;	/* Most significant */
654 	u_int8_t length_2;
655 	u_int8_t length_1;
656 	u_int8_t length_0;	/* Least significant */
657 };
658 
659 struct cd_audio_page
660 {
661 	u_int8_t page_code;
662 #define	CD_PAGE_CODE		0x3F
663 #define	AUDIO_PAGE		0x0e
664 #define	CD_PAGE_PS		0x80
665 	u_int8_t param_len;
666 	u_int8_t flags;
667 #define	CD_PA_SOTC		0x02
668 #define	CD_PA_IMMED		0x04
669 	u_int8_t unused[2];
670 	u_int8_t format_lba;
671 #define	CD_PA_FORMAT_LBA	0x0F
672 #define	CD_PA_APR_VALID		0x80
673 	u_int8_t lb_per_sec[2];
674 	struct	port_control
675 	{
676 		u_int8_t channels;
677 #define	CHANNEL			0x0F
678 #define	CHANNEL_0		1
679 #define	CHANNEL_1		2
680 #define	CHANNEL_2		4
681 #define	CHANNEL_3		8
682 #define	LEFT_CHANNEL		CHANNEL_0
683 #define	RIGHT_CHANNEL		CHANNEL_1
684 		u_int8_t volume;
685 	} port[4];
686 #define	LEFT_PORT		0
687 #define	RIGHT_PORT		1
688 };
689 
690 union cd_pages
691 {
692 	struct cd_audio_page audio;
693 };
694 
695 struct cd_mode_data_10
696 {
697 	struct scsi_mode_header_10 header;
698 	struct scsi_mode_blk_desc  blk_desc;
699 	union cd_pages page;
700 };
701 
702 struct cd_mode_data
703 {
704 	struct scsi_mode_header_6 header;
705 	struct scsi_mode_blk_desc blk_desc;
706 	union cd_pages page;
707 };
708 
709 union cd_mode_data_6_10
710 {
711 	struct cd_mode_data mode_data_6;
712 	struct cd_mode_data_10 mode_data_10;
713 };
714 
715 struct cd_mode_params
716 {
717 	STAILQ_ENTRY(cd_mode_params)	links;
718 	int				cdb_size;
719 	int				alloc_len;
720 	u_int8_t			*mode_buf;
721 };
722 
723 __BEGIN_DECLS
724 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
725 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
726 		     u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
727 		     u_int8_t key_format, u_int8_t *data_ptr,
728 		     u_int32_t dxfer_len, u_int8_t sense_len,
729 		     u_int32_t timeout);
730 
731 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
732 		   void (*cbfcnp)(struct cam_periph *, union ccb *),
733 		   u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
734 		   u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
735 		   u_int32_t timeout);
736 
737 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
738 			     void (*cbfcnp)(struct cam_periph *, union ccb *),
739 			     u_int8_t tag_action, u_int32_t address,
740 			     u_int8_t layer_number, u_int8_t format,
741 			     u_int8_t agid, u_int8_t *data_ptr,
742 			     u_int32_t dxfer_len, u_int8_t sense_len,
743 			     u_int32_t timeout);
744 
745 __END_DECLS
746 
747 #endif /*_SCSI_SCSI_CD_H*/
748 
749