xref: /plan9/sys/src/cmd/usb/disk/scsireq.h (revision fd362a73ff89ae80075dd82c9aad2a3468f0f3c9)
1 /*
2  * This is /sys/src/cmd/scuzz/scsireq.h
3  * changed to add more debug support, and to keep
4  * disk compiling without a scuzz that includes these changes.
5  *
6  * scsireq.h is also included by usb/disk and cdfs.
7  */
8 typedef struct Umsc Umsc;
9 #pragma incomplete Umsc
10 
11 enum {					/* fundamental constants/defaults */
12 	MaxDirData	= 255,		/* max. direct data returned */
13 	/*
14 	 * Because we are accessed via devmnt, we can never get i/o counts
15 	 * larger than 8216 (Msgsize and devmnt's offered iounit) - 24
16 	 * (IOHDRSZ) = 8K.
17 	 */
18 	Maxiosize	= 8216 - IOHDRSZ, /* max. I/O transfer size */
19 };
20 
21 typedef struct {
22 	uchar	*p;
23 	long	count;
24 	uchar	write;
25 } ScsiPtr;
26 
27 typedef struct {
28 	int	flags;
29 	char	*unit;			/* unit directory */
30 	int	lun;
31 	ulong	lbsize;
32 	uvlong	offset;			/* in blocks of lbsize bytes */
33 	int	fd;
34 	Umsc	*umsc;			/* lun */
35 	ScsiPtr	cmd;
36 	ScsiPtr	data;
37 	int	status;			/* returned status */
38 	uchar	sense[MaxDirData];	/* returned sense data */
39 	uchar	inquiry[MaxDirData];	/* returned inquiry data */
40 	int	readblock;		/* flag: read a block since open */
41 } ScsiReq;
42 
43 enum {					/* software flags */
44 	Fopen		= 0x0001,	/* open */
45 	Fseqdev		= 0x0002,	/* sequential-access device */
46 	Fwritten	= 0x0004,	/* device written */
47 	Fronly		= 0x0008,	/* device is read-only */
48 	Fwormdev	= 0x0010,	/* write-once read-multiple device */
49 	Fprintdev	= 0x0020,	/* printer */
50 	Fbfixed		= 0x0040,	/* fixed block size */
51 	Fchanger	= 0x0080,	/* medium-changer device */
52 	Finqok		= 0x0100,	/* inquiry data is OK */
53 	Fmode6		= 0x0200,	/* use 6-byte modeselect */
54 	Frw10		= 0x0400,	/* use 10-byte read/write */
55 	Fusb		= 0x0800,	/* USB transparent scsi */
56 };
57 
58 enum {
59 	STnomem		=-4,		/* buffer allocation failed */
60 	STharderr	=-3,		/* controller error of some kind */
61 	STtimeout	=-2,		/* bus timeout */
62 	STok		= 0,		/* good */
63 	STcheck		= 0x02,		/* check condition */
64 	STcondmet	= 0x04,		/* condition met/good */
65 	STbusy		= 0x08,		/* busy */
66 	STintok		= 0x10,		/* intermediate/good */
67 	STintcondmet	= 0x14,		/* intermediate/condition met/good */
68 	STresconf	= 0x18,		/* reservation conflict */
69 	STterminated	= 0x22,		/* command terminated */
70 	STqfull		= 0x28,		/* queue full */
71 };
72 
73 enum {					/* status */
74 	Status_SD	= 0x80,		/* sense-data available */
75 	Status_SW	= 0x83,		/* internal software error */
76 	Status_BADARG	= 0x84,		/* bad argument to request */
77 	Status_RO	= 0x85,		/* device is read-only */
78 };
79 
80 enum {
81 	/* sense data byte 0 */
82 	Sd0valid	= 0x80,		/* valid sense data present */
83 
84 	/* sense data byte 2 */
85 	/* incorrect-length indicator, difference in bytes 3—6 */
86 	Sd2ili		= 0x20,
87 	Sd2eom		= 0x40,		/* end of medium (tape) */
88 	Sd2filemark	= 0x80,		/* at a filemark (tape) */
89 
90 	/* command byte 1 */
91 	Cmd1fixed	= 1,		/* use fixed-length blocks */
92 	Cmd1sili	= 2,		/* don't set Sd2ili */
93 
94 	/* limit of block #s in 24-bit ccbs */
95 	Max24off	= (1<<21) - 1,	/* 2⁲ⁱ - 1 */
96 
97 	/* mode pages */
98 	Allmodepages = 0x3F,
99 };
100 
101 /* scsi device types, from the scsi standards */
102 enum {
103 	Devdir,			/* usually disk */
104 	Devseq,			/* usually tape */
105 	Devprint,
106 	Dev3,
107 	Devworm,		/* also direct, but special */
108 	Devcd,			/* also direct */
109 	Dev6,
110 	Devmo,			/* also direct */
111 	Devjuke,
112 };
113 
114 /* p arguments should be of type uchar* */
115 #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
116 #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
117 			  (p)[2] = (ul)>>8,  (p)[3] = (ul))
118 #define GETBE24(p)	((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
119 #define PUTBE24(p, ul)	((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
120 
121 long	SRready(ScsiReq*);
122 long	SRrewind(ScsiReq*);
123 long	SRreqsense(ScsiReq*);
124 long	SRformat(ScsiReq*);
125 long	SRrblimits(ScsiReq*, uchar*);
126 long	SRread(ScsiReq*, void*, long);
127 long	SRwrite(ScsiReq*, void*, long);
128 long	SRseek(ScsiReq*, long, int);
129 long	SRfilemark(ScsiReq*, ulong);
130 long	SRspace(ScsiReq*, uchar, long);
131 long	SRinquiry(ScsiReq*);
132 long	SRmodeselect6(ScsiReq*, uchar*, long);
133 long	SRmodeselect10(ScsiReq*, uchar*, long);
134 long	SRmodesense6(ScsiReq*, uchar, uchar*, long);
135 long	SRmodesense10(ScsiReq*, uchar, uchar*, long);
136 long	SRstart(ScsiReq*, uchar);
137 long	SRrcapacity(ScsiReq*, uchar*);
138 long	SRrcapacity16(ScsiReq*, uchar*);
139 
140 long	SRblank(ScsiReq*, uchar, uchar);	/* MMC CD-R/CD-RW commands */
141 long	SRsynccache(ScsiReq*);
142 long	SRTOC(ScsiReq*, void*, int, uchar, uchar);
143 long	SRrdiscinfo(ScsiReq*, void*, int);
144 long	SRrtrackinfo(ScsiReq*, void*, int, int);
145 
146 long	SRcdpause(ScsiReq*, int);		/* MMC CD audio commands */
147 long	SRcdstop(ScsiReq*);
148 long	SRcdload(ScsiReq*, int, int);
149 long	SRcdplay(ScsiReq*, int, long, long);
150 long	SRcdstatus(ScsiReq*, uchar*, int);
151 long	SRgetconf(ScsiReq*, uchar*, int);
152 
153 /*	old CD-R/CD-RW commands */
154 long	SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
155 long	SRtreserve(ScsiReq*, long);
156 long	SRtinfo(ScsiReq*, uchar, uchar*);
157 long	SRwtrack(ScsiReq*, void*, long, uchar, uchar);
158 long	SRmload(ScsiReq*, uchar);
159 long	SRfixation(ScsiReq*, uchar);
160 
161 long	SReinitialise(ScsiReq*);		/* CHANGER commands */
162 long	SRestatus(ScsiReq*, uchar, uchar*, int);
163 long	SRmmove(ScsiReq*, int, int, int, int);
164 
165 long	SRrequest(ScsiReq*);
166 int	SRclose(ScsiReq*);
167 int	SRopenraw(ScsiReq*, char*);
168 int	SRopen(ScsiReq*, char*);
169 
170 void	makesense(ScsiReq*);
171 
172 long	umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);
173 
174 void	scsidebug(int);
175 
176 char*	scsierrmsg(int n);
177