xref: /plan9/sys/src/cmd/scuzz/cdr.c (revision fd362a73ff89ae80075dd82c9aad2a3468f0f3c9)
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