xref: /dragonfly/sys/bus/cam/scsi/scsi_cd.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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