1 /*
2  * This file has been modified for the cdrkit suite.
3  *
4  * The behaviour and appearence of the program code below can differ to a major
5  * extent from the version distributed by the original author(s).
6  *
7  * For details, see Changelog file distributed with the cdrkit package. If you
8  * received this file from another source then ask the distributing person for
9  * a log of modifications.
10  *
11  */
12 
13 /* @(#)cdrecord.h	1.165 05/06/11 Copyright 1995-2005 J. Schilling */
14 /*
15  *	Definitions for cdrecord
16  *
17  *	Copyright (c) 1995-2005 J. Schilling
18  */
19 /*
20  * This program is free software; you can redistribute it and/or modify
21  * it under the terms of the GNU General Public License version 2
22  * as published by the Free Software Foundation.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License along with
30  * this program; see the file COPYING.  If not, write to the Free Software
31  * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32  */
33 
34 /*
35  * Make sure it is there. We need it for off_t.
36  */
37 #ifndef	_INCL_SYS_TYPES_H
38 #include <sys/types.h>
39 #define	_INCL_SYS_TYPES_H
40 #endif
41 
42 #ifndef	_UTYPES_H
43 #include <utypes.h>
44 #endif
45 
46 /*
47  * Defines for command line option flags
48  */
49 #define	F_DUMMY		0x00000001L	/* Do dummy (simulation) writes */
50 #define	F_TOC		0x00000002L	/* Get TOC */
51 #define	F_EJECT		0x00000004L	/* Eject disk after doing the work */
52 #define	F_LOAD		0x00000008L	/* Load disk only */
53 #define	F_MULTI		0x00000010L	/* Create linkable TOC/multi-session */
54 #define	F_MSINFO	0x00000020L	/* Get multi-session info */
55 #define	F_FIX		0x00000040L	/* Fixate disk only */
56 #define	F_NOFIX		0x00000080L	/* Do not fixate disk */
57 #define	F_VERSION	0x00000100L	/* Print version info */
58 #define	F_CHECKDRIVE	0x00000200L	/* Check for driver */
59 #define	F_INQUIRY	0x00000400L	/* Do inquiry */
60 #define	F_PRCAP		0x00000800L	/* Print capabilities */
61 #define	F_SCANBUS	0x00001000L	/* Scan SCSI Bus */
62 #define	F_RESET		0x00002000L	/* Reset SCSI Bus */
63 #define	F_BLANK		0x00004000L	/* Blank CD-RW */
64 #define	F_PRATIP	0x00008000L	/* Print ATIP info */
65 #define	F_PRDINFO	0x00010000L	/* Print disk info (XXX not yet used)  */
66 #define	F_IGNSIZE	0x00020000L	/* Ignore disk size */
67 #define	F_SAO		0x00040000L	/* Session at once */
68 #define	F_RAW		0x00080000L	/* Raw mode */
69 #define	F_WRITE		0x00100000L	/* Disk is going to be written */
70 #define	F_FORCE		0x00200000L	/* Force things (e.g. blank on dead disk)  */
71 #define	F_WAITI		0x00400000L	/* Wait until data is available on stdin */
72 #define	F_OVERBURN	0x00800000L	/* Allow oveburning */
73 #define	F_CLONE		0x01000000L	/* Do clone writing */
74 #define	F_STDIN		0x02000000L	/* We are using stdin as CD data */
75 #define	F_IMMED		0x04000000L	/* Try tu use IMMED SCSI flag if possible */
76 #define	F_DLCK		0x08000000L	/* Load disk and lock door */
77 #define	F_SETDROPTS	0x10000000L	/* Set driver opts and exit */
78 #define	F_FORMAT	0x20000000L	/* Format media */
79 #define	F_ABORT		0x40000000L	/* Send abort sequence to drive */
80 
81 #ifdef	min
82 #undef	min
83 #endif
84 #define	min(a, b)	((a) < (b) ? (a):(b))
85 
86 #ifdef	max
87 #undef	max
88 #endif
89 #define	max(a, b)	((a) < (b) ? (b):(a))
90 
91 #undef	roundup
92 #define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))
93 
94 /*
95  * NOTICE:	You should not make CDR_BUF_SIZE more than
96  *		the buffer size of the CD-Recorder.
97  *
98  * The Philips CDD 521 is the recorder with the smallest buffer.
99  * It only has 256kB of buffer RAM.
100  *
101  * WARNING:	Philips CDD 521 dies if CDR_BUF_SIZE is to big.
102  *		If you like to support the CDD 521 keep the buffer
103  *		at 63kB.
104  */
105 /*#define	CDR_BUF_SIZE	(126*1024)*/
106 #define	CDR_BUF_SIZE		(63*1024)
107 #define	CDR_MAX_BUF_SIZE	(256*1024)
108 
109 /*
110  * Never set MIN_GRACE_TIME < 3 seconds. We need to give
111  * the volume management a chance to settle before we
112  * start writing.
113  */
114 #ifndef	MIN_GRACE_TIME
115 #define	MIN_GRACE_TIME	0		/* changed to 0, there is no point in forcing it in this application. Fix your volume management if it breaks because it could not read the medium. */
116 #endif
117 #ifndef	GRACE_TIME
118 #define	GRACE_TIME	4
119 #endif
120 
121 /*
122  * Some sector sizes used for reading/writing ...
123  */
124 #define	DATA_SEC_SIZE	2048		/* 2048 bytes */
125 #define	MODE2_SEC_SIZE	2336		/* 2336 bytes */
126 #define	AUDIO_SEC_SIZE	2352		/* 2352 bytes */
127 #define	RAW16_SEC_SIZE	(2352+16)	/* 2368 bytes */
128 #define	RAW96_SEC_SIZE	(2352+96)	/* 2448 bytes */
129 
130 #define	MAX_TRACK	99	/* Red Book track limit */
131 
132 #define	PAD_SECS	15	/* NOTE: pad must be less than BUF_SIZE */
133 #define	PAD_SIZE	(PAD_SECS * DATA_SEC_SIZE)
134 
135 /*
136  * FIFO size must be at least 2x CDR_MAX_BUF_SIZE
137  */
138 #define	DEFAULT_FIFOSIZE (4L*1024L*1024L)
139 
140 #if	!defined(HAVE_LARGEFILES) && SIZEOF_LLONG > SIZEOF_LONG
141 typedef	Llong	tsize_t;
142 #else
143 typedef	off_t	tsize_t;
144 #endif
145 
146 #ifdef	nono
147 typedef struct tindex {
148 	int	dummy;		/* Not yet implemented */
149 } tindex_t;
150 #endif
151 
152 typedef struct ofile {
153 	struct ofile *next;	/* Next open file			*/
154 	int	f;		/* Open file				*/
155 	char	*filename;	/* File name				*/
156 	int	refcnt;		/* open reference count			*/
157 } ofile_t;
158 
159 typedef struct track {
160 	void	*xfp;		/* Open file for this track from xopen()*/
161 	char	*filename;	/* File name for this track		*/
162 
163 	tsize_t	itracksize;	/* Size of track bytes (-1 == until EOF)*/
164 				/* This is in units of isecsize		*/
165 	tsize_t	tracksize;	/* Size of track bytes (-1 == until EOF)*/
166 				/* This is in units of secsize		*/
167 
168 	long	trackstart;	/* Start sector # of this track		*/
169 	long	tracksecs;	/* Size of this track (sectors)		*/
170 	long	padsecs;	/* Pad size for this track (sectors)	*/
171 	long	pregapsize;	/* Pre-gap size for this track (sectors)*/
172 	long	index0start;	/* Index 0 start within this tr(sectors)*/
173 	int	isecsize;	/* Read input sector size for this track*/
174 	int	secsize;	/* Sector size for this track (bytes)	*/
175 	int	secspt;		/* # of sectors to copy for one transfer*/
176 	int	pktsize;	/* # of blocks per write packet		*/
177 	Uchar	dataoff;	/* offset of user data in raw sector	*/
178 	Uchar	tracks;		/* Number of tracks on this disk	*/
179 	Uchar	track;		/* Track # as offset in track[] array	*/
180 	Uchar	trackno;	/* Track # on disk for this track	*/
181 	Uchar	tracktype;	/* Track type (toc type)		*/
182 	Uchar	dbtype;		/* Data block type for this track	*/
183 	int	sectype;	/* Sector type				*/
184 	int	flags;		/* Flags (see below)			*/
185 	int	nindex;		/* Number of indices for track		*/
186 	long	*tindex;	/* Track index descriptor		*/
187 	char	*isrc;		/* ISRC code for this track / disk MCN	*/
188 	void	*text;		/* Opaque CD-Text data (txtptr_t *)	*/
189 } track_t;
190 
191 #define	track_base(tp)	((tp) - (tp)->track)
192 
193 /*
194  * Defines for tp->flags
195  */
196 #define	TI_AUDIO	0x00001	/* File is an audio track		*/
197 #define	TI_PREEMP	0x00002	/* Audio track recorded w/preemphasis	*/
198 #define	TI_MIX		0x00004	/* This is a mixed mode track		*/
199 #define	TI_RAW		0x00008	/* Write this track in raw mode		*/
200 #define	TI_PAD		0x00010	/* Pad data track			*/
201 #define	TI_SWAB		0x00020	/* Swab audio data			*/
202 #define	TI_ISOSIZE	0x00040	/* Use iso size for track		*/
203 #define	TI_NOAUHDR	0x00080	/* Don't look for audio header		*/
204 #define	TI_FIRST	0x00100	/* This is the first track		*/
205 #define	TI_LAST		0x00200	/* This is the last track		*/
206 #define	TI_PACKET	0x00400	/* Fixed- or variable-packet track	*/
207 #define	TI_NOCLOSE	0x00800	/* Don't close the track after writing	*/
208 #define	TI_TAO		0x01000	/* This track is written in TAO mode	*/
209 #define	TI_PREGAP	0x02000	/* Prev. track incl. pregap of this tr. */
210 #define	TI_SCMS		0x04000	/* Force to follow the SCMS rules	*/
211 #define	TI_COPY		0x08000	/* Allow digital copy			*/
212 #define	TI_SHORT_TRACK	0x10000	/* Ignore min 4 second Red Book	std.	*/
213 #define	TI_RAW16	0x20000	/* This track uses 16 bytes subch.	*/
214 #define	TI_RAW96R	0x40000	/* This track uses 96 bytes RAW subch.	*/
215 #define	TI_CLONE	0x80000	/* Special clone treatment needed	*/
216 #define	TI_TEXT		0x100000 /* This track holds CD-Text information */
217 #define	TI_DVD		0x200000 /* We are writing a DVD track		*/
218 #define	TI_SAO		0x400000 /* This track is written in SAO mode	*/
219 #define	TI_USEINFO	0x800000 /* Use information from *.inf files	*/
220 #define	TI_QUADRO	0x1000000 /* Four Channel Audio Data		*/
221 
222 
223 #define	is_audio(tp)	(((tp)->flags & TI_AUDIO) != 0)
224 #define	is_preemp(tp)	(((tp)->flags & TI_PREEMP) != 0)
225 #define	is_pad(tp)	(((tp)->flags & TI_PAD) != 0)
226 #define	is_swab(tp)	(((tp)->flags & TI_SWAB) != 0)
227 #define	is_first(tp)	(((tp)->flags & TI_FIRST) != 0)
228 #define	is_last(tp)	(((tp)->flags & TI_LAST) != 0)
229 #define	is_packet(tp)	(((tp)->flags & TI_PACKET) != 0)
230 #define	is_noclose(tp)	(((tp)->flags & TI_NOCLOSE) != 0)
231 #define	is_tao(tp)	(((tp)->flags & TI_TAO) != 0)
232 #define	is_sao(tp)	(((tp)->flags & TI_SAO) != 0)
233 #define	is_raw(tp)	(((tp)->flags & TI_RAW) != 0)
234 #define	is_raw16(tp)	(((tp)->flags & TI_RAW16) != 0)
235 #define	is_raw96(tp)	(((tp)->flags & (TI_RAW|TI_RAW16)) == TI_RAW)
236 #define	is_raw96p(tp)	(((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == TI_RAW)
237 #define	is_raw96r(tp)	(((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == (TI_RAW|TI_RAW96R))
238 #define	is_pregap(tp)	(((tp)->flags & TI_PREGAP) != 0)
239 #define	is_scms(tp)	(((tp)->flags & TI_SCMS) != 0)
240 #define	is_copy(tp)	(((tp)->flags & TI_COPY) != 0)
241 #define	is_shorttrk(tp)	(((tp)->flags & TI_SHORT_TRACK) != 0)
242 #define	is_clone(tp)	(((tp)->flags & TI_CLONE) != 0)
243 #define	is_text(tp)	(((tp)->flags & TI_TEXT) != 0)
244 #define	is_quadro(tp)	(((tp)->flags & TI_QUADRO) != 0)
245 
246 /*
247  * Defines for toc type / track type
248  */
249 #define	TOC_DA		0	/* CD-DA				*/
250 #define	TOC_ROM		1	/* CD-ROM				*/
251 #define	TOC_XA1		2	/* CD_ROM XA with first track in mode 1 */
252 #define	TOC_XA2		3	/* CD_ROM XA with first track in mode 2 */
253 #define	TOC_CDI		4	/* CDI					*/
254 
255 #define	TOC_MASK	7	/* Mask needed for toctname[]		*/
256 
257 /*
258  * Additional flags in toc type / trackp->tracktype
259  * XXX TOCF_DUMMY istr schon in dp->cdr_cmdflags & F_DUMMY
260  * XXX TOCF_MULTI istr schon in dp->cdr_cmdflags & F_MULTI
261  */
262 #define	TOCF_DUMMY	0x10	/* Write in dummy (simulation) mode	*/
263 #define	TOCF_MULTI	0x20	/* Multisession (Open Next Programarea) */
264 
265 #define	TOCF_MASK	0xF0	/* All possible flags in tracktype	*/
266 
267 extern	char	*toc2name[];	/* Convert toc type to name		*/
268 extern	int	toc2sess[];	/* Convert toc type to session format	*/
269 
270 /*
271  * Defines for sector type
272  *
273  * Mode is 2 bits
274  * Aud  is 1 bit
275  *
276  * Sector is: aud << 2 | mode
277  */
278 #define	ST_ROM_MODE1	1	/* CD-ROM in mode 1 (vanilla cdrom)	*/
279 #define	ST_ROM_MODE2	2	/* CD-ROM in mode 2			*/
280 #define	ST_AUDIO_NOPRE	4	/* CD-DA stereo without preemphasis	*/
281 #define	ST_AUDIO_PRE	5	/* CD-DA stereo with preemphasis	*/
282 
283 #define	ST_PREEMPMASK	0x01	/* Mask for preemphasis bit		*/
284 #define	ST_AUDIOMASK	0x04	/* Mask for audio bit			*/
285 #define	ST_MODEMASK	0x03	/* Mask for mode bits in sector type	*/
286 #define	ST_MASK		0x07	/* Mask needed for sectname[]		*/
287 
288 /*
289  * There are 6 different generic basic sector types.
290  */
291 #define	ST_MODE_AUDIO	 0x00	/* Generic Audio mode			*/
292 #define	ST_MODE_0	 0x10	/* Generic Zero mode			*/
293 #define	ST_MODE_1	 0x20	/* Generic CD-ROM mode	(ISO/IEC 10149)	*/
294 #define	ST_MODE_2	 0x30	/* Generic Mode 2	(ISO/IEC 10149)	*/
295 #define	ST_MODE_2_FORM_1 0x40	/* Generic Mode 2 form 1		*/
296 #define	ST_MODE_2_FORM_2 0x50	/* Generic Mode 2 form 2		*/
297 #define	ST_MODE_2_MIXED	 0x60	/* Generic Mode 2 mixed form (1/2)	*/
298 
299 #define	ST_MODE_MASK	 0x70	/* Mask needed to get generic sectype	*/
300 
301 #define	ST_MODE_RAW	 0x08	/* Do not touch EDC & subchannels	*/
302 #define	ST_NOSCRAMBLE	 0x80	/* Do not srcamble sectors 		*/
303 
304 #define	SECT_AUDIO	(ST_AUDIO_NOPRE  | ST_MODE_AUDIO)
305 #define	SECT_AUDIO_NOPRE (ST_AUDIO_NOPRE | ST_MODE_AUDIO)
306 #define	SECT_AUDIO_PRE	(ST_AUDIO_PRE    | ST_MODE_AUDIO)
307 #define	SECT_MODE_0	(ST_ROM_MODE1    | ST_MODE_0)
308 #define	SECT_ROM	(ST_ROM_MODE1    | ST_MODE_1)
309 #define	SECT_MODE_2	(ST_ROM_MODE2    | ST_MODE_2)
310 #define	SECT_MODE_2_F1	(ST_ROM_MODE2    | ST_MODE_2_FORM_1)
311 #define	SECT_MODE_2_F2	(ST_ROM_MODE2    | ST_MODE_2_FORM_2)
312 #define	SECT_MODE_2_MIX	(ST_ROM_MODE2    | ST_MODE_2_MIXED)
313 
314 extern	char	*st2name[];	/* Convert sector type to name		*/
315 extern	int	st2mode[];	/* Convert sector type to control nibble*/
316 
317 /*
318  * Control nibble bits:
319  *
320  * 0	with preemphasis (audio) / incremental (data)
321  * 1	digital copy permitted
322  * 2	data (not audio) track
323  * 3	4 channels (not 2)
324  */
325 #define	TM_PREEM	0x1	/* Audio track with preemphasis	*/
326 #define	TM_INCREMENTAL	0x1	/* Incremental data track	*/
327 #define	TM_ALLOW_COPY	0x2	/* Digital copy permitted	*/
328 #define	TM_DATA		0x4	/* This is a data track		*/
329 #define	TM_QUADRO	0x8	/* Four channel audio		*/
330 
331 /*
332  * Adr nibble:
333  */
334 #define	ADR_NONE	0	/* Sub-Q mode info not supplied		*/
335 #define	ADR_POS		1	/* Sub-Q encodes position data		*/
336 #define	ADR_MCN		2	/* Sub-Q encodes Media Catalog Number	*/
337 #define	ADR_ISRC	3	/* Sub-Q encodes ISRC			*/
338 
339 /*
340  * Defines for write type (from SCSI-3/mmc)
341  */
342 #define	WT_PACKET	0x0	/* Packet writing	*/
343 #define	WT_TAO		0x1	/* Track at once	*/
344 #define	WT_SAO		0x2	/* Session at once	*/
345 #define	WT_RAW		0x3	/* Raw			*/
346 #define	WT_RES_4	0x4	/* Reserved		*/
347 #define	WT_RES_5	0x5	/* Reserved		*/
348 #define	WT_RES_6	0x6	/* Reserved		*/
349 #define	WT_RES_7	0x7	/* Reserved		*/
350 #define	WT_RES_8	0x8	/* Reserved		*/
351 #define	WT_RES_9	0x9	/* Reserved		*/
352 #define	WT_RES_A	0xA	/* Reserved		*/
353 #define	WT_RES_B	0xB	/* Reserved		*/
354 #define	WT_RES_C	0xC	/* Reserved		*/
355 #define	WT_RES_D	0xD	/* Reserved		*/
356 #define	WT_RES_E	0xE	/* Reserved		*/
357 #define	WT_RES_F	0xF	/* Reserved		*/
358 
359 /*
360  * Data block layout:
361  *
362  *	-	Sync pattern 12 Bytes:	0x00 0xFF 0xFF ... 0xFF 0xFF 0x00
363  *	-	Block header 4  Bytes:	| minute | second | frame | mode |
364  *		Mode byte:
365  *			Bits 7, 6, 5	Run-in/Run-out/Link
366  *			Bits 4, 3, 2	Reserved
367  *			Bits 1, 0	Mode
368  *	-	Rest of sector see below.
369  *
370  * Mode 0 Format:
371  *	0	12   Bytes Sync header
372  *	12	4    Bytes Block header with Data mode == 0
373  *	16	2336 Bytes of zero data
374  *
375  * Mode 1 Format:
376  *	0	12   Bytes Sync header
377  *	12	4    Bytes Block header with Data mode == 1
378  *	16	2048 Bytes of user data
379  *	2064	4    Bytes CRC for Bytes 0-2063
380  *	2068	8    Bytes Zero fill
381  *	2076	172  Bytes P parity symbols
382  *	2248	104  Bytes Q parity symbols
383  *
384  * Mode 2 Format (formless):
385  *	0	12   Bytes Sync header
386  *	12	4    Bytes Block header with Data mode == 2
387  *	16	2336 Bytes of user data
388  *
389  * Mode 2 form 1 Format:
390  *	0	12   Bytes Sync header
391  *	12	4    Bytes Block header with Data mode == 2
392  *	16	4    Bytes subheader first copy
393  *	20	4    Bytes subheader second copy
394  *	24	2048 Bytes of user data
395  *	2072	4    Bytes CRC for Bytes 16-2071
396  *	2076	172  Bytes P parity symbols
397  *	2248	104  Bytes Q parity symbols
398  *
399  * Mode 2 form 2 Format:
400  *	0	12   Bytes Sync header
401  *	12	4    Bytes Block header with Data mode == 2
402  *	16	4    Bytes subheader first copy
403  *	20	4    Bytes subheader second copy
404  *	24	2324 Bytes of user data
405  *	2348	4    Bytes Optional CRC for Bytes 16-2347
406  */
407 
408 /*
409  * Mode Byte definitions (the 4th Byte in the Block header)
410  */
411 #define	SH_MODE_DATA	0x00	/* User Data Block	*/
412 #define	SH_MODE_RI4	0x20	/* Fourth run in Block	*/
413 #define	SH_MODE_RI3	0x40	/* Third run in Block	*/
414 #define	SH_MODE_RI2	0x60	/* Second run in Block	*/
415 #define	SH_MODE_RI1	0x80	/* First run in Block	*/
416 #define	SH_MODE_LINK	0xA0	/* Link Block		*/
417 #define	SH_MODE_RO2	0xC0	/* Second run out Block	*/
418 #define	SH_MODE_RO1	0xE0	/* First run out Block	*/
419 #define	SH_MODE_M0	0x00	/* Mode 0 Data		*/
420 #define	SH_MODE_M1	0x01	/* Mode 1 Data		*/
421 #define	SH_MODE_M2	0x02	/* Mode 2 Data		*/
422 #define	SH_MODE_MR	0x03	/* Reserved		*/
423 
424 /*
425  * Defines for data block type (from SCSI-3/mmc)
426  *
427  * Mandatory are only:
428  *	DB_ROM_MODE1	(8)	Mode 1     (ISO/IEC 10149)
429  *	DB_XA_MODE2	(10)	Mode 2-F1  (CD-ROM XA form 1)
430  *	DB_XA_MODE2_MIX	(13)	Mode 2-MIX (CD-ROM XA 1/2+subhdr)
431  */
432 #define	DB_RAW		0	/* 2352 bytes of raw data		  */
433 #define	DB_RAW_PQ	1	/* 2368 bytes (raw data + P/Q Subchannel) */
434 #define	DB_RAW_PW	2	/* 2448 bytes (raw data + P-W Subchannel) */
435 #define	DB_RAW_PW_R	3	/* 2448 bytes (raw data + P-W raw Subchannel)*/
436 #define	DB_RES_4	4	/* -	Reserved			  */
437 #define	DB_RES_5	5	/* -	Reserved			  */
438 #define	DB_RES_6	6	/* -	Reserved			  */
439 #define	DB_VU_7		7	/* -	Vendor specific			  */
440 #define	DB_ROM_MODE1	8	/* 2048 bytes Mode 1 (ISO/IEC 10149)	  */
441 #define	DB_ROM_MODE2	9	/* 2336 bytes Mode 2 (ISO/IEC 10149)	  */
442 #define	DB_XA_MODE2	10	/* 2048 bytes Mode 2 (CD-ROM XA form 1)   */
443 #define	DB_XA_MODE2_F1	11	/* 2056 bytes Mode 2 (CD-ROM XA form 1)	  */
444 #define	DB_XA_MODE2_F2	12	/* 2324 bytes Mode 2 (CD-ROM XA form 2)	  */
445 #define	DB_XA_MODE2_MIX	13	/* 2332 bytes Mode 2 (CD-ROM XA 1/2+subhdr) */
446 #define	DB_RES_14	14	/* -	Reserved			  */
447 #define	DB_VU_15	15	/* -	Vendor specific			  */
448 
449 extern	char	*db2name[];	/* Convert data block type to name	  */
450 
451 /*
452  * Defines for multi session type (from SCSI-3/mmc)
453  */
454 #define	MS_NONE		0	/* No B0 pointer. Next session not allowed*/
455 #define	MS_FINAL	1	/* B0 = FF:FF:FF. Next session not allowed*/
456 #define	MS_RES		2	/* Reserved				  */
457 #define	MS_MULTI	3	/* B0 = Next PA.  Next session allowed	  */
458 
459 /*
460  * Defines for session format (from SCSI-3/mmc)
461  */
462 #define	SES_DA_ROM	0x00	/* CD-DA or CD-ROM disk			  */
463 #define	SES_CDI		0x10	/* CD-I disk				  */
464 #define	SES_XA		0x20	/* CD-ROM XA disk			  */
465 #define	SES_UNDEF	0xFF	/* Undefined disk type (read disk info)	  */
466 
467 /*
468  * Defines for blanking of CD-RW discs (from SCSI-3/mmc)
469  */
470 #define	BLANK_DISC	0x00	/* Erase the entire disc		  */
471 #define	BLANK_MINIMAL	0x01	/* Erase the PMA, 1st session TOC, pregap */
472 #define	BLANK_TRACK	0x02	/* Erase an incomplete track		  */
473 #define	BLANK_UNRESERVE	0x03	/* Unreserve a track			  */
474 #define	BLANK_TAIL	0x04	/* Erase the tail of a track		  */
475 #define	BLANK_UNCLOSE	0x05	/* Unclose the last session		  */
476 #define	BLANK_SESSION	0x06	/* Erase the last session		  */
477 
478 /*
479  * Defines for formating DVD (custom values)
480  */
481 #define	FULL_FORMAT       0x00    /* Interactive format  */
482 #define	BACKGROUND_FORMAT 0x01    /* Background format   */
483 #define	FORCE_FORMAT      0x02    /* Force reformat      */
484 
485 /*
486  * Defines for formating DVD (custom values)
487  */
488 #define	FULL_FORMAT       0x00    /* Interactive format  */
489 #define	BACKGROUND_FORMAT 0x01    /* Background format   */
490 #define	FORCE_FORMAT      0x02    /* Force reformat      */
491 
492 /*
493  * Useful definitions for audio tracks
494  */
495 #define	msample		(44100 * 2)		/* one 16bit audio sample */
496 #define	ssample		(msample * 2)		/* one stereo sample	*/
497 #define	samples(v)	((v) / ssample)		/* # of stereo samples	*/
498 #define	hsamples(v)	((v) / (ssample/100))	/* 100* # of stereo samples/s*/
499 #define	fsamples(v)	((v) / (ssample/75))	/* 75* # of stereo samples/s */
500 
501 #define	minutes(v)	((int)(samples(v) / 60))
502 #define	seconds(v)	((int)(samples(v) % 60))
503 #define	hseconds(v)	((int)(hsamples(v) % 100))
504 #define	frames(v)	((int)(fsamples(v) % 75))
505 
506 /*
507  * sector based macros
508  */
509 #define	Sminutes(s)	((int)((s) / (60*75)))
510 #define	Sseconds(s)	((int)((s) / 75))
511 #define	Shseconds(s)	((int)(((s) % 75)*100)/75)
512 #define	Sframes(s)	((int)((s) % 75))
513 
514 typedef struct msf {
515 	char	msf_min;
516 	char	msf_sec;
517 	char	msf_frame;
518 } msf_t;
519 
520 /*
521  * Definitions for read TOC/PMA/ATIP command
522  */
523 #define	FMT_TOC		0
524 #define	FMT_SINFO	1
525 #define	FMT_FULLTOC	2
526 #define	FMT_PMA		3
527 #define	FMT_ATIP	4
528 #define	FMT_CDTEXT	5
529 
530 /*
531  * Definitions for read disk information "recording flags"
532  * used in UInt16_t "ds_cdrflags".
533  */
534 #define	RF_WRITE	0x0001	/* Disk is going to be written		*/
535 #define	RF_BLANK	0x0002	/* Disk is going to be erased		*/
536 #define	RF_PRATIP	0x0004	/* Print ATIP info			*/
537 #define	RF_LEADIN	0x0008	/* Lead-in has been "manually" written	*/
538 #define	RF_BURNFREE	0x0010	/* BUFFER underrun free recording	*/
539 #define	RF_VARIREC	0x0020	/* Plextor VariRec			*/
540 #define	RF_AUDIOMASTER	0x0040	/* Yamaha AudioMaster			*/
541 #define	RF_FORCESPEED	0x0080	/* WriteSpeed forced high		*/
542 #define	RF_DID_STAT	0x0100	/* Already did call cdrstats()		*/
543 #define	RF_DID_CDRSTAT	0x0200	/* Already did call (*dp->cdr_stats)()	*/
544 #define	RF_WR_WAIT	0x0400	/* Wait during writing to free bus	*/
545 #define	RF_SINGLESESS	0x0800	/* Plextor single sess. mode		*/
546 #define	RF_HIDE_CDR	0x1000	/* Plextor hide CDR features		*/
547 #define	RF_SPEEDREAD	0x2000	/* Plextor SpeedReed			*/
548 #define	RF_GIGAREC	0x4000	/* Plextor GigaRec			*/
549 
550 /*
551  * Definitions for read disk information "disk status"
552  * used in "ds_diskstat".
553  */
554 #define	DS_EMPTY	0	/* Empty disk				*/
555 #define	DS_APPENDABLE	1	/* Incomplete disk (appendable)		*/
556 #define	DS_COMPLETE	2	/* Complete disk (closed/no B0 pointer)	*/
557 #define	DS_RESERVED	3	/* Reserved				*/
558 
559 /*
560  * Definitions for read disk information "session status"
561  * used in "ds_sessstat".
562  */
563 #define	SS_EMPTY	0	/* Empty session			*/
564 #define	SS_APPENDABLE	1	/* Incomplete session			*/
565 #define	SS_RESERVED	2	/* Reserved				*/
566 #define	SS_COMPLETE	3	/* Complete session (needs DS_COMPLETE)	*/
567 
568 /*
569  * Definitions for disk_status write mode
570  * used in "ds_wrmode".
571  */
572 #define	WM_NONE		0	/* No write mode selected		*/
573 #define	WM_BLANK	1	/* Blanking mode			*/
574 #define	WM_FORMAT	2	/* Formatting				*/
575 #define	WM_PACKET	4	/* Packet writing			*/
576 #define	WM_TAO		8	/* Track at Once			*/
577 #define	WM_SAO		12	/* Session at Once w/ cooked sectors	*/
578 #define	WM_SAO_RAW16	13	/* Session at Once RAW+16 byte sectors	*/
579 #define	WM_SAO_RAW96P	14	/* Session at Once RAW+96P byte sectors	*/
580 #define	WM_SAO_RAW96R	15	/* Session at Once RAW+96R byte sectors	*/
581 #define	WM_RAW		16	/* RAW with cooked sectors is impossible*/
582 #define	WM_RAW_RAW16	17	/* RAW with RAW+16 byte sectors		*/
583 #define	WM_RAW_RAW96P	18	/* RAW with RAW+96P byte sectors	*/
584 #define	WM_RAW_RAW96R	19	/* RAW with RAW+96R byte sectors	*/
585 
586 #define	wm_base(wm)	((wm)/4*4) /* The basic write mode for this mode */
587 
588 /*
589  * Definitions for disk_status flags
590  * used in UInt16_t "ds_flags".
591  */
592 #define	DSF_DID_V	0x0001	/* Disk id valid			*/
593 #define	DSF_DBC_V	0x0002	/* Disk bar code valid			*/
594 #define	DSF_URU		0x0004	/* Disk is for unrestricted use		*/
595 #define	DSF_ERA		0x0008	/* Disk is erasable			*/
596 #define	DSF_HIGHSP_ERA	0x0010	/* Disk is high speed erasable		*/
597 #define	DSF_ULTRASP_ERA	0x0020	/* Disk is ultra speed erasable		*/
598 #define	DSF_ULTRASPP_ERA 0x0040	/* Disk is ultra speed+ erasable	*/
599 
600 
601 #define	DSF_DVD		0x0100	/* Disk is a DVD			*/
602 #define	DSF_DVD_PLUS_R	0x0200	/* Disk is a DVD+R			*/
603 #define	DSF_DVD_PLUS_RW	0x0400	/* Disk is a DVD+RW			*/
604 #define	DSF_NEED_FORMAT	0x0800	/* Disk needs to be formatted		*/
605 
606 /*
607  * Definitions for disktype flags
608  */
609 #define DT_CD           0x001  /*is a CD                                */
610 #define DT_DVD          0x002  /*is a DVD                               */
611 
612 /*
613  * Definitions for disktype flags
614  */
615 #define DT_CD           0x001  /*is a CD                                */
616 #define DT_DVD          0x002  /*is a DVD                               */
617 
618 /*
619  * Definitions for disk_status disk type
620  * used in "ds_type".
621  */
622 /* None defined yet */
623 
624 typedef	struct disk_status	dstat_t;
625 
626 struct disk_status {
627 	UInt32_t ds_diskid;		/* Disk identification		*/
628 	UInt16_t ds_cdrflags;		/* Recording flags from cdrecord*/
629 	UInt16_t ds_flags;		/* Disk_status flags		*/
630 	Uchar	 ds_wrmode;		/* Selected write mode		*/
631 	Uchar	 ds_type;		/* Abstract disk type		*/
632 
633 	Uchar	 ds_disktype;		/* Disk type (from TOC/PMA)	*/
634 	Uchar	 ds_diskstat;		/* Disk status (MMC)		*/
635 	Uchar	 ds_sessstat;		/* Status of last sesion (MMC)	*/
636 	Uchar	 ds_trfirst;		/* first track #		*/
637 	Uchar	 ds_trlast;		/* last track #			*/
638 	Uchar	 ds_trfirst_ls;		/* first track # in last session*/
639 	Uchar	 ds_barcode[8];		/* Disk bar code		*/
640 
641 	Int32_t	 ds_first_leadin;	/* Start of first lead in (ATIP)*/
642 	Int32_t	 ds_last_leadout;	/* Start of last lead out (ATIP)*/
643 	Int32_t	 ds_curr_leadin;	/* Start of next lead in	*/
644 	Int32_t	 ds_curr_leadout;	/* Start of next lead out	*/
645 
646 	Int32_t	 ds_maxblocks;		/* # of official blocks on disk	*/
647 	Int32_t	 ds_maxrblocks;		/* # real blocks on disk	*/
648 	Int32_t	 ds_fwa;		/* first writable addr		*/
649 
650 	Int32_t	 ds_startsec;		/* Actual start sector		*/
651 	Int32_t	 ds_endsec;		/* Actual end sector		*/
652 	Int32_t	 ds_buflow;		/* # of times drive buffer empty*/
653 
654 	UInt16_t ds_minbuf;		/* Minimum drive bufer fill rt.	*/
655 
656 	UInt16_t ds_at_min_speed;	/* The minimal ATIP write speed	*/
657 	UInt16_t ds_at_max_speed;	/* The maximal ATIP write speed	*/
658 	UInt16_t ds_dr_cur_rspeed;	/* The drive's cur read speed	*/
659 	UInt16_t ds_dr_max_rspeed;	/* The drive's max read speed	*/
660 	UInt16_t ds_dr_cur_wspeed;	/* The drive's cur write speed	*/
661 	UInt16_t ds_dr_max_wspeed;	/* The drive's max write speed	*/
662 	UInt16_t ds_wspeed;		/* The selected/drive wr. speed */
663 };
664 
665 /*
666  * First approach of a CDR device abstraction layer.
667  * This interface will change as long as I did not find the
668  * optimum that fits for all devices.
669  *
670  * Called with pointer to whole track array:
671  *	cdr_send_cue()
672  *	cdr_write_leadin()
673  *	cdr_open_session()
674  *	cdr_fixate()
675  *
676  * Called with (track_t *) 0 or pointer to current track:
677  *	cdr_next_wr_address()
678  *
679  * Called with pointer to current track:
680  *	cdr_open_track()
681  *	cdr_close_track()
682  *
683  * Calling sequence:
684  *	cdr_identify()					May modify driver
685  *	Here, the cdr_t will be allocated and
686  *	copied to a new writable area.
687  *	cdr_attach()					Get drive properties
688  *	cdr_buffer_cap()
689  *	cdr_getdisktype()				GET ATIP
690  *	cdr_init()					set TAO for -msinfo
691  *	cdr_check_session				XXX ????
692  *	cdr_opt1()					set early options
693  *	cdr_set_speed_dummy(usalp, dp, &speed)
694  *	<---	Grace time processing goes here
695  *	{ do_opc(); cdr_blank() }
696  *	cdr_opt2()					set late options
697  *	cdr_open_session()				set up params (no wrt.)
698  *	do_opc()
699  *	cdr_write_leadin()				start writing
700  *	LOOP {
701  *		cdr_open_track()
702  *		cdr_next_wr_address()			only TAO / Packet
703  *		write_track_data()
704  *		cdr_close_track()
705  *	}
706  *	write_leadout()				XXX should go -> driver!
707  *	cdr_fixate()
708  *	cdr_stats()
709  */
710 /*--------------------------------------------------------------------------*/
711 typedef	struct cdr_cmd	cdr_t;
712 
713 #ifdef	_SCG_SCSITRANSP_H
714 struct cdr_cmd {
715 	int	cdr_dev;						/* Numerical device type */
716 	UInt32_t cdr_cmdflags;			/* Command line options */
717 	UInt32_t cdr_flags;				/* Drive related flags	*/
718 	UInt8_t	 cdr_cdrw_support;	/* CD-RW write media types */
719 	UInt16_t cdr_speeddef;			/* Default write speed	*/
720 	UInt16_t cdr_speedmax;			/* Max. write speed	*/
721 
722 	char	*cdr_drname;				/* Driver ID string	*/
723 	char	*cdr_drtext;				/* Driver ID text	*/
724 	struct cd_mode_page_2A *cdr_cdcap;
725 	dstat_t	*cdr_dstat;
726 #ifdef	_SCG_SCSIREG_H
727 	/* identify drive */
728 	cdr_t	*(*cdr_identify)(SCSI *usalp, cdr_t *, struct scsi_inquiry *);
729 #else
730 	/* identify drive */
731 	cdr_t	*(*cdr_identify)(SCSI *usalp, cdr_t *, void *);
732 #endif
733 	/* init error decoding etc*/
734 	int	(*cdr_attach)(SCSI *usalp, cdr_t *);
735 	/* init drive to useful deflts */
736 	int	(*cdr_init)(SCSI *usalp, cdr_t *);
737 	/* get disk type */
738 	int	(*cdr_getdisktype)(SCSI *usalp, cdr_t *);
739 	/* load disk */
740 	int	(*cdr_load)(SCSI *usalp, cdr_t *);
741 	/* unload disk */
742 	int	(*cdr_unload)(SCSI *usalp, cdr_t *);
743 	/* read buffer capacity */
744 	int	(*cdr_buffer_cap)(SCSI *usalp, long *sizep, long *freep);
745 	/* check if recover is needed */
746 	int	(*cdr_check_recovery)(SCSI *usalp, cdr_t *);
747 	/* do recover */
748 	int	(*cdr_recover)(SCSI *usalp, cdr_t *, int track);
749 	/* set recording speed & dummy write */
750 	int	(*cdr_set_speed_dummy)(SCSI *usalp, cdr_t *, int *speedp);
751 	/* set sector size */
752 	int	(*cdr_set_secsize)(SCSI *usalp, int secsize);
753 	/* get next writable addr. */
754 	int	(*cdr_next_wr_address)(SCSI *usalp, track_t *trackp, long *ap);
755 	/* reserve track for future use */
756 	int	(*cdr_reserve_track)(SCSI *usalp, Ulong len);
757 	int	(*cdr_write_trackdata)(SCSI *usalp, caddr_t buf, long daddr, long bytecnt,
758 										  int seccnt, BOOL islast);
759 	/* generate cue sheet */
760 	int	(*cdr_gen_cue)(track_t *trackp, void *cuep, BOOL needgap);
761 	/* send cue sheet */
762 	int	(*cdr_send_cue)(SCSI *usalp, cdr_t *, track_t *trackp);
763 	/* write leadin */
764 	int	(*cdr_write_leadin)(SCSI *usalp, cdr_t *, track_t *trackp);
765 	/* open new track */
766 	int	(*cdr_open_track)(SCSI *usalp, cdr_t *, track_t *trackp);
767 	/* close written track */
768 	int	(*cdr_close_track)(SCSI *usalp, cdr_t *, track_t *trackp);
769 	/* open new session */
770 	int	(*cdr_open_session)(SCSI *usalp, cdr_t *, track_t *trackp);
771 	/* really needed ??? */
772 	int	(*cdr_close_session)(SCSI *usalp, cdr_t *);
773 	/* abort current write */
774 	int	(*cdr_abort_session)(SCSI *usalp, cdr_t *);
775 	/* read session offset*/
776 	int	(*cdr_session_offset)(SCSI *usalp, long *soff);
777 	/* write toc on disk */
778 	int	(*cdr_fixate)(SCSI *usalp, cdr_t *, track_t *trackp);
779 	/* final statistics printing*/
780 	int	(*cdr_stats)(SCSI *usalp, cdr_t *);
781 	/* blank something */
782 	int	(*cdr_blank)(SCSI *usalp, cdr_t *, long addr, int blanktype);
783 	/* format media */
784 	int	(*cdr_format)(SCSI *usalp, cdr_t *, int fmtflags);
785 	/* Do OPC */
786 	int	(*cdr_opc)(SCSI *usalp, caddr_t bp, int cnt, int doopc);
787 	/* do early option processing*/
788 	int	(*cdr_opt1)(SCSI *usalp, cdr_t *);
789 	/* do late option processing */
790 	int	(*cdr_opt2)(SCSI *usalp, cdr_t *);
791 	/* calculate optimale split */
792 	int	(*cdr_layer_split)(SCSI *usalp, cdr_t *, long tsize);
793 	int	profile;
794 	BOOL	is_dvd;
795 };
796 #endif
797 
798 /*
799  * Definitions for cdr_flags
800  */
801 #define	CDR_TAO		0x01		/* Drive supports Track at once	*/
802 #define	CDR_SAO		0x02		/* Drive supports Sess at once	*/
803 #define	CDR_PACKET	0x04		/* Drive supports packet writing*/
804 #define	CDR_RAW		0x08		/* Drive supports raw writing	*/
805 #define	CDR_RAW16	0x10		/* Drive supports RAW raw16	*/
806 #define	CDR_RAW96P	0x20		/* Drive supports RAW raw96 pak	*/
807 #define	CDR_RAW96R	0x40		/* Drive supports RAW raw96 raw	*/
808 #ifdef	__needed__
809 #define	CDR_SRAW16	0x100		/* Drive supports SAO raw16	*/
810 #endif
811 #define	CDR_SRAW96P	0x200		/* Drive supports SAO raw96 pak	*/
812 #define	CDR_SRAW96R	0x400		/* Drive supports SAO raw96 raw */
813 #define	CDR_SWABAUDIO	0x1000		/* Drive swabs audio data	*/
814 #define	CDR_ISREADER	0x2000		/* Drive is s CD-ROM reader	*/
815 #define	CDR_TRAYLOAD	0x4000		/* Drive loads CD with tray	*/
816 #define	CDR_CADDYLOAD	0x8000		/* Drive loads CD with caddy	*/
817 #define	CDR_NO_LOLIMIT	0x10000		/* Drive ignores lead-out limit	*/
818 #define	CDR_DVD		0x20000		/* Drive is a DVD drive		*/
819 #define	CDR_SIMUL	0x40000		/* Drive is simulated		*/
820 #define	CDR_BURNFREE	0x80000		/* Drive sup. BUFund. free rec.	*/
821 #define	CDR_VARIREC	0x100000	/* Drive sup. VariRec	 Plex.	*/
822 #define	CDR_AUDIOMASTER	0x200000	/* Drive sup. AudioMaster Yamah.*/
823 #define	CDR_FORCESPEED	0x400000	/* Drive sup. WriteSpeed ctl.	*/
824 #define	CDR_DISKTATTOO	0x800000	/* Drive sup. Yamaha DiskT@2	*/
825 #define	CDR_SINGLESESS	0x1000000	/* Drive sup. single sess. mode */
826 #define	CDR_HIDE_CDR	0x2000000	/* Drive sup. hide CDR features	*/
827 #define	CDR_SPEEDREAD	0x4000000	/* Drive sup. SpeedReed		*/
828 #define	CDR_GIGAREC	0x8000000	/* Drive sup. GigaRec	 Plex.	*/
829 #define	CDR_MMC		0x10000000	/* Drive is MMC compliant	*/
830 #define	CDR_MMC2	0x20000000	/* Drive is MMC-2 compliant	*/
831 #define	CDR_MMC3	0x40000000	/* Drive is MMC-3 compliant	*/
832 #ifdef	PROTOTYPES
833 #define	CDR_ALLOC	0x80000000UL	/* structure is allocated	*/
834 #else
835 #define	CDR_ALLOC	0x80000000	/* structure is allocated	*/
836 #endif
837 
838 /*
839  * Definitions for cdr_cdrw_support
840  */
841 #define	CDR_CDRW_NONE	0x00		/* CD-RW writing not supported */
842 #define	CDR_CDRW_MULTI	0x01		/* CD-RW multi speed supported */
843 #define	CDR_CDRW_HIGH	0x02		/* CD-RW high speed supported */
844 #define	CDR_CDRW_ULTRA	0x04		/* CD-RW ultra high speed supported */
845 #define	CDR_CDRW_ULTRAP	0x08		/* CD-RW ultra high speed+ supported */
846 #define	CDR_CDRW_ALL	0xFF		/* All bits set: unknown - support all */
847 
848 /*
849  * cdrecord.c
850  */
851 extern	int	read_buf(int f, char *bp, int size);
852 extern	int	fill_buf(int f, track_t *trackp, long secno, char *bp, int size);
853 extern	int	get_buf(int f, track_t *trackp, long secno, char **bpp, int size);
854 #ifdef	_SCG_SCSITRANSP_H
855 extern	int	write_secs(SCSI *usalp, cdr_t *dp, char *bp, long startsec,
856 								  int bytespt, int secspt, BOOL islast);
857 extern	int	pad_track(SCSI *usalp, cdr_t *dp, track_t *trackp,
858 								 long startsec, Llong amt,
859 								 BOOL dolast, Llong *bytesp);
860 extern	void	load_media(SCSI *usalp, cdr_t *, BOOL);
861 extern	void	unload_media(SCSI *usalp, cdr_t *, int);
862 extern	void	reload_media(SCSI *usalp, cdr_t *);
863 #endif
864 extern	void	raisepri(int);
865 extern	int	getnum(char *arg, long *valp);
866 
867 /*
868  * cd_misc.c
869  */
870 extern	int	from_bcd(int b);
871 extern	int	to_bcd(int i);
872 extern	long	msf_to_lba(int m, int s, int f, BOOL force_positive);
873 extern	BOOL	lba_to_msf(long lba, msf_t *mp);
874 extern	void	sec_to_msf(long sec, msf_t *mp);
875 extern	void	print_min_atip(long li, long lo);
876 
877 /*
878  * fifo.c
879  */
880 extern	void	init_fifo(long);
881 extern	BOOL	init_faio(track_t *track, int);
882 extern	BOOL	await_faio(void);
883 extern	void	kill_faio(void);
884 extern	int	wait_faio(void);
885 extern	int	faio_read_buf(int f, char *bp, int size);
886 extern	int	faio_get_buf(int f, char **bpp, int size);
887 extern	void	fifo_stats(void);
888 extern	int	fifo_percent(BOOL addone);
889 
890 /*
891  * wm_session.c
892  */
893 #ifdef	_SCG_SCSITRANSP_H
894 extern	int	write_session_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
895 #endif
896 
897 /*
898  * wm_track.c
899  */
900 #ifdef	_SCG_SCSITRANSP_H
901 /*extern	int	write_track_data __PR((SCSI *usalp, cdr_t *dp, track_t *trackp));*/
902 #endif
903 
904 /*
905  * wm_packet.c
906  */
907 #ifdef	_SCG_SCSITRANSP_H
908 extern	int	write_packet_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
909 #endif
910 
911 /*
912  * modes.c
913  */
914 #ifdef	_SCG_SCSITRANSP_H
915 extern	BOOL	get_mode_params(SCSI *usalp, int page, char *pagename,
916 										 Uchar *modep, Uchar *cmodep,
917 										 Uchar *dmodep, Uchar *smodep,
918 										 int *lenp);
919 extern	BOOL	set_mode_params(SCSI *usalp, char *pagename, Uchar *modep,
920 										 int len, int save, int secsize);
921 #endif
922 
923 /*
924  * misc.c
925  */
926 #ifdef	timerclear
927 extern	void	timevaldiff(struct timeval *start, struct timeval *stop);
928 extern	void	prtimediff(const char *fmt, struct timeval *start,
929 								  struct timeval *stop);
930 #endif
931 
932 /*
933  * getnum.c
934  */
935 extern	int	getnum(char *arg, long *valp);
936 extern	int	getllnum(char *arg, Llong *lvalp);
937 
938 /*
939  * scsi_cdr.c
940  */
941 #ifdef	_SCG_SCSITRANSP_H
942 extern	BOOL	unit_ready(SCSI *usalp);
943 extern	BOOL	wait_unit_ready(SCSI *usalp, int secs);
944 extern	BOOL	scsi_in_progress(SCSI *usalp);
945 extern	BOOL	cdr_underrun(SCSI *usalp);
946 extern	int	test_unit_ready(SCSI *usalp);
947 extern	int	rezero_unit(SCSI *usalp);
948 extern	int	request_sense(SCSI *usalp);
949 extern	int	request_sense_b(SCSI *usalp, caddr_t bp, int cnt);
950 extern	int	inquiry(SCSI *usalp, caddr_t, int);
951 extern	int	read_capacity(SCSI *usalp);
952 #ifdef	EOF	/* stdio.h has been included */
953 extern	void	print_capacity(SCSI *usalp, FILE *f);
954 #endif
955 extern	int	scsi_load_unload(SCSI *usalp, int);
956 extern	int	scsi_prevent_removal(SCSI *usalp, int);
957 extern	int	scsi_start_stop_unit(SCSI *usalp, int, int, BOOL immed);
958 
959 #define	ROTCTL_CLV	0	/* CLV or PCAV	*/
960 #define	ROTCTL_CAV	1	/* True CAV	*/
961 
962 extern	int	scsi_set_speed(SCSI *usalp, int readspeed, int writespeed,
963 										int rotctl);
964 extern	int	scsi_get_speed(SCSI *usalp, int *readspeedp, int *writespeedp);
965 extern	int	qic02(SCSI *usalp, int);
966 extern	int	write_xscsi(SCSI *usalp, caddr_t, long, long, int);
967 extern	int	write_xg0(SCSI *usalp, caddr_t, long, long, int);
968 extern	int	write_xg1(SCSI *usalp, caddr_t, long, long, int);
969 extern	int	write_xg5(SCSI *usalp, caddr_t, long, long, int);
970 extern	int	seek_scsi(SCSI *usalp, long addr);
971 extern	int	seek_g0(SCSI *usalp, long addr);
972 extern	int	seek_g1(SCSI *usalp, long addr);
973 extern	int	scsi_flush_cache(SCSI *usalp, BOOL immed);
974 extern	int	read_buffer(SCSI *usalp, caddr_t bp, int cnt, int mode);
975 extern	int	write_buffer(SCSI *usalp, char *buffer, long length, int mode,
976 									 int bufferid, long offset);
977 extern	int	read_subchannel(SCSI *usalp, caddr_t bp, int track, int cnt,
978 										 int msf, int subq, int fmt);
979 extern	int	read_toc(SCSI *usalp, caddr_t, int, int, int, int);
980 extern	int	read_toc_philips(SCSI *usalp, caddr_t, int, int, int, int);
981 extern	int	read_header(SCSI *usalp, caddr_t, long, int, int);
982 extern	int	read_disk_info(SCSI *usalp, caddr_t, int);
983 
984 #define	TI_TYPE_LBA	0	/* Address is LBA */
985 #define	TI_TYPE_TRACK	1	/* Address: 0 -> TOC, xx -> Track xx, 0xFF -> Inv Track */
986 #define	TI_TYPE_SESS	2	/* Address is session # */
987 extern	int	read_track_info(SCSI *usalp, caddr_t, int type, int addr, int cnt);
988 extern	int	read_rzone_info(SCSI *usalp, caddr_t bp, int cnt);
989 extern	int	reserve_tr_rzone(SCSI *usalp, long size);
990 extern	int	read_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int addr,
991 											 int layer, int fmt);
992 extern	int	send_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int layer,
993 											 int fmt);
994 extern	int	send_opc(SCSI *usalp, caddr_t, int cnt, int doopc);
995 
996 #define	CL_TYPE_STOP_DEICE	0	/* Stop De-icing a DVD+RW Media */
997 #define	CL_TYPE_TRACK		1	/* Close Track # */
998 #define	CL_TYPE_SESSION		2	/* Close Session/Border / Stop backgrnd. format */
999 #define	CL_TYPE_INTER_BORDER	3	/* Close intermediate Border */
1000 #define	CL_TYPE_OPEN_SESSION	4	/* Close the Open Session and Record an Extended lead-out */
1001 #define	CL_TYPE_FINALISE_MINRAD	5	/* Finalize the Disc with a Minimum Recorded Radius */
1002 #define	CL_TYPE_FINALISE	6	/* Finalize the disc */
1003 extern	int	scsi_close_tr_session(SCSI *usalp, int type, int track,
1004 												 BOOL immed);
1005 extern	int	read_master_cue(SCSI *usalp, caddr_t bp, int sheet, int cnt);
1006 extern	int	send_cue_sheet(SCSI *usalp, caddr_t bp, long size);
1007 extern	int	read_buff_cap(SCSI *usalp, long *, long *);
1008 extern	int	scsi_blank(SCSI *usalp, long addr, int blanktype, BOOL immed);
1009 extern	BOOL	allow_atapi(SCSI *usalp, BOOL new);
1010 extern	int	mode_select(SCSI *usalp, Uchar *, int, int, int);
1011 extern	int	mode_sense(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
1012 extern	int	mode_select_sg0(SCSI *usalp, Uchar *, int, int, int);
1013 extern	int	mode_sense_sg0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
1014 extern	int	mode_select_g0(SCSI *usalp, Uchar *, int, int, int);
1015 extern	int	mode_select_g1(SCSI *usalp, Uchar *, int, int, int);
1016 extern	int	mode_sense_g0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
1017 extern	int	mode_sense_g1(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
1018 extern	int	read_tochdr(SCSI *usalp, cdr_t *, int *, int *);
1019 extern	int	read_cdtext(SCSI *usalp);
1020 extern	int	read_trackinfo(SCSI *usalp, int, long *, struct msf *, int *,
1021 										int *, int *);
1022 extern	int	read_B0(SCSI *usalp, BOOL isbcd, long *b0p, long *lop);
1023 extern	int	read_session_offset(SCSI *usalp, long *);
1024 extern	int	read_session_offset_philips(SCSI *usalp, long *);
1025 extern	int	sense_secsize(SCSI *usalp, int current);
1026 extern	int	select_secsize(SCSI *usalp, int);
1027 extern	BOOL	is_cddrive(SCSI *usalp);
1028 extern	BOOL	is_unknown_dev(SCSI *usalp);
1029 extern	int	read_scsi(SCSI *usalp, caddr_t, long, int);
1030 extern	int	read_g0(SCSI *usalp, caddr_t, long, int);
1031 extern	int	read_g1(SCSI *usalp, caddr_t, long, int);
1032 extern	BOOL	getdev(SCSI *usalp, BOOL);
1033 #ifdef	EOF	/* stdio.h has been included */
1034 extern	void	printinq(SCSI *usalp, FILE *f);
1035 #endif
1036 extern	void	printdev(SCSI *usalp);
1037 extern	BOOL	do_inquiry(SCSI *usalp, BOOL);
1038 extern	BOOL	recovery_needed(SCSI *usalp, cdr_t *);
1039 extern	int	scsi_load(SCSI *usalp, cdr_t *);
1040 extern	int	scsi_unload(SCSI *usalp, cdr_t *);
1041 extern	int	scsi_cdr_write(SCSI *usalp, caddr_t bp, long sectaddr,
1042 										long size, int blocks, BOOL islast);
1043 extern	struct cd_mode_page_2A *mmc_cap(SCSI *usalp, Uchar *modep);
1044 extern	void	mmc_getval(struct cd_mode_page_2A *mp, BOOL *cdrrp, BOOL *cdwrp,
1045 								  BOOL *cdrrwp, BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
1046 extern	BOOL	is_mmc(SCSI *usalp, BOOL *cdwp, BOOL *dvdwp);
1047 extern	BOOL	mmc_check(SCSI *usalp, BOOL *cdrrp, BOOL *cdwrp, BOOL *cdrrwp,
1048 								 BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
1049 extern	void	print_capabilities(SCSI *usalp);
1050 #endif
1051 
1052 /*
1053  * scsi_cdr.c
1054  */
1055 #ifdef	_SCG_SCSITRANSP_H
1056 extern	void	print_capabilities_mmc4(SCSI *usalp);
1057 #endif
1058 
1059 /*
1060  * scsi_mmc.c
1061  */
1062 #ifdef	_SCG_SCSITRANSP_H
1063 extern	int	get_configuration(SCSI *usalp, caddr_t bp, int cnt,
1064 											int st_feature, int rt);
1065 extern	int	get_curprofile(SCSI *usalp);
1066 extern	int	print_profiles(SCSI *usalp);
1067 extern	int	get_proflist(SCSI *usalp, BOOL *wp, BOOL *cdp, BOOL *dvdp,
1068 									 BOOL *dvdplusp, BOOL *ddcdp);
1069 extern	int	get_wproflist(SCSI *usalp, BOOL *cdp, BOOL *dvdp,
1070 									  BOOL *dvdplusp, BOOL *ddcdp);
1071 extern char *mmc_obtain_profile_name(int profile_number);
1072 #endif
1073 
1074 /*
1075  * scsi_mmc.c
1076  */
1077 #ifdef	_SCG_SCSITRANSP_H
1078 extern	int	get_supported_cdrw_media_types(SCSI *usalp);
1079 #endif
1080 
1081 /*
1082  * mmc_misc.c
1083  */
1084 #ifdef	_SCG_SCSITRANSP_H
1085 extern	int	check_writemodes_mmc(SCSI *usalp, cdr_t *dp);
1086 #endif	/* _SCG_SCSITRANSP_H */
1087 
1088 /*
1089  * cdr_drv.c
1090  */
1091 #ifdef	_SCG_SCSITRANSP_H
1092 #ifdef	_SCG_SCSIREG_H
1093 extern	cdr_t	*drive_identify(SCSI *usalp, cdr_t *, struct scsi_inquiry *ip);
1094 #else
1095 extern	cdr_t	*drive_identify(SCSI *usalp, cdr_t *, void *ip);
1096 #endif
1097 extern	int	drive_attach(SCSI *usalp, cdr_t *);
1098 #endif
1099 extern	int	attach_unknown(void);
1100 #ifdef	_SCG_SCSITRANSP_H
1101 extern	int	blank_dummy(SCSI *usalp, cdr_t *, long addr, int blanktype);
1102 int	format_dummy(SCSI *usalp, cdr_t *, int fmtflags);
1103 extern	int	drive_getdisktype(SCSI *usalp, cdr_t *dp);
1104 extern	int	cmd_ill(SCSI *usalp);
1105 extern	int	cmd_dummy(SCSI *usalp, cdr_t *);
1106 extern	int	no_sendcue(SCSI *usalp, cdr_t *, track_t *trackp);
1107 extern	int	buf_dummy(SCSI *usalp, long *sp, long *fp);
1108 #endif
1109 extern	BOOL	set_cdrcmds(char *name, cdr_t **dpp);
1110 #ifdef	_SCG_SCSITRANSP_H
1111 extern	cdr_t	*get_cdrcmds(SCSI *usalp);
1112 #endif
1113 
1114 
1115 /*
1116  * drv_mmc.c
1117  */
1118 extern	void	mmc_opthelp(cdr_t *dp, int excode);
1119 extern	char	*hasdrvopt(char *optstr, char *optname);
1120 #ifdef	_SCG_SCSITRANSP_H
1121 extern struct ricoh_mode_page_30 *get_justlink_ricoh(SCSI *usalp, Uchar *mode);
1122 #endif
1123 
1124 /*
1125  * isosize.c
1126  */
1127 extern	Llong	isosize(int f);
1128 
1129 /*
1130  * audiosize.c
1131  */
1132 extern	BOOL	is_auname(const char *name);
1133 extern	off_t	ausize(int f);
1134 extern	BOOL	is_wavname(const char *name);
1135 extern	off_t	wavsize(int f);
1136 
1137 /*
1138  * auinfo.c
1139  */
1140 extern	BOOL	auinfosize(char *name, track_t *trackp);
1141 extern	void	auinfo(char *name, int track, track_t *trackp);
1142 #ifdef CDTEXT_H
1143 extern	textptr_t *gettextptr(int track, track_t *trackp);
1144 #endif
1145 extern	void	setmcn(char *mcn, track_t *trackp);
1146 extern	void	setisrc(char *isrc, track_t *trackp);
1147 extern	void	setindex(char *tindex, track_t *trackp);
1148 
1149 /*
1150  * diskid.c
1151  */
1152 extern	void	pr_manufacturer(msf_t *mp, BOOL rw, BOOL audio);
1153 extern	int	manufacturer_id(msf_t *mp);
1154 extern	long	disk_rcap(msf_t *mp, long maxblock, BOOL rw, BOOL audio);
1155 
1156 /*--------------------------------------------------------------------------*/
1157 /* Test only								    */
1158 /*--------------------------------------------------------------------------*/
1159 #ifdef _SCSIMMC_H
1160 /*extern	int	do_cue		__PR((track_t *trackp, struct mmc_cue **cuep));*/
1161 #else
1162 /*extern	int	do_cue		__PR((track_t *trackp, void *cuep));*/
1163 #endif
1164 
1165 /*
1166  * subchan.c
1167  */
1168 extern	int	do_leadin(track_t *trackp);
1169 #ifdef	_SCG_SCSITRANSP_H
1170 extern	int	write_leadin(SCSI *usalp, cdr_t *dp, track_t *trackp,
1171 									 int leadinstart);
1172 extern	int	write_leadout(SCSI *usalp, cdr_t *dp, track_t *trackp);
1173 #endif
1174 extern	void	fillsubch(track_t *trackp, Uchar *sp, int secno, int nsecs);
1175 extern	void	filltpoint(Uchar *sub, int ctrl_adr, int point, msf_t *mp);
1176 extern	void	fillttime(Uchar *sub, msf_t *mp);
1177 extern	void	qpto96(Uchar *sub, Uchar *subq, int dop);
1178 extern	void	addrw(Uchar *sub, Uchar	*subrwptr);
1179 extern	void	qwto16(Uchar *subq, Uchar *subptr);
1180 extern	void	subrecodesecs(track_t *trackp, Uchar *bp, int address, int nsecs);
1181 
1182 /*
1183  * sector.c
1184  */
1185 extern	int	encspeed(BOOL be_verbose);
1186 extern	void	encsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
1187 extern	void	scrsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
1188 extern	void	encodesector(Uchar *sp, int sectype, int address);
1189 extern	void	fillsector(Uchar *sp, int sectype, int address);
1190 
1191 /*
1192  * clone.c
1193  */
1194 extern	void	clone_toc(track_t *trackp);
1195 extern	void	clone_tracktype(track_t *trackp);
1196 
1197 /*
1198  * cdtext.c
1199  */
1200 extern	BOOL	checktextfile(char *fname);
1201 extern	void	packtext(int tracks, track_t *trackp);
1202 #ifdef	_SCG_SCSITRANSP_H
1203 extern	int	write_cdtext(SCSI *usalp, cdr_t *dp, long startsec);
1204 #endif
1205 
1206 /*
1207  * cue.c
1208  */
1209 extern	int	parsecue(char *cuefname, track_t trackp[]);
1210 #ifdef	EOF	/* stdio.h has been included */
1211 extern	void	fparsecue(FILE *f, track_t trackp[]);
1212 #endif
1213