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 /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
38 /* device capabilities in Pagcapmechsts mode page */
39 Capcdr = 1<<0, /* bytes 2 & 3 */
45 Capcdda = 1<<0, /* Capmisc bits */
48 /* Pagwrparams mode page offsets */
49 Wpwrtype = 2, /* write type */
50 Wptrkmode, /* track mode */
53 Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */
55 /* Pagwrparams bits */
56 Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */
58 Msbits = 3<<6, /* multisession field */
59 Msnonext= 0<<6, /* no next border nor session */
60 Mscdnonext= 1<<6, /* cd special: no next session */
61 Msnext = 3<<6, /* next session or border allowed */
62 Fp = 1<<5, /* pay attention to Wppktsz */
64 /* close track session cdb bits */
66 Closesessfinal = 2, /* close session / finalize disc */
67 Closefinaldvdrw = 3, /* dvd-rw special: finalize */
68 /* dvd+r dl special: close session, write extended lead-out */
69 Closesessextdvdrdl = 4,
70 Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */
71 Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */
73 /* read toc format values */
81 /* read toc cdb[1] bit */
84 /* write types, MMC-6 §7.5.4.9 */
85 Wtpkt = 0, /* a.k.a. incremental */
87 Wtsessonce, /* a.k.a. disc-at-once */
91 /* track modes (TODO: also track types?) */
92 Tmcdda = 0, /* audio cdda */
93 Tm2audio, /* 2 audio channels */
94 Tmunintr = 4, /* data, recorded uninterrupted */
95 Tmintr, /* data, recorded interrupted (dvd default) */
97 /* data block types */
98 Dbraw = 0, /* 2352 bytes */
99 Db2kdata = 8, /* mode 1: 2K of user data */
100 Db2336, /* mode 2: 2336 bytes of user data */
102 /* session formats */
107 /* Cache control bits in mode page 8 byte 2 */
108 Ccrcd = 1<<0, /* read cache disabled */
109 Ccmf = 1<<1, /* multiplication factor */
110 Ccwce = 1<<2, /* writeback cache enabled */
111 Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */
112 Ccdisc = 1<<4, /* discontinuity */
113 Cccap = 1<<5, /* caching analysis permitted */
114 Ccabpf = 1<<6, /* abort pre-fetch */
115 Ccic = 1<<7, /* initiator control */
117 /* drive->cap bits */
121 CDNblock = 12, /* chosen for CD */
122 DVDNblock = 16, /* DVD ECC block is 16 sectors */
123 BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */
125 * make a single transfer fit in a 9P rpc. if we don't do this,
126 * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
128 Readblock = 8192/BScdrom,
131 typedef struct Buf Buf;
132 typedef struct Drive Drive;
133 typedef struct Track Track;
134 typedef struct Otrack Otrack;
135 typedef struct Dev Dev;
136 typedef struct Msf Msf; /* minute, second, frame */
146 /* initialized while obtaining the toc (gettoc) */
147 vlong size; /* total size in bytes */
148 long bs; /* block size in bytes */
149 ulong beg; /* beginning block number */
150 ulong end; /* ending block number */
155 /* initialized by fs */
161 struct DTrack /* not used */
164 uchar beg[4]; /* msf value; only used for audio */
165 uchar end[4]; /* msf value; only used for audio */
178 int nref; /* kept by file server */
183 Otrack* (*openrd)(Drive *d, int trackno);
184 Otrack* (*create)(Drive *d, int bs);
185 long (*read)(Otrack *t, void *v, long n, vlong off);
186 long (*write)(Otrack *t, void *v, long n);
187 void (*close)(Otrack *t);
188 int (*gettoc)(Drive*);
189 int (*fixate)(Drive *d);
190 char* (*ctl)(Drive *d, int argc, char **argv);
191 char* (*setspeed)(Drive *d, int r, int w);
199 int type; /* scsi peripheral device type */
201 /* disc characteristics */
206 int nchange; /* compare with the members in Scsi */
207 ulong changetime; /* " */
210 int blank; /* (not used for anything yet) */
212 int recordable; /* writable by burning? */
214 int erasable; /* rewritable? */
218 ulong cap; /* drive capabilities */
219 uchar blkbuf[BScdda];
227 void *aux; /* kept by driver */
232 uchar *data; /* buffer */
233 vlong off; /* data[0] at offset off in file */
234 int bs; /* block size */
235 long ndata; /* no. valid bytes in data */
236 int nblock; /* total buffer size in blocks */
237 int omode; /* OREAD, OWRITE */
238 long (*fn)(Buf*, void*, long, ulong); /* read, write */
240 /* used only by client */