Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
enum {
2
	Maxtrack	= 200,
3
	Ntrack		= Maxtrack+1,
4
	BScdrom		= 2048,		/* mmc data block size */
5
	BScdda		= 2352,
6
	BScdxa		= 2336,
7
	BSmax		= 2352,
8
 
9
	Maxfeatures	= 512,
10
 
11
	/* scsi peripheral device types, SPC-3 §6.4.2 */
12
	TypeDA		= 0,		/* Direct Access (SBC) */
13
	TypeSA		= 1,		/* Sequential Access (SSC) */
14
	TypeWO		= 4,		/* Worm (SBC)*/
15
	TypeCD		= 5,		/* CD/DVD/BD (MMC) */
16
	TypeMO		= 7,		/* rewriteable Magneto-Optical (SBC) */
17
	TypeMC		= 8,		/* Medium Changer (SMC) */
18
 
19
	/* MMC device types */
20
	Mmcnone	= 0,
21
	Mmccd,
22
	Mmcdvdminus,
23
	Mmcdvdplus,
24
	Mmcbd,
25
 
26
	/* disc or track types */
27
	TypeNone	= 0,
28
	TypeAudio,
29
	TypeAwritable,
30
	TypeData,
31
	TypeDwritable,
32
	TypeDisk,
33
	TypeBlank,
34
 
35
	/* disc writability classes */
36
	Readonly	= 0,		/* -ROM */
37
	Write1,				/* -R: write once only */
38
	Erasewrite,			/* -R[WE]: erase then write */
39
	Ram,				/* -RAM: read & write unrestricted */
40
 
41
	/* tri-state flags */
42
	Unset		= -1,
43
	No,
44
	Yes,
45
 
46
	/* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
47
	Capread		= 2,
48
	Capwrite	= 3,
49
	Capmisc		= 5,
50
 
51
	/* device capabilities in Pagcapmechsts mode page */
52
	Capcdr		= 1<<0,		/* bytes 2 & 3 */
53
	Capcdrw		= 1<<1,
54
	Captestwr	= 1<<2,
55
	Capdvdrom	= 1<<3,
56
	Capdvdr		= 1<<4,
57
	Capdvdram	= 1<<5,
58
	Capcdda		= 1<<0,		/* Capmisc bits */
59
	Caprw		= 1<<2,
60
 
61
	/* Pagwrparams mode page offsets */
62
	Wpwrtype	= 2,		/* write type */
63
	Wptrkmode,			/* track mode */
64
	Wpdatblktype,
65
	Wpsessfmt	= 8,
66
	Wppktsz		= 10,		/* BE ulong: # user data blks/fixed pkt */
67
 
68
	/* Pagwrparams bits */
69
	Bufe	= 1<<6,	/* Wpwrtype: buffer under-run free recording enable */
70
	/* Wptrkmode */
71
	Msbits	= 3<<6,		/* multisession field */
72
	Msnonext= 0<<6,		/* no next border nor session */
73
	Mscdnonext= 1<<6,	/* cd special: no next session */
74
	Msnext	= 3<<6,		/* next session or border allowed */
75
	Fp	= 1<<5,		/* pay attention to Wppktsz */
76
 
77
	/* close track session cdb bits */
78
	Closetrack	= 1,
79
	Closesessfinal	= 2,	/* close session / finalize disc */
80
	Closefinaldvdrw	= 3,	/* dvd-rw special: finalize */
81
	/* dvd+r dl special: close session, write extended lead-out */
82
	Closesessextdvdrdl = 4,
83
	Closefinal30mm	= 5,	/* dvd+r special: finalize with ≥30mm radius */
84
	Closedvdrbdfinal= 6,	/* dvd+r, bd-r special: finalize */
85
 
86
	/* read toc format values */
87
	Tocfmttoc	= 0,
88
	Tocfmtsessnos	= 1,
89
	Tocfmtqleadin	= 2,
90
	Tocfmtqpma	= 3,
91
	Tocfmtatip	= 4,
92
	Tocfmtcdtext	= 5,
93
 
94
	/* read toc cdb[1] bit */
95
	Msfbit	= 1<<1,
96
 
97
	/* write types, MMC-6 §7.5.4.9 */
98
	Wtpkt	= 0,		/* a.k.a. incremental */
99
	Wttrackonce,
100
	Wtsessonce,		/* a.k.a. disc-at-once */
101
	Wtraw,
102
	Wtlayerjump,
103
 
104
	/* track modes (determine: are these also track types?) */
105
	Tmcdda	= 0,		/* audio cdda */
106
	Tm2audio,		/* 2 audio channels */
107
	Tmunintr = 4,		/* data, recorded uninterrupted */
108
	Tmintr,			/* data, recorded interrupted (dvd default) */
109
 
110
	/* data block types */
111
	Dbraw = 0,		/* 2352 bytes */
112
	Db2kdata = 8,		/* mode 1: 2K of user data */
113
	Db2336,			/* mode 2: 2336 bytes of user data */
114
 
115
	/* session formats */
116
	Sfdata	= 0,
117
	Sfcdi	= 0x10,
118
	Sfcdxa	= 0x20,
119
 
120
	/* Cache control bits in mode page 8 byte 2 */
121
	Ccrcd	= 1<<0,		/* read cache disabled */
122
	Ccmf	= 1<<1,		/* multiplication factor */
123
	Ccwce	= 1<<2,		/* writeback cache enabled */
124
	Ccsize	= 1<<3, /* use `cache segment size', not `# of cache segments' */
125
	Ccdisc	= 1<<4,		/* discontinuity */
126
	Cccap	= 1<<5,		/* caching analysis permitted */
127
	Ccabpf	= 1<<6,		/* abort pre-fetch */
128
	Ccic	= 1<<7,		/* initiator control */
129
 
130
	/* drive->cap bits */
131
	Cwrite	= 1<<0,
132
	Ccdda	= 1<<1,
133
 
134
	CDNblock = 12,		/* chosen for CD */
135
	DVDNblock = 16,		/* DVD ECC block is 16 sectors */
136
	BDNblock = 32,		/* BD ECC block (`cluster') is 32 sectors */
137
				/* BD-R are write-once in increments of 64KB */
138
	/*
139
	 * make a single transfer fit in a 9P rpc.  if we don't do this,
140
	 * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
141
	 */
142
	Readblock = 8192/BScdrom,
143
};
144
 
