scsi_base.c revision 1.12 1 1.1 mycroft /*
2 1.9 mycroft * Copyright (c) 1994 Charles Hannum. All rights reserved.
3 1.9 mycroft *
4 1.9 mycroft * Redistribution and use in source and binary forms, with or without
5 1.9 mycroft * modification, are permitted provided that the following conditions
6 1.9 mycroft * are met:
7 1.9 mycroft * 1. Redistributions of source code must retain the above copyright
8 1.9 mycroft * notice, this list of conditions and the following disclaimer.
9 1.9 mycroft * 2. Redistributions in binary form must reproduce the above copyright
10 1.9 mycroft * notice, this list of conditions and the following disclaimer in the
11 1.9 mycroft * documentation and/or other materials provided with the distribution.
12 1.9 mycroft * 3. All advertising materials mentioning features or use of this software
13 1.9 mycroft * must display the following acknowledgement:
14 1.9 mycroft * This product includes software developed by Charles Hannum.
15 1.9 mycroft * 4. The name of the author may not be used to endorse or promote products
16 1.9 mycroft * derived from this software without specific prior written permission.
17 1.9 mycroft *
18 1.9 mycroft * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.9 mycroft * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.9 mycroft * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.9 mycroft * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 1.9 mycroft * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 1.9 mycroft * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 1.9 mycroft * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 1.9 mycroft * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 1.9 mycroft * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 1.9 mycroft * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.9 mycroft *
29 1.12 mycroft * $Id: scsi_base.c,v 1.12 1994/04/20 22:13:33 mycroft Exp $
30 1.9 mycroft */
31 1.9 mycroft
32 1.9 mycroft /*
33 1.9 mycroft * Originally written by Julian Elischer (julian (at) dialix.oz.au)
34 1.1 mycroft */
35 1.1 mycroft
36 1.1 mycroft #include <sys/types.h>
37 1.1 mycroft #include <sys/param.h>
38 1.11 mycroft #include <sys/kernel.h>
39 1.1 mycroft #include <sys/buf.h>
40 1.1 mycroft #include <sys/uio.h>
41 1.1 mycroft #include <sys/malloc.h>
42 1.1 mycroft #include <sys/errno.h>
43 1.1 mycroft #include <sys/device.h>
44 1.2 mycroft
45 1.1 mycroft #include <scsi/scsi_all.h>
46 1.1 mycroft #include <scsi/scsi_disk.h>
47 1.1 mycroft #include <scsi/scsiconf.h>
48 1.1 mycroft
49 1.1 mycroft #ifdef DDB
50 1.1 mycroft int Debugger();
51 1.1 mycroft #else /* DDB */
52 1.1 mycroft #define Debugger()
53 1.1 mycroft #endif /* DDB */
54 1.1 mycroft
55 1.12 mycroft LIST_HEAD(xs_free_list, scsi_xfer) xs_free_list;
56 1.1 mycroft
57 1.1 mycroft /*
58 1.1 mycroft * Get a scsi transfer structure for the caller. Charge the structure
59 1.1 mycroft * to the device that is referenced by the sc_link structure. If the
60 1.1 mycroft * sc_link structure has no 'credits' then the device already has the
61 1.1 mycroft * maximum number or outstanding operations under way. In this stage,
62 1.1 mycroft * wait on the structure so that when one is freed, we are awoken again
63 1.1 mycroft * If the SCSI_NOSLEEP flag is set, then do not wait, but rather, return
64 1.1 mycroft * a NULL pointer, signifying that no slots were available
65 1.1 mycroft * Note in the link structure, that we are waiting on it.
66 1.1 mycroft */
67 1.1 mycroft
68 1.1 mycroft struct scsi_xfer *
69 1.1 mycroft get_xs(sc_link, flags)
70 1.2 mycroft struct scsi_link *sc_link; /* who to charge the xs to */
71 1.11 mycroft int flags; /* if this call can sleep */
72 1.1 mycroft {
73 1.2 mycroft struct scsi_xfer *xs;
74 1.11 mycroft int s;
75 1.1 mycroft
76 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("get_xs\n"));
77 1.1 mycroft s = splbio();
78 1.1 mycroft while (!sc_link->opennings) {
79 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("sleeping\n"));
80 1.1 mycroft if (flags & SCSI_NOSLEEP) {
81 1.1 mycroft splx(s);
82 1.1 mycroft return 0;
83 1.1 mycroft }
84 1.1 mycroft sc_link->flags |= SDEV_WAITING;
85 1.12 mycroft (void) tsleep(sc_link, PRIBIO, "getxs", 0);
86 1.1 mycroft }
87 1.1 mycroft sc_link->opennings--;
88 1.12 mycroft if (xs = xs_free_list.lh_first) {
89 1.12 mycroft LIST_REMOVE(xs, free_list);
90 1.1 mycroft splx(s);
91 1.1 mycroft } else {
92 1.1 mycroft splx(s);
93 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("making\n"));
94 1.12 mycroft xs = malloc(sizeof(*xs), M_DEVBUF,
95 1.1 mycroft ((flags & SCSI_NOSLEEP) ? M_NOWAIT : M_WAITOK));
96 1.12 mycroft if (!xs) {
97 1.1 mycroft sc_print_addr(sc_link);
98 1.1 mycroft printf("cannot allocate scsi xs\n");
99 1.12 mycroft return 0;
100 1.1 mycroft }
101 1.1 mycroft }
102 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("returning\n"));
103 1.1 mycroft xs->sc_link = sc_link;
104 1.11 mycroft return xs;
105 1.1 mycroft }
106 1.1 mycroft
107 1.1 mycroft /*
108 1.1 mycroft * Given a scsi_xfer struct, and a device (referenced through sc_link)
109 1.1 mycroft * return the struct to the free pool and credit the device with it
110 1.1 mycroft * If another process is waiting for an xs, do a wakeup, let it proceed
111 1.1 mycroft */
112 1.1 mycroft void
113 1.1 mycroft free_xs(xs, sc_link, flags)
114 1.1 mycroft struct scsi_xfer *xs;
115 1.1 mycroft struct scsi_link *sc_link; /* who to credit for returning it */
116 1.11 mycroft int flags;
117 1.1 mycroft {
118 1.12 mycroft LIST_INSERT_HEAD(&xs_free_list, xs, free_list);
119 1.1 mycroft
120 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("free_xs\n"));
121 1.1 mycroft /* if was 0 and someone waits, wake them up */
122 1.3 mycroft if ((!sc_link->opennings++) && (sc_link->flags & SDEV_WAITING)) {
123 1.3 mycroft sc_link->flags &= ~SDEV_WAITING;
124 1.3 mycroft wakeup(sc_link); /* remember, it wakes them ALL up */
125 1.3 mycroft } else {
126 1.1 mycroft if (sc_link->device->start) {
127 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB2, ("calling private start()\n"));
128 1.1 mycroft (*(sc_link->device->start)) (sc_link->dev_unit);
129 1.1 mycroft }
130 1.3 mycroft }
131 1.1 mycroft }
132 1.1 mycroft
133 1.1 mycroft /*
134 1.1 mycroft * Find out from the device what its capacity is.
135 1.1 mycroft */
136 1.1 mycroft u_int32
137 1.1 mycroft scsi_size(sc_link, flags)
138 1.1 mycroft struct scsi_link *sc_link;
139 1.11 mycroft int flags;
140 1.1 mycroft {
141 1.1 mycroft struct scsi_read_cap_data rdcap;
142 1.1 mycroft struct scsi_read_capacity scsi_cmd;
143 1.1 mycroft u_int32 size;
144 1.1 mycroft
145 1.1 mycroft /*
146 1.1 mycroft * make up a scsi command and ask the scsi driver to do
147 1.1 mycroft * it for you.
148 1.1 mycroft */
149 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
150 1.1 mycroft scsi_cmd.op_code = READ_CAPACITY;
151 1.1 mycroft
152 1.1 mycroft /*
153 1.1 mycroft * If the command works, interpret the result as a 4 byte
154 1.1 mycroft * number of blocks
155 1.1 mycroft */
156 1.2 mycroft if (scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
157 1.2 mycroft sizeof(scsi_cmd), (u_char *) & rdcap, sizeof(rdcap),
158 1.2 mycroft 2, 20000, NULL, flags | SCSI_DATA_IN) != 0) {
159 1.1 mycroft sc_print_addr(sc_link);
160 1.1 mycroft printf("could not get size\n");
161 1.11 mycroft return 0;
162 1.1 mycroft } else {
163 1.1 mycroft size = rdcap.addr_0 + 1;
164 1.1 mycroft size += rdcap.addr_1 << 8;
165 1.1 mycroft size += rdcap.addr_2 << 16;
166 1.1 mycroft size += rdcap.addr_3 << 24;
167 1.1 mycroft }
168 1.11 mycroft return size;
169 1.1 mycroft }
170 1.1 mycroft
171 1.1 mycroft /*
172 1.1 mycroft * Get scsi driver to send a "are you ready?" command
173 1.1 mycroft */
174 1.2 mycroft int
175 1.1 mycroft scsi_test_unit_ready(sc_link, flags)
176 1.1 mycroft struct scsi_link *sc_link;
177 1.11 mycroft int flags;
178 1.1 mycroft {
179 1.1 mycroft struct scsi_test_unit_ready scsi_cmd;
180 1.1 mycroft
181 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
182 1.1 mycroft scsi_cmd.op_code = TEST_UNIT_READY;
183 1.1 mycroft
184 1.2 mycroft return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
185 1.2 mycroft sizeof(scsi_cmd), 0, 0, 2, 100000, NULL, flags);
186 1.1 mycroft }
187 1.1 mycroft
188 1.1 mycroft /*
189 1.1 mycroft * Do a scsi operation, asking a device to run as SCSI-II if it can.
190 1.1 mycroft */
191 1.2 mycroft int
192 1.1 mycroft scsi_change_def(sc_link, flags)
193 1.1 mycroft struct scsi_link *sc_link;
194 1.11 mycroft int flags;
195 1.1 mycroft {
196 1.1 mycroft struct scsi_changedef scsi_cmd;
197 1.1 mycroft
198 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
199 1.1 mycroft scsi_cmd.op_code = CHANGE_DEFINITION;
200 1.1 mycroft scsi_cmd.how = SC_SCSI_2;
201 1.1 mycroft
202 1.2 mycroft return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
203 1.2 mycroft sizeof(scsi_cmd), 0, 0, 2, 100000, NULL, flags);
204 1.1 mycroft }
205 1.1 mycroft
206 1.1 mycroft /*
207 1.1 mycroft * Do a scsi operation asking a device what it is
208 1.1 mycroft * Use the scsi_cmd routine in the switch table.
209 1.1 mycroft */
210 1.2 mycroft int
211 1.1 mycroft scsi_inquire(sc_link, inqbuf, flags)
212 1.1 mycroft struct scsi_link *sc_link;
213 1.1 mycroft struct scsi_inquiry_data *inqbuf;
214 1.11 mycroft int flags;
215 1.1 mycroft {
216 1.1 mycroft struct scsi_inquiry scsi_cmd;
217 1.1 mycroft
218 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
219 1.1 mycroft scsi_cmd.op_code = INQUIRY;
220 1.1 mycroft scsi_cmd.length = sizeof(struct scsi_inquiry_data);
221 1.1 mycroft
222 1.2 mycroft return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
223 1.2 mycroft sizeof(scsi_cmd), (u_char *) inqbuf,
224 1.2 mycroft sizeof(struct scsi_inquiry_data), 2, 100000, NULL,
225 1.2 mycroft SCSI_DATA_IN | flags);
226 1.1 mycroft }
227 1.1 mycroft
228 1.1 mycroft /*
229 1.1 mycroft * Prevent or allow the user to remove the media
230 1.1 mycroft */
231 1.2 mycroft int
232 1.1 mycroft scsi_prevent(sc_link, type, flags)
233 1.1 mycroft struct scsi_link *sc_link;
234 1.11 mycroft int type, flags;
235 1.1 mycroft {
236 1.1 mycroft struct scsi_prevent scsi_cmd;
237 1.1 mycroft
238 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
239 1.1 mycroft scsi_cmd.op_code = PREVENT_ALLOW;
240 1.1 mycroft scsi_cmd.how = type;
241 1.2 mycroft return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
242 1.2 mycroft sizeof(scsi_cmd), 0, 0, 2, 5000, NULL, flags);
243 1.1 mycroft }
244 1.1 mycroft
245 1.1 mycroft /*
246 1.1 mycroft * Get scsi driver to send a "start up" command
247 1.1 mycroft */
248 1.2 mycroft int
249 1.10 mycroft scsi_start(sc_link, type, flags)
250 1.1 mycroft struct scsi_link *sc_link;
251 1.11 mycroft int type, flags;
252 1.1 mycroft {
253 1.1 mycroft struct scsi_start_stop scsi_cmd;
254 1.1 mycroft
255 1.1 mycroft bzero(&scsi_cmd, sizeof(scsi_cmd));
256 1.1 mycroft scsi_cmd.op_code = START_STOP;
257 1.10 mycroft scsi_cmd.how = type;
258 1.2 mycroft return scsi_scsi_cmd(sc_link, (struct scsi_generic *) &scsi_cmd,
259 1.10 mycroft sizeof(scsi_cmd), 0, 0, 2,
260 1.10 mycroft type == SSS_START ? 10000 : 2000, NULL, flags);
261 1.1 mycroft }
262 1.1 mycroft
263 1.1 mycroft /*
264 1.1 mycroft * This routine is called by the scsi interrupt when the transfer is complete.
265 1.1 mycroft */
266 1.1 mycroft void
267 1.1 mycroft scsi_done(xs)
268 1.1 mycroft struct scsi_xfer *xs;
269 1.1 mycroft {
270 1.1 mycroft struct scsi_link *sc_link = xs->sc_link;
271 1.1 mycroft struct buf *bp = xs->bp;
272 1.11 mycroft int error;
273 1.1 mycroft
274 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB2, ("scsi_done\n"));
275 1.1 mycroft #ifdef SCSIDEBUG
276 1.1 mycroft if (sc_link->flags & SDEV_DB1)
277 1.1 mycroft show_scsi_cmd(xs);
278 1.1 mycroft #endif /*SCSIDEBUG */
279 1.1 mycroft /*
280 1.1 mycroft * If it's a user level request, bypass all usual completion processing,
281 1.1 mycroft * let the user work it out.. We take reponsibility for freeing the
282 1.1 mycroft * xs when the user returns. (and restarting the device's queue).
283 1.1 mycroft */
284 1.1 mycroft if (xs->flags & SCSI_USER) {
285 1.1 mycroft biodone(xs->bp);
286 1.1 mycroft #ifdef NOTNOW
287 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("calling user done()\n"));
288 1.1 mycroft scsi_user_done(xs); /* to take a copy of the sense etc. */
289 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("returned from user done()\n "));
290 1.1 mycroft #endif
291 1.1 mycroft free_xs(xs, sc_link, SCSI_NOSLEEP); /* restarts queue too */
292 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("returning to adapter\n"));
293 1.1 mycroft return;
294 1.1 mycroft }
295 1.1 mycroft /*
296 1.1 mycroft * If the device has it's own done routine, call it first.
297 1.1 mycroft * If it returns a legit error value, return that, otherwise
298 1.1 mycroft * it wants us to continue with normal processing.
299 1.1 mycroft */
300 1.1 mycroft
301 1.1 mycroft if (sc_link->device->done) {
302 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB2, ("calling private done()\n"));
303 1.11 mycroft error = (*sc_link->device->done) (xs);
304 1.11 mycroft if (error == -1) {
305 1.1 mycroft free_xs(xs, sc_link, SCSI_NOSLEEP); /*XXX */
306 1.1 mycroft return; /* it did it all, finish up */
307 1.1 mycroft }
308 1.11 mycroft if (error == -2)
309 1.1 mycroft return; /* it did it all, finish up */
310 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("continuing with generic done()\n"));
311 1.1 mycroft }
312 1.1 mycroft if ((bp = xs->bp) == NULL) {
313 1.1 mycroft /*
314 1.1 mycroft * if it's a normal upper level request, then ask
315 1.1 mycroft * the upper level code to handle error checking
316 1.1 mycroft * rather than doing it here at interrupt time
317 1.1 mycroft */
318 1.1 mycroft wakeup(xs);
319 1.1 mycroft return;
320 1.1 mycroft }
321 1.1 mycroft /*
322 1.1 mycroft * Go and handle errors now.
323 1.1 mycroft * If it returns -1 then we should RETRY
324 1.1 mycroft */
325 1.11 mycroft if ((error = sc_err1(xs)) == -1) {
326 1.1 mycroft if ((*(sc_link->adapter->scsi_cmd)) (xs)
327 1.2 mycroft == SUCCESSFULLY_QUEUED) /* don't wake the job, ok? */
328 1.1 mycroft return;
329 1.1 mycroft xs->flags |= ITSDONE;
330 1.1 mycroft }
331 1.1 mycroft free_xs(xs, sc_link, SCSI_NOSLEEP); /* does a start if needed */
332 1.1 mycroft biodone(bp);
333 1.1 mycroft }
334 1.1 mycroft
335 1.1 mycroft /*
336 1.1 mycroft * ask the scsi driver to perform a command for us.
337 1.1 mycroft * tell it where to read/write the data, and how
338 1.1 mycroft * long the data is supposed to be. If we have a buf
339 1.1 mycroft * to associate with the transfer, we need that too.
340 1.1 mycroft */
341 1.2 mycroft int
342 1.1 mycroft scsi_scsi_cmd(sc_link, scsi_cmd, cmdlen, data_addr, datalen,
343 1.1 mycroft retries, timeout, bp, flags)
344 1.1 mycroft struct scsi_link *sc_link;
345 1.1 mycroft struct scsi_generic *scsi_cmd;
346 1.1 mycroft u_int32 cmdlen;
347 1.1 mycroft u_char *data_addr;
348 1.1 mycroft u_int32 datalen;
349 1.11 mycroft int retries;
350 1.11 mycroft int timeout;
351 1.1 mycroft struct buf *bp;
352 1.11 mycroft int flags;
353 1.1 mycroft {
354 1.1 mycroft struct scsi_xfer *xs;
355 1.11 mycroft int error;
356 1.11 mycroft int s;
357 1.1 mycroft
358 1.2 mycroft if (bp)
359 1.2 mycroft flags |= SCSI_NOSLEEP;
360 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB2, ("scsi_cmd\n"));
361 1.1 mycroft
362 1.1 mycroft xs = get_xs(sc_link, flags); /* should wait unless booting */
363 1.2 mycroft if (!xs)
364 1.11 mycroft return ENOMEM;
365 1.1 mycroft /*
366 1.1 mycroft * Fill out the scsi_xfer structure. We don't know whose context
367 1.1 mycroft * the cmd is in, so copy it.
368 1.1 mycroft */
369 1.11 mycroft bcopy(scsi_cmd, &xs->cmdstore, cmdlen);
370 1.1 mycroft xs->flags = INUSE | flags;
371 1.1 mycroft xs->sc_link = sc_link;
372 1.1 mycroft xs->retries = retries;
373 1.1 mycroft xs->timeout = timeout;
374 1.1 mycroft xs->cmd = &xs->cmdstore;
375 1.1 mycroft xs->cmdlen = cmdlen;
376 1.1 mycroft xs->data = data_addr;
377 1.1 mycroft xs->datalen = datalen;
378 1.1 mycroft xs->resid = datalen;
379 1.1 mycroft xs->bp = bp;
380 1.11 mycroft if ((flags & (SCSI_DATA_IN | SCSI_DATA_OUT)) &&
381 1.11 mycroft ((caddr_t) data_addr < (caddr_t) KERNBASE)) {
382 1.1 mycroft if (bp) {
383 1.1 mycroft printf("Data buffered space not in kernel context\n");
384 1.1 mycroft #ifdef SCSIDEBUG
385 1.1 mycroft show_scsi_cmd(xs);
386 1.1 mycroft #endif /* SCSIDEBUG */
387 1.11 mycroft error = EFAULT;
388 1.1 mycroft goto bad;
389 1.1 mycroft }
390 1.1 mycroft xs->data = malloc(datalen, M_TEMP, M_WAITOK);
391 1.1 mycroft /* I think waiting is ok *//*XXX */
392 1.11 mycroft if (flags & SCSI_DATA_OUT)
393 1.1 mycroft bcopy(data_addr, xs->data, datalen);
394 1.11 mycroft else
395 1.1 mycroft bzero(xs->data, datalen);
396 1.1 mycroft }
397 1.1 mycroft retry:
398 1.1 mycroft xs->error = XS_NOERROR;
399 1.1 mycroft #ifdef SCSIDEBUG
400 1.2 mycroft if (sc_link->flags & SDEV_DB3)
401 1.2 mycroft show_scsi_xs(xs);
402 1.1 mycroft #endif /* SCSIDEBUG */
403 1.1 mycroft /*
404 1.1 mycroft * Do the transfer. If we are polling we will return:
405 1.1 mycroft * COMPLETE, Was poll, and scsi_done has been called
406 1.1 mycroft * TRY_AGAIN_LATER, Adapter short resources, try again
407 1.1 mycroft *
408 1.1 mycroft * if under full steam (interrupts) it will return:
409 1.1 mycroft * SUCCESSFULLY_QUEUED, will do a wakeup when complete
410 1.1 mycroft * TRY_AGAIN_LATER, (as for polling)
411 1.1 mycroft * After the wakeup, we must still check if it succeeded
412 1.1 mycroft *
413 1.1 mycroft * If we have a bp however, all the error proccessing
414 1.1 mycroft * and the buffer code both expect us to return straight
415 1.1 mycroft * to them, so as soon as the command is queued, return
416 1.1 mycroft */
417 1.11 mycroft error = (*(sc_link->adapter->scsi_cmd)) (xs);
418 1.1 mycroft
419 1.11 mycroft switch (error) {
420 1.1 mycroft case SUCCESSFULLY_QUEUED:
421 1.1 mycroft if (bp)
422 1.11 mycroft return error; /* will sleep (or not) elsewhere */
423 1.1 mycroft s = splbio();
424 1.1 mycroft while (!(xs->flags & ITSDONE))
425 1.4 mycroft tsleep(xs, PRIBIO + 1, "scsi_scsi_cmd", 0);
426 1.1 mycroft splx(s);
427 1.1 mycroft /* fall through to check success of completed command */
428 1.1 mycroft case COMPLETE: /* Polling command completed ok */
429 1.1 mycroft /*XXX*/ case HAD_ERROR: /* Polling command completed with error */
430 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("back in cmd()\n"));
431 1.11 mycroft if ((error = sc_err1(xs)) == -1)
432 1.1 mycroft goto retry;
433 1.1 mycroft break;
434 1.1 mycroft
435 1.1 mycroft case TRY_AGAIN_LATER: /* adapter resource shortage */
436 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB3, ("will try again \n"));
437 1.1 mycroft if (xs->retries--) {
438 1.1 mycroft xs->flags &= ~ITSDONE;
439 1.11 mycroft tsleep((caddr_t)&lbolt, PRIBIO, "scretry", 0);
440 1.1 mycroft goto retry;
441 1.1 mycroft }
442 1.1 mycroft default:
443 1.11 mycroft error = EIO;
444 1.1 mycroft }
445 1.1 mycroft /*
446 1.1 mycroft * If we had to copy the data out of the user's context,
447 1.1 mycroft * then do the other half (copy it back or whatever)
448 1.1 mycroft * and free the memory buffer
449 1.1 mycroft */
450 1.11 mycroft if ((flags & SCSI_DATA_IN) && (xs->data != data_addr)) {
451 1.11 mycroft bcopy(xs->data, data_addr, datalen);
452 1.1 mycroft free(xs->data, M_TEMP);
453 1.1 mycroft }
454 1.1 mycroft /*
455 1.1 mycroft * we have finished with the xfer stuct, free it and
456 1.1 mycroft * check if anyone else needs to be started up.
457 1.1 mycroft */
458 1.1 mycroft bad:
459 1.1 mycroft free_xs(xs, sc_link, flags); /* includes the 'start' op */
460 1.11 mycroft if (bp && error) {
461 1.11 mycroft bp->b_error = error;
462 1.1 mycroft bp->b_flags |= B_ERROR;
463 1.1 mycroft biodone(bp);
464 1.1 mycroft }
465 1.11 mycroft return error;
466 1.1 mycroft }
467 1.1 mycroft
468 1.2 mycroft int
469 1.1 mycroft sc_err1(xs)
470 1.1 mycroft struct scsi_xfer *xs;
471 1.1 mycroft {
472 1.1 mycroft struct buf *bp = xs->bp;
473 1.11 mycroft int error;
474 1.1 mycroft
475 1.1 mycroft SC_DEBUG(xs->sc_link, SDEV_DB3, ("sc_err1,err = 0x%x \n", xs->error));
476 1.1 mycroft /*
477 1.1 mycroft * If it has a buf, we might be working with
478 1.1 mycroft * a request from the buffer cache or some other
479 1.1 mycroft * piece of code that requires us to process
480 1.1 mycroft * errors at inetrrupt time. We have probably
481 1.1 mycroft * been called by scsi_done()
482 1.1 mycroft */
483 1.1 mycroft switch (xs->error) {
484 1.1 mycroft case XS_NOERROR: /* nearly always hit this one */
485 1.11 mycroft error = 0;
486 1.1 mycroft if (bp) {
487 1.1 mycroft bp->b_error = 0;
488 1.1 mycroft bp->b_resid = 0;
489 1.1 mycroft }
490 1.1 mycroft break;
491 1.1 mycroft
492 1.1 mycroft case XS_SENSE:
493 1.1 mycroft if (bp) {
494 1.1 mycroft bp->b_error = 0;
495 1.1 mycroft bp->b_resid = 0;
496 1.11 mycroft if (error = scsi_interpret_sense(xs)) {
497 1.1 mycroft bp->b_flags |= B_ERROR;
498 1.11 mycroft bp->b_error = error;
499 1.1 mycroft bp->b_resid = bp->b_bcount;
500 1.1 mycroft }
501 1.1 mycroft SC_DEBUG(xs->sc_link, SDEV_DB3,
502 1.11 mycroft ("scsi_interpret_sense (bp) returned %d\n", error));
503 1.1 mycroft } else {
504 1.11 mycroft error = scsi_interpret_sense(xs);
505 1.1 mycroft SC_DEBUG(xs->sc_link, SDEV_DB3,
506 1.11 mycroft ("scsi_interpret_sense (no bp) returned %d\n", error));
507 1.1 mycroft }
508 1.1 mycroft break;
509 1.1 mycroft
510 1.1 mycroft case XS_BUSY:
511 1.1 mycroft /*should somehow arange for a 1 sec delay here (how?) */
512 1.1 mycroft case XS_TIMEOUT:
513 1.1 mycroft /*
514 1.1 mycroft * If we can, resubmit it to the adapter.
515 1.1 mycroft */
516 1.1 mycroft if (xs->retries--) {
517 1.1 mycroft xs->error = XS_NOERROR;
518 1.1 mycroft xs->flags &= ~ITSDONE;
519 1.1 mycroft goto retry;
520 1.1 mycroft }
521 1.1 mycroft /* fall through */
522 1.1 mycroft case XS_DRIVER_STUFFUP:
523 1.1 mycroft if (bp) {
524 1.1 mycroft bp->b_flags |= B_ERROR;
525 1.1 mycroft bp->b_error = EIO;
526 1.1 mycroft }
527 1.11 mycroft error = EIO;
528 1.1 mycroft break;
529 1.1 mycroft default:
530 1.11 mycroft error = EIO;
531 1.1 mycroft sc_print_addr(xs->sc_link);
532 1.1 mycroft printf("unknown error category from scsi driver\n");
533 1.1 mycroft }
534 1.11 mycroft return error;
535 1.1 mycroft retry:
536 1.11 mycroft return -1;
537 1.1 mycroft }
538 1.1 mycroft
539 1.1 mycroft /*
540 1.1 mycroft * Look at the returned sense and act on the error, determining
541 1.1 mycroft * the unix error number to pass back. (0 = report no error)
542 1.1 mycroft *
543 1.1 mycroft * THIS IS THE DEFAULT ERROR HANDLER
544 1.1 mycroft */
545 1.2 mycroft int
546 1.1 mycroft scsi_interpret_sense(xs)
547 1.1 mycroft struct scsi_xfer *xs;
548 1.1 mycroft {
549 1.1 mycroft struct scsi_sense_data *sense;
550 1.1 mycroft struct scsi_link *sc_link = xs->sc_link;
551 1.1 mycroft u_int32 key;
552 1.1 mycroft u_int32 silent;
553 1.1 mycroft u_int32 info;
554 1.2 mycroft int error;
555 1.1 mycroft
556 1.1 mycroft static char *error_mes[] =
557 1.1 mycroft {"soft error (corrected)",
558 1.1 mycroft "not ready", "medium error",
559 1.1 mycroft "non-media hardware failure", "illegal request",
560 1.1 mycroft "unit attention", "readonly device",
561 1.1 mycroft "no data found", "vendor unique",
562 1.1 mycroft "copy aborted", "command aborted",
563 1.1 mycroft "search returned equal", "volume overflow",
564 1.1 mycroft "verify miscompare", "unknown error key"
565 1.1 mycroft };
566 1.1 mycroft
567 1.1 mycroft /*
568 1.1 mycroft * If the flags say errs are ok, then always return ok.
569 1.1 mycroft */
570 1.1 mycroft if (xs->flags & SCSI_ERR_OK)
571 1.11 mycroft return 0;
572 1.1 mycroft
573 1.11 mycroft sense = &xs->sense;
574 1.1 mycroft #ifdef SCSIDEBUG
575 1.1 mycroft if (sc_link->flags & SDEV_DB1) {
576 1.1 mycroft u_int32 count = 0;
577 1.1 mycroft printf("code%x valid%x ",
578 1.1 mycroft sense->error_code & SSD_ERRCODE,
579 1.1 mycroft sense->error_code & SSD_ERRCODE_VALID ? 1 : 0);
580 1.1 mycroft printf("seg%x key%x ili%x eom%x fmark%x\n",
581 1.1 mycroft sense->ext.extended.segment,
582 1.1 mycroft sense->ext.extended.flags & SSD_KEY,
583 1.1 mycroft sense->ext.extended.flags & SSD_ILI ? 1 : 0,
584 1.1 mycroft sense->ext.extended.flags & SSD_EOM ? 1 : 0,
585 1.1 mycroft sense->ext.extended.flags & SSD_FILEMARK ? 1 : 0);
586 1.1 mycroft printf("info: %x %x %x %x followed by %d extra bytes\n",
587 1.1 mycroft sense->ext.extended.info[0],
588 1.1 mycroft sense->ext.extended.info[1],
589 1.1 mycroft sense->ext.extended.info[2],
590 1.1 mycroft sense->ext.extended.info[3],
591 1.1 mycroft sense->ext.extended.extra_len);
592 1.1 mycroft printf("extra: ");
593 1.2 mycroft while (count < sense->ext.extended.extra_len)
594 1.1 mycroft printf("%x ", sense->ext.extended.extra_bytes[count++]);
595 1.1 mycroft printf("\n");
596 1.1 mycroft }
597 1.1 mycroft #endif /*SCSIDEBUG */
598 1.1 mycroft /*
599 1.1 mycroft * If the device has it's own error handler, call it first.
600 1.1 mycroft * If it returns a legit error value, return that, otherwise
601 1.1 mycroft * it wants us to continue with normal error processing.
602 1.1 mycroft */
603 1.1 mycroft if (sc_link->device->err_handler) {
604 1.1 mycroft SC_DEBUG(sc_link, SDEV_DB2, ("calling private err_handler()\n"));
605 1.2 mycroft error = (*sc_link->device->err_handler) (xs);
606 1.2 mycroft if (error != -1)
607 1.2 mycroft return error; /* error >= 0 better ? */
608 1.1 mycroft }
609 1.1 mycroft /* otherwise use the default */
610 1.1 mycroft silent = (xs->flags & SCSI_SILENT);
611 1.1 mycroft switch (sense->error_code & SSD_ERRCODE) {
612 1.1 mycroft /*
613 1.1 mycroft * If it's code 70, use the extended stuff and interpret the key
614 1.1 mycroft */
615 1.1 mycroft case 0x71: /* delayed error */
616 1.1 mycroft sc_print_addr(sc_link);
617 1.1 mycroft key = sense->ext.extended.flags & SSD_KEY;
618 1.1 mycroft printf(" DELAYED ERROR, key = 0x%x\n", key);
619 1.1 mycroft case 0x70:
620 1.2 mycroft if (sense->error_code & SSD_ERRCODE_VALID)
621 1.1 mycroft info = ntohl(*((long *) sense->ext.extended.info));
622 1.2 mycroft else
623 1.1 mycroft info = 0;
624 1.1 mycroft key = sense->ext.extended.flags & SSD_KEY;
625 1.1 mycroft
626 1.1 mycroft if (key && !silent) {
627 1.1 mycroft sc_print_addr(sc_link);
628 1.1 mycroft printf("%s", error_mes[key - 1]);
629 1.1 mycroft if (sense->error_code & SSD_ERRCODE_VALID) {
630 1.1 mycroft switch (key) {
631 1.1 mycroft case 0x2: /* NOT READY */
632 1.1 mycroft case 0x5: /* ILLEGAL REQUEST */
633 1.1 mycroft case 0x6: /* UNIT ATTENTION */
634 1.1 mycroft case 0x7: /* DATA PROTECT */
635 1.1 mycroft break;
636 1.1 mycroft case 0x8: /* BLANK CHECK */
637 1.1 mycroft printf(", requested size: %d (decimal)",
638 1.1 mycroft info);
639 1.1 mycroft break;
640 1.1 mycroft default:
641 1.1 mycroft printf(", info = %d (decimal)", info);
642 1.1 mycroft }
643 1.1 mycroft }
644 1.1 mycroft printf("\n");
645 1.1 mycroft }
646 1.1 mycroft switch (key) {
647 1.1 mycroft case 0x0: /* NO SENSE */
648 1.1 mycroft case 0x1: /* RECOVERED ERROR */
649 1.1 mycroft if (xs->resid == xs->datalen)
650 1.1 mycroft xs->resid = 0; /* not short read */
651 1.1 mycroft case 0xc: /* EQUAL */
652 1.11 mycroft return 0;
653 1.1 mycroft case 0x2: /* NOT READY */
654 1.1 mycroft sc_link->flags &= ~SDEV_MEDIA_LOADED;
655 1.11 mycroft return EBUSY;
656 1.1 mycroft case 0x5: /* ILLEGAL REQUEST */
657 1.11 mycroft return EINVAL;
658 1.1 mycroft case 0x6: /* UNIT ATTENTION */
659 1.1 mycroft sc_link->flags &= ~SDEV_MEDIA_LOADED;
660 1.2 mycroft if (sc_link->flags & SDEV_OPEN)
661 1.11 mycroft return EIO;
662 1.2 mycroft else
663 1.1 mycroft return 0;
664 1.1 mycroft case 0x7: /* DATA PROTECT */
665 1.11 mycroft return EACCES;
666 1.1 mycroft case 0xd: /* VOLUME OVERFLOW */
667 1.11 mycroft return ENOSPC;
668 1.1 mycroft case 0x8: /* BLANK CHECK */
669 1.11 mycroft return 0;
670 1.1 mycroft default:
671 1.11 mycroft return EIO;
672 1.1 mycroft }
673 1.1 mycroft /*
674 1.1 mycroft * Not code 70, just report it
675 1.1 mycroft */
676 1.1 mycroft default:
677 1.1 mycroft if (!silent) {
678 1.1 mycroft sc_print_addr(sc_link);
679 1.1 mycroft printf("error code %d",
680 1.1 mycroft sense->error_code & SSD_ERRCODE);
681 1.1 mycroft if (sense->error_code & SSD_ERRCODE_VALID) {
682 1.1 mycroft printf(" at block no. %d (decimal)",
683 1.1 mycroft (sense->ext.unextended.blockhi << 16) +
684 1.1 mycroft (sense->ext.unextended.blockmed << 8) +
685 1.1 mycroft (sense->ext.unextended.blocklow));
686 1.1 mycroft }
687 1.1 mycroft printf("\n");
688 1.1 mycroft }
689 1.11 mycroft return EIO;
690 1.1 mycroft }
691 1.1 mycroft }
692 1.1 mycroft
693 1.1 mycroft /*
694 1.1 mycroft * Utility routines often used in SCSI stuff
695 1.1 mycroft */
696 1.1 mycroft
697 1.1 mycroft /*
698 1.1 mycroft * convert a physical address to 3 bytes,
699 1.1 mycroft * MSB at the lowest address,
700 1.1 mycroft * LSB at the highest.
701 1.1 mycroft */
702 1.1 mycroft void
703 1.1 mycroft lto3b(val, bytes)
704 1.1 mycroft int val;
705 1.1 mycroft u_char *bytes;
706 1.1 mycroft {
707 1.1 mycroft *bytes++ = (val & 0xff0000) >> 16;
708 1.1 mycroft *bytes++ = (val & 0xff00) >> 8;
709 1.1 mycroft *bytes = val & 0xff;
710 1.1 mycroft }
711 1.1 mycroft
712 1.1 mycroft /*
713 1.1 mycroft * The reverse of lto3b
714 1.1 mycroft */
715 1.1 mycroft int
716 1.1 mycroft _3btol(bytes)
717 1.1 mycroft u_char *bytes;
718 1.1 mycroft {
719 1.1 mycroft u_int32 rc;
720 1.1 mycroft rc = (*bytes++ << 16);
721 1.1 mycroft rc += (*bytes++ << 8);
722 1.1 mycroft rc += *bytes;
723 1.1 mycroft return ((int) rc);
724 1.1 mycroft }
725 1.1 mycroft
726 1.1 mycroft /*
727 1.1 mycroft * Print out the scsi_link structure's address info.
728 1.1 mycroft */
729 1.1 mycroft void
730 1.1 mycroft sc_print_addr(sc_link)
731 1.1 mycroft struct scsi_link *sc_link;
732 1.1 mycroft {
733 1.1 mycroft
734 1.1 mycroft printf("%s%d(%s:%d:%d): ",
735 1.1 mycroft sc_link->device->name, sc_link->dev_unit,
736 1.1 mycroft ((struct device *)sc_link->adapter_softc)->dv_xname,
737 1.1 mycroft sc_link->target, sc_link->lun);
738 1.1 mycroft }
739 1.1 mycroft
740 1.1 mycroft #ifdef SCSIDEBUG
741 1.1 mycroft /*
742 1.1 mycroft * Given a scsi_xfer, dump the request, in all it's glory
743 1.1 mycroft */
744 1.1 mycroft void
745 1.1 mycroft show_scsi_xs(xs)
746 1.1 mycroft struct scsi_xfer *xs;
747 1.1 mycroft {
748 1.1 mycroft printf("xs(0x%x): ", xs);
749 1.1 mycroft printf("flg(0x%x)", xs->flags);
750 1.1 mycroft printf("sc_link(0x%x)", xs->sc_link);
751 1.1 mycroft printf("retr(0x%x)", xs->retries);
752 1.1 mycroft printf("timo(0x%x)", xs->timeout);
753 1.1 mycroft printf("cmd(0x%x)", xs->cmd);
754 1.1 mycroft printf("len(0x%x)", xs->cmdlen);
755 1.1 mycroft printf("data(0x%x)", xs->data);
756 1.1 mycroft printf("len(0x%x)", xs->datalen);
757 1.1 mycroft printf("res(0x%x)", xs->resid);
758 1.1 mycroft printf("err(0x%x)", xs->error);
759 1.1 mycroft printf("bp(0x%x)", xs->bp);
760 1.1 mycroft show_scsi_cmd(xs);
761 1.1 mycroft }
762 1.1 mycroft
763 1.1 mycroft void
764 1.1 mycroft show_scsi_cmd(struct scsi_xfer *xs)
765 1.1 mycroft {
766 1.1 mycroft u_char *b = (u_char *) xs->cmd;
767 1.1 mycroft int i = 0;
768 1.1 mycroft
769 1.1 mycroft sc_print_addr(xs->sc_link);
770 1.1 mycroft printf("command: ");
771 1.1 mycroft
772 1.1 mycroft if (!(xs->flags & SCSI_RESET)) {
773 1.1 mycroft while (i < xs->cmdlen) {
774 1.1 mycroft if (i)
775 1.1 mycroft printf(",");
776 1.1 mycroft printf("%x", b[i++]);
777 1.1 mycroft }
778 1.1 mycroft printf("-[%d bytes]\n", xs->datalen);
779 1.1 mycroft if (xs->datalen)
780 1.1 mycroft show_mem(xs->data, min(64, xs->datalen));
781 1.2 mycroft } else
782 1.1 mycroft printf("-RESET-\n");
783 1.1 mycroft }
784 1.1 mycroft
785 1.1 mycroft void
786 1.1 mycroft show_mem(address, num)
787 1.1 mycroft unsigned char *address;
788 1.1 mycroft u_int32 num;
789 1.1 mycroft {
790 1.1 mycroft u_int32 x, y;
791 1.1 mycroft printf("------------------------------");
792 1.1 mycroft for (y = 0; y < num; y += 1) {
793 1.1 mycroft if (!(y % 16))
794 1.1 mycroft printf("\n%03d: ", y);
795 1.1 mycroft printf("%02x ", *address++);
796 1.1 mycroft }
797 1.1 mycroft printf("\n------------------------------\n");
798 1.1 mycroft }
799 1.1 mycroft #endif /*SCSIDEBUG */
800