1 /*
2  *   libdi - CD Audio Device Interface Library
3  *
4  *   Copyright (C) 1993-2004  Ti Kan
5  *   E-mail: xmcd@amb.org
6  *
7  *   This program is free software; you can redistribute it and/or modify
8  *   it under the terms of the GNU General Public License as published by
9  *   the Free Software Foundation; either version 2 of the License, or
10  *   (at your option) any later version.
11  *
12  *   This program is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *   GNU General Public License for more details.
16  *
17  *   You should have received a copy of the GNU General Public License
18  *   along with this program; if not, write to the Free Software
19  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21 #ifndef __SCSIPT_H__
22 #define __SCSIPT_H__
23 
24 #if defined(DI_SCSIPT) || defined(CDDA_RD_SCSIPT)
25 
26 #ifndef lint
27 static char *_scsipt_h_ident_ = "@(#)scsipt.h	6.78 04/01/14";
28 #endif
29 
30 
31 #define MAX_VENDORS		8	/* Max number of vendors */
32 
33 /*
34  * Vendor-unique modules
35  *
36  * Undefine any of these (except VENDOR_SCSI2) to remove
37  * vendor-unique support for a particular vendor.  Removing
38  * unused vendor-unique modules can reduce the executable
39  * binary size and run-time memory usage.
40  */
41 #define VENDOR_SCSI2		0	/* SCSI-2 mode */
42 #define VENDOR_CHINON		1	/* Chinon vendor-unique mode */
43 #define VENDOR_HITACHI		2	/* Hitachi vendor-unique mode */
44 #define VENDOR_NEC		3	/* NEC vendor-unique mode */
45 #define VENDOR_PIONEER		4	/* Pioneer vendor-unique mode */
46 #define VENDOR_SONY		5	/* Sony vendor-unique mode */
47 #define VENDOR_TOSHIBA		6	/* Toshiba vendor-unique mode */
48 #define VENDOR_PANASONIC	7	/* Panasonic vendor-unique mode */
49 
50 
51 /* Data direction code */
52 #define OP_NODATA		0	/* SCSI no data */
53 #define OP_DATAIN		1	/* SCSI data-in */
54 #define OP_DATAOUT		2	/* SCSI data-out */
55 
56 
57 /* Default command timeout interval */
58 #define DFLT_CMD_TIMEOUT	10	/* seconds */
59 
60 
61 /* Read Sub-channel audio status */
62 #define AUDIO_NOTVALID		0x00	/* audio status not valid */
63 #define AUDIO_PLAYING		0x11	/* audio play in progress */
64 #define AUDIO_PAUSED		0x12	/* audio play paused */
65 #define AUDIO_COMPLETED		0x13	/* audio play successfully completed */
66 #define AUDIO_FAILED		0x14	/* audio played stopped due to error */
67 #define AUDIO_NOSTATUS		0x15	/* no audio status */
68 
69 
70 /* SCSI command opcodes */
71 
72 /* 6-byte commands */
73 #define OP_S_TEST		0x00	/* test unit ready */
74 #define OP_S_REZERO		0x01	/* rezero */
75 #define OP_S_RSENSE		0x03	/* request sense */
76 #define OP_S_READ		0x08	/* read (8) */
77 #define OP_S_SEEK		0x0b	/* seek */
78 #define OP_S_INQUIR		0x12	/* inquiry */
79 #define OP_S_MSELECT		0x15	/* mode select (6) */
80 #define OP_S_MSENSE		0x1a	/* mode sense (6) */
81 #define OP_S_START		0x1b	/* start/stop unit */
82 #define OP_S_PREVENT		0x1e	/* prevent/allow medium removal */
83 #define OP_S_INITELEMSTAT	0x07	/* initialize element status */
84 
85 /* 10-byte commands */
86 #define OP_M_RDCAP		0x25	/* read capacity */
87 #define OP_M_READ		0x28	/* read (10) */
88 #define OP_M_RDSUBQ		0x42	/* read subchannel */
89 #define OP_M_RDTOC		0x43	/* read TOC */
90 #define OP_M_RDHDR		0x44	/* read header */
91 #define OP_M_PLAY		0x45	/* play audio (10) */
92 #define OP_M_PLAYMSF		0x47	/* play audio MSF */
93 #define OP_M_PLAYTI		0x48	/* play audio track/index */
94 #define OP_M_PLAYTR		0x49	/* play audio track relative (10) */
95 #define OP_M_PAUSE		0x4b	/* pause/resume */
96 #define OP_M_MSELECT		0x55	/* mode select (10) */
97 #define OP_M_MSENSE		0x5a	/* mode sense (10) */
98 
99 /* 12-byte commands */
100 #define OP_L_PLAY		0xa5	/* play audio (12) */
101 #define OP_L_READ		0xa8	/* read (12) */
102 #define OP_L_PLAYTR		0xa9	/* play audio track relative (12) */
103 #define OP_L_MOVEMED		0xa5	/* move medium */
104 #define OP_L_READELEMSTAT	0xb8	/* read element status */
105 #define OP_L_READCD		0xbe	/* MMC read CD */
106 
107 
108 /* Data lengths */
109 #define SZ_RDSUBQ		48	/* max read sub-channel Q data size */
110 #define SZ_MCNDATA		13	/* media catalog number data size */
111 #define SZ_ISRCDATA		12	/* intl std recording code data size */
112 #define SZ_RDTOC		804	/* max read TOC (tracks) data size */
113 #define SZ_RDCDTEXT		8192	/* max read TOC (CD-TEXT) data size */
114 #define SZ_CDTEXTPKD		12	/* CDTEXT per-pack data size */
115 #define SZ_CDTEXTINFO		512	/* CDTEXT scratch buffer size */
116 #define SZ_TOCHDR		4	/* TOC header size */
117 #define SZ_TOCENT		8	/* TOC per-track entry size */
118 #define SZ_MSENSE		60	/* max mode sense/mode sel data size */
119 #define SZ_AUDIOCTL		16	/* audio control page size */
120 #define SZ_DEVCAPAB		16	/* device capab page size */
121 #define SZ_ELEMADDR		20	/* element addr page size */
122 #define SZ_RSENSE		18	/* max request sense data size */
123 #define SZ_ELEMHDR		8	/* med chgr element status header */
124 #define SZ_ELEMSTAT		8	/* med chgr element status */
125 
126 
127 /* CD-ROM Mode sense/mode select page codes */
128 #define PG_ERRECOV		0x01	/* error recovery parameters page */
129 #define PG_DISCONN		0x02	/* disconn/conn parameters page */
130 #define PG_CDROMCTL		0x0d	/* cd-rom control parameters page */
131 #define PG_AUDIOCTL		0x0e	/* audio control parameters page */
132 #define PG_ALL			0x3f	/* 0x01, 0x02, 0x0d and 0x0e */
133 
134 /* Medium-changer Mode sense/mode select page codes */
135 #define PG_DEVCAPAB		0x1f	/* device capabilities page */
136 #define PG_ELEMADDR		0x1d	/* element address assignments  page */
137 
138 
139 /* Read sub-channel format codes */
140 #define SUB_ALL			0x00	/* sub-Q channel data */
141 #define SUB_CURPOS		0x01	/* current CD-ROM position */
142 #define SUB_MCN			0x02	/* media catalog num (UPC/bar code) */
143 #define SUB_ISRC		0x03	/* track ISRC code */
144 
145 
146 /* Inquiry data misc definitions */
147 #define DEV_WORM		0x04	/* WORM/CD-R peripheral device type */
148 #define DEV_ROM			0x05	/* ROM peripheral device type */
149 #define DEV_CHANGER		0x08	/* Medium changer device type */
150 #define DEV_CONNECTED		0x00	/* peripheral qualifier */
151 
152 
153 /* SCSI CDB handling */
154 #define MAX_CMDLEN		12	/* Max SCSI CDB length */
155 #define SCSICDB_RESET(p)	(void) memset(p, 0, MAX_CMDLEN);
156 
157 
158 /* CDDA-over-SCSI read method code */
159 #define CDDA_MMC		0	/* Use MMC read command */
160 #define CDDA_STD		1	/* Use SCSI read command */
161 #define CDDA_NEC		2	/* Use NEC vendor-unique */
162 #define CDDA_SONY		3	/* Use Sony vendor-unique */
163 
164 
165 /*
166  * SCSI inquiry data
167  */
168 typedef struct inqry_data {
169 #if _BYTE_ORDER_ == _L_ENDIAN_
170 	unsigned int	type:5;		/* peripheral device type */
171 	unsigned int	pqual:3;	/* peripheral qualifier */
172 	unsigned int	qualif:7;	/* device type qualifier */
173 	unsigned int	rmb:1;		/* removable media */
174 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
175 	unsigned int	pqual:3;	/* peripheral qualifier */
176 	unsigned int	type:5;		/* peripheral device type */
177 	unsigned int	rmb:1;		/* removable media */
178 	unsigned int	qualif:7;	/* device type qualifier */
179 #endif	/* _BYTE_ORDER_ */
180 
181 	unsigned int	ver:8;		/* SCSI version */
182 	unsigned int	res1:8;		/* reserved */
183 
184 	byte_t		len;		/* length of additional data */
185 	byte_t		res2[3];	/* reserved */
186 	byte_t		vendor[8];	/* vendor ID */
187 	byte_t		prod[16];	/* product ID */
188 	byte_t		revnum[4];	/* revision number */
189 } inquiry_data_t;
190 
191 
192 /*
193  * Mode Sense/Mode Select data
194  */
195 
196 /* Mode Sense/Mode Select (6 byte) data */
197 typedef struct mode_sense_6_data {
198 	/* mode header */
199 	unsigned int	data_len:8;	/* data length */
200 	unsigned int	medium:8;	/* medium */
201 #if _BYTE_ORDER_ == _L_ENDIAN_
202 	unsigned int	speed:4;	/* speed */
203 	unsigned int	buffered:3;	/* buffered */
204 	unsigned int	wprot:1;	/* write protected */
205 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
206 	unsigned int	wprot:1;	/* write protected */
207 	unsigned int	buffered:3;	/* buffered */
208 	unsigned int	speed:4;	/* speed */
209 #endif	/* _BYTE_ORDER_ */
210 	unsigned int	bdescr_len:8;	/* block descriptor length */
211 
212 	byte_t		data[48];	/* block desc/page desc data */
213 } mode_sense_6_data_t;
214 
215 
216 /* Mode Sense/Mode Select (10 byte) data */
217 typedef struct mode_sense_10_data {
218 	/* mode header */
219 	unsigned int	data_len:16;	/* data length */
220 	unsigned int	medium:8;	/* medium */
221 #if _BYTE_ORDER_ == _L_ENDIAN_
222 	unsigned int	speed:4;	/* speed */
223 	unsigned int	buffered:3;	/* buffered */
224 	unsigned int	wprot:1;	/* write protected */
225 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
226 	unsigned int	wprot:1;	/* write protected */
227 	unsigned int	buffered:3;	/* buffered */
228 	unsigned int	speed:4;	/* speed */
229 #endif	/* _BYTE_ORDER_ */
230 
231 	unsigned int	res:16;		/* reserved */
232 	unsigned int	bdescr_len:16;	/* block descriptor length */
233 
234 	byte_t		data[48];	/* block desc/page desc data */
235 } mode_sense_10_data_t;
236 
237 
238 /* Block descriptor data */
239 typedef struct blk_desc {
240 	unsigned int	dens_code:8;	/* density code */
241 	unsigned int	num_blks:24;	/* number of blocks */
242 
243 	unsigned int	res:8;		/* reserved */
244 	unsigned int	blk_len:24;	/* block length */
245 } blk_desc_t;
246 
247 
248 /* CD-ROM Audio-parameters page (0x0e) data */
249 typedef struct audio_pg {
250 #if _BYTE_ORDER_ == _L_ENDIAN_
251 	unsigned int	pg_code:6;	/* page code */
252 	unsigned int	res:2;		/* reserved */
253 	unsigned int	pg_len:8;	/* page length */
254 	unsigned int	res1:1;		/* reserved */
255 	unsigned int	sotc:1;		/* SOTC */
256 	unsigned int	immed:1;	/* immediate */
257 	unsigned int	res2:5;		/* reserved */
258 	unsigned int	res3:8;		/* reserved */
259 
260 	unsigned int	res4:16;	/* reserved */
261 	unsigned int	audio_bps:16;	/* logical blocks per second */
262 
263 	unsigned int	p0_ch_ctrl:4;	/* port 0 channel control */
264 	unsigned int	res5:4;		/* reserved */
265 	unsigned int	p0_vol:8;	/* port 0 volume */
266 	unsigned int	p1_ch_ctrl:4;	/* port 1 channel control */
267 	unsigned int	res6:4;		/* reserved */
268 	unsigned int	p1_vol:8;	/* port 1 volume */
269 
270 	unsigned int	p2_ch_ctrl:4;	/* port 2 channel control */
271 	unsigned int	res7:4;		/* reserved */
272 	unsigned int	p2_vol:8;	/* port 2 volume */
273 	unsigned int	p3_ch_ctrl:4;	/* port 3 channel control */
274 	unsigned int	res8:4;		/* reserved */
275 	unsigned int	p3_vol:8;	/* port 3 volume */
276 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
277 	unsigned int	res:2;		/* reserved */
278 	unsigned int	pg_code:6;	/* page code */
279 	unsigned int	pg_len:8;	/* page length */
280 	unsigned int	res2:5;		/* reserved */
281 	unsigned int	immed:1;	/* immediate */
282 	unsigned int	sotc:1;		/* SOTC */
283 	unsigned int	res1:1;		/* reserved */
284 	unsigned int	res3:8;		/* reserved */
285 
286 	unsigned int	res4:16;	/* reserved */
287 	unsigned int	audio_bps:16;	/* logical blocks per second */
288 
289 	unsigned int	res5:4;		/* reserved */
290 	unsigned int	p0_ch_ctrl:4;	/* port 0 channel control */
291 	unsigned int	p0_vol:8;	/* port 0 volume */
292 	unsigned int	res6:4;		/* reserved */
293 	unsigned int	p1_ch_ctrl:4;	/* port 1 channel control */
294 	unsigned int	p1_vol:8;	/* port 1 volume */
295 
296 	unsigned int	res7:4;		/* reserved */
297 	unsigned int	p2_ch_ctrl:4;	/* port 2 channel control */
298 	unsigned int	p2_vol:8;	/* port 2 volume */
299 	unsigned int	res8:4;		/* reserved */
300 	unsigned int	p3_ch_ctrl:4;	/* port 3 channel control */
301 	unsigned int	p3_vol:8;	/* port 3 volume */
302 #endif	/* _BYTE_ORDER_ */
303 } audio_pg_t;
304 
305 
306 /* Medium-changer Device capabilities page (0x1f) data */
307 typedef struct dev_capab {
308 #if _BYTE_ORDER_ == _L_ENDIAN_
309 	unsigned int	pg_code:6;	/* page code */
310 	unsigned int	res:2;		/* reserved */
311 	unsigned int	pg_len:8;	/* page length */
312 	unsigned int	stor_mt:1;	/* medium transport element */
313 	unsigned int	stor_st:1;	/* storage element */
314 	unsigned int	stor_ie:1;	/* import/export element */
315 	unsigned int	stor_dt:1;	/* data transfer element */
316 	unsigned int	res1:4;		/* reserved */
317 	unsigned int	res2:8;		/* reserved */
318 
319 	unsigned int	move_mt_mt:1;	/* move medium: MT->MT */
320 	unsigned int	move_mt_st:1;	/* move medium: MT->ST */
321 	unsigned int	move_mt_ie:1;	/* move medium: MT->IE */
322 	unsigned int	move_mt_dt:1;	/* move medium: MT->DT */
323 	unsigned int	res3:4;		/* reserved */
324 	unsigned int	move_st_mt:1;	/* move medium: ST->MT */
325 	unsigned int	move_st_st:1;	/* move medium: ST->ST */
326 	unsigned int	move_st_ie:1;	/* move medium: ST->IE */
327 	unsigned int	move_st_dt:1;	/* move medium: ST->DT */
328 	unsigned int	res4:4;		/* reserved */
329 	unsigned int	move_ie_mt:1;	/* move medium: IE->MT */
330 	unsigned int	move_ie_st:1;	/* move medium: IE->ST */
331 	unsigned int	move_ie_ie:1;	/* move medium: IE->IE */
332 	unsigned int	move_ie_dt:1;	/* move medium: IE->DT */
333 	unsigned int	res5:4;		/* reserved */
334 	unsigned int	move_dt_mt:1;	/* move medium: DT->MT */
335 	unsigned int	move_dt_st:1;	/* move medium: DT->ST */
336 	unsigned int	move_dt_ie:1;	/* move medium: DT->IE */
337 	unsigned int	move_dt_dt:1;	/* move medium: DT->DT */
338 	unsigned int	res6:4;		/* reserved */
339 
340 	unsigned int	res7:32;	/* reserved */
341 
342 	unsigned int	xchg_mt_mt:1;	/* exchange medium: MT<->MT */
343 	unsigned int	xchg_mt_st:1;	/* exchange medium: MT<->ST */
344 	unsigned int	xchg_mt_ie:1;	/* exchange medium: MT<->IE */
345 	unsigned int	xchg_mt_dt:1;	/* exchange medium: MT<->DT */
346 	unsigned int	res8:4;		/* reserved */
347 	unsigned int	xchg_st_mt:1;	/* exchange medium: ST<->MT */
348 	unsigned int	xchg_st_st:1;	/* exchange medium: ST<->ST */
349 	unsigned int	xchg_st_ie:1;	/* exchange medium: ST<->IE */
350 	unsigned int	xchg_st_dt:1;	/* exchange medium: ST<->DT */
351 	unsigned int	res9:4;		/* reserved */
352 	unsigned int	xchg_ie_mt:1;	/* exchange medium: IE<->MT */
353 	unsigned int	xchg_ie_st:1;	/* exchange medium: IE<->ST */
354 	unsigned int	xchg_ie_ie:1;	/* exchange medium: IE<->IE */
355 	unsigned int	xchg_ie_dt:1;	/* exchange medium: IE<->DT */
356 	unsigned int	res10:4;	/* reserved */
357 	unsigned int	xchg_dt_mt:1;	/* exchange medium: DT<->MT */
358 	unsigned int	xchg_dt_st:1;	/* exchange medium: DT<->ST */
359 	unsigned int	xchg_dt_ie:1;	/* exchange medium: DT<->IE */
360 	unsigned int	xchg_dt_dt:1;	/* exchange medium: DT<->DT */
361 	unsigned int	res11:4;	/* reserved */
362 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
363 	unsigned int	res:2;		/* reserved */
364 	unsigned int	pg_code:6;	/* page code */
365 	unsigned int	pg_len:8;	/* page length */
366 	unsigned int	res1:4;		/* reserved */
367 	unsigned int	stor_dt:1;	/* data transfer element */
368 	unsigned int	stor_ie:1;	/* import/export element */
369 	unsigned int	stor_st:1;	/* storage element */
370 	unsigned int	stor_mt:1;	/* medium transport element */
371 	unsigned int	res2:8;		/* reserved */
372 
373 	unsigned int	res3:4;		/* reserved */
374 	unsigned int	move_mt_dt:1;	/* move medium: MT->DT */
375 	unsigned int	move_mt_ie:1;	/* move medium: MT->IE */
376 	unsigned int	move_mt_st:1;	/* move medium: MT->ST */
377 	unsigned int	move_mt_mt:1;	/* move medium: MT->MT */
378 	unsigned int	res4:4;		/* reserved */
379 	unsigned int	move_st_dt:1;	/* move medium: ST->DT */
380 	unsigned int	move_st_ie:1;	/* move medium: ST->IE */
381 	unsigned int	move_st_st:1;	/* move medium: ST->ST */
382 	unsigned int	move_st_mt:1;	/* move medium: ST->MT */
383 	unsigned int	res5:4;		/* reserved */
384 	unsigned int	move_ie_dt:1;	/* move medium: IE->DT */
385 	unsigned int	move_ie_ie:1;	/* move medium: IE->IE */
386 	unsigned int	move_ie_st:1;	/* move medium: IE->ST */
387 	unsigned int	move_ie_mt:1;	/* move medium: IE->MT */
388 	unsigned int	res6:4;		/* reserved */
389 	unsigned int	move_dt_dt:1;	/* move medium: DT->DT */
390 	unsigned int	move_dt_ie:1;	/* move medium: DT->IE */
391 	unsigned int	move_dt_st:1;	/* move medium: DT->ST */
392 	unsigned int	move_dt_mt:1;	/* move medium: DT->MT */
393 
394 	unsigned int	res7:32;	/* reserved */
395 
396 	unsigned int	res8:4;		/* reserved */
397 	unsigned int	xchg_mt_dt:1;	/* exchange medium: MT<->DT */
398 	unsigned int	xchg_mt_ie:1;	/* exchange medium: MT<->IE */
399 	unsigned int	xchg_mt_st:1;	/* exchange medium: MT<->ST */
400 	unsigned int	xchg_mt_mt:1;	/* exchange medium: MT<->MT */
401 	unsigned int	res9:4;		/* reserved */
402 	unsigned int	xchg_st_dt:1;	/* exchange medium: ST<->DT */
403 	unsigned int	xchg_st_ie:1;	/* exchange medium: ST<->IE */
404 	unsigned int	xchg_st_st:1;	/* exchange medium: ST<->ST */
405 	unsigned int	xchg_st_mt:1;	/* exchange medium: ST<->MT */
406 	unsigned int	res10:4;	/* reserved */
407 	unsigned int	xchg_ie_dt:1;	/* exchange medium: IE<->DT */
408 	unsigned int	xchg_ie_ie:1;	/* exchange medium: IE<->IE */
409 	unsigned int	xchg_ie_st:1;	/* exchange medium: IE<->ST */
410 	unsigned int	xchg_ie_mt:1;	/* exchange medium: IE<->MT */
411 	unsigned int	res11:4;	/* reserved */
412 	unsigned int	xchg_dt_dt:1;	/* exchange medium: DT<->DT */
413 	unsigned int	xchg_dt_ie:1;	/* exchange medium: DT<->IE */
414 	unsigned int	xchg_dt_st:1;	/* exchange medium: DT<->ST */
415 	unsigned int	xchg_dt_mt:1;	/* exchange medium: DT<->MT */
416 #endif	/* _BYTE_ORDER_ */
417 } dev_capab_t;
418 
419 
420 /* Medium-changer Element address assignments page (0x1d) data */
421 typedef struct elem_addr {
422 #if _BYTE_ORDER_ == _L_ENDIAN_
423 	unsigned int	pg_code:6;	/* page code */
424 	unsigned int	res:2;		/* reserved */
425 	unsigned int	pg_len:8;	/* page length */
426 	unsigned int	mt_addr:16;	/* medium transport element address */
427 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
428 	unsigned int	res:2;		/* reserved */
429 	unsigned int	pg_code:6;	/* page code */
430 	unsigned int	pg_len:8;	/* page length */
431 	unsigned int	mt_addr:16;	/* medium transport element address */
432 #endif	/* _BYTE_ORDER_ */
433 
434 	unsigned int	mt_num:16;	/* medium transport elements */
435 	unsigned int	st_addr:16;	/* storage element address */
436 
437 	unsigned int	st_num:16;	/* storage elements */
438 	unsigned int	ie_addr:16;	/* import/export element address */
439 
440 	unsigned int	ie_num:16;	/* import/export elements */
441 	unsigned int	dt_addr:16;	/* data transfer element address */
442 
443 	unsigned int	dt_num:16;	/* data transfer elements */
444 	unsigned int	res1:16;	/* reserved */
445 } elem_addr_t;
446 
447 
448 /*
449  * Request Sense data
450  */
451 typedef struct req_sense_data {
452 #if _BYTE_ORDER_ == _L_ENDIAN_
453 	unsigned int	errcode:7;	/* error code */
454 	unsigned int	valid:1;	/* valid bit */
455 	unsigned int	segno:8;	/* segment number */
456 	unsigned int	key:4;		/* sense key */
457 	unsigned int	res:1;		/* reserved */
458 	unsigned int	ili:1;		/* ILI */
459 	unsigned int	eom:1;		/* end-of-medium */
460 	unsigned int	fm:1;		/* filemark */
461 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
462 	unsigned int	valid:1;	/* valid bit */
463 	unsigned int	errcode:7;	/* error code */
464 	unsigned int	segno:8;	/* segment number */
465 	unsigned int	fm:1;		/* filemark */
466 	unsigned int	eom:1;		/* end-of-medium */
467 	unsigned int	ili:1;		/* ILI */
468 	unsigned int	res:1;		/* reserved */
469 	unsigned int	key:4;		/* sense key */
470 #endif	/* _BYTE_ORDER_ */
471 	unsigned int	info0:8;	/* information */
472 
473 	unsigned int	info1:8;	/* information */
474 	unsigned int	info2:8;	/* information */
475 	unsigned int	info3:8;	/* information */
476 	unsigned int 	addl_len:8;	/* additional sense length */
477 
478 	unsigned int	cmd_spec0:8;	/* command specific information */
479 	unsigned int	cmd_spec1:8;	/* command specific information */
480 	unsigned int	cmd_spec2:8;	/* command specific information */
481 	unsigned int	cmd_spec3:8;	/* command specific information */
482 
483 	unsigned int	code:8;		/* additional sense code */
484 	unsigned int	qual:8;		/* additional sense code qualifier */
485 	unsigned int	fruc:8;		/* field replaceable unit code */
486 	unsigned int	key_spec0:8;	/* sense-key specific */
487 
488 	unsigned int	key_spec1:8;	/* sense-key specific */
489 	unsigned int	key_spec2:8;	/* sense-key specific */
490 	unsigned int	pad1:16;	/* pad for alignment */
491 } req_sense_data_t;
492 
493 
494 /* Structure to map request sense key code to a descriptive string */
495 typedef struct req_sense_keymap {
496 	int		key;		/* The sense key */
497 	char		*text;		/* The description text string */
498 } req_sense_keymap_t;
499 
500 
501 /*
502  * Read subchannel Q data header
503  */
504 typedef struct subq_hdr {
505 	byte_t		reserved;	/* reserved */
506 	byte_t		audio_status;	/* audio status */
507 	word16_t	subch_len;	/* subchannel data length */
508 } subq_hdr_t;
509 
510 
511 /*
512  * Subchannel Q data - format 00 (All information)
513  */
514 typedef struct subq_00 {
515 	unsigned int	fmt_code:8;	/* format code */
516 #if _BYTE_ORDER_ == _L_ENDIAN_
517 	unsigned int	preemph:1;	/* preemphasis */
518 	unsigned int	copyallow:1;	/* digital copy allow */
519 	unsigned int	trktype:1;	/* 0=audio 1=data */
520 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
521 	unsigned int	adr:4;		/* ADR */
522 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
523 	unsigned int	adr:4;		/* ADR */
524 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
525 	unsigned int	trktype:1;	/* 0=audio 1=data */
526 	unsigned int	copyallow:1;	/* digital copy allow */
527 	unsigned int	preemph:1;	/* preemphasis */
528 #endif	/* _BYTE_ORDER_ */
529 	unsigned int	trkno:8;	/* track number */
530 	unsigned int	idxno:8;	/* index number */
531 
532 	lmsf_t		abs_addr;	/* absolute address */
533 	lmsf_t		rel_addr;	/* track-relative address */
534 
535 #if _BYTE_ORDER_ == _L_ENDIAN_
536 	unsigned int	reserved:7;	/* reserved */
537 	unsigned int	mcval:1;	/* MCN is valid */
538 #else
539 	unsigned int	mcval:1;	/* MCN is valid */
540 	unsigned int	reserved:7;	/* reserved */
541 #endif
542 	byte_t		mcn[15];	/* MCN data */
543 
544 #if _BYTE_ORDER_ == _L_ENDIAN_
545 	unsigned int	reserved2:7;	/* reserved */
546 	unsigned int	tcval:1;	/* ISRC is valid */
547 #else
548 	unsigned int	tcval:1;	/* ISRC is valid */
549 	unsigned int	reserved2:7;	/* reserved */
550 #endif
551 	byte_t		isrc[15];	/* ISRC data */
552 } subq_00_t;
553 
554 
555 /*
556  * Subchannel Q data - format 01 (CD-ROM Current Position)
557  */
558 typedef struct subq_01 {
559 	unsigned int	fmt_code:8;	/* format code */
560 #if _BYTE_ORDER_ == _L_ENDIAN_
561 	unsigned int	preemph:1;	/* preemphasis */
562 	unsigned int	copyallow:1;	/* digital copy allow */
563 	unsigned int	trktype:1;	/* 0=audio 1=data */
564 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
565 	unsigned int	adr:4;		/* ADR */
566 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
567 	unsigned int	adr:4;		/* ADR */
568 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
569 	unsigned int	trktype:1;	/* 0=audio 1=data */
570 	unsigned int	copyallow:1;	/* digital copy allow */
571 	unsigned int	preemph:1;	/* preemphasis */
572 #endif	/* _BYTE_ORDER_ */
573 	unsigned int	trkno:8;	/* track number */
574 	unsigned int	idxno:8;	/* index number */
575 
576 	lmsf_t		abs_addr;	/* absolute address */
577 	lmsf_t		rel_addr;	/* track-relative address */
578 } subq_01_t;
579 
580 
581 /*
582  * Subchannel Q data - format 02 (Media Catalog Number)
583  */
584 typedef struct subq_02 {
585 	unsigned int	fmt_code:8;	/* format code */
586 	unsigned int	reserved:24;	/* reserved */
587 
588 #if _BYTE_ORDER_ == _L_ENDIAN_
589 	unsigned int	reserved2:7;	/* reserved */
590 	unsigned int	mcval:1;	/* MCN is valid */
591 #else
592 	unsigned int	mcval:1;	/* MCN is valid */
593 	unsigned int	reserved2:7;	/* reserved */
594 #endif
595 	byte_t		mcn[15];	/* MCN data */
596 } subq_02_t;
597 
598 
599 /*
600  * Subchannel Q data - format 03 (International Standard Recording Code)
601  */
602 typedef struct subq_03 {
603 	unsigned int	fmt_code:8;	/* format code */
604 	unsigned int	reserved:24;	/* reserved */
605 
606 #if _BYTE_ORDER_ == _L_ENDIAN_
607 	unsigned int	reserved2:7;	/* reserved */
608 	unsigned int	tcval:1;	/* ISRC is valid */
609 #else
610 	unsigned int	tcval:1;	/* ISRC is valid */
611 	unsigned int	reserved2:7;	/* reserved */
612 #endif
613 	byte_t		isrc[15];	/* ISRC data */
614 } subq_03_t;
615 
616 
617 /*
618  * Read TOC command data header
619  */
620 typedef struct toc_hdr {
621 	word16_t	data_len;	/* TOC data length */
622 	byte_t		first_trk;	/* first track number */
623 	byte_t		last_trk;	/* last track number */
624 } toc_hdr_t;
625 
626 
627 /*
628  * Read TOC command track descriptor
629  */
630 typedef struct toc_trk_descr {
631 	unsigned int	res1:8;		/* reserved */
632 #if _BYTE_ORDER_ == _L_ENDIAN_
633 	unsigned int	preemph:1;	/* preemphasis */
634 	unsigned int	copyallow:1;	/* digital copy allow */
635 	unsigned int	trktype:1;	/* 0=audio 1=data */
636 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
637 	unsigned int	adr:4;		/* ADR */
638 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
639 	unsigned int	adr:4;		/* ADR */
640 	unsigned int	audioch:1;	/* 0=2ch 1=4ch */
641 	unsigned int	trktype:1;	/* 0=audio 1=data */
642 	unsigned int	copyallow:1;	/* digital copy allow */
643 	unsigned int	preemph:1;	/* preemphasis */
644 #endif	/* _BYTE_ORDER_ */
645 	unsigned int	trkno:8;	/* track number */
646 	unsigned int	res2:8;		/* reserved */
647 
648 	lmsf_t		abs_addr;	/* absolute address */
649 } toc_trk_descr_t;
650 
651 
652 /* Values for the pack_type field of the toc_cdtext_pack_t structure */
653 #define PACK_TITLE	0x80		/* Album or track title */
654 #define PACK_PERFORMER	0x81		/* Name of performer(s) */
655 #define PACK_SONGWRITER	0x82		/* Name of songwriter(s) */
656 #define PACK_COMPOSER	0x83		/* Name of composer(s) */
657 #define PACK_ARRANGER	0x84		/* Name of arranger(s) */
658 #define PACK_MESSAGE	0x85		/* Message(s) to user */
659 #define PACK_IDENT	0x86		/* Disc identification info */
660 #define PACK_GENRE	0x87		/* Genre identification and info */
661 #define PACK_TOC	0x88		/* TOC info */
662 #define PACK_TOC2	0x89		/* Second TOC info */
663 #define PACK_UPCEAN	0x8e		/* UPC/EAN code, ISRC code (track) */
664 #define PACK_SIZEINFO	0x8f		/* Size info of the block */
665 
666 /*
667  * Read TOC command CD-TEXT pack descriptor
668  */
669 typedef struct toc_cdtext_pack {
670 	byte_t		pack_type;	/* Pack type */
671 	byte_t		trk_no;		/* Track Number */
672 	byte_t		seq_no;		/* Sequence number */
673 	byte_t		blk_char;	/* Block character */
674 	byte_t		data[SZ_CDTEXTPKD];
675 					/* Text data */
676 	byte_t		crc0;		/* CRC info */
677 	byte_t		crc1;		/* CRC info */
678 } toc_cdtext_pack_t;
679 
680 
681 /*
682  * Medium changer Read Element Status data structures
683  */
684 
685 /* Element status header */
686 typedef struct {
687 	unsigned int	firstelem:16;	/* first elem addr reported */
688 	unsigned int	numelem:16;	/* number of elems reported */
689 
690 	unsigned int	datalen:32;	/* report byte cnt max=0xffffff */
691 } elemhdr_t;
692 
693 
694 /* Element types */
695 #define ELEMTYP_ALL	0		/* all types */
696 #define ELEMTYP_MT	1		/* medium transport */
697 #define ELEMTYP_ST	2		/* storage */
698 #define ELEMTYP_IE	3		/* import export */
699 #define ELEMTYP_DT	4		/* data transfer */
700 
701 
702 /* Element status page */
703 typedef struct {
704 	unsigned int	type:8;		/* elem type code */
705 #if _BYTE_ORDER_ == _L_ENDIAN_
706 	unsigned int	res1:6;		/* reserved */
707 	unsigned int	avoltag:1;	/* avoltag */
708 	unsigned int	pvoltag:1;	/* pvoltag */
709 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
710 	unsigned int	pvoltag:1;	/* pvoltag */
711 	unsigned int	avoltag:1;	/* avoltag */
712 	unsigned int	res1:6;		/* reserved */
713 #endif	/* _BYTE_ORDER_ */
714 	unsigned int	desclen:16;	/* elem descriptor length each */
715 
716 	unsigned int	pagelen:32;	/* descriptors byte cnt max=0xffffff */
717 } elemstat_t;
718 
719 
720 /* Medium transport element descriptor */
721 typedef struct {
722 	unsigned int	elemaddr:16;	/* element address */
723 #if _BYTE_ORDER_ == _L_ENDIAN_
724 	unsigned int	full:1;		/* full */
725 	unsigned int	res2:1;		/* reserved */
726 	unsigned int	excpt:1;	/* except */
727 	unsigned int	res1:5;		/* reserved */
728 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
729 	unsigned int	res1:5;		/* reserved */
730 	unsigned int	excpt:1;	/* except */
731 	unsigned int	res2:1;		/* reserved */
732 	unsigned int	full:1;		/* full */
733 #endif	/* _BYTE_ORDER_ */
734 	unsigned int	res3:8;		/* reserved */
735 
736 	unsigned int	asc:8;		/* additional sense code */
737 	unsigned int	ascq:8;		/* additional sense code qualifier */
738 	unsigned int	res4:16;	/* reserved */
739 
740 	unsigned int	res5:8;		/* reserved */
741 #if _BYTE_ORDER_ == _L_ENDIAN_
742 	unsigned int	res6:6;		/* reserved */
743 	unsigned int	invert:1;	/* invert */
744 	unsigned int	svalid:1;	/* svalid */
745 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
746 	unsigned int	svalid:1;	/* svalid */
747 	unsigned int	invert:1;	/* invert */
748 	unsigned int	res6:6;		/* reserved */
749 #endif	/* _BYTE_ORDER_ */
750 	unsigned int	srcaddr:16;	/* source storage elem address */
751 
752 	byte_t		pri_voltag[35];	/* primary volume tag info */
753 	byte_t		alt_voltag[15];	/* alternate volume tag info */
754 } elemdesc_mt_t;
755 
756 
757 /* Storage element descriptor */
758 typedef struct {
759 	unsigned int	elemaddr:16;	/* element address */
760 #if _BYTE_ORDER_ == _L_ENDIAN_
761 	unsigned int	full:1;		/* full */
762 	unsigned int	res2:1;		/* reserved */
763 	unsigned int	excpt:1;	/* except */
764 	unsigned int	access:1;	/* access */
765 	unsigned int	res1:4;		/* reserved */
766 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
767 	unsigned int	res1:4;		/* reserved */
768 	unsigned int	access:1;	/* access */
769 	unsigned int	excpt:1;	/* except */
770 	unsigned int	res2:1;		/* reserved */
771 	unsigned int	full:1;		/* full */
772 #endif	/* _BYTE_ORDER_ */
773 	unsigned int	res3:8;		/* reserved */
774 
775 	unsigned int	asc:8;		/* additional sense code */
776 	unsigned int	ascq:8;		/* additional sense code qualifier */
777 	unsigned int	res4:16;	/* reserved */
778 
779 	unsigned int	res5:8;		/* reserved */
780 #if _BYTE_ORDER_ == _L_ENDIAN_
781 	unsigned int	res6:6;		/* reserved */
782 	unsigned int	invert:1;	/* invert */
783 	unsigned int	svalid:1;	/* svalid */
784 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
785 	unsigned int	svalid:1;	/* svalid */
786 	unsigned int	invert:1;	/* invert */
787 	unsigned int	res6:6;		/* reserved */
788 #endif	/* _BYTE_ORDER_ */
789 	unsigned int	srcaddr:16;	/* source storage elem address */
790 
791 	byte_t		pri_voltag[35];	/* primary volume tag info */
792 	byte_t		alt_voltag[15];	/* alternate volume tag info */
793 } elemdesc_st_t;
794 
795 
796 /* Import/export element descriptor */
797 typedef struct {
798 	unsigned int	elemaddr:16;	/* element address */
799 #if _BYTE_ORDER_ == _L_ENDIAN_
800 	unsigned int	full:1;		/* full */
801 	unsigned int	impexp:1;	/* impexp */
802 	unsigned int	excpt:1;	/* except */
803 	unsigned int	access:1;	/* access */
804 	unsigned int	exenab:1;	/* exenab */
805 	unsigned int	inenab:1;	/* inenab */
806 	unsigned int	res1:2;		/* reserved */
807 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
808 	unsigned int	res1:2;		/* reserved */
809 	unsigned int	inenab:1;	/* inenab */
810 	unsigned int	exenab:1;	/* exenab */
811 	unsigned int	access:1;	/* access */
812 	unsigned int	excpt:1;	/* except */
813 	unsigned int	impexp:1;	/* impexp */
814 	unsigned int	full:1;		/* full */
815 #endif	/* _BYTE_ORDER_ */
816 	unsigned int	res3:8;		/* reserved */
817 
818 	unsigned int	asc:8;		/* additional sense code */
819 	unsigned int	ascq:8;		/* additional sense code qualifier */
820 	unsigned int	res4:16;	/* reserved */
821 
822 	unsigned int	res5:8;		/* reserved */
823 #if _BYTE_ORDER_ == _L_ENDIAN_
824 	unsigned int	res6:6;		/* reserved */
825 	unsigned int	invert:1;	/* invert */
826 	unsigned int	svalid:1;	/* svalid */
827 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
828 	unsigned int	svalid:1;	/* svalid */
829 	unsigned int	invert:1;	/* invert */
830 	unsigned int	res6:6;		/* reserved */
831 #endif	/* _BYTE_ORDER_ */
832 	unsigned int	srcaddr:16;	/* source storage elem address */
833 
834 	byte_t		pri_voltag[35];	/* primary volume tag info */
835 	byte_t		alt_voltag[15];	/* alternate volume tag info */
836 } elemdesc_ie_t;
837 
838 
839 /* Data transfer element descriptor */
840 typedef struct {
841 	unsigned int	elemaddr:16;	/* element address */
842 #if _BYTE_ORDER_ == _L_ENDIAN_
843 	unsigned int	full:1;		/* full */
844 	unsigned int	res2:1;		/* reserved */
845 	unsigned int	excpt:1;	/* except */
846 	unsigned int	access:1;	/* access */
847 	unsigned int	res1:4;		/* reserved */
848 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
849 	unsigned int	res1:4;		/* reserved */
850 	unsigned int	access:1;	/* access */
851 	unsigned int	excpt:1;	/* except */
852 	unsigned int	res2:1;		/* reserved */
853 	unsigned int	full:1;		/* full */
854 #endif	/* _BYTE_ORDER_ */
855 	unsigned int	res3:8;		/* reserved */
856 
857 	unsigned int	asc:8;		/* additional sense code */
858 	unsigned int	ascq:8;		/* additional sense code qualifier */
859 #if _BYTE_ORDER_ == _L_ENDIAN_
860 	unsigned int	lun:3;		/* lun */
861 	unsigned int	res5:1;		/* reserved */
862 	unsigned int	luvalid:1;	/* luvalid */
863 	unsigned int	idvalid:1;	/* idvalid */
864 	unsigned int	res6:1;		/* reserved */
865 	unsigned int	notbus:1;	/* notbus */
866 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
867 	unsigned int	notbus:1;	/* notbus */
868 	unsigned int	res6:1;		/* reserved */
869 	unsigned int	idvalid:1;	/* idvalid */
870 	unsigned int	luvalid:1;	/* luvalid */
871 	unsigned int	res5:1;		/* reserved */
872 	unsigned int	lun:3;		/* lun */
873 #endif	/* _BYTE_ORDER_ */
874 	unsigned int	busaddr:8;	/* scsi bus addr */
875 
876 	unsigned int	res7:8;		/* reserved */
877 #if _BYTE_ORDER_ == _L_ENDIAN_
878 	unsigned int	res8:6;		/* reserved */
879 	unsigned int	invert:1;	/* invert */
880 	unsigned int	svalid:1;	/* svalid */
881 #else	/* _BYTE_ORDER_ == _B_ENDIAN_ */
882 	unsigned int	svalid:1;	/* svalid */
883 	unsigned int	invert:1;	/* invert */
884 	unsigned int	res8:6;		/* reserved */
885 #endif	/* _BYTE_ORDER_ */
886 	unsigned int	srcaddr:16;	/* source storage elem address */
887 
888 	byte_t		pri_voltag[35];	/* primary volume tag info */
889 	byte_t		alt_voltag[15];	/* alternate volume tag info */
890 } elemdesc_dt_t;
891 
892 
893 /* Union of all element descriptors */
894 typedef union {
895 	elemdesc_mt_t	mt;		/* medium transport elem descriptor */
896 	elemdesc_st_t	st;		/* storage elem descriptor */
897 	elemdesc_ie_t	ie;		/* import/export elem descriptor */
898 	elemdesc_dt_t	dt;		/* data transfer elem descriptor */
899 } elemdesc_t;
900 
901 
902 /*
903  * Medium changer parameters structure
904  */
905 typedef struct {
906 	word16_t	mtbase;		/* Medium transport element base addr */
907 	word16_t	stbase;		/* Storage element base addr */
908 	word16_t	iebase;		/* Import/export element base addr */
909 	word16_t	dtbase;		/* Data transfer element base addr */
910 } mcparm_t;
911 
912 
913 /* Defines for the addrfmt field of the cdda_req_t structure */
914 #define READFMT_LBA	0x1
915 #define READFMT_MSF	0x2
916 
917 /*
918  * Read CDDA request structure
919  */
920 typedef struct cdda_req {
921 	lmsf_t		pos;		/* Address location to read */
922 	int		nframes;	/* Number of frames to read */
923 	byte_t		*buf;		/* Data buffer pointer */
924 	byte_t		addrfmt;	/* Address format */
925 } cdda_req_t;
926 
927 
928 
929 /***** Additional include files *****/
930 
931 /* OS interface library headers */
932 #include "libdi_d/os_aix.h"		/* IBM AIX */
933 #include "libdi_d/os_aux.h"		/* Apple A/UX */
934 #include "libdi_d/os_bsdi.h"		/* BSDI BSD/OS */
935 #include "libdi_d/os_dec.h"		/* Digital OSF/1 & Ultrix */
936 #include "libdi_d/os_dgux.h"		/* Data General DG/UX */
937 #include "libdi_d/os_fnbsd.h"		/* FreeBSD/NetBSD */
938 #include "libdi_d/os_hpux.h"		/* HP-UX */
939 #include "libdi_d/os_irix.h"		/* SGI IRIX */
940 #include "libdi_d/os_linux.h"		/* Linux */
941 #include "libdi_d/os_news.h"		/* Sony NEWS-OS */
942 #include "libdi_d/os_sco.h"		/* SCO UNIX/Open Desktop/Open Server */
943 #include "libdi_d/os_sinix.h"		/* SNI SINIX */
944 #include "libdi_d/os_sun.h"		/* SunOS */
945 #include "libdi_d/os_svr4.h"		/* SVR4 */
946 #include "libdi_d/os_vms.h"		/* Digital OpenVMS */
947 
948 /* If compiling on a non-supported OS, force demo-only mode */
949 #if !defined(OS_MODULE) && !defined(DEMO_ONLY)
950 #define DEMO_ONLY
951 #endif
952 
953 /* If demo-only, no need to compile in the vendor-unique modules */
954 #ifdef DEMO_ONLY
955 #ifdef VENDOR_CHINON
956 #undef VENDOR_CHINON
957 #endif
958 #ifdef VENDOR_HITACHI
959 #undef VENDOR_HITACHI
960 #endif
961 #ifdef VENDOR_NEC
962 #undef VENDOR_NEC
963 #endif
964 #ifdef VENDOR_PIONEER
965 #undef VENDOR_PIONEER
966 #endif
967 #ifdef VENDOR_SONY
968 #undef VENDOR_SONY
969 #endif
970 #ifdef VENDOR_TOSHIBA
971 #undef VENDOR_TOSHIBA
972 #endif
973 #ifdef VENDOR_PANASONIC
974 #undef VENDOR_PANASONIC
975 #endif
976 #endif	/* DEMO_ONLY */
977 
978 /* Demo mode support header */
979 #include "libdi_d/os_demo.h"
980 
981 /* Vendor-unique library headers */
982 #include "libdi_d/vu_chin.h"		/* Chinon vendor-unique header */
983 #include "libdi_d/vu_hita.h"		/* Hitachi vendor-unique header */
984 #include "libdi_d/vu_nec.h"		/* NEC vendor-unique header */
985 #include "libdi_d/vu_pana.h"		/* Panasonic vendor-unique header */
986 #include "libdi_d/vu_pion.h"		/* Pioneer vendor-unique header */
987 #include "libdi_d/vu_sony.h"		/* Sony vendor-unique header */
988 #include "libdi_d/vu_tosh.h"		/* Toshiba vendor-unique header */
989 
990 /*
991  * Functions for vendor-unique module use only
992  */
993 extern bool_t	scsipt_rezero_unit(di_dev_t *, int);
994 extern bool_t	scsipt_tst_unit_rdy(di_dev_t *, int, req_sense_data_t *,
995 				    bool_t);
996 extern bool_t	scsipt_request_sense(di_dev_t *, int, byte_t *, size_t);
997 extern bool_t	scsipt_rdsubq(di_dev_t *, int, byte_t, byte_t, cdstat_t *,
998 			      char *, char *, bool_t);
999 extern bool_t	scsipt_modesense(di_dev_t *, int, byte_t *, byte_t,
1000 				 byte_t, size_t);
1001 extern bool_t	scsipt_modesel(di_dev_t *, int, byte_t *, byte_t, size_t);
1002 extern bool_t	scsipt_inquiry(di_dev_t *, int, byte_t *, size_t);
1003 extern bool_t	scsipt_rdtoc(di_dev_t *, int, byte_t *, size_t, int, int,
1004 			     bool_t, bool_t);
1005 extern bool_t	scsipt_playmsf(di_dev_t *, int, msf_t *, msf_t *);
1006 extern bool_t	scsipt_play10(di_dev_t *, int, sword32_t, sword32_t);
1007 extern bool_t	scsipt_play12(di_dev_t *, int, sword32_t, sword32_t);
1008 extern bool_t	scsipt_play_trkidx(di_dev_t *, int, int, int, int, int);
1009 extern bool_t	scsipt_read_cdda(di_dev_t *, int, cdda_req_t *, size_t, int,
1010 				 req_sense_data_t *);
1011 extern bool_t	scsipt_prev_allow(di_dev_t *, int, bool_t);
1012 extern bool_t	scsipt_start_stop(di_dev_t *, int, bool_t, bool_t, bool_t);
1013 extern bool_t	scsipt_pause_resume(di_dev_t *, int, bool_t);
1014 extern bool_t	scsipt_move_medium(di_dev_t *, int,
1015 				   word16_t, word16_t, word16_t);
1016 extern bool_t	scsipt_init_elemstat(di_dev_t *, int);
1017 extern bool_t	scsipt_read_elemstat(di_dev_t *, int, byte_t *, size_t, int);
1018 extern bool_t	scsipt_disc_present(di_dev_t *, int, curstat_t *,
1019 				    req_sense_data_t *);
1020 
1021 #endif	/* DI_SCSIPT CDDA_RD_SCSIPT */
1022 
1023 #ifdef DI_SCSIPT
1024 
1025 /*
1026  * Vendor-unique module initialization jump table
1027  */
1028 typedef struct {
1029 	void		(*init)(void);	/* VU init function */
1030 } vuinit_tbl_t;
1031 
1032 
1033 /*
1034  * Vendor-unique module entry jump table
1035  */
1036 typedef struct {
1037 	/* Vendor name string */
1038 	char		*vendor;
1039 
1040 	/* Play audio function */
1041 	bool_t		(*playaudio)(byte_t, sword32_t, sword32_t,
1042 				     msf_t *, msf_t *, byte_t, byte_t);
1043 
1044 	/* Pause/resume function */
1045 	bool_t		(*pause_resume)(bool_t);
1046 
1047 	/* Start/stop function */
1048 	bool_t		(*start_stop)(bool_t, bool_t);
1049 
1050 	/* Playback status function */
1051 	bool_t		(*get_playstatus)(cdstat_t *);
1052 
1053 	/* Playback volume function */
1054 	int		(*volume)(int, curstat_t *, bool_t);
1055 
1056 	/* Channel routing function */
1057 	bool_t		(*route)(curstat_t *);
1058 
1059 	/* Playback mute function */
1060 	bool_t		(*mute)(bool_t);
1061 
1062 	/* Read TOC function */
1063 	bool_t		(*get_toc)(curstat_t *);
1064 
1065 	/* Eject function */
1066 	bool_t		(*eject)(void);
1067 
1068 	/* Module start function */
1069 	void		(*start)(void);
1070 
1071 	/* Module halt function */
1072 	void		(*halt)(void);
1073 } vu_tbl_t;
1074 
1075 
1076 /*
1077  * Public functions
1078  */
1079 extern char	*scsipt_reqsense_keystr(int);
1080 extern void	scsipt_enable(di_dev_t *, int);
1081 extern void	scsipt_disable(di_dev_t *, int);
1082 extern bool_t	scsipt_is_enabled(di_dev_t *, int);
1083 extern void	scsipt_init(curstat_t *, di_tbl_t *);
1084 extern void	scsipt_load_cdtext(curstat_t *, di_cdtext_t *);
1085 extern bool_t	scsipt_playmode(curstat_t *);
1086 extern bool_t	scsipt_check_disc(curstat_t *);
1087 extern void	scsipt_status_upd(curstat_t *);
1088 extern void	scsipt_lock(curstat_t *, bool_t);
1089 extern void	scsipt_repeat(curstat_t *, bool_t);
1090 extern void	scsipt_shuffle(curstat_t *, bool_t);
1091 extern void	scsipt_load_eject(curstat_t *);
1092 extern void	scsipt_ab(curstat_t *);
1093 extern void	scsipt_sample(curstat_t *);
1094 extern void	scsipt_level(curstat_t *, byte_t, bool_t);
1095 extern void	scsipt_play_pause(curstat_t *);
1096 extern void	scsipt_stop(curstat_t *, bool_t);
1097 extern void	scsipt_chgdisc(curstat_t *);
1098 extern void	scsipt_prevtrk(curstat_t *);
1099 extern void	scsipt_nexttrk(curstat_t *);
1100 extern void	scsipt_previdx(curstat_t *);
1101 extern void	scsipt_nextidx(curstat_t *);
1102 extern void	scsipt_rew(curstat_t *, bool_t);
1103 extern void	scsipt_ff(curstat_t *, bool_t);
1104 extern void	scsipt_warp(curstat_t *);
1105 extern void	scsipt_route(curstat_t *);
1106 extern void	scsipt_mute_on(curstat_t *);
1107 extern void	scsipt_mute_off(curstat_t *);
1108 extern void	scsipt_cddajitter(curstat_t *);
1109 extern void	scsipt_debug(void);
1110 extern void	scsipt_start(curstat_t *);
1111 extern void	scsipt_icon(curstat_t *, bool_t);
1112 extern void	scsipt_halt(curstat_t *);
1113 extern char	*scsipt_methodstr(void);
1114 
1115 #else
1116 
1117 #define scsipt_init	NULL
1118 
1119 #endif	/* DI_SCSIPT */
1120 
1121 #endif	/* __SCSIPT_H__ */
1122 
1123