4 BScdrom = 2048, /* mmc data block size */
9 /* scsi peripheral device types, SPC-3 §6.4.2 */
10 TypeDA = 0, /* Direct Access (SBC) */
11 TypeSA = 1, /* Sequential Access (SSC) */
12 TypeWO = 4, /* Worm (SBC)*/
13 TypeCD = 5, /* CD/DVD/BD (MMC) */
14 TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */
15 TypeMC = 8, /* Medium Changer (SMC) */
17 /* MMC device types */
24 /* disc or track types */
33 /* disc writability classes */
34 Readonly = 0, /* -ROM */
35 Write1, /* -R: write once only */
36 Erasewrite, /* -R[WE]: erase then write */
37 Ram, /* -RAM: read & write unrestricted */
44 /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
49 /* device capabilities in Pagcapmechsts mode page */
50 Capcdr = 1<<0, /* bytes 2 & 3 */
56 Capcdda = 1<<0, /* Capmisc bits */
59 /* Pagwrparams mode page offsets */
60 Wpwrtype = 2, /* write type */
61 Wptrkmode, /* track mode */
64 Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */
66 /* Pagwrparams bits */
67 Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */
69 Msbits = 3<<6, /* multisession field */
70 Msnonext= 0<<6, /* no next border nor session */
71 Mscdnonext= 1<<6, /* cd special: no next session */
72 Msnext = 3<<6, /* next session or border allowed */
73 Fp = 1<<5, /* pay attention to Wppktsz */
75 /* close track session cdb bits */
77 Closesessfinal = 2, /* close session / finalize disc */
78 Closefinaldvdrw = 3, /* dvd-rw special: finalize */
79 /* dvd+r dl special: close session, write extended lead-out */
80 Closesessextdvdrdl = 4,
81 Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */
82 Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */
84 /* read toc format values */
92 /* read toc cdb[1] bit */
95 /* write types, MMC-6 §7.5.4.9 */
96 Wtpkt = 0, /* a.k.a. incremental */
98 Wtsessonce, /* a.k.a. disc-at-once */
102 /* track modes (TODO: also track types?) */
103 Tmcdda = 0, /* audio cdda */
104 Tm2audio, /* 2 audio channels */
105 Tmunintr = 4, /* data, recorded uninterrupted */
106 Tmintr, /* data, recorded interrupted (dvd default) */
108 /* data block types */
109 Dbraw = 0, /* 2352 bytes */
110 Db2kdata = 8, /* mode 1: 2K of user data */
111 Db2336, /* mode 2: 2336 bytes of user data */
113 /* session formats */
118 /* Cache control bits in mode page 8 byte 2 */
119 Ccrcd = 1<<0, /* read cache disabled */
120 Ccmf = 1<<1, /* multiplication factor */
121 Ccwce = 1<<2, /* writeback cache enabled */
122 Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */
123 Ccdisc = 1<<4, /* discontinuity */
124 Cccap = 1<<5, /* caching analysis permitted */
125 Ccabpf = 1<<6, /* abort pre-fetch */
126 Ccic = 1<<7, /* initiator control */
128 /* drive->cap bits */
132 CDNblock = 12, /* chosen for CD */
133 DVDNblock = 16, /* DVD ECC block is 16 sectors */
134 BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
136 * make a single transfer fit in a 9P rpc. if we don't do this,
137 * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
139 Readblock = 8192/BScdrom,
142 typedef struct Buf Buf;
143 typedef struct Dev Dev;
144 typedef struct Drive Drive;
145 typedef struct Msf Msf; /* minute, second, frame */
146 typedef struct Otrack Otrack;
147 typedef struct Track Track;
148 typedef schar Tristate;
158 /* initialized while obtaining the toc (gettoc) */
159 vlong size; /* total size in bytes */
160 long bs; /* block size in bytes */
161 ulong beg; /* beginning block number */
162 ulong end; /* ending block number */
167 /* initialized by fs */
173 struct DTrack /* not used */
176 uchar beg[4]; /* msf value; only used for audio */
177 uchar end[4]; /* msf value; only used for audio */
190 int nref; /* kept by file server */
195 Otrack* (*openrd)(Drive *d, int trackno);
196 Otrack* (*create)(Drive *d, int bs);
197 long (*read)(Otrack *t, void *v, long n, vlong off);
198 long (*write)(Otrack *t, void *v, long n);
199 void (*close)(Otrack *t);
200 int (*gettoc)(Drive*);
201 int (*fixate)(Drive *d);
202 char* (*ctl)(Drive *d, int argc, char **argv);
203 char* (*setspeed)(Drive *d, int r, int w);
211 int type; /* scsi peripheral device type: Type?? */
213 /* disc characteristics */
214 int mmctype; /* cd, dvd, or bd */
215 char *dvdtype; /* name of dvd flavour */
219 int nchange; /* compare with the members in Scsi */
220 ulong changetime; /* " */
222 int writeok; /* writable disc? */
224 * we could combine these attributes into a single variable except
225 * that we discover them separately sometimes.
227 Tristate recordable; /* writable by burning? */
228 Tristate erasable; /* writable after erasing? */
231 ulong cap; /* drive capabilities */
232 uchar blkbuf[BScdda];
240 void *aux; /* kept by driver */
245 uchar *data; /* buffer */
246 vlong off; /* data[0] at offset off in file */
247 int bs; /* block size */
248 long ndata; /* no. valid bytes in data */
249 int nblock; /* total buffer size in blocks */
250 int omode; /* OREAD, OWRITE */
251 long (*fn)(Buf*, void*, long, ulong); /* read, write */
253 /* used only by client */