xref: /plan9/sys/src/cmd/scuzz/scsireq.h (revision fd362a73ff89ae80075dd82c9aad2a3468f0f3c9)
1*e67f3b95SDavid du Colombier /* this file is also included by usb/disk and cdfs */
2e6dcbf51SDavid du Colombier typedef struct Umsc Umsc;
3e6dcbf51SDavid du Colombier #pragma incomplete Umsc
4e6dcbf51SDavid du Colombier 
53e12c5d1SDavid du Colombier enum {					/* fundamental constants/defaults */
63e12c5d1SDavid du Colombier 	NTargetID	= 8,		/* number of target IDs */
73e12c5d1SDavid du Colombier 	CtlrID		= 7,		/* default controller target ID */
83e12c5d1SDavid du Colombier 	MaxDirData	= 255,		/* max. direct data returned */
93e12c5d1SDavid du Colombier 	LBsize		= 512,		/* default logical-block size */
103e12c5d1SDavid du Colombier };
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier typedef struct {
133e12c5d1SDavid du Colombier 	uchar	*p;
143e12c5d1SDavid du Colombier 	long	count;
153e12c5d1SDavid du Colombier 	uchar	write;
163e12c5d1SDavid du Colombier } ScsiPtr;
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier typedef struct {
197dd7cddfSDavid du Colombier 	int	flags;
207dd7cddfSDavid du Colombier 	char	*unit;			/* unit directory */
217dd7cddfSDavid du Colombier 	int	lun;
223e12c5d1SDavid du Colombier 	ulong	lbsize;
23208510e1SDavid du Colombier 	ulong	offset;			/* in blocks of lbsize bytes */
247dd7cddfSDavid du Colombier 	int	fd;
25e6dcbf51SDavid du Colombier 	Umsc	*umsc;			/* lun */
263e12c5d1SDavid du Colombier 	ScsiPtr	cmd;
273e12c5d1SDavid du Colombier 	ScsiPtr	data;
287dd7cddfSDavid du Colombier 	int	status;			/* returned status */
293e12c5d1SDavid du Colombier 	uchar	sense[MaxDirData];	/* returned sense data */
303e12c5d1SDavid du Colombier 	uchar	inquiry[MaxDirData];	/* returned inquiry data */
31e29d4813SDavid du Colombier 	int	readblock;		/* flag: read a block since open */
323e12c5d1SDavid du Colombier } ScsiReq;
333e12c5d1SDavid du Colombier 
34e29d4813SDavid du Colombier enum {					/* software flags */
357dd7cddfSDavid du Colombier 	Fopen		= 0x0001,	/* open */
367dd7cddfSDavid du Colombier 	Fseqdev		= 0x0002,	/* sequential-access device */
377dd7cddfSDavid du Colombier 	Fwritten	= 0x0004,	/* device written */
387dd7cddfSDavid du Colombier 	Fronly		= 0x0008,	/* device is read-only */
397dd7cddfSDavid du Colombier 	Fwormdev	= 0x0010,	/* write-once read-multiple device */
407dd7cddfSDavid du Colombier 	Fprintdev	= 0x0020,	/* printer */
417dd7cddfSDavid du Colombier 	Fbfixed		= 0x0040,	/* fixed block size */
427dd7cddfSDavid du Colombier 	Fchanger	= 0x0080,	/* medium-changer device */
437dd7cddfSDavid du Colombier 	Finqok		= 0x0100,	/* inquiry data is OK */
4480ee5cbfSDavid du Colombier 	Fmode6		= 0x0200,	/* use 6-byte modeselect */
453ff48bf5SDavid du Colombier 	Frw10		= 0x0400,	/* use 10-byte read/write */
46e6dcbf51SDavid du Colombier 	Fusb		= 0x0800,	/* USB transparent scsi */
477dd7cddfSDavid du Colombier };
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier enum {
507dd7cddfSDavid du Colombier 	STnomem		=-4,		/* buffer allocation failed */
517dd7cddfSDavid du Colombier 	STharderr	=-3,		/* controller error of some kind */
527dd7cddfSDavid du Colombier 	STtimeout	=-2,		/* bus timeout */
537dd7cddfSDavid du Colombier 	STok		= 0,		/* good */
547dd7cddfSDavid du Colombier 	STcheck		= 0x02,		/* check condition */
557dd7cddfSDavid du Colombier 	STcondmet	= 0x04,		/* condition met/good */
567dd7cddfSDavid du Colombier 	STbusy		= 0x08,		/* busy */
577dd7cddfSDavid du Colombier 	STintok		= 0x10,		/* intermediate/good */
587dd7cddfSDavid du Colombier 	STintcondmet	= 0x14,		/* intermediate/condition met/good */
597dd7cddfSDavid du Colombier 	STresconf	= 0x18,		/* reservation conflict */
607dd7cddfSDavid du Colombier 	STterminated	= 0x22,		/* command terminated */
617dd7cddfSDavid du Colombier 	STqfull		= 0x28,		/* queue full */
623e12c5d1SDavid du Colombier };
633e12c5d1SDavid du Colombier 
643e12c5d1SDavid du Colombier enum {					/* status */
653e12c5d1SDavid du Colombier 	Status_SD	= 0x80,		/* sense-data available */
663e12c5d1SDavid du Colombier 	Status_SW	= 0x83,		/* internal software error */
673e12c5d1SDavid du Colombier 	Status_BADARG	= 0x84,		/* bad argument to request */
683e12c5d1SDavid du Colombier 	Status_RO	= 0x85,		/* device is read-only */
693e12c5d1SDavid du Colombier };
703e12c5d1SDavid du Colombier 
71e29d4813SDavid du Colombier enum {
72e29d4813SDavid du Colombier 	/* sense data byte 0 */
73e29d4813SDavid du Colombier 	Sd0valid	= 0x80,		/* valid sense data present */
74e29d4813SDavid du Colombier 
75e29d4813SDavid du Colombier 	/* sense data byte 2 */
76e29d4813SDavid du Colombier 	/* incorrect-length indicator, difference in bytes 3—6 */
77e29d4813SDavid du Colombier 	Sd2ili		= 0x20,
78e29d4813SDavid du Colombier 	Sd2eom		= 0x40,		/* end of medium (tape) */
79e29d4813SDavid du Colombier 	Sd2filemark	= 0x80,		/* at a filemark (tape) */
80e29d4813SDavid du Colombier 
81e29d4813SDavid du Colombier 	/* command byte 1 */
82e29d4813SDavid du Colombier 	Cmd1fixed	= 1,		/* use fixed-length blocks */
83e29d4813SDavid du Colombier 	Cmd1sili	= 2,		/* don't set Sd2ili */
84e29d4813SDavid du Colombier 
85e29d4813SDavid du Colombier 	/* limit of block #s in 24-bit ccbs */
86e29d4813SDavid du Colombier 	Max24off	= (1<<21) - 1,	/* 2⁲ⁱ - 1 */
87e29d4813SDavid du Colombier 
88e29d4813SDavid du Colombier 	/* mode pages */
89e29d4813SDavid du Colombier 	Allmodepages = 0x3F,
90e29d4813SDavid du Colombier };
91e29d4813SDavid du Colombier 
92e29d4813SDavid du Colombier /* p arguments should be of type uchar* */
93e29d4813SDavid du Colombier #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
94e29d4813SDavid du Colombier #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
95e29d4813SDavid du Colombier 			  (p)[2] = (ul)>>8,  (p)[3] = (ul))
96e29d4813SDavid du Colombier #define GETBE24(p)	((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
97e29d4813SDavid du Colombier #define PUTBE24(p, ul)	((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
98e29d4813SDavid du Colombier 
99e6dcbf51SDavid du Colombier extern long maxiosize;
1003e12c5d1SDavid du Colombier 
101e6dcbf51SDavid du Colombier long	SRready(ScsiReq*);
102e6dcbf51SDavid du Colombier long	SRrewind(ScsiReq*);
103e6dcbf51SDavid du Colombier long	SRreqsense(ScsiReq*);
104e6dcbf51SDavid du Colombier long	SRformat(ScsiReq*);
105e6dcbf51SDavid du Colombier long	SRrblimits(ScsiReq*, uchar*);
106e6dcbf51SDavid du Colombier long	SRread(ScsiReq*, void*, long);
107e6dcbf51SDavid du Colombier long	SRwrite(ScsiReq*, void*, long);
108e6dcbf51SDavid du Colombier long	SRseek(ScsiReq*, long, int);
109e6dcbf51SDavid du Colombier long	SRfilemark(ScsiReq*, ulong);
110e6dcbf51SDavid du Colombier long	SRspace(ScsiReq*, uchar, long);
111e6dcbf51SDavid du Colombier long	SRinquiry(ScsiReq*);
112e6dcbf51SDavid du Colombier long	SRmodeselect6(ScsiReq*, uchar*, long);
113e6dcbf51SDavid du Colombier long	SRmodeselect10(ScsiReq*, uchar*, long);
114e6dcbf51SDavid du Colombier long	SRmodesense6(ScsiReq*, uchar, uchar*, long);
115e6dcbf51SDavid du Colombier long	SRmodesense10(ScsiReq*, uchar, uchar*, long);
116e6dcbf51SDavid du Colombier long	SRstart(ScsiReq*, uchar);
117e6dcbf51SDavid du Colombier long	SRrcapacity(ScsiReq*, uchar*);
1187dd7cddfSDavid du Colombier 
119e6dcbf51SDavid du Colombier long	SRblank(ScsiReq*, uchar, uchar);	/* MMC CD-R/CD-RW commands */
120e6dcbf51SDavid du Colombier long	SRsynccache(ScsiReq*);
121e6dcbf51SDavid du Colombier long	SRTOC(ScsiReq*, void*, int, uchar, uchar);
122e6dcbf51SDavid du Colombier long	SRrdiscinfo(ScsiReq*, void*, int);
123e6dcbf51SDavid du Colombier long	SRrtrackinfo(ScsiReq*, void*, int, int);
1247dd7cddfSDavid du Colombier 
125e6dcbf51SDavid du Colombier long	SRcdpause(ScsiReq*, int);		/* MMC CD audio commands */
126e6dcbf51SDavid du Colombier long	SRcdstop(ScsiReq*);
127e6dcbf51SDavid du Colombier long	SRcdload(ScsiReq*, int, int);
128e6dcbf51SDavid du Colombier long	SRcdplay(ScsiReq*, int, long, long);
129e6dcbf51SDavid du Colombier long	SRcdstatus(ScsiReq*, uchar*, int);
130e6dcbf51SDavid du Colombier long	SRgetconf(ScsiReq*, uchar*, int);
1313e12c5d1SDavid du Colombier 
132e6dcbf51SDavid du Colombier /*	old CD-R/CD-RW commands */
133e6dcbf51SDavid du Colombier long	SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
134e6dcbf51SDavid du Colombier long	SRtreserve(ScsiReq*, long);
135e6dcbf51SDavid du Colombier long	SRtinfo(ScsiReq*, uchar, uchar*);
136e6dcbf51SDavid du Colombier long	SRwtrack(ScsiReq*, void*, long, uchar, uchar);
137e6dcbf51SDavid du Colombier long	SRmload(ScsiReq*, uchar);
138e6dcbf51SDavid du Colombier long	SRfixation(ScsiReq*, uchar);
1397dd7cddfSDavid du Colombier 
140e6dcbf51SDavid du Colombier long	SReinitialise(ScsiReq*);		/* CHANGER commands */
141e6dcbf51SDavid du Colombier long	SRestatus(ScsiReq*, uchar, uchar*, int);
142e6dcbf51SDavid du Colombier long	SRmmove(ScsiReq*, int, int, int, int);
1433e12c5d1SDavid du Colombier 
144e6dcbf51SDavid du Colombier long	SRrequest(ScsiReq*);
145e6dcbf51SDavid du Colombier int	SRclose(ScsiReq*);
146e6dcbf51SDavid du Colombier int	SRopenraw(ScsiReq*, char*);
147e6dcbf51SDavid du Colombier int	SRopen(ScsiReq*, char*);
148219b2ee8SDavid du Colombier 
149e6dcbf51SDavid du Colombier void	makesense(ScsiReq*);
150e6dcbf51SDavid du Colombier 
151e6dcbf51SDavid du Colombier long	umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);
152