f7cced7c33d1528e02e78bfa30d2ea60a8192155
[dragonfly.git] / sys / bus / cam / scsi / scsi_cd.h
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.3 2003/12/29 06:42:10 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 struct cd_audio_page
661 {
662         u_int8_t page_code;
663 #define CD_PAGE_CODE            0x3F
664 #define AUDIO_PAGE              0x0e
665 #define CD_PAGE_PS              0x80
666         u_int8_t param_len;
667         u_int8_t flags;
668 #define CD_PA_SOTC              0x02
669 #define CD_PA_IMMED             0x04
670         u_int8_t unused[2];
671         u_int8_t format_lba;
672 #define CD_PA_FORMAT_LBA        0x0F
673 #define CD_PA_APR_VALID         0x80
674         u_int8_t lb_per_sec[2];
675         struct  port_control
676         {
677                 u_int8_t channels;
678 #define CHANNEL                 0x0F
679 #define CHANNEL_0               1
680 #define CHANNEL_1               2
681 #define CHANNEL_2               4
682 #define CHANNEL_3               8
683 #define LEFT_CHANNEL            CHANNEL_0
684 #define RIGHT_CHANNEL           CHANNEL_1
685                 u_int8_t volume;
686         } port[4];
687 #define LEFT_PORT               0
688 #define RIGHT_PORT              1
689 };
690
691 union cd_pages
692 {
693         struct cd_audio_page audio;
694 };
695
696 struct cd_mode_data_10
697 {
698         struct scsi_mode_header_10 header;
699         struct scsi_mode_blk_desc  blk_desc;
700         union cd_pages page;
701 };
702
703 struct cd_mode_data
704 {
705         struct scsi_mode_header_6 header;
706         struct scsi_mode_blk_desc blk_desc;
707         union cd_pages page;
708 };
709
710 union cd_mode_data_6_10
711 {
712         struct cd_mode_data mode_data_6;
713         struct cd_mode_data_10 mode_data_10;
714 };
715
716 struct cd_mode_params
717 {
718         STAILQ_ENTRY(cd_mode_params)    links;
719         int                             cdb_size;
720         int                             alloc_len;
721         u_int8_t                        *mode_buf;
722 };
723
724 __BEGIN_DECLS
725 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
726                      void (*cbfcnp)(struct cam_periph *, union ccb *),
727                      u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
728                      u_int8_t key_format, u_int8_t *data_ptr,
729                      u_int32_t dxfer_len, u_int8_t sense_len,
730                      u_int32_t timeout);
731
732 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
733                    void (*cbfcnp)(struct cam_periph *, union ccb *),
734                    u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
735                    u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
736                    u_int32_t timeout);
737
738 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
739                              void (*cbfcnp)(struct cam_periph *, union ccb *),
740                              u_int8_t tag_action, u_int32_t address,
741                              u_int8_t layer_number, u_int8_t format,
742                              u_int8_t agid, u_int8_t *data_ptr,
743                              u_int32_t dxfer_len, u_int8_t sense_len,
744                              u_int32_t timeout);
745
746 __END_DECLS
747
748 #endif /*_SCSI_SCSI_CD_H*/
749