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; 266