xref: /dragonfly/sys/bus/cam/scsi/scsi_cd.h (revision 1de703da)
1 /*-
2  * Copyright (c) 2000 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.2 2002/11/20 00:26:18 njl Exp $
45  * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.h,v 1.2 2003/06/17 04:28:19 dillon 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 
162 struct scsi_read_cd_capacity
163 {
164 	u_int8_t op_code;
165 	u_int8_t byte2;
166 	u_int8_t addr_3;	/* Most Significant */
167 	u_int8_t addr_2;
168 	u_int8_t addr_1;
169 	u_int8_t addr_0;	/* Least Significant */
170 	u_int8_t unused[3];
171 	u_int8_t control;
172 };
173 
174 struct scsi_set_speed
175 {
176 	u_int8_t opcode;
177 	u_int8_t byte2;
178 	u_int8_t readspeed[2];
179 	u_int8_t writespeed[2];
180 	u_int8_t reserved[5];
181 	u_int8_t control;
182 };
183 
184 struct scsi_report_key
185 {
186 	u_int8_t opcode;
187 	u_int8_t reserved0;
188 	u_int8_t lba[4];
189 	u_int8_t reserved1[2];
190 	u_int8_t alloc_len[2];
191 	u_int8_t agid_keyformat;
192 #define RK_KF_AGID_MASK		0xc0
193 #define RK_KF_AGID_SHIFT	6
194 #define RK_KF_KEYFORMAT_MASK	0x3f
195 #define RK_KF_AGID		0x00
196 #define RK_KF_CHALLENGE		0x01
197 #define RF_KF_KEY1		0x02
198 #define RK_KF_KEY2		0x03
199 #define RF_KF_TITLE		0x04
200 #define RF_KF_ASF		0x05
201 #define RK_KF_RPC_SET		0x06
202 #define RF_KF_RPC_REPORT	0x08
203 #define RF_KF_INV_AGID		0x3f
204 	u_int8_t control;
205 };
206 
207 /*
208  * See the report key structure for key format and AGID definitions.
209  */
210 struct scsi_send_key
211 {
212 	u_int8_t opcode;
213 	u_int8_t reserved[7];
214 	u_int8_t param_len[2];
215 	u_int8_t agid_keyformat;
216 	u_int8_t control;
217 };
218 
219 struct scsi_read_dvd_structure
220 {
221 	u_int8_t opcode;
222 	u_int8_t reserved;
223 	u_int8_t address[4];
224 	u_int8_t layer_number;
225 	u_int8_t format;
226 #define RDS_FORMAT_PHYSICAL		0x00
227 #define RDS_FORMAT_COPYRIGHT		0x01
228 #define RDS_FORMAT_DISC_KEY		0x02
229 #define RDS_FORMAT_BCA			0x03
230 #define RDS_FORMAT_MANUFACTURER		0x04
231 #define RDS_FORMAT_CMGS_CPM		0x05
232 #define RDS_FORMAT_PROT_DISCID		0x06
233 #define RDS_FORMAT_DISC_KEY_BLOCK	0x07
234 #define RDS_FORMAT_DDS			0x08
235 #define RDS_FORMAT_DVDRAM_MEDIA_STAT	0x09
236 #define RDS_FORMAT_SPARE_AREA		0x0a
237 #define RDS_FORMAT_RMD_BORDEROUT	0x0c
238 #define RDS_FORMAT_RMD			0x0d
239 #define RDS_FORMAT_LEADIN		0x0e
240 #define RDS_FORMAT_DISC_ID		0x0f
241 #define RDS_FORMAT_DCB			0x30
242 #define RDS_FORMAT_WRITE_PROT		0xc0
243 #define RDS_FORMAT_STRUCTURE_LIST	0xff
244 	u_int8_t alloc_len[2];
245 	u_int8_t agid;
246 	u_int8_t control;
247 };
248 
249 /*
250  * Opcodes
251  */
252 #define READ_CD_CAPACITY	0x25	/* slightly different from disk */
253 #define READ_SUBCHANNEL		0x42	/* cdrom read Subchannel */
254 #define READ_TOC		0x43	/* cdrom read TOC */
255 #define READ_HEADER		0x44	/* cdrom read header */
256 #define PLAY_10			0x45	/* cdrom play  'play audio' mode */
257 #define PLAY_MSF		0x47	/* cdrom play Min,Sec,Frames mode */
258 #define PLAY_TRACK		0x48	/* cdrom play track/index mode */
259 #define PLAY_TRACK_REL		0x49	/* cdrom play track/index mode */
260 #define PAUSE			0x4b	/* cdrom pause in 'play audio' mode */
261 #define SEND_KEY		0xa3	/* dvd send key command */
262 #define REPORT_KEY		0xa4	/* dvd report key command */
263 #define PLAY_12			0xa5	/* cdrom pause in 'play audio' mode */
264 #define PLAY_TRACK_REL_BIG	0xa9	/* cdrom play track/index mode */
265 #define READ_DVD_STRUCTURE	0xad	/* read dvd structure */
266 #define SET_CD_SPEED		0xbb	/* set c/dvd speed */
267 
268 struct scsi_report_key_data_header
269 {
270 	u_int8_t data_len[2];
271 	u_int8_t reserved[2];
272 };
273 
274 struct scsi_report_key_data_agid
275 {
276 	u_int8_t data_len[2];
277 	u_int8_t reserved[5];
278 	u_int8_t agid;
279 #define RKD_AGID_MASK	0xc0
280 #define RKD_AGID_SHIFT	6
281 };
282 
283 struct scsi_report_key_data_challenge
284 {
285 	u_int8_t data_len[2];
286 	u_int8_t reserved0[2];
287 	u_int8_t challenge_key[10];
288 	u_int8_t reserved1[2];
289 };
290 
291 struct scsi_report_key_data_key1_key2
292 {
293 	u_int8_t data_len[2];
294 	u_int8_t reserved0[2];
295 	u_int8_t key1[5];
296 	u_int8_t reserved1[3];
297 };
298 
299 struct scsi_report_key_data_title
300 {
301 	u_int8_t data_len[2];
302 	u_int8_t reserved0[2];
303 	u_int8_t byte0;
304 #define RKD_TITLE_CPM		0x80
305 #define RKD_TITLE_CPM_SHIFT	7
306 #define RKD_TITLE_CP_SEC	0x40
307 #define RKD_TITLE_CP_SEC_SHIFT	6
308 #define RKD_TITLE_CMGS_MASK	0x30
309 #define RKD_TITLE_CMGS_SHIFT	4
310 #define RKD_TITLE_CMGS_NO_RST	0x00
311 #define RKD_TITLE_CMGS_RSVD	0x10
312 #define RKD_TITLE_CMGS_1_GEN	0x20
313 #define RKD_TITLE_CMGS_NO_COPY	0x30
314 	u_int8_t title_key[5];
315 	u_int8_t reserved1[2];
316 };
317 
318 struct scsi_report_key_data_asf
319 {
320 	u_int8_t data_len[2];
321 	u_int8_t reserved[5];
322 	u_int8_t success;
323 #define RKD_ASF_SUCCESS	0x01
324 };
325 
326 struct scsi_report_key_data_rpc
327 {
328 	u_int8_t data_len[2];
329 	u_int8_t rpc_scheme0;
330 #define RKD_RPC_SCHEME_UNKNOWN		0x00
331 #define RKD_RPC_SCHEME_PHASE_II		0x01
332 	u_int8_t reserved0;
333 	u_int8_t byte4;
334 #define RKD_RPC_TYPE_MASK		0xC0
335 #define RKD_RPC_TYPE_SHIFT		6
336 #define RKD_RPC_TYPE_NONE		0x00
337 #define RKD_RPC_TYPE_SET		0x40
338 #define RKD_RPC_TYPE_LAST_CHANCE	0x80
339 #define RKD_RPC_TYPE_PERM		0xC0
340 #define RKD_RPC_VENDOR_RESET_MASK	0x38
341 #define RKD_RPC_VENDOR_RESET_SHIFT	3
342 #define RKD_RPC_USER_RESET_MASK		0x07
343 #define RKD_RPC_USER_RESET_SHIFT	0
344 	u_int8_t region_mask;
345 	u_int8_t rpc_scheme1;
346 	u_int8_t reserved1;
347 };
348 
349 struct scsi_send_key_data_rpc
350 {
351 	u_int8_t data_len[2];
352 	u_int8_t reserved0[2];
353 	u_int8_t region_code;
354 	u_int8_t reserved1[3];
355 };
356 
357 /*
358  * Common header for the return data from the READ DVD STRUCTURE command.
359  */
360 struct scsi_read_dvd_struct_data_header
361 {
362 	u_int8_t data_len[2];
363 	u_int8_t reserved[2];
364 };
365 
366 struct scsi_read_dvd_struct_data_layer_desc
367 {
368 	u_int8_t book_type_version;
369 #define RDSD_BOOK_TYPE_DVD_ROM	0x00
370 #define RDSD_BOOK_TYPE_DVD_RAM	0x10
371 #define RDSD_BOOK_TYPE_DVD_R	0x20
372 #define RDSD_BOOK_TYPE_DVD_RW	0x30
373 #define RDSD_BOOK_TYPE_DVD_PRW	0x90
374 #define RDSD_BOOK_TYPE_MASK	0xf0
375 #define RDSD_BOOK_TYPE_SHIFT	4
376 #define RDSD_BOOK_VERSION_MASK	0x0f
377 	/*
378 	 * The lower 4 bits of this field is referred to as the "minimum
379 	 * rate" field in MMC2, and the "maximum rate" field in MMC3.  Ugh.
380 	 */
381 	u_int8_t disc_size_max_rate;
382 #define RDSD_DISC_SIZE_120MM	0x00
383 #define RDSD_DISC_SIZE_80MM	0x10
384 #define RDSD_DISC_SIZE_MASK	0xf0
385 #define RDSD_DISC_SIZE_SHIFT	4
386 #define RDSD_MAX_RATE_0252	0x00
387 #define RDSD_MAX_RATE_0504	0x01
388 #define RDSD_MAX_RATE_1008	0x02
389 #define RDSD_MAX_RATE_NOT_SPEC	0x0f
390 #define RDSD_MAX_RATE_MASK	0x0f
391 	u_int8_t layer_info;
392 #define RDSD_NUM_LAYERS_MASK	0x60
393 #define RDSD_NUM_LAYERS_SHIFT	5
394 #define RDSD_NL_ONE_LAYER	0x00
395 #define RDSD_NL_TWO_LAYERS	0x20
396 #define RDSD_TRACK_PATH_MASK	0x10
397 #define RDSD_TRACK_PATH_SHIFT	4
398 #define RDSD_TP_PTP		0x00
399 #define RDSD_TP_OTP		0x10
400 #define RDSD_LAYER_TYPE_RO	0x01
401 #define RDSD_LAYER_TYPE_RECORD	0x02
402 #define RDSD_LAYER_TYPE_RW	0x04
403 #define RDSD_LAYER_TYPE_MASK	0x0f
404 	u_int8_t density;
405 #define RDSD_LIN_DENSITY_0267		0x00
406 #define RDSD_LIN_DENSITY_0293		0x10
407 #define RDSD_LIN_DENSITY_0409_0435	0x20
408 #define RDSD_LIN_DENSITY_0280_0291	0x40
409 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
410 #define RDSD_LIN_DENSITY_0353		0x80
411 #define RDSD_LIN_DENSITY_MASK		0xf0
412 #define RDSD_LIN_DENSITY_SHIFT		4
413 #define RDSD_TRACK_DENSITY_074		0x00
414 #define RDSD_TRACK_DENSITY_080		0x01
415 #define RDSD_TRACK_DENSITY_0615		0x02
416 #define RDSD_TRACK_DENSITY_MASK		0x0f
417 	u_int8_t zeros0;
418 	u_int8_t main_data_start[3];
419 #define RDSD_MAIN_DATA_START_DVD_RO	0x30000
420 #define RDSD_MAIN_DATA_START_DVD_RW	0x31000
421 	u_int8_t zeros1;
422 	u_int8_t main_data_end[3];
423 	u_int8_t zeros2;
424 	u_int8_t end_sector_layer0[3];
425 	u_int8_t bca;
426 #define RDSD_BCA	0x80
427 #define RDSD_BCA_MASK	0x80
428 #define RDSD_BCA_SHIFT	7
429 	u_int8_t media_specific[2031];
430 };
431 
432 struct scsi_read_dvd_struct_data_physical
433 {
434 	u_int8_t data_len[2];
435 	u_int8_t reserved[2];
436 	struct scsi_read_dvd_struct_data_layer_desc layer_desc;
437 };
438 
439 struct scsi_read_dvd_struct_data_copyright
440 {
441 	u_int8_t data_len[2];
442 	u_int8_t reserved0[2];
443 	u_int8_t cps_type;
444 #define RDSD_CPS_NOT_PRESENT	0x00
445 #define RDSD_CPS_DATA_EXISTS	0x01
446 	u_int8_t region_info;
447 	u_int8_t reserved1[2];
448 };
449 
450 struct scsi_read_dvd_struct_data_disc_key
451 {
452 	u_int8_t data_len[2];
453 	u_int8_t reserved[2];
454 	u_int8_t disc_key[2048];
455 };
456 
457 struct scsi_read_dvd_struct_data_bca
458 {
459 	u_int8_t data_len[2];
460 	u_int8_t reserved[2];
461 	u_int8_t bca_info[188]; /* XXX 12-188 bytes */
462 };
463 
464 struct scsi_read_dvd_struct_data_manufacturer
465 {
466 	u_int8_t data_len[2];
467 	u_int8_t reserved[2];
468 	u_int8_t manuf_info[2048];
469 };
470 
471 struct scsi_read_dvd_struct_data_copy_manage
472 {
473 	u_int8_t data_len[2];
474 	u_int8_t reserved0[2];
475 	u_int8_t byte4;
476 #define RDSD_CPM_NO_COPYRIGHT	0x00
477 #define RDSD_CPM_HAS_COPYRIGHT	0x80
478 #define RDSD_CPM_MASK		0x80
479 #define RDSD_CMGS_COPY_ALLOWED	0x00
480 #define RDSD_CMGS_ONE_COPY	0x20
481 #define RDSD_CMGS_NO_COPIES	0x30
482 #define RDSD_CMGS_MASK		0x30
483 	u_int8_t reserved1[3];
484 };
485 
486 struct scsi_read_dvd_struct_data_prot_discid
487 {
488 	u_int8_t data_len[2];
489 	u_int8_t reserved[2];
490 	u_int8_t prot_discid_data[16];
491 };
492 
493 struct scsi_read_dvd_struct_data_disc_key_blk
494 {
495 	/*
496 	 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
497 	 */
498 	u_int8_t data_len[2];
499 	u_int8_t reserved;
500 	u_int8_t total_packs;
501 	u_int8_t disc_key_pack_data[28668];
502 };
503 struct scsi_read_dvd_struct_data_dds
504 {
505 	u_int8_t data_len[2];
506 	u_int8_t reserved[2];
507 	u_int8_t dds_info[2048];
508 };
509 
510 struct scsi_read_dvd_struct_data_medium_status
511 {
512 	u_int8_t data_len[2];
513 	u_int8_t reserved0[2];
514 	u_int8_t byte4;
515 #define RDSD_MS_CARTRIDGE	0x80
516 #define RDSD_MS_OUT		0x40
517 #define RDSD_MS_MSWI		0x08
518 #define RDSD_MS_CWP		0x04
519 #define RDSD_MS_PWP		0x02
520 	u_int8_t disc_type_id;
521 #define RDSD_DT_NEED_CARTRIDGE	0x00
522 #define RDSD_DT_NO_CART_NEEDED	0x01
523 	u_int8_t reserved1;
524 	u_int8_t ram_swi_info;
525 #define RDSD_SWI_NO_BARE	0x01
526 #define RDSD_SWI_UNSPEC		0xff
527 };
528 
529 struct scsi_read_dvd_struct_data_spare_area
530 {
531 	u_int8_t data_len[2];
532 	u_int8_t reserved[2];
533 	u_int8_t unused_primary[4];
534 	u_int8_t unused_supl[4];
535 	u_int8_t allocated_supl[4];
536 };
537 
538 struct scsi_read_dvd_struct_data_rmd_borderout
539 {
540 	u_int8_t data_len[2];
541 	u_int8_t reserved[2];
542 	u_int8_t rmd[30720]; 	/* maximum is 30720 bytes */
543 };
544 
545 struct scsi_read_dvd_struct_data_rmd
546 {
547 	u_int8_t data_len[2];
548 	u_int8_t reserved[2];
549 	u_int8_t last_sector_num[4];
550 	u_int8_t rmd_bytes[32768];  /* This is the maximum */
551 };
552 
553 /*
554  * XXX KDM this is the MMC2 version of the structure.
555  * The variable positions have changed (in a semi-conflicting way) in the
556  * MMC3 spec, although the overall length of the structure is the same.
557  */
558 struct scsi_read_dvd_struct_data_leadin
559 {
560 	u_int8_t data_len[2];
561 	u_int8_t reserved0[2];
562 	u_int8_t field_id_1;
563 	u_int8_t app_code;
564 	u_int8_t disc_physical_data;
565 	u_int8_t last_addr[3];
566 	u_int8_t reserved1[2];
567 	u_int8_t field_id_2;
568 	u_int8_t rwp;
569 	u_int8_t rwp_wavelength;
570 	u_int8_t optimum_write_strategy;
571 	u_int8_t reserved2[4];
572 	u_int8_t field_id_3;
573 	u_int8_t manuf_id_17_12[6];
574 	u_int8_t reserved3;
575 	u_int8_t field_id_4;
576 	u_int8_t manuf_id_11_6[6];
577 	u_int8_t reserved4;
578 	u_int8_t field_id_5;
579 	u_int8_t manuf_id_5_0[6];
580 	u_int8_t reserved5[25];
581 };
582 
583 struct scsi_read_dvd_struct_data_disc_id
584 {
585 	u_int8_t data_len[2];
586 	u_int8_t reserved[4];
587 	u_int8_t random_num[2];
588 	u_int8_t year[4];
589 	u_int8_t month[2];
590 	u_int8_t day[2];
591 	u_int8_t hour[2];
592 	u_int8_t minute[2];
593 	u_int8_t second[2];
594 };
595 
596 struct scsi_read_dvd_struct_data_generic_dcb
597 {
598 	u_int8_t content_desc[4];
599 #define SCSI_RCB
600 	u_int8_t unknown_desc_actions[4];
601 #define RDSD_ACTION_RECORDING	0x0001
602 #define RDSD_ACTION_READING	0x0002
603 #define RDSD_ACTION_FORMAT	0x0004
604 #define RDSD_ACTION_MODIFY_DCB	0x0008
605 	u_int8_t vendor_id[32];
606 	u_int8_t dcb_data[32728];
607 };
608 
609 struct scsi_read_dvd_struct_data_dcb
610 {
611 	u_int8_t data_len[2];
612 	u_int8_t reserved[2];
613 	struct scsi_read_dvd_struct_data_generic_dcb dcb;
614 };
615 
616 struct read_dvd_struct_write_prot
617 {
618 	u_int8_t data_len[2];
619 	u_int8_t reserved0[2];
620 	u_int8_t write_prot_status;
621 #define RDSD_WPS_MSWI		0x08
622 #define RDSD_WPS_CWP		0x04
623 #define RDSD_WPS_PWP		0x02
624 #define RDSD_WPS_SWPP		0x01
625 	u_int8_t reserved[3];
626 };
627 
628 struct read_dvd_struct_list_entry
629 {
630 	u_int8_t format_code;
631 	u_int8_t sds_rds;
632 #define RDSD_SDS_NOT_WRITEABLE	0x00
633 #define RDSD_SDS_WRITEABLE	0x80
634 #define RDSD_SDS_MASK		0x80
635 #define RDSD_RDS_NOT_READABLE	0x00
636 #define RDSD_RDS_READABLE	0x40
637 #define RDSD_RDS_MASK		0x40
638 	u_int8_t struct_len[2];
639 };
640 
641 struct read_dvd_struct_data_list
642 {
643 	u_int8_t data_len[2];
644 	u_int8_t reserved[2];
645 	struct read_dvd_struct_list_entry entries[0];
646 };
647 
648 struct scsi_read_cd_cap_data
649 {
650 	u_int8_t addr_3;	/* Most significant */
651 	u_int8_t addr_2;
652 	u_int8_t addr_1;
653 	u_int8_t addr_0;	/* Least significant */
654 	u_int8_t length_3;	/* Most significant */
655 	u_int8_t length_2;
656 	u_int8_t length_1;
657 	u_int8_t length_0;	/* Least significant */
658 };
659 
660 union	cd_pages
661 {
662 	struct	audio_page
663 	{
664 		u_int8_t page_code;
665 #define	CD_PAGE_CODE	0x3F
666 #define	AUDIO_PAGE	0x0e
667 #define	CD_PAGE_PS	0x80
668 		u_int8_t param_len;
669 		u_int8_t flags;
670 #define		CD_PA_SOTC	0x02
671 #define		CD_PA_IMMED	0x04
672 		u_int8_t unused[2];
673 		u_int8_t format_lba;
674 #define		CD_PA_FORMAT_LBA	0x0F
675 #define		CD_PA_APR_VALID	0x80
676 		u_int8_t lb_per_sec[2];
677 		struct	port_control
678 		{
679 			u_int8_t channels;
680 #define	CHANNEL 0x0F
681 #define	CHANNEL_0 1
682 #define	CHANNEL_1 2
683 #define	CHANNEL_2 4
684 #define	CHANNEL_3 8
685 #define	LEFT_CHANNEL	CHANNEL_0
686 #define	RIGHT_CHANNEL	CHANNEL_1
687 			u_int8_t volume;
688 		} port[4];
689 #define	LEFT_PORT	0
690 #define	RIGHT_PORT	1
691 	}audio;
692 };
693 
694 struct cd_mode_data
695 {
696 	struct scsi_mode_header_6 header;
697 	struct scsi_mode_blk_desc blk_desc;
698 	union cd_pages page;
699 };
700 
701 __BEGIN_DECLS
702 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
703 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
704 		     u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
705 		     u_int8_t key_format, u_int8_t *data_ptr,
706 		     u_int32_t dxfer_len, u_int8_t sense_len,
707 		     u_int32_t timeout);
708 
709 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
710 		   void (*cbfcnp)(struct cam_periph *, union ccb *),
711 		   u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
712 		   u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
713 		   u_int32_t timeout);
714 
715 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
716 			     void (*cbfcnp)(struct cam_periph *, union ccb *),
717 			     u_int8_t tag_action, u_int32_t address,
718 			     u_int8_t layer_number, u_int8_t format,
719 			     u_int8_t agid, u_int8_t *data_ptr,
720 			     u_int32_t dxfer_len, u_int8_t sense_len,
721 			     u_int32_t timeout);
722 
723 __END_DECLS
724 
725 #endif /*_SCSI_SCSI_CD_H*/
726 
727