xref: /plan9/sys/src/cmd/cdfs/dat.h (revision c038c065b3262a4b30cb86a2f0f52bffd3cc20c0)
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