Imported Upstream version 1.1.11
[platform/upstream/cdrkit.git] / wodim / wodim.h
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