xref: /plan9/sys/src/cmd/usb/disk/scsireq.h (revision fd362a73ff89ae80075dd82c9aad2a3468f0f3c9)
17d7728c9SDavid du Colombier /*
27d7728c9SDavid du Colombier  * This is /sys/src/cmd/scuzz/scsireq.h
3*3a827ddcSDavid du Colombier  * changed to add more debug support, and to keep
47d7728c9SDavid du Colombier  * disk compiling without a scuzz that includes these changes.
57d7728c9SDavid du Colombier  *
6*3a827ddcSDavid du Colombier  * scsireq.h is also included by usb/disk and cdfs.
77d7728c9SDavid du Colombier  */
87d7728c9SDavid du Colombier typedef struct Umsc Umsc;
97d7728c9SDavid du Colombier #pragma incomplete Umsc
107d7728c9SDavid du Colombier 
117d7728c9SDavid du Colombier enum {					/* fundamental constants/defaults */
127d7728c9SDavid du Colombier 	MaxDirData	= 255,		/* max. direct data returned */
13*3a827ddcSDavid du Colombier 	/*
14*3a827ddcSDavid du Colombier 	 * Because we are accessed via devmnt, we can never get i/o counts
15*3a827ddcSDavid du Colombier 	 * larger than 8216 (Msgsize and devmnt's offered iounit) - 24
16*3a827ddcSDavid du Colombier 	 * (IOHDRSZ) = 8K.
17*3a827ddcSDavid du Colombier 	 */
18*3a827ddcSDavid du Colombier 	Maxiosize	= 8216 - IOHDRSZ, /* max. I/O transfer size */
197d7728c9SDavid du Colombier };
207d7728c9SDavid du Colombier 
217d7728c9SDavid du Colombier typedef struct {
227d7728c9SDavid du Colombier 	uchar	*p;
237d7728c9SDavid du Colombier 	long	count;
247d7728c9SDavid du Colombier 	uchar	write;
257d7728c9SDavid du Colombier } ScsiPtr;
267d7728c9SDavid du Colombier 
277d7728c9SDavid du Colombier typedef struct {
287d7728c9SDavid du Colombier 	int	flags;
297d7728c9SDavid du Colombier 	char	*unit;			/* unit directory */
307d7728c9SDavid du Colombier 	int	lun;
317d7728c9SDavid du Colombier 	ulong	lbsize;
32*3a827ddcSDavid du Colombier 	uvlong	offset;			/* in blocks of lbsize bytes */
337d7728c9SDavid du Colombier 	int	fd;
347d7728c9SDavid du Colombier 	Umsc	*umsc;			/* lun */
357d7728c9SDavid du Colombier 	ScsiPtr	cmd;
367d7728c9SDavid du Colombier 	ScsiPtr	data;
377d7728c9SDavid du Colombier 	int	status;			/* returned status */
387d7728c9SDavid du Colombier 	uchar	sense[MaxDirData];	/* returned sense data */
397d7728c9SDavid du Colombier 	uchar	inquiry[MaxDirData];	/* returned inquiry data */
407d7728c9SDavid du Colombier 	int	readblock;		/* flag: read a block since open */
417d7728c9SDavid du Colombier } ScsiReq;
427d7728c9SDavid du Colombier 
437d7728c9SDavid du Colombier enum {					/* software flags */
447d7728c9SDavid du Colombier 	Fopen		= 0x0001,	/* open */
457d7728c9SDavid du Colombier 	Fseqdev		= 0x0002,	/* sequential-access device */
467d7728c9SDavid du Colombier 	Fwritten	= 0x0004,	/* device written */
477d7728c9SDavid du Colombier 	Fronly		= 0x0008,	/* device is read-only */
487d7728c9SDavid du Colombier 	Fwormdev	= 0x0010,	/* write-once read-multiple device */
497d7728c9SDavid du Colombier 	Fprintdev	= 0x0020,	/* printer */
507d7728c9SDavid du Colombier 	Fbfixed		= 0x0040,	/* fixed block size */
517d7728c9SDavid du Colombier 	Fchanger	= 0x0080,	/* medium-changer device */
527d7728c9SDavid du Colombier 	Finqok		= 0x0100,	/* inquiry data is OK */
537d7728c9SDavid du Colombier 	Fmode6		= 0x0200,	/* use 6-byte modeselect */
547d7728c9SDavid du Colombier 	Frw10		= 0x0400,	/* use 10-byte read/write */
557d7728c9SDavid du Colombier 	Fusb		= 0x0800,	/* USB transparent scsi */
567d7728c9SDavid du Colombier };
577d7728c9SDavid du Colombier 
587d7728c9SDavid du Colombier enum {
597d7728c9SDavid du Colombier 	STnomem		=-4,		/* buffer allocation failed */
607d7728c9SDavid du Colombier 	STharderr	=-3,		/* controller error of some kind */
617d7728c9SDavid du Colombier 	STtimeout	=-2,		/* bus timeout */
627d7728c9SDavid du Colombier 	STok		= 0,		/* good */
637d7728c9SDavid du Colombier 	STcheck		= 0x02,		/* check condition */
647d7728c9SDavid du Colombier 	STcondmet	= 0x04,		/* condition met/good */
657d7728c9SDavid du Colombier 	STbusy		= 0x08,		/* busy */
667d7728c9SDavid du Colombier 	STintok		= 0x10,		/* intermediate/good */
677d7728c9SDavid du Colombier 	STintcondmet	= 0x14,		/* intermediate/condition met/good */
687d7728c9SDavid du Colombier 	STresconf	= 0x18,		/* reservation conflict */
697d7728c9SDavid du Colombier 	STterminated	= 0x22,		/* command terminated */
707d7728c9SDavid du Colombier 	STqfull		= 0x28,		/* queue full */
717d7728c9SDavid du Colombier };
727d7728c9SDavid du Colombier 
737d7728c9SDavid du Colombier enum {					/* status */
747d7728c9SDavid du Colombier 	Status_SD	= 0x80,		/* sense-data available */
757d7728c9SDavid du Colombier 	Status_SW	= 0x83,		/* internal software error */
767d7728c9SDavid du Colombier 	Status_BADARG	= 0x84,		/* bad argument to request */
777d7728c9SDavid du Colombier 	Status_RO	= 0x85,		/* device is read-only */
787d7728c9SDavid du Colombier };
797d7728c9SDavid du Colombier 
807d7728c9SDavid du Colombier enum {
817d7728c9SDavid du Colombier 	/* sense data byte 0 */
827d7728c9SDavid du Colombier 	Sd0valid	= 0x80,		/* valid sense data present */
837d7728c9SDavid du Colombier 
847d7728c9SDavid du Colombier 	/* sense data byte 2 */
857d7728c9SDavid du Colombier 	/* incorrect-length indicator, difference in bytes 3—6 */
867d7728c9SDavid du Colombier 	Sd2ili		= 0x20,
877d7728c9SDavid du Colombier 	Sd2eom		= 0x40,		/* end of medium (tape) */
887d7728c9SDavid du Colombier 	Sd2filemark	= 0x80,		/* at a filemark (tape) */
897d7728c9SDavid du Colombier 
907d7728c9SDavid du Colombier 	/* command byte 1 */
917d7728c9SDavid du Colombier 	Cmd1fixed	= 1,		/* use fixed-length blocks */
927d7728c9SDavid du Colombier 	Cmd1sili	= 2,		/* don't set Sd2ili */
937d7728c9SDavid du Colombier 
947d7728c9SDavid du Colombier 	/* limit of block #s in 24-bit ccbs */
957d7728c9SDavid du Colombier 	Max24off	= (1<<21) - 1,	/* 2⁲ⁱ - 1 */
967d7728c9SDavid du Colombier 
977d7728c9SDavid du Colombier 	/* mode pages */
987d7728c9SDavid du Colombier 	Allmodepages = 0x3F,
997d7728c9SDavid du Colombier };
1007d7728c9SDavid du Colombier 
1017d7728c9SDavid du Colombier /* scsi device types, from the scsi standards */
1027d7728c9SDavid du Colombier enum {
1037d7728c9SDavid du Colombier 	Devdir,			/* usually disk */
1047d7728c9SDavid du Colombier 	Devseq,			/* usually tape */
1057d7728c9SDavid du Colombier 	Devprint,
1067d7728c9SDavid du Colombier 	Dev3,
1077d7728c9SDavid du Colombier 	Devworm,		/* also direct, but special */
1087d7728c9SDavid du Colombier 	Devcd,			/* also direct */
1097d7728c9SDavid du Colombier 	Dev6,
1107d7728c9SDavid du Colombier 	Devmo,			/* also direct */
1117d7728c9SDavid du Colombier 	Devjuke,
1127d7728c9SDavid du Colombier };
1137d7728c9SDavid du Colombier 
1147d7728c9SDavid du Colombier /* p arguments should be of type uchar* */
1157d7728c9SDavid du Colombier #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
1167d7728c9SDavid du Colombier #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
1177d7728c9SDavid du Colombier 			  (p)[2] = (ul)>>8,  (p)[3] = (ul))
1187d7728c9SDavid du Colombier #define GETBE24(p)	((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
1197d7728c9SDavid du Colombier #define PUTBE24(p, ul)	((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
1207d7728c9SDavid du Colombier 
1217d7728c9SDavid du Colombier long	SRready(ScsiReq*);
1227d7728c9SDavid du Colombier long	SRrewind(ScsiReq*);
1237d7728c9SDavid du Colombier long	SRreqsense(ScsiReq*);
1247d7728c9SDavid du Colombier long	SRformat(ScsiReq*);
1257d7728c9SDavid du Colombier long	SRrblimits(ScsiReq*, uchar*);
1267d7728c9SDavid du Colombier long	SRread(ScsiReq*, void*, long);
1277d7728c9SDavid du Colombier long	SRwrite(ScsiReq*, void*, long);
1287d7728c9SDavid du Colombier long	SRseek(ScsiReq*, long, int);
1297d7728c9SDavid du Colombier long	SRfilemark(ScsiReq*, ulong);
1307d7728c9SDavid du Colombier long	SRspace(ScsiReq*, uchar, long);
1317d7728c9SDavid du Colombier long	SRinquiry(ScsiReq*);
1327d7728c9SDavid du Colombier long	SRmodeselect6(ScsiReq*, uchar*, long);
1337d7728c9SDavid du Colombier long	SRmodeselect10(ScsiReq*, uchar*, long);
1347d7728c9SDavid du Colombier long	SRmodesense6(ScsiReq*, uchar, uchar*, long);
1357d7728c9SDavid du Colombier long	SRmodesense10(ScsiReq*, uchar, uchar*, long);
1367d7728c9SDavid du Colombier long	SRstart(ScsiReq*, uchar);
1377d7728c9SDavid du Colombier long	SRrcapacity(ScsiReq*, uchar*);
1387d7728c9SDavid du Colombier long	SRrcapacity16(ScsiReq*, uchar*);
1397d7728c9SDavid du Colombier 
1407d7728c9SDavid du Colombier long	SRblank(ScsiReq*, uchar, uchar);	/* MMC CD-R/CD-RW commands */
1417d7728c9SDavid du Colombier long	SRsynccache(ScsiReq*);
1427d7728c9SDavid du Colombier long	SRTOC(ScsiReq*, void*, int, uchar, uchar);
1437d7728c9SDavid du Colombier long	SRrdiscinfo(ScsiReq*, void*, int);
1447d7728c9SDavid du Colombier long	SRrtrackinfo(ScsiReq*, void*, int, int);
1457d7728c9SDavid du Colombier 
1467d7728c9SDavid du Colombier long	SRcdpause(ScsiReq*, int);		/* MMC CD audio commands */
1477d7728c9SDavid du Colombier long	SRcdstop(ScsiReq*);
1487d7728c9SDavid du Colombier long	SRcdload(ScsiReq*, int, int);
1497d7728c9SDavid du Colombier long	SRcdplay(ScsiReq*, int, long, long);
1507d7728c9SDavid du Colombier long	SRcdstatus(ScsiReq*, uchar*, int);
1517d7728c9SDavid du Colombier long	SRgetconf(ScsiReq*, uchar*, int);
1527d7728c9SDavid du Colombier 
1537d7728c9SDavid du Colombier /*	old CD-R/CD-RW commands */
1547d7728c9SDavid du Colombier long	SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
1557d7728c9SDavid du Colombier long	SRtreserve(ScsiReq*, long);
1567d7728c9SDavid du Colombier long	SRtinfo(ScsiReq*, uchar, uchar*);
1577d7728c9SDavid du Colombier long	SRwtrack(ScsiReq*, void*, long, uchar, uchar);
1587d7728c9SDavid du Colombier long	SRmload(ScsiReq*, uchar);
1597d7728c9SDavid du Colombier long	SRfixation(ScsiReq*, uchar);
1607d7728c9SDavid du Colombier 
1617d7728c9SDavid du Colombier long	SReinitialise(ScsiReq*);		/* CHANGER commands */
1627d7728c9SDavid du Colombier long	SRestatus(ScsiReq*, uchar, uchar*, int);
1637d7728c9SDavid du Colombier long	SRmmove(ScsiReq*, int, int, int, int);
1647d7728c9SDavid du Colombier 
1657d7728c9SDavid du Colombier long	SRrequest(ScsiReq*);
1667d7728c9SDavid du Colombier int	SRclose(ScsiReq*);
1677d7728c9SDavid du Colombier int	SRopenraw(ScsiReq*, char*);
1687d7728c9SDavid du Colombier int	SRopen(ScsiReq*, char*);
1697d7728c9SDavid du Colombier 
1707d7728c9SDavid du Colombier void	makesense(ScsiReq*);
1717d7728c9SDavid du Colombier 
1727d7728c9SDavid du Colombier long	umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);
1737d7728c9SDavid du Colombier 
1747d7728c9SDavid du Colombier void	scsidebug(int);
1757d7728c9SDavid du Colombier 
1767d7728c9SDavid du Colombier char*	scsierrmsg(int n);
177