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