1 /* this file is also included by usb/disk and cdfs */
2 typedef struct Umsc Umsc;
3 #pragma incomplete Umsc
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 */
20 char *unit; /* unit directory */
23 ulong offset; /* in blocks of lbsize bytes */
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 */
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 */
50 STnomem =-4, /* buffer allocation failed */
51 STharderr =-3, /* controller error of some kind */
52 STtimeout =-2, /* bus timeout */
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 */
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 */
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 */
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 */
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 */
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 */
114 ScmdReadDVD = 0xAD, /* read dvd structure */
115 ScmdReportKey = 0xA4, /* read dvd key */
116 ScmdSendKey = 0xA3, /* write dvd key */
118 ScmdClosetracksess= 0x5B,
120 ScmdSetcdspeed = 0xBB,
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 */
133 /* sense data byte 0 */
134 Sd0valid = 0x80, /* valid sense data present */
136 /* sense data byte 2 */
137 /* incorrect-length indicator, difference in bytes 3—6 */
139 Sd2eom = 0x40, /* end of medium (tape) */
140 Sd2filemark = 0x80, /* at a filemark (tape) */
143 Cmd1fixed = 1, /* use fixed-length blocks */
144 Cmd1sili = 2, /* don't set Sd2ili */
146 /* limit of block #s in 24-bit ccbs */
147 Max24off = (1<<21) - 1, /* 2²¹ - 1 */
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))
160 extern long maxiosize;
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*);
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);
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);
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);
201 long SReinitialise(ScsiReq*); /* CHANGER commands */
202 long SRestatus(ScsiReq*, uchar, uchar*, int);
203 long SRmmove(ScsiReq*, int, int, int, int);
205 long SRrequest(ScsiReq*);
206 int SRclose(ScsiReq*);
207 int SRopenraw(ScsiReq*, char*);
208 int SRopen(ScsiReq*, char*);
210 void makesense(ScsiReq*);
212 long umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*);