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