]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/scuzz/scsireq.h
grep: error if sbrk fails
[plan9front.git] / sys / src / cmd / scuzz / scsireq.h
1 /* this file is also included by usb/disk and cdfs */
2 typedef struct Umsc Umsc;
3 #pragma incomplete Umsc
4
5 enum {                                  /* fundamental constants/defaults */
6         NTargetID       = 8,            /* number of target IDs */
7         CtlrID          = 7,            /* default controller target ID */
8         MaxDirData      = 255,          /* max. direct data returned */
9         LBsize          = 512,          /* default logical-block size */
10 };
11
12 typedef struct {
13         uchar   *p;
14         long    count;
15         uchar   write;
16 } ScsiPtr;
17
18 typedef struct {
19         int     flags;
20         char    *unit;                  /* unit directory */
21         int     lun;
22         ulong   lbsize;
23         ulong   offset;                 /* in blocks of lbsize bytes */
24         int     fd;
25         Umsc    *umsc;                  /* lun */
26         ScsiPtr cmd;
27         ScsiPtr data;
28         int     status;                 /* returned status */
29         uchar   sense[MaxDirData];      /* returned sense data */
30         uchar   inquiry[MaxDirData];    /* returned inquiry data */
31         int     readblock;              /* flag: read a block since open */
32 } ScsiReq;
33
34 enum {                                  /* software flags */
35         Fopen           = 0x0001,       /* open */
36         Fseqdev         = 0x0002,       /* sequential-access device */
37         Fwritten        = 0x0004,       /* device written */
38         Fronly          = 0x0008,       /* device is read-only */
39         Fwormdev        = 0x0010,       /* write-once read-multiple device */
40         Fprintdev       = 0x0020,       /* printer */
41         Fbfixed         = 0x0040,       /* fixed block size */
42         Fchanger        = 0x0080,       /* medium-changer device */
43         Finqok          = 0x0100,       /* inquiry data is OK */
44         Fmode6          = 0x0200,       /* use 6-byte modeselect */
45         Frw10           = 0x0400,       /* use 10-byte read/write */
46         Fusb            = 0x0800,       /* USB transparent scsi */
47 };
48
49 enum {
50         STnomem         =-4,            /* buffer allocation failed */
51         STharderr       =-3,            /* controller error of some kind */
52         STtimeout       =-2,            /* bus timeout */
53         STok            = 0,            /* good */
54         STcheck         = 0x02,         /* check condition */
55         STcondmet       = 0x04,         /* condition met/good */
56         STbusy          = 0x08,         /* busy */
57         STintok         = 0x10,         /* intermediate/good */
58         STintcondmet    = 0x14,         /* intermediate/condition met/good */
59         STresconf       = 0x18,         /* reservation conflict */
60         STterminated    = 0x22,         /* command terminated */
61         STqfull         = 0x28,         /* queue full */
62 };
63
64 enum {                                  /* status */
65         Status_SD       = 0x80,         /* sense-data available */
66         Status_SW       = 0x83,         /* internal software error */
67         Status_BADARG   = 0x84,         /* bad argument to request */
68         Status_RO       = 0x85,         /* device is read-only */
69 };
70
71 enum {                                  /* SCSI command codes */
72         ScmdTur         = 0x00,         /* test unit ready */
73         ScmdRewind      = 0x01,         /* rezero/rewind */
74         ScmdRsense      = 0x03,         /* request sense */
75         ScmdFormat      = 0x04,         /* format unit */
76         ScmdRblimits    = 0x05,         /* read block limits */
77         ScmdRead        = 0x08,         /* read */
78         ScmdWrite       = 0x0A,         /* write */
79         ScmdSeek        = 0x0B,         /* seek */
80         ScmdFmark       = 0x10,         /* write filemarks */
81         ScmdSpace       = 0x11,         /* space forward/backward */
82         ScmdInq         = 0x12,         /* inquiry */
83         ScmdMselect6    = 0x15,         /* mode select */
84         ScmdMselect10   = 0x55,         /* mode select */
85         ScmdMsense6     = 0x1A,         /* mode sense */
86         ScmdMsense10    = 0x5A,         /* mode sense */
87         ScmdStart       = 0x1B,         /* start/stop unit */
88         ScmdRcapacity   = 0x25,         /* read capacity */
89         ScmdExtread     = 0x28,         /* extended read */
90         ScmdExtwrite    = 0x2A,         /* extended write */
91         ScmdExtseek     = 0x2B,         /* extended seek */
92
93         ScmdSynccache   = 0x35,         /* flush cache */
94         ScmdRTOC        = 0x43,         /* read TOC data */
95         ScmdRdiscinfo   = 0x51,         /* read disc information */
96         ScmdRtrackinfo  = 0x52,         /* read track information */
97         ScmdReserve     = 0x53,         /* reserve track */
98         ScmdBlank       = 0xA1,         /* blank *-RW media */
99
100         ScmdCDpause     = 0x4B,         /* pause/resume */
101         ScmdCDstop      = 0x4E,         /* stop play/scan */
102         ScmdCDplay      = 0xA5,         /* play audio */
103         ScmdCDload      = 0xA6,         /* load/unload */
104         ScmdCDscan      = 0xBA,         /* fast forward/reverse */
105         ScmdCDstatus    = 0xBD,         /* mechanism status */
106         Scmdgetconf     = 0x46,         /* get configuration */
107
108         ScmdEInitialise = 0x07,         /* initialise element status */
109         ScmdMMove       = 0xA5,         /* move medium */
110         ScmdEStatus     = 0xB8,         /* read element status */
111         ScmdMExchange   = 0xA6,         /* exchange medium */
112         ScmdEposition   = 0x2B,         /* position to element */
113
114         ScmdReadDVD     = 0xAD,         /* read dvd structure */
115         ScmdReportKey   = 0xA4,         /* read dvd key */
116         ScmdSendKey     = 0xA3,         /* write dvd key */
117
118         ScmdClosetracksess= 0x5B,
119         ScmdRead12      = 0xA8,
120         ScmdSetcdspeed  = 0xBB,
121         ScmdReadcd      = 0xBE,
122
123         /* vendor-specific */
124         ScmdFwaddr      = 0xE2,         /* first writeable address */
125         ScmdTreserve    = 0xE4,         /* reserve track */
126         ScmdTinfo       = 0xE5,         /* read track info */
127         ScmdTwrite      = 0xE6,         /* write track */
128         ScmdMload       = 0xE7,         /* medium load/unload */
129         ScmdFixation    = 0xE9,         /* fixation */
130 };
131
132 enum {
133         /* sense data byte 0 */
134         Sd0valid        = 0x80,         /* valid sense data present */
135
136         /* sense data byte 2 */
137         /* incorrect-length indicator, difference in bytes 3—6 */
138         Sd2ili          = 0x20,
139         Sd2eom          = 0x40,         /* end of medium (tape) */
140         Sd2filemark     = 0x80,         /* at a filemark (tape) */
141
142         /* command byte 1 */
143         Cmd1fixed       = 1,            /* use fixed-length blocks */
144         Cmd1sili        = 2,            /* don't set Sd2ili */
145
146         /* limit of block #s in 24-bit ccbs */
147         Max24off        = (1<<21) - 1,  /* 2²¹ - 1 */
148
149         /* mode pages */
150         Allmodepages = 0x3F,
151 };
152
153 /* p arguments should be of type uchar* */
154 #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3])
155 #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \
156                           (p)[2] = (ul)>>8,  (p)[3] = (ul))
157 #define GETBE24(p)      ((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2])
158 #define PUTBE24(p, ul)  ((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul))
159
160 extern long maxiosize;
161
162 long    SRready(ScsiReq*);
163 long    SRrewind(ScsiReq*);
164 long    SRreqsense(ScsiReq*);
165 long    SRformat(ScsiReq*);
166 long    SRrblimits(ScsiReq*, uchar*);
167 long    SRread(ScsiReq*, void*, long);
168 long    SRwrite(ScsiReq*, void*, long);
169 long    SRseek(ScsiReq*, long, int);
170 long    SRfilemark(ScsiReq*, ulong);
171 long    SRspace(ScsiReq*, uchar, long);
172 long    SRinquiry(ScsiReq*);
173 long    SRmodeselect6(ScsiReq*, uchar*, long);
174 long    SRmodeselect10(ScsiReq*, uchar*, long);
175 long    SRmodesense6(ScsiReq*, uchar, uchar*, long);
176 long    SRmodesense10(ScsiReq*, uchar, uchar*, long);
177 long    SRstart(ScsiReq*, uchar);
178 long    SRrcapacity(ScsiReq*, uchar*);
179
180 long    SRblank(ScsiReq*, uchar, uchar);        /* MMC CD-R/CD-RW commands */
181 long    SRsynccache(ScsiReq*);
182 long    SRTOC(ScsiReq*, void*, int, uchar, uchar);
183 long    SRrdiscinfo(ScsiReq*, void*, int);
184 long    SRrtrackinfo(ScsiReq*, void*, int, int);
185
186 long    SRcdpause(ScsiReq*, int);               /* MMC CD audio commands */
187 long    SRcdstop(ScsiReq*);
188 long    SRcdload(ScsiReq*, int, int);
189 long    SRcdplay(ScsiReq*, int, long, long);
190 long    SRcdstatus(ScsiReq*, uchar*, int);
191 long    SRgetconf(ScsiReq*, uchar*, int);
192
193 /*      old CD-R/CD-RW commands */
194 long    SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*);
195 long    SRtreserve(ScsiReq*, long);
196 long    SRtinfo(ScsiReq*, uchar, uchar*);
197 long    SRwtrack(ScsiReq*, void*, long, uchar, uchar);
198 long    SRmload(ScsiReq*, uchar);
199 long    SRfixation(ScsiReq*, uchar);
200
201 long    SReinitialise(ScsiReq*);                /* CHANGER commands */
202 long    SRestatus(ScsiReq*, uchar, uchar*, int);
203 long    SRmmove(ScsiReq*, int, int, int, int);
204
205 long    SRrequest(ScsiReq*);
206 int     SRclose(ScsiReq*);
207 int     SRopenraw(ScsiReq*, char*);
208 int     SRopen(ScsiReq*, char*);
209
210 void    makesense(ScsiReq*);
211
212 long    umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);