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