17dd7cddfSDavid du Colombier enum { 27dd7cddfSDavid du Colombier Maxtrack = 200, 37dd7cddfSDavid du Colombier Ntrack = Maxtrack+1, 4*c038c065SDavid 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 9e67f3b95SDavid du Colombier /* scsi peripheral device types */ 10e67f3b95SDavid du Colombier TypeDA = 0, /* Direct Access (SBC) */ 11e67f3b95SDavid du Colombier TypeSA = 1, /* Sequential Access (SSC-2) */ 12e67f3b95SDavid du Colombier TypeWO = 4, /* Worm (SBC)*/ 13e67f3b95SDavid du Colombier TypeCD = 5, /* CD/DVD/BD (MMC-3) */ 14e67f3b95SDavid du Colombier TypeMO = 7, /* rewriteable Magneto-Optical (SBC) */ 15e67f3b95SDavid du Colombier TypeMC = 8, /* Medium Changer (SMC-2) */ 167dd7cddfSDavid du Colombier 17*c038c065SDavid du Colombier /* MMC-3 device types */ 18*c038c065SDavid du Colombier Subtypenone = 0, 19*c038c065SDavid du Colombier Subtypecd, 20*c038c065SDavid du Colombier Subtypedvd, 21*c038c065SDavid du Colombier Subtypebd, 22*c038c065SDavid du Colombier 23*c038c065SDavid du Colombier /* disc or track types */ 247dd7cddfSDavid du Colombier TypeNone = 0, 257dd7cddfSDavid du Colombier TypeAudio, 267dd7cddfSDavid du Colombier TypeAwritable, 277dd7cddfSDavid du Colombier TypeData, 287dd7cddfSDavid du Colombier TypeDwritable, 297dd7cddfSDavid du Colombier TypeDisk, 307dd7cddfSDavid du Colombier TypeBlank, 317dd7cddfSDavid du Colombier 32*c038c065SDavid du Colombier /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */ 33*c038c065SDavid du Colombier Capread = 2, 34*c038c065SDavid du Colombier Capwrite = 3, 35*c038c065SDavid du Colombier Capmisc = 5, 36*c038c065SDavid du Colombier 37*c038c065SDavid du Colombier /* device capabilities in Pagcapmechsts mode page */ 38*c038c065SDavid du Colombier Capcdr = 1<<0, /* bytes 2 & 3 */ 39*c038c065SDavid du Colombier Capcdrw = 1<<1, 40*c038c065SDavid du Colombier Captestwr = 1<<2, 41*c038c065SDavid du Colombier Capdvdrom = 1<<3, 42*c038c065SDavid du Colombier Capdvdr = 1<<4, 43*c038c065SDavid du Colombier Capdvdram = 1<<5, 44*c038c065SDavid du Colombier Capcdda = 1<<0, /* Capmisc bits */ 45*c038c065SDavid du Colombier Caprw = 1<<2, 46*c038c065SDavid du Colombier 47*c038c065SDavid du Colombier /* write types, MMC-6 §7.5.4.9 */ 48*c038c065SDavid du Colombier Wtpkt = 0, 49*c038c065SDavid du Colombier Wttrackonce, 50*c038c065SDavid du Colombier Wtsessonce, 51*c038c065SDavid du Colombier Wtraw, 52*c038c065SDavid du Colombier Wtlayerjump, 53*c038c065SDavid du Colombier 54*c038c065SDavid du Colombier /* Cache control bits in mode page 8 byte 2 */ 55e67f3b95SDavid du Colombier Ccrcd = 1<<0, /* read cache disabled */ 56e67f3b95SDavid du Colombier Ccmf = 1<<1, /* multiplication factor */ 57e67f3b95SDavid du Colombier Ccwce = 1<<2, /* writeback cache enabled */ 58e67f3b95SDavid du Colombier Ccsize = 1<<3, /* use `cache segment size', not `# of cache segments' */ 59e67f3b95SDavid du Colombier Ccdisc = 1<<4, /* discontinuity */ 60e67f3b95SDavid du Colombier Cccap = 1<<5, /* caching analysis permitted */ 61e67f3b95SDavid du Colombier Ccabpf = 1<<6, /* abort pre-fetch */ 62e67f3b95SDavid du Colombier Ccic = 1<<7, /* initiator control */ 63e67f3b95SDavid du Colombier 64*c038c065SDavid du Colombier /* drive->cap bits */ 657dd7cddfSDavid du Colombier Cwrite = 1<<0, 667dd7cddfSDavid du Colombier Ccdda = 1<<1, 677dd7cddfSDavid du Colombier 68*c038c065SDavid du Colombier CDNblock = 12, /* chosen for CD */ 69*c038c065SDavid du Colombier DVDNblock = 16, /* DVD ECC block is 16 sectors */ 70*c038c065SDavid du Colombier BDNblock = 32, /* BD ECC block (`cluster') is 32 sectors */ 717dd7cddfSDavid du Colombier }; 727dd7cddfSDavid du Colombier 737dd7cddfSDavid du Colombier typedef struct Buf Buf; 747dd7cddfSDavid du Colombier typedef struct Drive Drive; 757dd7cddfSDavid du Colombier typedef struct Track Track; 767dd7cddfSDavid du Colombier typedef struct Otrack Otrack; 777dd7cddfSDavid du Colombier typedef struct Dev Dev; 789a747e4fSDavid du Colombier typedef struct Msf Msf; /* minute, second, frame */ 799a747e4fSDavid du Colombier 809a747e4fSDavid du Colombier struct Msf { 819a747e4fSDavid du Colombier int m; 829a747e4fSDavid du Colombier int s; 839a747e4fSDavid du Colombier int f; 849a747e4fSDavid du Colombier }; 857dd7cddfSDavid du Colombier 867dd7cddfSDavid du Colombier struct Track 877dd7cddfSDavid du Colombier { 887dd7cddfSDavid du Colombier /* initialized while obtaining the toc (gettoc) */ 897dd7cddfSDavid du Colombier vlong size; /* total size in bytes */ 907dd7cddfSDavid du Colombier long bs; /* block size in bytes */ 917dd7cddfSDavid du Colombier ulong beg; /* beginning block number */ 927dd7cddfSDavid du Colombier ulong end; /* ending block number */ 937dd7cddfSDavid du Colombier int type; 949a747e4fSDavid du Colombier Msf mbeg; 959a747e4fSDavid du Colombier Msf mend; 969a747e4fSDavid du Colombier 977dd7cddfSDavid du Colombier /* initialized by fs */ 989a747e4fSDavid du Colombier char name[32]; 997dd7cddfSDavid du Colombier int mode; 1007dd7cddfSDavid du Colombier int mtime; 1017dd7cddfSDavid du Colombier }; 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombier struct DTrack 1047dd7cddfSDavid du Colombier { 1059a747e4fSDavid du Colombier uchar name[32]; 1067dd7cddfSDavid du Colombier uchar beg[4]; 1077dd7cddfSDavid du Colombier uchar end[4]; 1087dd7cddfSDavid du Colombier uchar size[8]; 1097dd7cddfSDavid du Colombier uchar magic[4]; 1107dd7cddfSDavid du Colombier }; 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier struct Otrack 1137dd7cddfSDavid du Colombier { 1147dd7cddfSDavid du Colombier Track *track; 1157dd7cddfSDavid du Colombier Drive *drive; 1167dd7cddfSDavid du Colombier int nchange; 1177dd7cddfSDavid du Colombier int omode; 1187dd7cddfSDavid du Colombier Buf *buf; 1197dd7cddfSDavid du Colombier 1207dd7cddfSDavid du Colombier int nref; /* kept by file server */ 1217dd7cddfSDavid du Colombier }; 1227dd7cddfSDavid du Colombier 1237dd7cddfSDavid du Colombier struct Dev 1247dd7cddfSDavid du Colombier { 1257dd7cddfSDavid du Colombier Otrack* (*openrd)(Drive *d, int trackno); 1267dd7cddfSDavid du Colombier Otrack* (*create)(Drive *d, int bs); 1277dd7cddfSDavid du Colombier long (*read)(Otrack *t, void *v, long n, long off); 1287dd7cddfSDavid du Colombier long (*write)(Otrack *t, void *v, long n); 1297dd7cddfSDavid du Colombier void (*close)(Otrack *t); 1307dd7cddfSDavid du Colombier int (*gettoc)(Drive*); 1317dd7cddfSDavid du Colombier int (*fixate)(Drive *d); 1327dd7cddfSDavid du Colombier char* (*ctl)(Drive *d, int argc, char **argv); 1339a747e4fSDavid du Colombier char* (*setspeed)(Drive *d, int r, int w); 1347dd7cddfSDavid du Colombier }; 1357dd7cddfSDavid du Colombier 1367dd7cddfSDavid du Colombier struct Drive 1377dd7cddfSDavid du Colombier { 1387dd7cddfSDavid du Colombier QLock; 1397dd7cddfSDavid du Colombier Scsi; 1407dd7cddfSDavid du Colombier 141*c038c065SDavid du Colombier /* disc characteristics */ 1427dd7cddfSDavid du Colombier int type; 143*c038c065SDavid du Colombier int subtype; 1447dd7cddfSDavid du Colombier int nopen; 1457dd7cddfSDavid du Colombier int firsttrack; 1467dd7cddfSDavid du Colombier int ntrack; 1477dd7cddfSDavid du Colombier int nchange; 1487dd7cddfSDavid du Colombier int changetime; 1497dd7cddfSDavid du Colombier int nameok; 1507dd7cddfSDavid du Colombier int writeok; 151*c038c065SDavid du Colombier int blank; 152*c038c065SDavid du Colombier int blankset; 153*c038c065SDavid du Colombier int recordable; /* writable by burning? */ 154*c038c065SDavid du Colombier int recordableset; 155*c038c065SDavid du Colombier int erasable; /* rewritable? */ 156*c038c065SDavid du Colombier int erasableset; 157e67f3b95SDavid du Colombier 1587dd7cddfSDavid du Colombier Track track[Ntrack]; 159*c038c065SDavid du Colombier ulong cap; /* drive capabilities */ 1607dd7cddfSDavid du Colombier uchar blkbuf[BScdda]; 161e67f3b95SDavid du Colombier 1629a747e4fSDavid du Colombier int maxreadspeed; 1639a747e4fSDavid du Colombier int maxwritespeed; 1649a747e4fSDavid du Colombier int readspeed; 1659a747e4fSDavid du Colombier int writespeed; 1667dd7cddfSDavid du Colombier Dev; 1677dd7cddfSDavid du Colombier 1687dd7cddfSDavid du Colombier void *aux; /* kept by driver */ 1697dd7cddfSDavid du Colombier }; 1707dd7cddfSDavid du Colombier 1717dd7cddfSDavid du Colombier struct Buf 1727dd7cddfSDavid du Colombier { 1737dd7cddfSDavid du Colombier uchar *data; /* buffer */ 1747dd7cddfSDavid du Colombier long off; /* data[0] at offset off in file */ 1757dd7cddfSDavid du Colombier int bs; /* block size */ 1767dd7cddfSDavid du Colombier long ndata; /* no. valid bytes in data */ 1777dd7cddfSDavid du Colombier int nblock; /* total buffer size in blocks */ 1787dd7cddfSDavid du Colombier int omode; /* OREAD, OWRITE */ 1797dd7cddfSDavid du Colombier long (*fn)(Buf*, void*, long, long); /* read, write */ 1807dd7cddfSDavid du Colombier 1817dd7cddfSDavid du Colombier /* used only by client */ 1827dd7cddfSDavid du Colombier Otrack *otrack; 1837dd7cddfSDavid du Colombier }; 1847dd7cddfSDavid du Colombier 1857dd7cddfSDavid du Colombier extern int vflag; 186