1 #include <u.h>
2 #include <libc.h>
3 #include <disk.h>
4 #include "scsireq.h"
5
6 long
SRblank(ScsiReq * rp,uchar type,uchar track)7 SRblank(ScsiReq *rp, uchar type, uchar track)
8 {
9 uchar cmd[12];
10
11 memset(cmd, 0, sizeof(cmd));
12 cmd[0] = ScmdBlank;
13 cmd[1] = type;
14 cmd[2] = track>>24;
15 cmd[3] = track>>16;
16 cmd[4] = track>>8;
17 cmd[5] = track;
18 rp->cmd.p = cmd;
19 rp->cmd.count = sizeof(cmd);
20 rp->data.p = cmd;
21 rp->data.count = 0;
22 rp->data.write = 1;
23 return SRrequest(rp);
24 }
25
26 long
SRsynccache(ScsiReq * rp)27 SRsynccache(ScsiReq *rp)
28 {
29 uchar cmd[10];
30
31 memset(cmd, 0, sizeof(cmd));
32 cmd[0] = ScmdSynccache;
33 rp->cmd.p = cmd;
34 rp->cmd.count = sizeof(cmd);
35 rp->data.p = cmd;
36 rp->data.count = 0;
37 rp->data.write = 1;
38 return SRrequest(rp);
39 }
40
41 long
SRTOC(ScsiReq * rp,void * data,int nbytes,uchar format,uchar track)42 SRTOC(ScsiReq *rp, void *data, int nbytes, uchar format, uchar track)
43 {
44 uchar cmd[10];
45
46 memset(cmd, 0, sizeof(cmd));
47 cmd[0] = ScmdRTOC;
48 cmd[2] = format;
49 cmd[6] = track;
50 cmd[7] = nbytes>>8;
51 cmd[8] = nbytes;
52 rp->cmd.p = cmd;
53 rp->cmd.count = sizeof(cmd);
54 rp->data.p = data;
55 rp->data.count = nbytes;
56 rp->data.write = 0;
57 return SRrequest(rp);
58 }
59
60 long
SRrdiscinfo(ScsiReq * rp,void * data,int nbytes)61 SRrdiscinfo(ScsiReq *rp, void *data, int nbytes)
62 {
63 uchar cmd[10];
64
65 memset(cmd, 0, sizeof(cmd));
66 cmd[0] = ScmdRdiscinfo;
67 cmd[7] = nbytes>>8;
68 cmd[8] = nbytes;
69 rp->cmd.p = cmd;
70 rp->cmd.count = sizeof(cmd);
71 rp->data.p = data;
72 rp->data.count = nbytes;
73 rp->data.write = 0;
74 return SRrequest(rp);
75 }
76
77 long
SRrtrackinfo(ScsiReq * rp,void * data,int nbytes,int track)78 SRrtrackinfo(ScsiReq *rp, void *data, int nbytes, int track)
79 {
80 uchar cmd[10];
81
82 memset(cmd, 0, sizeof(cmd));
83 cmd[0] = ScmdRtrackinfo;
84 cmd[1] = 0x01;
85 cmd[2] = track>>24;
86 cmd[3] = track>>16;
87 cmd[4] = track>>8;
88 cmd[5] = track;
89 cmd[7] = nbytes>>8;
90 cmd[8] = nbytes;
91 rp->cmd.p = cmd;
92 rp->cmd.count = sizeof(cmd);
93 rp->data.p = data;
94 rp->data.count = nbytes;
95 rp->data.write = 0;
96 return SRrequest(rp);
97 }
98
99 long
SRfwaddr(ScsiReq * rp,uchar track,uchar mode,uchar npa,uchar * data)100 SRfwaddr(ScsiReq *rp, uchar track, uchar mode, uchar npa, uchar *data)
101 {
102 uchar cmd[10];
103
104 memset(cmd, 0, sizeof(cmd));
105 cmd[0] = ScmdFwaddr;
106 cmd[2] = track;
107 cmd[3] = mode;
108 cmd[7] = npa;
109 rp->cmd.p = cmd;
110 rp->cmd.count = sizeof(cmd);
111 rp->data.p = data;
112 rp->data.count = MaxDirData;
113 rp->data.write = 0;
114 return SRrequest(rp);
115 }
116
117 long
SRtreserve(ScsiReq * rp,long nbytes)118 SRtreserve(ScsiReq *rp, long nbytes)
119 {
120 uchar cmd[10];
121 long n;
122
123 if((nbytes % rp->lbsize)){
124 rp->status = Status_BADARG;
125 return -1;
126 }
127 memset(cmd, 0, sizeof(cmd));
128 cmd[0] = ScmdTreserve;
129 n = nbytes/rp->lbsize;
130 cmd[5] = n>>24;
131 cmd[6] = n>>16;
132 cmd[7] = n>>8;
133 cmd[8] = n;
134 rp->cmd.p = cmd;
135 rp->cmd.count = sizeof(cmd);
136 rp->data.p = cmd;
137 rp->data.count = 0;
138 rp->data.write = 1;
139 return SRrequest(rp);
140 }
141
142 long
SRtinfo(ScsiReq * rp,uchar track,uchar * data)143 SRtinfo(ScsiReq *rp, uchar track, uchar *data)
144 {
145 uchar cmd[10];
146
147 memset(cmd, 0, sizeof(cmd));
148 cmd[0] = ScmdTinfo;
149 cmd[5] = track;
150 cmd[8] = MaxDirData;
151 rp->cmd.p = cmd;
152 rp->cmd.count = sizeof(cmd);
153 rp->data.p = data;
154 rp->data.count = MaxDirData;
155 rp->data.write = 0;
156 return SRrequest(rp);
157 }
158
159 long
SRwtrack(ScsiReq * rp,void * buf,long nbytes,uchar track,uchar mode)160 SRwtrack(ScsiReq *rp, void *buf, long nbytes, uchar track, uchar mode)
161 {
162 uchar cmd[10];
163 long m, n;
164
165 if((nbytes % rp->lbsize) || nbytes > maxiosize){
166 rp->status = Status_BADARG;
167 return -1;
168 }
169 memset(cmd, 0, sizeof(cmd));
170 cmd[0] = ScmdTwrite;
171 cmd[5] = track;
172 cmd[6] = mode;
173 n = nbytes/rp->lbsize;
174 cmd[7] = n>>8;
175 cmd[8] = n;
176 rp->cmd.p = cmd;
177 rp->cmd.count = sizeof(cmd);
178 rp->data.p = buf;
179 rp->data.count = nbytes;
180 rp->data.write = 1;
181 m = SRrequest(rp);
182 if(m < 0)
183 return -1;
184 rp->offset += n;
185 return m;
186 }
187
188 long
SRmload(ScsiReq * rp,uchar code)189 SRmload(ScsiReq *rp, uchar code)
190 {
191 uchar cmd[12];
192
193 memset(cmd, 0, sizeof(cmd));
194 cmd[0] = ScmdMload;
195 cmd[8] = code;
196 rp->cmd.p = cmd;
197 rp->cmd.count = sizeof(cmd);
198 rp->data.p = cmd;
199 rp->data.count = 0;
200 rp->data.write = 1;
201 return SRrequest(rp);
202 }
203
204 long
SRfixation(ScsiReq * rp,uchar type)205 SRfixation(ScsiReq *rp, uchar type)
206 {
207 uchar cmd[10];
208
209 memset(cmd, 0, sizeof(cmd));
210 cmd[0] = ScmdFixation;
211 cmd[8] = type;
212 rp->cmd.p = cmd;
213 rp->cmd.count = sizeof(cmd);
214 rp->data.p = cmd;
215 rp->data.count = 0;
216 rp->data.write = 1;
217 return SRrequest(rp);
218 }
219