145
typedef struct Buf Buf;
146
typedef struct Dev Dev;
147
typedef struct Drive Drive;
148
typedef struct Msf Msf;		/* minute, second, frame */
149
typedef struct Otrack Otrack;
150
typedef struct Track Track;
151
typedef schar Tristate;
152
 
153
struct Msf {
154
	int	m;
155
	int	s;
156
	int	f;
157
};
158
 
159
struct Track
160
{
161
	/* initialized while obtaining the toc (gettoc) */
162
	vlong	size;		/* total size in bytes */
163
	long	bs;		/* block size in bytes */
164
	ulong	beg;		/* beginning block number */
165
	ulong	end;		/* ending block number */
166
	int	type;
167
	Msf	mbeg;
168
	Msf	mend;
169
 
170
	/* initialized by fs */
171
	char	name[32];
172
	int	mode;
173
	ulong	mtime;
174
};
175
 
176
struct DTrack			/* not used */
177
{
178
	uchar	name[32];
179
	uchar	beg[4];		/* msf value; only used for audio */
180
	uchar	end[4];		/* msf value; only used for audio */
181
	uchar	size[8];
182
	uchar	magic[4];
183
};
184
 
185
struct Otrack
186
{
187
	Track	*track;
188
	Drive	*drive;
189
	int	nchange;
190
	int	omode;
191
	Buf	*buf;
192
 
193
	int	nref;		/* kept by file server */
194
};
195
 
196
struct Dev
197
{
198
	Otrack*	(*openrd)(Drive *d, int trackno);
199
	Otrack*	(*create)(Drive *d, int bs);
200
	long	(*read)(Otrack *t, void *v, long n, vlong off);
201
	long	(*write)(Otrack *t, void *v, long n);
202
	void	(*close)(Otrack *t);
203
	int	(*gettoc)(Drive*);
204
	int	(*fixate)(Drive *d);
205
	char*	(*ctl)(Drive *d, int argc, char **argv);
206
	char*	(*setspeed)(Drive *d, int r, int w);
207
};
208
 
209
struct Drive
210
{
211
	QLock;
212
	Scsi;
213
 
214
	int	type;			/* scsi peripheral device type: Type?? */
215
 
216
	/* disc characteristics */
217
	int	mmctype;		/* cd, dvd, or bd */
218
	char	*dvdtype;		/* name of dvd flavour */
219
	char	*laysfx;		/* layer suffix (e.g., -dl) */
220
	int	firsttrack;
221
	int	invistrack;
222
	int	ntrack;
223
	int	nchange;		/* compare with the members in Scsi */
224
	ulong	changetime;		/* " */
225
	int	relearn;		/* need to re-learn the disc? */
226
	int	nameok;
227
	int	writeok;		/* writable disc? */
228
	/*
229
	 * we could combine these attributes into a single variable except
230
	 * that we discover them separately sometimes.
231
	 */
232
	Tristate recordable;		/* writable by burning? */
233
	Tristate erasable;		/* writable after erasing? */
234
 
235
	Track	track[Ntrack];
236
	ulong	end;			/* # of blks on current disc */
237
	ulong	cap;			/* drive capabilities */
238
	uchar	blkbuf[BScdda];
239
 
240
	int	maxreadspeed;
241
	int	maxwritespeed;
242
	int	readspeed;
243
	int	writespeed;
244
	Dev;
245
 
246
	uchar	features[Maxfeatures/8];
247
 
248
	void *aux;		/* kept by driver */
249
};
250
 
251
struct Buf
252
{
253
	uchar	*data;		/* buffer */
254
	vlong	off;		/* data[0] at offset off in file */
255
	int	bs;		/* block size */
256
	long	ndata;		/* no. valid bytes in data */
257
	int	nblock;		/* total buffer size in blocks */
258
	int	omode;		/* OREAD, OWRITE */
259
	long	(*fn)(Buf*, void*, long, ulong); /* read, write */
260
 
261
	/* used only by client */
262
	Otrack	*otrack;
263
};
264
 
265
extern int	vflag;