17dd7cddfSDavid du Colombier enum { 27dd7cddfSDavid du Colombier Maxtrack = 200, 37dd7cddfSDavid du Colombier Ntrack = Maxtrack+1, 4c038c065SDavid du Colombier BScdrom = 2048, /* mmc data block size */ 57dd7cddfSDavid du Colombier BScdda = 2352, 67dd7cddfSDavid du Colombier BScdxa = 2336, 759cc4ca5SDavid du Colombier BSmax = 2352, 87dd7cddfSDavid du Colombier 9889a2622SDavid du Colombier Maxfeatures = 512, 10889a2622SDavid du Colombier 11cdf9e71cSDavid du Colombier /* scsi peripheral device types, SPC-3 §6.4.2 */ 12e67f3b95SDavid du Colombier TypeDA = 0, /* Direct Access (SBC) */ 13cdf9e71cSDavid du Colombier TypeSA = 1, /* Sequential Access (SSC) */ 14e67f3b95SDavid du Colombier TypeWO = 4, /* Worm (SBC)*/ 15cdf9e71cSDavid du Colombier TypeCD = 5, /* CD/DVD/BD (MMC) */ 16e67f3b95SDavid du Colombier TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */ 17cdf9e71cSDavid du Colombier TypeMC = 8, /* Medium Changer (SMC) */ 187dd7cddfSDavid du Colombier 19cdf9e71cSDavid du Colombier /* MMC device types */ 20cdf9e71cSDavid du Colombier Mmcnone = 0, 21cdf9e71cSDavid du Colombier Mmccd, 22cdf9e71cSDavid du Colombier Mmcdvdminus, 23cdf9e71cSDavid du Colombier Mmcdvdplus, 24cdf9e71cSDavid du Colombier Mmcbd, 25c038c065SDavid du Colombier 26c038c065SDavid du Colombier /* disc or track types */ 277dd7cddfSDavid du Colombier TypeNone = 0, 287dd7cddfSDavid du Colombier TypeAudio, 297dd7cddfSDavid du Colombier TypeAwritable, 307dd7cddfSDavid du Colombier TypeData, 317dd7cddfSDavid du Colombier TypeDwritable, 327dd7cddfSDavid du Colombier TypeDisk, 337dd7cddfSDavid du Colombier TypeBlank, 347dd7cddfSDavid du Colombier 3560ba15acSDavid du Colombier /* disc writability classes */ 3660ba15acSDavid du Colombier Readonly = 0, /* -ROM */ 3760ba15acSDavid du Colombier Write1, /* -R: write once only */ 3860ba15acSDavid du Colombier Erasewrite, /* -R[WE]: erase then write */ 3960ba15acSDavid du Colombier Ram, /* -RAM: read & write unrestricted */ 4060ba15acSDavid du Colombier 4160ba15acSDavid du Colombier /* tri-state flags */ 4260ba15acSDavid du Colombier Unset = -1, 4360ba15acSDavid du Colombier No, 4460ba15acSDavid du Colombier Yes, 4560ba15acSDavid du Colombier 46c038c065SDavid du Colombier /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */ 47c038c065SDavid du Colombier Capread = 2, 48c038c065SDavid du Colombier Capwrite = 3, 49c038c065SDavid du Colombier Capmisc = 5, 50c038c065SDavid du Colombier 51c038c065SDavid du Colombier /* device capabilities in Pagcapmechsts mode page */ 52c038c065SDavid du Colombier Capcdr = 1<<0, /* bytes 2 & 3 */ 53c038c065SDavid du Colombier Capcdrw = 1<<1, 54c038c065SDavid du Colombier Captestwr = 1<<2, 55c038c065SDavid du Colombier Capdvdrom = 1<<3, 56c038c065SDavid du Colombier Capdvdr = 1<<4, 57c038c065SDavid du Colombier Capdvdram = 1<<5, 58c038c065SDavid du Colombier Capcdda = 1<<0, /* Capmisc bits */ 59c038c065SDavid du Colombier Caprw = 1<<2, 60c038c065SDavid du Colombier 612adb73c5SDavid du Colombier /* Pagwrparams mode page offsets */ 622adb73c5SDavid du Colombier Wpwrtype = 2, /* write type */ 632adb73c5SDavid du Colombier Wptrkmode, /* track mode */ 642adb73c5SDavid du Colombier Wpdatblktype, 652adb73c5SDavid du Colombier Wpsessfmt = 8, 662adb73c5SDavid du Colombier Wppktsz = 10, /* BE ulong: # user data blks/fixed pkt */ 672adb73c5SDavid du Colombier 68436f307dSDavid du Colombier /* Pagwrparams bits */ 692adb73c5SDavid du Colombier Bufe = 1<<6, /* Wpwrtype: buffer under-run free recording enable */ 702adb73c5SDavid du Colombier /* Wptrkmode */ 712adb73c5SDavid du Colombier Msbits = 3<<6, /* multisession field */ 722adb73c5SDavid du Colombier Msnonext= 0<<6, /* no next border nor session */ 732adb73c5SDavid du Colombier Mscdnonext= 1<<6, /* cd special: no next session */ 742adb73c5SDavid du Colombier Msnext = 3<<6, /* next session or border allowed */ 752adb73c5SDavid du Colombier Fp = 1<<5, /* pay attention to Wppktsz */ 76436f307dSDavid du Colombier 77436f307dSDavid du Colombier /* close track session cdb bits */ 78436f307dSDavid du Colombier Closetrack = 1, 79436f307dSDavid du Colombier Closesessfinal = 2, /* close session / finalize disc */ 80436f307dSDavid du Colombier Closefinaldvdrw = 3, /* dvd-rw special: finalize */ 81436f307dSDavid du Colombier /* dvd+r dl special: close session, write extended lead-out */ 82436f307dSDavid du Colombier Closesessextdvdrdl = 4, 83436f307dSDavid du Colombier Closefinal30mm = 5, /* dvd+r special: finalize with ≥30mm radius */ 84436f307dSDavid du Colombier Closedvdrbdfinal= 6, /* dvd+r, bd-r special: finalize */ 85436f307dSDavid du Colombier 86436f307dSDavid du Colombier /* read toc format values */ 87436f307dSDavid du Colombier Tocfmttoc = 0, 88436f307dSDavid du Colombier Tocfmtsessnos = 1, 89436f307dSDavid du Colombier Tocfmtqleadin = 2, 90436f307dSDavid du Colombier Tocfmtqpma = 3, 91436f307dSDavid du Colombier Tocfmtatip = 4, 92436f307dSDavid du Colombier Tocfmtcdtext = 5, 93436f307dSDavid du Colombier 94436f307dSDavid du Colombier /* read toc cdb[1] bit */ 95436f307dSDavid du Colombier Msfbit = 1<<1, 96436f307dSDavid du Colombier 97c038c065SDavid du Colombier /* write types, MMC-6 §7.5.4.9 */ 982adb73c5SDavid du Colombier Wtpkt = 0, /* a.k.a. incremental */ 99c038c065SDavid du Colombier Wttrackonce, 1002adb73c5SDavid du Colombier Wtsessonce, /* a.k.a. disc-at-once */ 101c038c065SDavid du Colombier Wtraw, 102c038c065SDavid du Colombier Wtlayerjump, 103c038c065SDavid du Colombier 104889a2622SDavid du Colombier /* track modes (determine: are these also track types?) */ 1052adb73c5SDavid du Colombier Tmcdda = 0, /* audio cdda */ 1062adb73c5SDavid du Colombier Tm2audio, /* 2 audio channels */ 1072adb73c5SDavid du Colombier Tmunintr = 4, /* data, recorded uninterrupted */ 1082adb73c5SDavid du Colombier Tmintr, /* data, recorded interrupted (dvd default) */ 1092adb73c5SDavid du Colombier 1102adb73c5SDavid du Colombier /* data block types */ 1112adb73c5SDavid du Colombier Dbraw = 0, /* 2352 bytes */ 1122adb73c5SDavid du Colombier Db2kdata = 8, /* mode 1: 2K of user data */ 1132adb73c5SDavid du Colombier Db2336, /* mode 2: 2336 bytes of user data */ 1142adb73c5SDavid du Colombier 1152adb73c5SDavid du Colombier /* session formats */ 1162adb73c5SDavid du Colombier Sfdata = 0, 1172adb73c5SDavid du Colombier Sfcdi = 0x10, 1182adb73c5SDavid du Colombier Sfcdxa = 0x20, 1192adb73c5SDavid du Colombier 120c038c065SDavid du Colombier /* Cache control bits in mode page 8 byte 2 */ 121e67f3b95SDavid du Colombier Ccrcd = 1<<0, /* read cache disabled */ 122e67f3b95SDavid du Colombier Ccmf = 1<<1, /* multiplication factor */ 123e67f3b95SDavid du Colombier Ccwce = 1<<2, /* writeback cache enabled */ 124e67f3b95SDavid du Colombier Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */ 125e67f3b95SDavid du Colombier Ccdisc = 1<<4, /* discontinuity */ 126e67f3b95SDavid du Colombier Cccap = 1<<5, /* caching analysis permitted */ 127e67f3b95SDavid du Colombier Ccabpf = 1<<6, /* abort pre-fetch */ 128e67f3b95SDavid du Colombier Ccic = 1<<7, /* initiator control */ 129e67f3b95SDavid du Colombier 130c038c065SDavid du Colombier /* drive->cap bits */ 1317dd7cddfSDavid du Colombier Cwrite = 1<<0, 1327dd7cddfSDavid du Colombier Ccdda = 1<<1, 1337dd7cddfSDavid du Colombier 134c038c065SDavid du Colombier CDNblock = 12, /* chosen for CD */ 135c038c065SDavid du Colombier DVDNblock = 16, /* DVD ECC block is 16 sectors */ 136c038c065SDavid du Colombier BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */ 137889a2622SDavid du Colombier /* BD-R are write-once in increments of 64KB */ 1387386956aSDavid du Colombier /* 1397386956aSDavid du Colombier * make a single transfer fit in a 9P rpc. if we don't do this, 1407386956aSDavid du Colombier * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously. 1417386956aSDavid du Colombier */ 1427386956aSDavid du Colombier Readblock = 8192/BScdrom, 1437dd7cddfSDavid du Colombier }; 1447dd7cddfSDavid du Colombier 1457dd7cddfSDavid du Colombier typedef struct Buf Buf; 1467dd7cddfSDavid du Colombier typedef struct Dev Dev; 14760ba15acSDavid du Colombier typedef struct Drive Drive; 1489a747e4fSDavid du Colombier typedef struct Msf Msf; /* minute, second, frame */ 14960ba15acSDavid du Colombier typedef struct Otrack Otrack; 15060ba15acSDavid du Colombier typedef struct Track Track; 15160ba15acSDavid du Colombier typedef schar Tristate; 1529a747e4fSDavid du Colombier 1539a747e4fSDavid du Colombier struct Msf { 1549a747e4fSDavid du Colombier int m; 1559a747e4fSDavid du Colombier int s; 1569a747e4fSDavid du Colombier int f; 1579a747e4fSDavid du Colombier }; 1587dd7cddfSDavid du Colombier 1597dd7cddfSDavid du Colombier struct Track 1607dd7cddfSDavid du Colombier { 1617dd7cddfSDavid du Colombier /* initialized while obtaining the toc (gettoc) */ 1627dd7cddfSDavid du Colombier vlong size; /* total size in bytes */ 1637dd7cddfSDavid du Colombier long bs; /* block size in bytes */ 1647dd7cddfSDavid du Colombier ulong beg; /* beginning block number */ 1657dd7cddfSDavid du Colombier ulong end; /* ending block number */ 1667dd7cddfSDavid du Colombier int type; 1679a747e4fSDavid du Colombier Msf mbeg; 1689a747e4fSDavid du Colombier Msf mend; 1699a747e4fSDavid du Colombier 1707dd7cddfSDavid du Colombier /* initialized by fs */ 1719a747e4fSDavid du Colombier char name[32]; 1727dd7cddfSDavid du Colombier int mode; 173684b447eSDavid du Colombier ulong mtime; 1747dd7cddfSDavid du Colombier }; 1757dd7cddfSDavid du Colombier 17673ee67a1SDavid du Colombier struct DTrack /* not used */ 1777dd7cddfSDavid du Colombier { 1789a747e4fSDavid du Colombier uchar name[32]; 179436f307dSDavid du Colombier uchar beg[4]; /* msf value; only used for audio */ 180436f307dSDavid du Colombier uchar end[4]; /* msf value; only used for audio */ 1817dd7cddfSDavid du Colombier uchar size[8]; 1827dd7cddfSDavid du Colombier uchar magic[4]; 1837dd7cddfSDavid du Colombier }; 1847dd7cddfSDavid du Colombier 1857dd7cddfSDavid du Colombier struct Otrack 1867dd7cddfSDavid du Colombier { 1877dd7cddfSDavid du Colombier Track *track; 1887dd7cddfSDavid du Colombier Drive *drive; 1897dd7cddfSDavid du Colombier int nchange; 1907dd7cddfSDavid du Colombier int omode; 1917dd7cddfSDavid du Colombier Buf *buf; 1927dd7cddfSDavid du Colombier 1937dd7cddfSDavid du Colombier int nref; /* kept by file server */ 1947dd7cddfSDavid du Colombier }; 1957dd7cddfSDavid du Colombier 1967dd7cddfSDavid du Colombier struct Dev 1977dd7cddfSDavid du Colombier { 1987dd7cddfSDavid du Colombier Otrack* (*openrd)(Drive *d, int trackno); 1997dd7cddfSDavid du Colombier Otrack* (*create)(Drive *d, int bs); 200dd12a5c6SDavid du Colombier long (*read)(Otrack *t, void *v, long n, vlong off); 2017dd7cddfSDavid du Colombier long (*write)(Otrack *t, void *v, long n); 2027dd7cddfSDavid du Colombier void (*close)(Otrack *t); 2037dd7cddfSDavid du Colombier int (*gettoc)(Drive*); 2047dd7cddfSDavid du Colombier int (*fixate)(Drive *d); 2057dd7cddfSDavid du Colombier char* (*ctl)(Drive *d, int argc, char **argv); 2069a747e4fSDavid du Colombier char* (*setspeed)(Drive *d, int r, int w); 2077dd7cddfSDavid du Colombier }; 2087dd7cddfSDavid du Colombier 2097dd7cddfSDavid du Colombier struct Drive 2107dd7cddfSDavid du Colombier { 2117dd7cddfSDavid du Colombier QLock; 2127dd7cddfSDavid du Colombier Scsi; 2137dd7cddfSDavid du Colombier 21460ba15acSDavid du Colombier int type; /* scsi peripheral device type: Type?? */ 215cdf9e71cSDavid du Colombier 216c038c065SDavid du Colombier /* disc characteristics */ 21760ba15acSDavid du Colombier int mmctype; /* cd, dvd, or bd */ 21860ba15acSDavid du Colombier char *dvdtype; /* name of dvd flavour */ 219889a2622SDavid du Colombier char *laysfx; /* layer suffix (e.g., -dl) */ 2207dd7cddfSDavid du Colombier int firsttrack; 2217f1c8a1dSDavid du Colombier int invistrack; 2227dd7cddfSDavid du Colombier int ntrack; 223cdf9e71cSDavid du Colombier int nchange; /* compare with the members in Scsi */ 224cdf9e71cSDavid du Colombier ulong changetime; /* " */ 225*81f927e7SDavid du Colombier int relearn; /* need to re-learn the disc? */ 2267dd7cddfSDavid du Colombier int nameok; 22760ba15acSDavid du Colombier int writeok; /* writable disc? */ 22860ba15acSDavid du Colombier /* 22960ba15acSDavid du Colombier * we could combine these attributes into a single variable except 23060ba15acSDavid du Colombier * that we discover them separately sometimes. 23160ba15acSDavid du Colombier */ 23260ba15acSDavid du Colombier Tristate recordable; /* writable by burning? */ 23360ba15acSDavid du Colombier Tristate erasable; /* writable after erasing? */ 234e67f3b95SDavid du Colombier 2357dd7cddfSDavid du Colombier Track track[Ntrack]; 236889a2622SDavid du Colombier ulong end; /* # of blks on current disc */ 237c038c065SDavid du Colombier ulong cap; /* drive capabilities */ 2387dd7cddfSDavid du Colombier uchar blkbuf[BScdda]; 239e67f3b95SDavid du Colombier 2409a747e4fSDavid du Colombier int maxreadspeed; 2419a747e4fSDavid du Colombier int maxwritespeed; 2429a747e4fSDavid du Colombier int readspeed; 2439a747e4fSDavid du Colombier int writespeed; 2447dd7cddfSDavid du Colombier Dev; 2457dd7cddfSDavid du Colombier 246889a2622SDavid du Colombier uchar features[Maxfeatures/8]; 247889a2622SDavid du Colombier 2487dd7cddfSDavid du Colombier void *aux; /* kept by driver */ 2497dd7cddfSDavid du Colombier }; 2507dd7cddfSDavid du Colombier 2517dd7cddfSDavid du Colombier struct Buf 2527dd7cddfSDavid du Colombier { 2537dd7cddfSDavid du Colombier uchar *data; /* buffer */ 254dd12a5c6SDavid du Colombier vlong off; /* data[0] at offset off in file */ 2557dd7cddfSDavid du Colombier int bs; /* block size */ 2567dd7cddfSDavid du Colombier long ndata; /* no. valid bytes in data */ 2577dd7cddfSDavid du Colombier int nblock; /* total buffer size in blocks */ 2587dd7cddfSDavid du Colombier int omode; /* OREAD, OWRITE */ 259dd12a5c6SDavid du Colombier long (*fn)(Buf*, void*, long, ulong); /* read, write */ 2607dd7cddfSDavid du Colombier 2617dd7cddfSDavid du Colombier /* used only by client */ 2627dd7cddfSDavid du Colombier Otrack *otrack; 2637dd7cddfSDavid du Colombier }; 2647dd7cddfSDavid du Colombier 2657dd7cddfSDavid du Colombier extern int vflag; 266