Annotation of sys/scsi/sd.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: sd.c,v 1.136 2007/06/23 19:19:49 krw Exp $ */
2: /* $NetBSD: sd.c,v 1.111 1997/04/02 02:29:41 mycroft Exp $ */
3:
4: /*-
5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Charles M. Hannum.
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by the NetBSD
22: * Foundation, Inc. and its contributors.
23: * 4. Neither the name of The NetBSD Foundation nor the names of its
24: * contributors may be used to endorse or promote products derived
25: * from this software without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37: * POSSIBILITY OF SUCH DAMAGE.
38: */
39:
40: /*
41: * Originally written by Julian Elischer (julian@dialix.oz.au)
42: * for TRW Financial Systems for use under the MACH(2.5) operating system.
43: *
44: * TRW Financial Systems, in accordance with their agreement with Carnegie
45: * Mellon University, makes this software available to CMU to distribute
46: * or use in any manner that they see fit as long as this message is kept with
47: * the software. For this reason TFS also grants any other persons or
48: * organisations permission to use or modify this software.
49: *
50: * TFS supplies this software to be publicly redistributed
51: * on the understanding that TFS is not responsible for the correct
52: * functioning of this software in any circumstances.
53: *
54: * Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
55: */
56:
57: #include <sys/types.h>
58: #include <sys/param.h>
59: #include <sys/systm.h>
60: #include <sys/timeout.h>
61: #include <sys/file.h>
62: #include <sys/stat.h>
63: #include <sys/ioctl.h>
64: #include <sys/mtio.h>
65: #include <sys/buf.h>
66: #include <sys/uio.h>
67: #include <sys/malloc.h>
68: #include <sys/errno.h>
69: #include <sys/device.h>
70: #include <sys/disklabel.h>
71: #include <sys/disk.h>
72: #include <sys/proc.h>
73: #include <sys/conf.h>
74: #include <sys/scsiio.h>
75:
76: #include <scsi/scsi_all.h>
77: #include <scsi/scsi_disk.h>
78: #include <scsi/scsiconf.h>
79: #include <scsi/sdvar.h>
80:
81: #include <ufs/ffs/fs.h> /* for BBSIZE and SBSIZE */
82:
83: #include <sys/vnode.h>
84:
85: int sdmatch(struct device *, void *, void *);
86: void sdattach(struct device *, struct device *, void *);
87: int sdactivate(struct device *, enum devact);
88: int sddetach(struct device *, int);
89:
90: void sdminphys(struct buf *);
91: void sdgetdisklabel(dev_t, struct sd_softc *, struct disklabel *, int);
92: void sdstart(void *);
93: void sdrestart(void *);
94: void sddone(struct scsi_xfer *);
95: void sd_shutdown(void *);
96: int sd_reassign_blocks(struct sd_softc *, u_long);
97: int sd_interpret_sense(struct scsi_xfer *);
98: int sd_get_parms(struct sd_softc *, struct disk_parms *, int);
99: void sd_flush(struct sd_softc *, int);
100: void sd_kill_buffers(struct sd_softc *);
101:
102: void viscpy(u_char *, u_char *, int);
103:
104: int sd_ioctl_inquiry(struct sd_softc *, struct dk_inquiry *);
105:
106: struct cfattach sd_ca = {
107: sizeof(struct sd_softc), sdmatch, sdattach,
108: sddetach, sdactivate
109: };
110:
111: struct cfdriver sd_cd = {
112: NULL, "sd", DV_DISK
113: };
114:
115: struct dkdriver sddkdriver = { sdstrategy };
116:
117: struct scsi_device sd_switch = {
118: sd_interpret_sense, /* check out error handler first */
119: sdstart, /* have a queue, served by this */
120: NULL, /* have no async handler */
121: sddone, /* deal with stats at interrupt time */
122: };
123:
124: const struct scsi_inquiry_pattern sd_patterns[] = {
125: {T_DIRECT, T_FIXED,
126: "", "", ""},
127: {T_DIRECT, T_REMOV,
128: "", "", ""},
129: {T_RDIRECT, T_FIXED,
130: "", "", ""},
131: {T_RDIRECT, T_REMOV,
132: "", "", ""},
133: {T_OPTICAL, T_FIXED,
134: "", "", ""},
135: {T_OPTICAL, T_REMOV,
136: "", "", ""},
137: };
138:
139: #define sdlock(softc) disk_lock(&(softc)->sc_dk)
140: #define sdunlock(softc) disk_unlock(&(softc)->sc_dk)
141: #define sdlookup(unit) (struct sd_softc *)device_lookup(&sd_cd, (unit))
142:
143: int
144: sdmatch(struct device *parent, void *match, void *aux)
145: {
146: struct scsi_attach_args *sa = aux;
147: int priority;
148:
149: (void)scsi_inqmatch(sa->sa_inqbuf,
150: sd_patterns, sizeof(sd_patterns)/sizeof(sd_patterns[0]),
151: sizeof(sd_patterns[0]), &priority);
152:
153: return (priority);
154: }
155:
156: /*
157: * The routine called by the low level scsi routine when it discovers
158: * a device suitable for this driver.
159: */
160: void
161: sdattach(struct device *parent, struct device *self, void *aux)
162: {
163: int error, result;
164: struct sd_softc *sd = (struct sd_softc *)self;
165: struct disk_parms *dp = &sd->params;
166: struct scsi_attach_args *sa = aux;
167: struct scsi_link *sc_link = sa->sa_sc_link;
168:
169: SC_DEBUG(sc_link, SDEV_DB2, ("sdattach:\n"));
170:
171: /*
172: * Store information needed to contact our base driver
173: */
174: sd->sc_link = sc_link;
175: sc_link->device = &sd_switch;
176: sc_link->device_softc = sd;
177:
178: /*
179: * Initialize and attach the disk structure.
180: */
181: sd->sc_dk.dk_driver = &sddkdriver;
182: sd->sc_dk.dk_name = sd->sc_dev.dv_xname;
183: disk_attach(&sd->sc_dk);
184:
185: if ((sc_link->flags & SDEV_ATAPI) && (sc_link->flags & SDEV_REMOVABLE))
186: sc_link->quirks |= SDEV_NOSYNCCACHE;
187:
188: if (!(sc_link->inqdata.flags & SID_RelAdr))
189: sc_link->quirks |= SDEV_ONLYBIG;
190:
191: /*
192: * Note if this device is ancient. This is used in sdminphys().
193: */
194: if (!(sc_link->flags & SDEV_ATAPI) &&
195: SCSISPC(sa->sa_inqbuf->version) == 0)
196: sd->flags |= SDF_ANCIENT;
197:
198: /*
199: * Use the subdriver to request information regarding
200: * the drive. We cannot use interrupts yet, so the
201: * request must specify this.
202: */
203: printf("\n");
204:
205: timeout_set(&sd->sc_timeout, sdrestart, sd);
206:
207: /* Spin up non-UMASS devices ready or not. */
208: if ((sd->sc_link->flags & SDEV_UMASS) == 0)
209: scsi_start(sc_link, SSS_START, scsi_autoconf | SCSI_SILENT |
210: SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);
211:
212: /* Check that it is still responding and ok. */
213: error = scsi_test_unit_ready(sd->sc_link, TEST_READY_RETRIES,
214: scsi_autoconf | SCSI_IGNORE_ILLEGAL_REQUEST |
215: SCSI_IGNORE_MEDIA_CHANGE | SCSI_SILENT);
216:
217: if (error)
218: result = SDGP_RESULT_OFFLINE;
219: else
220: result = sd_get_parms(sd, &sd->params,
221: scsi_autoconf | SCSI_SILENT | SCSI_IGNORE_MEDIA_CHANGE);
222:
223: printf("%s: ", sd->sc_dev.dv_xname);
224: switch (result) {
225: case SDGP_RESULT_OK:
226: printf("%lldMB, %lu cyl, %lu head, %lu sec, %lu bytes/sec, %lld sec total",
227: dp->disksize / (1048576 / dp->blksize), dp->cyls,
228: dp->heads, dp->sectors, dp->blksize, dp->disksize);
229: break;
230:
231: case SDGP_RESULT_OFFLINE:
232: printf("drive offline");
233: break;
234:
235: #ifdef DIAGNOSTIC
236: default:
237: panic("sdattach: unknown result (%#x) from get_parms", result);
238: break;
239: #endif
240: }
241: printf("\n");
242:
243: /*
244: * Establish a shutdown hook so that we can ensure that
245: * our data has actually made it onto the platter at
246: * shutdown time. Note that this relies on the fact
247: * that the shutdown hook code puts us at the head of
248: * the list (thus guaranteeing that our hook runs before
249: * our ancestors').
250: */
251: if ((sd->sc_sdhook =
252: shutdownhook_establish(sd_shutdown, sd)) == NULL)
253: printf("%s: WARNING: unable to establish shutdown hook\n",
254: sd->sc_dev.dv_xname);
255: }
256:
257: int
258: sdactivate(struct device *self, enum devact act)
259: {
260: int rv = 0;
261:
262: switch (act) {
263: case DVACT_ACTIVATE:
264: break;
265:
266: case DVACT_DEACTIVATE:
267: /*
268: * Nothing to do; we key off the device's DVF_ACTIVATE.
269: */
270: break;
271: }
272:
273: return (rv);
274: }
275:
276:
277: int
278: sddetach(struct device *self, int flags)
279: {
280: struct sd_softc *sd = (struct sd_softc *)self;
281: int bmaj, cmaj, mn;
282:
283: sd_kill_buffers(sd);
284:
285: /* Locate the lowest minor number to be detached. */
286: mn = DISKMINOR(self->dv_unit, 0);
287:
288: for (bmaj = 0; bmaj < nblkdev; bmaj++)
289: if (bdevsw[bmaj].d_open == sdopen)
290: vdevgone(bmaj, mn, mn + MAXPARTITIONS - 1, VBLK);
291: for (cmaj = 0; cmaj < nchrdev; cmaj++)
292: if (cdevsw[cmaj].d_open == sdopen)
293: vdevgone(cmaj, mn, mn + MAXPARTITIONS - 1, VCHR);
294:
295: /* Get rid of the shutdown hook. */
296: if (sd->sc_sdhook != NULL)
297: shutdownhook_disestablish(sd->sc_sdhook);
298:
299: /* Detach disk. */
300: disk_detach(&sd->sc_dk);
301:
302: return (0);
303: }
304:
305: /*
306: * Open the device. Make sure the partition info is as up-to-date as can be.
307: */
308: int
309: sdopen(dev_t dev, int flag, int fmt, struct proc *p)
310: {
311: struct scsi_link *sc_link;
312: struct sd_softc *sd;
313: int error = 0, part, rawopen, unit;
314:
315: unit = DISKUNIT(dev);
316: part = DISKPART(dev);
317:
318: rawopen = (part == RAW_PART) && (fmt == S_IFCHR);
319:
320: sd = sdlookup(unit);
321: if (sd == NULL)
322: return (ENXIO);
323:
324: sc_link = sd->sc_link;
325: SC_DEBUG(sc_link, SDEV_DB1,
326: ("sdopen: dev=0x%x (unit %d (of %d), partition %d)\n", dev, unit,
327: sd_cd.cd_ndevs, part));
328:
329: if ((error = sdlock(sd)) != 0) {
330: device_unref(&sd->sc_dev);
331: return (error);
332: }
333:
334: if (sd->sc_dk.dk_openmask != 0) {
335: /*
336: * If any partition is open, but the disk has been invalidated,
337: * disallow further opens of non-raw partition.
338: */
339: if ((sc_link->flags & SDEV_MEDIA_LOADED) == 0) {
340: if (rawopen)
341: goto out;
342: error = EIO;
343: goto bad;
344: }
345: } else {
346: /* Spin up non-UMASS devices ready or not. */
347: if ((sd->sc_link->flags & SDEV_UMASS) == 0)
348: scsi_start(sc_link, SSS_START, (rawopen ? SCSI_SILENT :
349: 0) | SCSI_IGNORE_ILLEGAL_REQUEST |
350: SCSI_IGNORE_MEDIA_CHANGE);
351:
352: /* Use sd_interpret_sense() for sense errors.
353: *
354: * But only after spinning the disk up! Just in case a broken
355: * device returns "Initialization command required." and causes
356: * a loop of scsi_start() calls.
357: */
358: sc_link->flags |= SDEV_OPEN;
359:
360: /* Check that it is still responding and ok. */
361: error = scsi_test_unit_ready(sc_link,
362: TEST_READY_RETRIES, (rawopen ? SCSI_SILENT : 0) |
363: SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_IGNORE_MEDIA_CHANGE);
364:
365: if (error) {
366: if (rawopen) {
367: error = 0;
368: goto out;
369: } else
370: goto bad;
371: }
372:
373: /*
374: * Try to prevent the unloading of a removable device while
375: * it's open. But allow the open to proceed if the device can't
376: * be locked in.
377: */
378: if ((sc_link->flags & SDEV_REMOVABLE) != 0)
379: scsi_prevent(sc_link, PR_PREVENT,
380: SCSI_IGNORE_ILLEGAL_REQUEST |
381: SCSI_IGNORE_MEDIA_CHANGE);
382:
383: /* Load the physical device parameters. */
384: sc_link->flags |= SDEV_MEDIA_LOADED;
385: if (sd_get_parms(sd, &sd->params, (rawopen ? SCSI_SILENT : 0))
386: == SDGP_RESULT_OFFLINE) {
387: sc_link->flags &= ~SDEV_MEDIA_LOADED;
388: error = ENXIO;
389: goto bad;
390: }
391: SC_DEBUG(sc_link, SDEV_DB3, ("Params loaded\n"));
392:
393: /* Load the partition info if not already loaded. */
394: sdgetdisklabel(dev, sd, sd->sc_dk.dk_label, 0);
395: SC_DEBUG(sc_link, SDEV_DB3, ("Disklabel loaded\n"));
396: }
397:
398: /* Check that the partition exists. */
399: if (part != RAW_PART &&
400: (part >= sd->sc_dk.dk_label->d_npartitions ||
401: sd->sc_dk.dk_label->d_partitions[part].p_fstype == FS_UNUSED)) {
402: error = ENXIO;
403: goto bad;
404: }
405:
406: out: /* Insure only one open at a time. */
407: switch (fmt) {
408: case S_IFCHR:
409: sd->sc_dk.dk_copenmask |= (1 << part);
410: break;
411: case S_IFBLK:
412: sd->sc_dk.dk_bopenmask |= (1 << part);
413: break;
414: }
415: sd->sc_dk.dk_openmask = sd->sc_dk.dk_copenmask | sd->sc_dk.dk_bopenmask;
416: SC_DEBUG(sc_link, SDEV_DB3, ("open complete\n"));
417:
418: /* It's OK to fall through because dk_openmask is now non-zero. */
419: bad:
420: if (sd->sc_dk.dk_openmask == 0) {
421: if ((sd->sc_link->flags & SDEV_REMOVABLE) != 0)
422: scsi_prevent(sc_link, PR_ALLOW,
423: SCSI_IGNORE_ILLEGAL_REQUEST |
424: SCSI_IGNORE_MEDIA_CHANGE);
425: sc_link->flags &= ~(SDEV_OPEN | SDEV_MEDIA_LOADED);
426: }
427:
428: sdunlock(sd);
429: device_unref(&sd->sc_dev);
430: return (error);
431: }
432:
433: /*
434: * Close the device. Only called if we are the last occurrence of an open
435: * device. Convenient now but usually a pain.
436: */
437: int
438: sdclose(dev_t dev, int flag, int fmt, struct proc *p)
439: {
440: struct sd_softc *sd;
441: int part = DISKPART(dev);
442: int error;
443:
444: sd = sdlookup(DISKUNIT(dev));
445: if (sd == NULL)
446: return ENXIO;
447:
448: if ((error = sdlock(sd)) != 0) {
449: device_unref(&sd->sc_dev);
450: return (error);
451: }
452:
453: switch (fmt) {
454: case S_IFCHR:
455: sd->sc_dk.dk_copenmask &= ~(1 << part);
456: break;
457: case S_IFBLK:
458: sd->sc_dk.dk_bopenmask &= ~(1 << part);
459: break;
460: }
461: sd->sc_dk.dk_openmask = sd->sc_dk.dk_copenmask | sd->sc_dk.dk_bopenmask;
462:
463: if (sd->sc_dk.dk_openmask == 0) {
464: if ((sd->flags & SDF_DIRTY) != 0)
465: sd_flush(sd, 0);
466:
467: if ((sd->sc_link->flags & SDEV_REMOVABLE) != 0)
468: scsi_prevent(sd->sc_link, PR_ALLOW,
469: SCSI_IGNORE_ILLEGAL_REQUEST |
470: SCSI_IGNORE_NOT_READY);
471: sd->sc_link->flags &= ~(SDEV_OPEN | SDEV_MEDIA_LOADED);
472:
473: if (sd->sc_link->flags & SDEV_EJECTING) {
474: scsi_start(sd->sc_link, SSS_STOP|SSS_LOEJ, 0);
475: sd->sc_link->flags &= ~SDEV_EJECTING;
476: }
477:
478: timeout_del(&sd->sc_timeout);
479: }
480:
481: sdunlock(sd);
482: device_unref(&sd->sc_dev);
483: return 0;
484: }
485:
486: /*
487: * Actually translate the requested transfer into one the physical driver
488: * can understand. The transfer is described by a buf and will include
489: * only one physical transfer.
490: */
491: void
492: sdstrategy(struct buf *bp)
493: {
494: struct sd_softc *sd;
495: int s;
496:
497: sd = sdlookup(DISKUNIT(bp->b_dev));
498: if (sd == NULL) {
499: bp->b_error = ENXIO;
500: goto bad;
501: }
502:
503: SC_DEBUG(sd->sc_link, SDEV_DB2, ("sdstrategy: %ld bytes @ blk %d\n",
504: bp->b_bcount, bp->b_blkno));
505: /*
506: * If the device has been made invalid, error out
507: */
508: if ((sd->sc_link->flags & SDEV_MEDIA_LOADED) == 0) {
509: if (sd->sc_link->flags & SDEV_OPEN)
510: bp->b_error = EIO;
511: else
512: bp->b_error = ENODEV;
513: goto bad;
514: }
515: /*
516: * If it's a null transfer, return immediately
517: */
518: if (bp->b_bcount == 0)
519: goto done;
520:
521: /*
522: * The transfer must be a whole number of sectors.
523: */
524: if ((bp->b_bcount % sd->sc_dk.dk_label->d_secsize) != 0) {
525: bp->b_error = EINVAL;
526: goto bad;
527: }
528: /*
529: * Do bounds checking, adjust transfer. if error, process.
530: * If end of partition, just return.
531: */
532: if (DISKPART(bp->b_dev) != RAW_PART &&
533: bounds_check_with_label(bp, sd->sc_dk.dk_label,
534: (sd->flags & (SDF_WLABEL|SDF_LABELLING)) != 0) <= 0)
535: goto done;
536:
537: s = splbio();
538:
539: /*
540: * Place it in the queue of disk activities for this disk
541: */
542: disksort(&sd->buf_queue, bp);
543:
544: /*
545: * Tell the device to get going on the transfer if it's
546: * not doing anything, otherwise just wait for completion
547: */
548: sdstart(sd);
549:
550: splx(s);
551:
552: device_unref(&sd->sc_dev);
553: return;
554:
555: bad:
556: bp->b_flags |= B_ERROR;
557: done:
558: /*
559: * Correctly set the buf to indicate a completed xfer
560: */
561: bp->b_resid = bp->b_bcount;
562: s = splbio();
563: biodone(bp);
564: splx(s);
565: if (sd != NULL)
566: device_unref(&sd->sc_dev);
567: }
568:
569: /*
570: * sdstart looks to see if there is a buf waiting for the device
571: * and that the device is not already busy. If both are true,
572: * It dequeues the buf and creates a scsi command to perform the
573: * transfer in the buf. The transfer request will call scsi_done
574: * on completion, which will in turn call this routine again
575: * so that the next queued transfer is performed.
576: * The bufs are queued by the strategy routine (sdstrategy)
577: *
578: * This routine is also called after other non-queued requests
579: * have been made of the scsi driver, to ensure that the queue
580: * continues to be drained.
581: *
582: * must be called at the correct (highish) spl level
583: * sdstart() is called at splbio from sdstrategy, sdrestart and scsi_done
584: */
585: void
586: sdstart(void *v)
587: {
588: struct sd_softc *sd = (struct sd_softc *)v;
589: struct scsi_link *sc_link = sd->sc_link;
590: struct buf *bp = 0;
591: struct buf *dp;
592: struct scsi_rw_big cmd_big;
593: struct scsi_rw_12 cmd_12;
594: struct scsi_rw_16 cmd_16;
595: struct scsi_rw cmd_small;
596: struct scsi_generic *cmdp;
597: daddr64_t blkno;
598: int nblks, cmdlen, error;
599: struct partition *p;
600:
601: SC_DEBUG(sc_link, SDEV_DB2, ("sdstart\n"));
602:
603: splassert(IPL_BIO);
604:
605: /*
606: * Check if the device has room for another command
607: */
608: while (sc_link->openings > 0) {
609: /*
610: * there is excess capacity, but a special waits
611: * It'll need the adapter as soon as we clear out of the
612: * way and let it run (user level wait).
613: */
614: if (sc_link->flags & SDEV_WAITING) {
615: sc_link->flags &= ~SDEV_WAITING;
616: wakeup((caddr_t)sc_link);
617: return;
618: }
619:
620: /*
621: * See if there is a buf with work for us to do..
622: */
623: dp = &sd->buf_queue;
624: if ((bp = dp->b_actf) == NULL) /* yes, an assign */
625: return;
626: dp->b_actf = bp->b_actf;
627:
628: /*
629: * If the device has become invalid, abort all the
630: * reads and writes until all files have been closed and
631: * re-opened
632: */
633: if ((sc_link->flags & SDEV_MEDIA_LOADED) == 0) {
634: bp->b_error = EIO;
635: bp->b_flags |= B_ERROR;
636: bp->b_resid = bp->b_bcount;
637: biodone(bp);
638: continue;
639: }
640:
641: /*
642: * We have a buf, now we should make a command
643: *
644: * First, translate the block to absolute and put it in terms
645: * of the logical blocksize of the device.
646: */
647: blkno =
648: bp->b_blkno / (sd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
649: p = &sd->sc_dk.dk_label->d_partitions[DISKPART(bp->b_dev)];
650: blkno += DL_GETPOFFSET(p);
651: nblks = howmany(bp->b_bcount, sd->sc_dk.dk_label->d_secsize);
652:
653: /*
654: * Fill out the scsi command. If the transfer will
655: * fit in a "small" cdb, use it.
656: */
657: if (!(sc_link->flags & SDEV_ATAPI) &&
658: !(sc_link->quirks & SDEV_ONLYBIG) &&
659: ((blkno & 0x1fffff) == blkno) &&
660: ((nblks & 0xff) == nblks)) {
661: /*
662: * We can fit in a 6 byte cdb.
663: */
664: bzero(&cmd_small, sizeof(cmd_small));
665: cmd_small.opcode = (bp->b_flags & B_READ) ?
666: READ_COMMAND : WRITE_COMMAND;
667: _lto3b(blkno, cmd_small.addr);
668: cmd_small.length = nblks;
669: cmdlen = sizeof(cmd_small);
670: cmdp = (struct scsi_generic *)&cmd_small;
671: } else if (((blkno & 0xffffffff) == blkno) &&
672: ((nblks & 0xffff) == nblks)) {
673: /*
674: * We can fit in a 10 byte cdb.
675: */
676: bzero(&cmd_big, sizeof(cmd_big));
677: cmd_big.opcode = (bp->b_flags & B_READ) ?
678: READ_BIG : WRITE_BIG;
679: _lto4b(blkno, cmd_big.addr);
680: _lto2b(nblks, cmd_big.length);
681: cmdlen = sizeof(cmd_big);
682: cmdp = (struct scsi_generic *)&cmd_big;
683: } else if (((blkno & 0xffffffff) == blkno) &&
684: ((nblks & 0xffffffff) == nblks)) {
685: /*
686: * We can fit in a 12 byte cdb.
687: */
688: bzero(&cmd_12, sizeof(cmd_12));
689: cmd_12.opcode = (bp->b_flags & B_READ) ?
690: READ_12 : WRITE_12;
691: _lto4b(blkno, cmd_12.addr);
692: _lto4b(nblks, cmd_12.length);
693: cmdlen = sizeof(cmd_12);
694: cmdp = (struct scsi_generic *)&cmd_12;
695: } else {
696: /*
697: * Need a 16 byte cdb. There's nothing bigger.
698: */
699: bzero(&cmd_16, sizeof(cmd_16));
700: cmd_16.opcode = (bp->b_flags & B_READ) ?
701: READ_16 : WRITE_16;
702: _lto8b(blkno, cmd_16.addr);
703: _lto4b(nblks, cmd_16.length);
704: cmdlen = sizeof(cmd_16);
705: cmdp = (struct scsi_generic *)&cmd_16;
706: }
707:
708: /* Instrumentation. */
709: disk_busy(&sd->sc_dk);
710:
711: /*
712: * Call the routine that chats with the adapter.
713: * Note: we cannot sleep as we may be an interrupt
714: */
715: error = scsi_scsi_cmd(sc_link, cmdp, cmdlen,
716: (u_char *)bp->b_data, bp->b_bcount,
717: SDRETRIES, 60000, bp, SCSI_NOSLEEP |
718: ((bp->b_flags & B_READ) ? SCSI_DATA_IN : SCSI_DATA_OUT));
719: switch (error) {
720: case 0:
721: /*
722: * Mark the disk dirty so that the cache will be
723: * flushed on close.
724: */
725: if ((bp->b_flags & B_READ) == 0)
726: sd->flags |= SDF_DIRTY;
727: timeout_del(&sd->sc_timeout);
728: break;
729: case EAGAIN:
730: /*
731: * The device can't start another i/o. Try again later.
732: */
733: dp->b_actf = bp;
734: disk_unbusy(&sd->sc_dk, 0, 0);
735: timeout_add(&sd->sc_timeout, 1);
736: return;
737: default:
738: disk_unbusy(&sd->sc_dk, 0, 0);
739: printf("%s: not queued, error %d\n",
740: sd->sc_dev.dv_xname, error);
741: break;
742: }
743: }
744: }
745:
746: void
747: sdrestart(void *v)
748: {
749: int s;
750:
751: s = splbio();
752: sdstart(v);
753: splx(s);
754: }
755:
756: void
757: sddone(struct scsi_xfer *xs)
758: {
759: struct sd_softc *sd = xs->sc_link->device_softc;
760:
761: if (sd->flags & SDF_FLUSHING) {
762: /* Flush completed, no longer dirty. */
763: sd->flags &= ~(SDF_FLUSHING|SDF_DIRTY);
764: }
765:
766: if (xs->bp != NULL)
767: disk_unbusy(&sd->sc_dk, (xs->bp->b_bcount - xs->bp->b_resid),
768: (xs->bp->b_flags & B_READ));
769: }
770:
771: void
772: sdminphys(struct buf *bp)
773: {
774: struct sd_softc *sd;
775: long max;
776:
777: sd = sdlookup(DISKUNIT(bp->b_dev));
778: if (sd == NULL)
779: return; /* XXX - right way to fail this? */
780:
781: /*
782: * If the device is ancient, we want to make sure that
783: * the transfer fits into a 6-byte cdb.
784: *
785: * XXX Note that the SCSI-I spec says that 256-block transfers
786: * are allowed in a 6-byte read/write, and are specified
787: * by setting the "length" to 0. However, we're conservative
788: * here, allowing only 255-block transfers in case an
789: * ancient device gets confused by length == 0. A length of 0
790: * in a 10-byte read/write actually means 0 blocks.
791: */
792: if (sd->flags & SDF_ANCIENT) {
793: max = sd->sc_dk.dk_label->d_secsize * 0xff;
794:
795: if (bp->b_bcount > max)
796: bp->b_bcount = max;
797: }
798:
799: (*sd->sc_link->adapter->scsi_minphys)(bp);
800:
801: device_unref(&sd->sc_dev);
802: }
803:
804: int
805: sdread(dev_t dev, struct uio *uio, int ioflag)
806: {
807: return (physio(sdstrategy, NULL, dev, B_READ, sdminphys, uio));
808: }
809:
810: int
811: sdwrite(dev_t dev, struct uio *uio, int ioflag)
812: {
813: return (physio(sdstrategy, NULL, dev, B_WRITE, sdminphys, uio));
814: }
815:
816: /*
817: * Perform special action on behalf of the user
818: * Knows about the internals of this device
819: */
820: int
821: sdioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p)
822: {
823: struct sd_softc *sd;
824: struct disklabel *lp;
825: int error = 0;
826: int part = DISKPART(dev);
827:
828: sd = sdlookup(DISKUNIT(dev));
829: if (sd == NULL)
830: return ENXIO;
831:
832: SC_DEBUG(sd->sc_link, SDEV_DB2, ("sdioctl 0x%lx\n", cmd));
833:
834: /*
835: * If the device is not valid.. abandon ship
836: */
837: if ((sd->sc_link->flags & SDEV_MEDIA_LOADED) == 0) {
838: switch (cmd) {
839: case DIOCWLABEL:
840: case DIOCLOCK:
841: case DIOCEJECT:
842: case SCIOCIDENTIFY:
843: case SCIOCCOMMAND:
844: case SCIOCDEBUG:
845: if (part == RAW_PART)
846: break;
847: /* FALLTHROUGH */
848: default:
849: if ((sd->sc_link->flags & SDEV_OPEN) == 0) {
850: error = ENODEV;
851: goto exit;
852: } else {
853: error = EIO;
854: goto exit;
855: }
856: }
857: }
858:
859: switch (cmd) {
860: case DIOCRLDINFO:
861: lp = malloc(sizeof(*lp), M_TEMP, M_WAITOK);
862: sdgetdisklabel(dev, sd, lp, 0);
863: bcopy(lp, sd->sc_dk.dk_label, sizeof(*lp));
864: free(lp, M_TEMP);
865: goto exit;
866: case DIOCGPDINFO:
867: sdgetdisklabel(dev, sd, (struct disklabel *)addr, 1);
868: goto exit;
869:
870: case DIOCGDINFO:
871: *(struct disklabel *)addr = *(sd->sc_dk.dk_label);
872: goto exit;
873:
874: case DIOCGPART:
875: ((struct partinfo *)addr)->disklab = sd->sc_dk.dk_label;
876: ((struct partinfo *)addr)->part =
877: &sd->sc_dk.dk_label->d_partitions[DISKPART(dev)];
878: goto exit;
879:
880: case DIOCWDINFO:
881: case DIOCSDINFO:
882: if ((flag & FWRITE) == 0) {
883: error = EBADF;
884: goto exit;
885: }
886:
887: if ((error = sdlock(sd)) != 0)
888: goto exit;
889: sd->flags |= SDF_LABELLING;
890:
891: error = setdisklabel(sd->sc_dk.dk_label,
892: (struct disklabel *)addr, /*sd->sc_dk.dk_openmask : */0);
893: if (error == 0) {
894: if (cmd == DIOCWDINFO)
895: error = writedisklabel(DISKLABELDEV(dev),
896: sdstrategy, sd->sc_dk.dk_label);
897: }
898:
899: sd->flags &= ~SDF_LABELLING;
900: sdunlock(sd);
901: goto exit;
902:
903: case DIOCWLABEL:
904: if ((flag & FWRITE) == 0) {
905: error = EBADF;
906: goto exit;
907: }
908: if (*(int *)addr)
909: sd->flags |= SDF_WLABEL;
910: else
911: sd->flags &= ~SDF_WLABEL;
912: goto exit;
913:
914: case DIOCLOCK:
915: error = scsi_prevent(sd->sc_link,
916: (*(int *)addr) ? PR_PREVENT : PR_ALLOW, 0);
917: goto exit;
918:
919: case MTIOCTOP:
920: if (((struct mtop *)addr)->mt_op != MTOFFL) {
921: error = EIO;
922: goto exit;
923: }
924: /* FALLTHROUGH */
925: case DIOCEJECT:
926: if ((sd->sc_link->flags & SDEV_REMOVABLE) == 0) {
927: error = ENOTTY;
928: goto exit;
929: }
930: sd->sc_link->flags |= SDEV_EJECTING;
931: goto exit;
932:
933: case DIOCINQ:
934: error = scsi_do_ioctl(sd->sc_link, dev, cmd, addr, flag, p);
935: if (error == ENOTTY)
936: error = sd_ioctl_inquiry(sd,
937: (struct dk_inquiry *)addr);
938: goto exit;
939:
940: default:
941: if (part != RAW_PART) {
942: error = ENOTTY;
943: goto exit;
944: }
945: error = scsi_do_ioctl(sd->sc_link, dev, cmd, addr, flag, p);
946: }
947:
948: exit:
949: device_unref(&sd->sc_dev);
950: return (error);
951: }
952:
953: int
954: sd_ioctl_inquiry(struct sd_softc *sd, struct dk_inquiry *di)
955: {
956: struct scsi_inquiry_vpd vpd;
957:
958: bzero(di, sizeof(struct dk_inquiry));
959: scsi_strvis(di->vendor, sd->sc_link->inqdata.vendor,
960: sizeof(sd->sc_link->inqdata.vendor));
961: scsi_strvis(di->product, sd->sc_link->inqdata.product,
962: sizeof(sd->sc_link->inqdata.product));
963: scsi_strvis(di->revision, sd->sc_link->inqdata.revision,
964: sizeof(sd->sc_link->inqdata.revision));
965:
966: /* the serial vpd page is optional */
967: if (scsi_inquire_vpd(sd->sc_link, &vpd, sizeof(vpd),
968: SI_PG_SERIAL, 0) == 0)
969: scsi_strvis(di->serial, vpd.serial, sizeof(vpd.serial));
970:
971: return (0);
972: }
973:
974: /*
975: * Load the label information on the named device
976: */
977: void
978: sdgetdisklabel(dev_t dev, struct sd_softc *sd, struct disklabel *lp,
979: int spoofonly)
980: {
981: size_t len;
982: char *errstring, packname[sizeof(lp->d_packname) + 1];
983: char product[17], vendor[9];
984:
985: bzero(lp, sizeof(struct disklabel));
986:
987: lp->d_secsize = sd->params.blksize;
988: lp->d_ntracks = sd->params.heads;
989: lp->d_nsectors = sd->params.sectors;
990: lp->d_ncylinders = sd->params.cyls;
991: lp->d_secpercyl = lp->d_ntracks * lp->d_nsectors;
992: if (lp->d_secpercyl == 0) {
993: lp->d_secpercyl = 100;
994: /* as long as it's not 0 - readdisklabel divides by it */
995: }
996:
997: lp->d_type = DTYPE_SCSI;
998: if ((sd->sc_link->inqdata.device & SID_TYPE) == T_OPTICAL)
999: strncpy(lp->d_typename, "SCSI optical",
1000: sizeof(lp->d_typename));
1001: else
1002: strncpy(lp->d_typename, "SCSI disk",
1003: sizeof(lp->d_typename));
1004:
1005: /*
1006: * Try to fit '<vendor> <product>' into d_packname. If that doesn't fit
1007: * then leave out '<vendor> ' and use only as much of '<product>' as
1008: * does fit.
1009: */
1010: viscpy(vendor, sd->sc_link->inqdata.vendor, 8);
1011: viscpy(product, sd->sc_link->inqdata.product, 16);
1012: len = snprintf(packname, sizeof(packname), "%s %s", vendor, product);
1013: if (len > sizeof(lp->d_packname)) {
1014: strlcpy(packname, product, sizeof(packname));
1015: len = strlen(packname);
1016: }
1017: /*
1018: * It is safe to use len as the count of characters to copy because
1019: * packname is sizeof(lp->d_packname)+1, the string in packname is
1020: * always null terminated and len does not count the terminating null.
1021: * d_packname is not a null terminated string.
1022: */
1023: bcopy(packname, lp->d_packname, len);
1024:
1025: DL_SETDSIZE(lp, sd->params.disksize);
1026: lp->d_rpm = sd->params.rot_rate;
1027: lp->d_interleave = 1;
1028: lp->d_version = 1;
1029: lp->d_flags = 0;
1030:
1031: /* XXX - these values for BBSIZE and SBSIZE assume ffs */
1032: lp->d_bbsize = BBSIZE;
1033: lp->d_sbsize = SBSIZE;
1034:
1035: lp->d_magic = DISKMAGIC;
1036: lp->d_magic2 = DISKMAGIC;
1037: lp->d_checksum = dkcksum(lp);
1038:
1039: /*
1040: * Call the generic disklabel extraction routine
1041: */
1042: errstring = readdisklabel(DISKLABELDEV(dev), sdstrategy, lp, spoofonly);
1043: if (errstring) {
1044: /*printf("%s: %s\n", sd->sc_dev.dv_xname, errstring);*/
1045: }
1046: }
1047:
1048:
1049: void
1050: sd_shutdown(void *arg)
1051: {
1052: struct sd_softc *sd = (struct sd_softc *)arg;
1053:
1054: /*
1055: * If the disk cache needs to be flushed, and the disk supports
1056: * it, flush it. We're cold at this point, so we poll for
1057: * completion.
1058: */
1059: if ((sd->flags & SDF_DIRTY) != 0)
1060: sd_flush(sd, SCSI_AUTOCONF);
1061:
1062: timeout_del(&sd->sc_timeout);
1063: }
1064:
1065: /*
1066: * Tell the device to map out a defective block
1067: */
1068: int
1069: sd_reassign_blocks(struct sd_softc *sd, u_long blkno)
1070: {
1071: struct scsi_reassign_blocks scsi_cmd;
1072: struct scsi_reassign_blocks_data rbdata;
1073:
1074: bzero(&scsi_cmd, sizeof(scsi_cmd));
1075: bzero(&rbdata, sizeof(rbdata));
1076: scsi_cmd.opcode = REASSIGN_BLOCKS;
1077:
1078: _lto2b(sizeof(rbdata.defect_descriptor[0]), rbdata.length);
1079: _lto4b(blkno, rbdata.defect_descriptor[0].dlbaddr);
1080:
1081: return scsi_scsi_cmd(sd->sc_link, (struct scsi_generic *)&scsi_cmd,
1082: sizeof(scsi_cmd), (u_char *)&rbdata, sizeof(rbdata), SDRETRIES,
1083: 5000, NULL, SCSI_DATA_OUT);
1084: }
1085:
1086: /*
1087: * Check Errors
1088: */
1089: int
1090: sd_interpret_sense(struct scsi_xfer *xs)
1091: {
1092: struct scsi_sense_data *sense = &xs->sense;
1093: struct scsi_link *sc_link = xs->sc_link;
1094: struct sd_softc *sd = sc_link->device_softc;
1095: u_int8_t serr = sense->error_code & SSD_ERRCODE;
1096: int retval;
1097:
1098: /*
1099: * Let the generic code handle everything except a few categories of
1100: * LUN not ready errors on open devices.
1101: */
1102: if (((sc_link->flags & SDEV_OPEN) == 0) ||
1103: (serr != SSD_ERRCODE_CURRENT && serr != SSD_ERRCODE_DEFERRED) ||
1104: ((sense->flags & SSD_KEY) != SKEY_NOT_READY) ||
1105: (sense->extra_len < 6))
1106: return (EJUSTRETURN);
1107:
1108: switch (ASC_ASCQ(sense)) {
1109: case SENSE_NOT_READY_BECOMING_READY:
1110: SC_DEBUG(sc_link, SDEV_DB1, ("becoming ready.\n"));
1111: retval = scsi_delay(xs, 5);
1112: break;
1113:
1114: case SENSE_NOT_READY_INIT_REQUIRED:
1115: SC_DEBUG(sc_link, SDEV_DB1, ("spinning up\n"));
1116: retval = scsi_start(sd->sc_link, SSS_START,
1117: SCSI_IGNORE_ILLEGAL_REQUEST | SCSI_URGENT | SCSI_NOSLEEP);
1118: if (retval == 0)
1119: retval = ERESTART;
1120: else
1121: SC_DEBUG(sc_link, SDEV_DB1, ("spin up failed (%#x)\n",
1122: retval));
1123: break;
1124:
1125: default:
1126: retval = EJUSTRETURN;
1127: break;
1128: }
1129:
1130: return (retval);
1131: }
1132:
1133: daddr64_t
1134: sdsize(dev_t dev)
1135: {
1136: struct sd_softc *sd;
1137: int part, omask;
1138: int64_t size;
1139:
1140: sd = sdlookup(DISKUNIT(dev));
1141: if (sd == NULL)
1142: return -1;
1143:
1144: part = DISKPART(dev);
1145: omask = sd->sc_dk.dk_openmask & (1 << part);
1146:
1147: if (omask == 0 && sdopen(dev, 0, S_IFBLK, NULL) != 0) {
1148: size = -1;
1149: goto exit;
1150: }
1151: if ((sd->sc_link->flags & SDEV_MEDIA_LOADED) == 0)
1152: size = -1;
1153: else if (sd->sc_dk.dk_label->d_partitions[part].p_fstype != FS_SWAP)
1154: size = -1;
1155: else
1156: size = DL_GETPSIZE(&sd->sc_dk.dk_label->d_partitions[part]) *
1157: (sd->sc_dk.dk_label->d_secsize / DEV_BSIZE);
1158: if (omask == 0 && sdclose(dev, 0, S_IFBLK, NULL) != 0)
1159: size = -1;
1160:
1161: exit:
1162: device_unref(&sd->sc_dev);
1163: return size;
1164: }
1165:
1166: /* #define SD_DUMP_NOT_TRUSTED if you just want to watch */
1167: static struct scsi_xfer sx;
1168: static int sddoingadump;
1169:
1170: /*
1171: * dump all of physical memory into the partition specified, starting
1172: * at offset 'dumplo' into the partition.
1173: */
1174: int
1175: sddump(dev_t dev, daddr64_t blkno, caddr_t va, size_t size)
1176: {
1177: struct sd_softc *sd; /* disk unit to do the I/O */
1178: struct disklabel *lp; /* disk's disklabel */
1179: int unit, part;
1180: int sectorsize; /* size of a disk sector */
1181: daddr64_t nsects; /* number of sectors in partition */
1182: daddr64_t sectoff; /* sector offset of partition */
1183: int totwrt; /* total number of sectors left to write */
1184: int nwrt; /* current number of sectors to write */
1185: struct scsi_rw_big cmd; /* write command */
1186: struct scsi_xfer *xs; /* ... convenience */
1187: int retval;
1188:
1189: /* Check if recursive dump; if so, punt. */
1190: if (sddoingadump)
1191: return EFAULT;
1192:
1193: /* Mark as active early. */
1194: sddoingadump = 1;
1195:
1196: unit = DISKUNIT(dev); /* Decompose unit & partition. */
1197: part = DISKPART(dev);
1198:
1199: /* Check for acceptable drive number. */
1200: if (unit >= sd_cd.cd_ndevs || (sd = sd_cd.cd_devs[unit]) == NULL)
1201: return ENXIO;
1202:
1203: /*
1204: * XXX Can't do this check, since the media might have been
1205: * XXX marked `invalid' by successful unmounting of all
1206: * XXX filesystems.
1207: */
1208: #if 0
1209: /* Make sure it was initialized. */
1210: if ((sd->sc_link->flags & SDEV_MEDIA_LOADED) != SDEV_MEDIA_LOADED)
1211: return ENXIO;
1212: #endif
1213:
1214: /* Convert to disk sectors. Request must be a multiple of size. */
1215: lp = sd->sc_dk.dk_label;
1216: sectorsize = lp->d_secsize;
1217: if ((size % sectorsize) != 0)
1218: return EFAULT;
1219: totwrt = size / sectorsize;
1220: blkno = dbtob(blkno) / sectorsize; /* blkno in DEV_BSIZE units */
1221:
1222: nsects = DL_GETPSIZE(&lp->d_partitions[part]);
1223: sectoff = DL_GETPOFFSET(&lp->d_partitions[part]);
1224:
1225: /* Check transfer bounds against partition size. */
1226: if ((blkno < 0) || ((blkno + totwrt) > nsects))
1227: return EINVAL;
1228:
1229: /* Offset block number to start of partition. */
1230: blkno += sectoff;
1231:
1232: xs = &sx;
1233:
1234: while (totwrt > 0) {
1235: nwrt = totwrt; /* XXX */
1236: #ifndef SD_DUMP_NOT_TRUSTED
1237: /*
1238: * Fill out the scsi command
1239: */
1240: bzero(&cmd, sizeof(cmd));
1241: cmd.opcode = WRITE_BIG;
1242: _lto4b(blkno, cmd.addr);
1243: _lto2b(nwrt, cmd.length);
1244: /*
1245: * Fill out the scsi_xfer structure
1246: * Note: we cannot sleep as we may be an interrupt
1247: * don't use scsi_scsi_cmd() as it may want
1248: * to wait for an xs.
1249: */
1250: bzero(xs, sizeof(sx));
1251: xs->flags |= SCSI_AUTOCONF | SCSI_DATA_OUT;
1252: xs->sc_link = sd->sc_link;
1253: xs->retries = SDRETRIES;
1254: xs->timeout = 10000; /* 10000 millisecs for a disk ! */
1255: xs->cmd = (struct scsi_generic *)&cmd;
1256: xs->cmdlen = sizeof(cmd);
1257: xs->resid = nwrt * sectorsize;
1258: xs->error = XS_NOERROR;
1259: xs->bp = NULL;
1260: xs->data = va;
1261: xs->datalen = nwrt * sectorsize;
1262:
1263: /*
1264: * Pass all this info to the scsi driver.
1265: */
1266: retval = (*(sd->sc_link->adapter->scsi_cmd)) (xs);
1267: if (retval != COMPLETE)
1268: return ENXIO;
1269: #else /* SD_DUMP_NOT_TRUSTED */
1270: /* Let's just talk about this first... */
1271: printf("sd%d: dump addr 0x%x, blk %d\n", unit, va, blkno);
1272: delay(500 * 1000); /* half a second */
1273: #endif /* SD_DUMP_NOT_TRUSTED */
1274:
1275: /* update block count */
1276: totwrt -= nwrt;
1277: blkno += nwrt;
1278: va += sectorsize * nwrt;
1279: }
1280: sddoingadump = 0;
1281: return 0;
1282: }
1283:
1284: /*
1285: * Copy up to len chars from src to dst, ignoring non-printables.
1286: * Must be room for len+1 chars in dst so we can write the NUL.
1287: * Does not assume src is NUL-terminated.
1288: */
1289: void
1290: viscpy(u_char *dst, u_char *src, int len)
1291: {
1292: while (len > 0 && *src != '\0') {
1293: if (*src < 0x20 || *src >= 0x80) {
1294: src++;
1295: continue;
1296: }
1297: *dst++ = *src++;
1298: len--;
1299: }
1300: *dst = '\0';
1301: }
1302:
1303: /*
1304: * Fill out the disk parameter structure. Return SDGP_RESULT_OK if the
1305: * structure is correctly filled in, SDGP_RESULT_OFFLINE otherwise. The caller
1306: * is responsible for clearing the SDEV_MEDIA_LOADED flag if the structure
1307: * cannot be completed.
1308: */
1309: int
1310: sd_get_parms(struct sd_softc *sd, struct disk_parms *dp, int flags)
1311: {
1312: union scsi_mode_sense_buf *buf = NULL;
1313: struct page_rigid_geometry *rigid;
1314: struct page_flex_geometry *flex;
1315: struct page_reduced_geometry *reduced;
1316: u_int32_t heads = 0, sectors = 0, cyls = 0, blksize, ssblksize;
1317: u_int16_t rpm = 0;
1318:
1319: dp->disksize = scsi_size(sd->sc_link, flags, &ssblksize);
1320:
1321: /*
1322: * Many UMASS devices choke when asked about their geometry. Most
1323: * don't have a meaningful geometry anyway, so just fake it if
1324: * scsi_size() worked.
1325: */
1326: if ((sd->sc_link->flags & SDEV_UMASS) && (dp->disksize > 0))
1327: goto validate; /* N.B. buf will be NULL at validate. */
1328:
1329: buf = malloc(sizeof(*buf), M_TEMP, M_NOWAIT);
1330: if (buf == NULL)
1331: goto validate;
1332:
1333: switch (sd->sc_link->inqdata.device & SID_TYPE) {
1334: case T_OPTICAL:
1335: /* No more information needed or available. */
1336: break;
1337:
1338: case T_RDIRECT:
1339: /* T_RDIRECT supports only PAGE_REDUCED_GEOMETRY (6). */
1340: scsi_do_mode_sense(sd->sc_link, PAGE_REDUCED_GEOMETRY, buf,
1341: (void **)&reduced, NULL, NULL, &blksize, sizeof(*reduced),
1342: flags | SCSI_SILENT, NULL);
1343: if (DISK_PGCODE(reduced, PAGE_REDUCED_GEOMETRY)) {
1344: if (dp->disksize == 0)
1345: dp->disksize = _5btol(reduced->sectors);
1346: if (blksize == 0)
1347: blksize = _2btol(reduced->bytes_s);
1348: }
1349: break;
1350:
1351: default:
1352: /*
1353: * NOTE: Some devices leave off the last four bytes of
1354: * PAGE_RIGID_GEOMETRY and PAGE_FLEX_GEOMETRY mode sense pages.
1355: * The only information in those four bytes is RPM information
1356: * so accept the page. The extra bytes will be zero and RPM will
1357: * end up with the default value of 3600.
1358: */
1359: rigid = NULL;
1360: if (((sd->sc_link->flags & SDEV_ATAPI) == 0) ||
1361: ((sd->sc_link->flags & SDEV_REMOVABLE) == 0))
1362: scsi_do_mode_sense(sd->sc_link, PAGE_RIGID_GEOMETRY,
1363: buf, (void **)&rigid, NULL, NULL, &blksize,
1364: sizeof(*rigid) - 4, flags | SCSI_SILENT, NULL);
1365: if (DISK_PGCODE(rigid, PAGE_RIGID_GEOMETRY)) {
1366: heads = rigid->nheads;
1367: cyls = _3btol(rigid->ncyl);
1368: rpm = _2btol(rigid->rpm);
1369: if (heads * cyls > 0)
1370: sectors = dp->disksize / (heads * cyls);
1371: } else {
1372: scsi_do_mode_sense(sd->sc_link, PAGE_FLEX_GEOMETRY,
1373: buf, (void **)&flex, NULL, NULL, &blksize,
1374: sizeof(*flex) - 4, flags | SCSI_SILENT, NULL);
1375: if (DISK_PGCODE(flex, PAGE_FLEX_GEOMETRY)) {
1376: sectors = flex->ph_sec_tr;
1377: heads = flex->nheads;
1378: cyls = _2btol(flex->ncyl);
1379: rpm = _2btol(flex->rpm);
1380: if (blksize == 0)
1381: blksize = _2btol(flex->bytes_s);
1382: if (dp->disksize == 0)
1383: dp->disksize = heads * cyls * sectors;
1384: }
1385: }
1386: break;
1387: }
1388:
1389: validate:
1390: if (buf)
1391: free(buf, M_TEMP);
1392:
1393: if (dp->disksize == 0)
1394: return (SDGP_RESULT_OFFLINE);
1395:
1396: if (ssblksize > 0)
1397: dp->blksize = ssblksize;
1398: else
1399: dp->blksize = (blksize == 0) ? 512 : blksize;
1400:
1401: /*
1402: * Restrict blksize values to powers of two between 512 and 64k.
1403: */
1404: switch (dp->blksize) {
1405: case 0x200: /* == 512, == DEV_BSIZE on all architectures. */
1406: case 0x400:
1407: case 0x800:
1408: case 0x1000:
1409: case 0x2000:
1410: case 0x4000:
1411: case 0x8000:
1412: case 0x10000:
1413: break;
1414: default:
1415: SC_DEBUG(sd->sc_link, SDEV_DB1,
1416: ("sd_get_parms: bad blksize: %#x\n", dp->blksize));
1417: return (SDGP_RESULT_OFFLINE);
1418: }
1419:
1420: /*
1421: * XXX THINK ABOUT THIS!! Using values such that sectors * heads *
1422: * cyls is <= disk_size can lead to wasted space. We need a more
1423: * careful calculation/validation to make everything work out
1424: * optimally.
1425: */
1426: if (dp->disksize > 0xffffffff && (dp->heads * dp->sectors) < 0xffff) {
1427: dp->heads = 511;
1428: dp->sectors = 255;
1429: cyls = 0;
1430: } else {
1431: /*
1432: * Use standard geometry values for anything we still don't
1433: * know.
1434: */
1435: dp->heads = (heads == 0) ? 255 : heads;
1436: dp->sectors = (sectors == 0) ? 63 : sectors;
1437: dp->rot_rate = (rpm == 0) ? 3600 : rpm;
1438: }
1439:
1440: dp->cyls = (cyls == 0) ? dp->disksize / (dp->heads * dp->sectors) :
1441: cyls;
1442:
1443: return (SDGP_RESULT_OK);
1444: }
1445:
1446: void
1447: sd_flush(struct sd_softc *sd, int flags)
1448: {
1449: struct scsi_link *sc_link = sd->sc_link;
1450: struct scsi_synchronize_cache sync_cmd;
1451:
1452: /*
1453: * If the device is SCSI-2, issue a SYNCHRONIZE CACHE.
1454: * We issue with address 0 length 0, which should be
1455: * interpreted by the device as "all remaining blocks
1456: * starting at address 0". We ignore ILLEGAL REQUEST
1457: * in the event that the command is not supported by
1458: * the device, and poll for completion so that we know
1459: * that the cache has actually been flushed.
1460: *
1461: * Unless, that is, the device can't handle the SYNCHRONIZE CACHE
1462: * command, as indicated by our quirks flags.
1463: *
1464: * XXX What about older devices?
1465: */
1466: if (SCSISPC(sc_link->inqdata.version) >= 2 &&
1467: (sc_link->quirks & SDEV_NOSYNCCACHE) == 0) {
1468: bzero(&sync_cmd, sizeof(sync_cmd));
1469: sync_cmd.opcode = SYNCHRONIZE_CACHE;
1470:
1471: if (scsi_scsi_cmd(sc_link,
1472: (struct scsi_generic *)&sync_cmd, sizeof(sync_cmd),
1473: NULL, 0, SDRETRIES, 100000, NULL,
1474: flags|SCSI_IGNORE_ILLEGAL_REQUEST))
1475: printf("%s: WARNING: cache synchronization failed\n",
1476: sd->sc_dev.dv_xname);
1477: else
1478: sd->flags |= SDF_FLUSHING;
1479: }
1480: }
1481:
1482: /*
1483: * Remove unprocessed buffers from queue.
1484: */
1485: void
1486: sd_kill_buffers(struct sd_softc *sd)
1487: {
1488: struct buf *dp, *bp;
1489: int s;
1490:
1491: s = splbio();
1492: for (dp = &sd->buf_queue; (bp = dp->b_actf) != NULL; ) {
1493: dp->b_actf = bp->b_actf;
1494:
1495: bp->b_error = ENXIO;
1496: bp->b_flags |= B_ERROR;
1497: biodone(bp);
1498: }
1499: splx(s);
1500: }
CVSweb