xref: /netbsd-src/sys/dev/scsipi/st.c (revision 3b435a73967be44dfb4a27315acd72bfacde430c)
1 /*	$NetBSD: st.c,v 1.114 1999/09/30 22:57:55 thorpej Exp $ */
2 
3 /*-
4  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Charles M. Hannum.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  * Originally written by Julian Elischer (julian@tfs.com)
41  * for TRW Financial Systems for use under the MACH(2.5) operating system.
42  *
43  * TRW Financial Systems, in accordance with their agreement with Carnegie
44  * Mellon University, makes this software available to CMU to distribute
45  * or use in any manner that they see fit as long as this message is kept with
46  * the software. For this reason TFS also grants any other persons or
47  * organisations permission to use or modify this software.
48  *
49  * TFS supplies this software to be publicly redistributed
50  * on the understanding that TFS is not responsible for the correct
51  * functioning of this software in any circumstances.
52  *
53  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
54  * major changes by Julian Elischer (julian@jules.dialix.oz.au) May 1993
55  *
56  * A lot of rewhacking done by mjacob (mjacob@nas.nasa.gov).
57  */
58 
59 #include "opt_scsi.h"
60 #include "rnd.h"
61 
62 #include <sys/types.h>
63 #include <sys/param.h>
64 #include <sys/systm.h>
65 #include <sys/fcntl.h>
66 #include <sys/errno.h>
67 #include <sys/ioctl.h>
68 #include <sys/malloc.h>
69 #include <sys/buf.h>
70 #include <sys/proc.h>
71 #include <sys/user.h>
72 #include <sys/mtio.h>
73 #include <sys/device.h>
74 #include <sys/conf.h>
75 #if NRND > 0
76 #include <sys/rnd.h>
77 #endif
78 
79 #include <dev/scsipi/scsipi_all.h>
80 #include <dev/scsipi/scsi_all.h>
81 #include <dev/scsipi/scsi_tape.h>
82 #include <dev/scsipi/scsiconf.h>
83 
84 /* Defines for device specific stuff */
85 #define DEF_FIXED_BSIZE  512
86 #define	ST_RETRIES	4	/* only on non IO commands */
87 
88 #define STMODE(z)	( minor(z)       & 0x03)
89 #define STDSTY(z)	((minor(z) >> 2) & 0x03)
90 #define STUNIT(z)	((minor(z) >> 4)       )
91 
92 #define NORMAL_MODE	0
93 #define NOREW_MODE	1
94 #define EJECT_MODE	2
95 #define CTRL_MODE	3
96 
97 #define	FALSE		0
98 #define	TRUE		1
99 
100 #define	ST_IO_TIME	(3 * 60 * 1000)		/* 3 minutes */
101 #define	ST_CTL_TIME	(30 * 1000)		/* 30 seconds */
102 #define	ST_SPC_TIME	(4 * 60 * 60 * 1000)	/* 4 hours */
103 
104 /*
105  * Define various devices that we know mis-behave in some way,
106  * and note how they are bad, so we can correct for them
107  */
108 struct modes {
109 	u_int quirks;			/* same definitions as in quirkdata */
110 	int blksize;
111 	u_int8_t density;
112 };
113 
114 struct quirkdata {
115 	u_int quirks;
116 #define	ST_Q_FORCE_BLKSIZE	0x0001
117 #define	ST_Q_SENSE_HELP		0x0002	/* must do READ for good MODE SENSE */
118 #define	ST_Q_IGNORE_LOADS	0x0004
119 #define	ST_Q_BLKSIZE		0x0008	/* variable-block media_blksize > 0 */
120 #define	ST_Q_UNIMODAL		0x0010	/* unimode drive rejects mode select */
121 	u_int page_0_size;
122 #define	MAX_PAGE_0_SIZE	64
123 	struct modes modes[4];
124 };
125 
126 struct st_quirk_inquiry_pattern {
127 	struct scsipi_inquiry_pattern pattern;
128 	struct quirkdata quirkdata;
129 };
130 
131 struct st_quirk_inquiry_pattern st_quirk_patterns[] = {
132 	{{T_SEQUENTIAL, T_REMOV,
133 	 "        ", "                ", "    "}, {0, 0, {
134 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
135 		{ST_Q_FORCE_BLKSIZE, 512, QIC_24},	/* minor 4-7 */
136 		{ST_Q_FORCE_BLKSIZE, 0, HALFINCH_1600},	/* minor 8-11 */
137 		{ST_Q_FORCE_BLKSIZE, 0, HALFINCH_6250}	/* minor 12-15 */
138 	}}},
139 	{{T_SEQUENTIAL, T_REMOV,
140 	 "TANDBERG", " TDC 3600       ", ""},     {0, 12, {
141 		{0, 0, 0},				/* minor 0-3 */
142 		{ST_Q_FORCE_BLKSIZE, 0, QIC_525},	/* minor 4-7 */
143 		{0, 0, QIC_150},			/* minor 8-11 */
144 		{0, 0, QIC_120}				/* minor 12-15 */
145 	}}},
146  	{{T_SEQUENTIAL, T_REMOV,
147  	 "TANDBERG", " TDC 3800       ", ""},     {0, 0, {
148 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
149 		{0, 0, QIC_525},			/* minor 4-7 */
150 		{0, 0, QIC_150},			/* minor 8-11 */
151 		{0, 0, QIC_120}				/* minor 12-15 */
152 	}}},
153 	/*
154 	 * lacking a manual for the 4200, it's not clear what the
155 	 * specific density codes should be- the device is a 2.5GB
156 	 * capable QIC drive, those density codes aren't readily
157 	 * availabel. The 'default' will just have to do.
158 	 */
159  	{{T_SEQUENTIAL, T_REMOV,
160  	 "TANDBERG", " TDC 4200       ", ""},     {0, 0, {
161 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
162 		{0, 0, QIC_525},			/* minor 4-7 */
163 		{0, 0, QIC_150},			/* minor 8-11 */
164 		{0, 0, QIC_120}				/* minor 12-15 */
165 	}}},
166 	/*
167 	 * At least -005 and -007 need this.  I'll assume they all do unless I
168 	 * hear otherwise.  - mycroft, 31MAR1994
169 	 */
170 	{{T_SEQUENTIAL, T_REMOV,
171 	 "ARCHIVE ", "VIPER 2525 25462", ""},     {0, 0, {
172 		{ST_Q_SENSE_HELP, 0, 0},		/* minor 0-3 */
173 		{ST_Q_SENSE_HELP, 0, QIC_525},		/* minor 4-7 */
174 		{0, 0, QIC_150},			/* minor 8-11 */
175 		{0, 0, QIC_120}				/* minor 12-15 */
176 	}}},
177 	/*
178 	 * One user reports that this works for his tape drive.  It probably
179 	 * needs more work.  - mycroft, 09APR1994
180 	 */
181 	{{T_SEQUENTIAL, T_REMOV,
182 	 "SANKYO  ", "CP525           ", ""},    {0, 0, {
183 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
184 		{ST_Q_FORCE_BLKSIZE, 512, QIC_525},	/* minor 4-7 */
185 		{0, 0, QIC_150},			/* minor 8-11 */
186 		{0, 0, QIC_120}				/* minor 12-15 */
187 	}}},
188 	{{T_SEQUENTIAL, T_REMOV,
189 	 "ANRITSU ", "DMT780          ", ""},     {0, 0, {
190 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
191 		{ST_Q_FORCE_BLKSIZE, 512, QIC_525},	/* minor 4-7 */
192 		{0, 0, QIC_150},			/* minor 8-11 */
193 		{0, 0, QIC_120}				/* minor 12-15 */
194 	}}},
195 	{{T_SEQUENTIAL, T_REMOV,
196 	 "ARCHIVE ", "VIPER 150  21247", ""},     {0, 12, {
197 		{ST_Q_SENSE_HELP, 0, 0},		/* minor 0-3 */
198 		{0, 0, QIC_150},			/* minor 4-7 */
199 		{0, 0, QIC_120},			/* minor 8-11 */
200 		{0, 0, QIC_24}				/* minor 12-15 */
201 	}}},
202 	{{T_SEQUENTIAL, T_REMOV,
203 	 "ARCHIVE ", "VIPER 150  21531", ""},     {0, 12, {
204 		{ST_Q_SENSE_HELP, 0, 0},		/* minor 0-3 */
205 		{0, 0, QIC_150},			/* minor 4-7 */
206 		{0, 0, QIC_120},			/* minor 8-11 */
207 		{0, 0, QIC_24}				/* minor 12-15 */
208 	}}},
209 	{{T_SEQUENTIAL, T_REMOV,
210 	 "WANGTEK ", "5099ES SCSI", ""},          {0, 0, {
211 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
212 		{0, 0, QIC_11},				/* minor 4-7 */
213 		{0, 0, QIC_24},				/* minor 8-11 */
214 		{0, 0, QIC_24}				/* minor 12-15 */
215 	}}},
216 	{{T_SEQUENTIAL, T_REMOV,
217 	 "WANGTEK ", "5150ES SCSI", ""},          {0, 0, {
218 		{ST_Q_FORCE_BLKSIZE, 512, 0},		/* minor 0-3 */
219 		{0, 0, QIC_24},				/* minor 4-7 */
220 		{0, 0, QIC_120},			/* minor 8-11 */
221 		{0, 0, QIC_150}				/* minor 12-15 */
222 	}}},
223 	{{T_SEQUENTIAL, T_REMOV,
224 	 "WANGTEK ", "5525ES SCSI REV7", ""},     {0, 0, {
225 		{0, 0, 0},				/* minor 0-3 */
226 		{ST_Q_BLKSIZE, 0, QIC_525},		/* minor 4-7 */
227 		{0, 0, QIC_150},			/* minor 8-11 */
228 		{0, 0, QIC_120}				/* minor 12-15 */
229 	}}},
230 	{{T_SEQUENTIAL, T_REMOV,
231 	 "WangDAT ", "Model 1300      ", ""},     {0, 0, {
232 		{0, 0, 0},				/* minor 0-3 */
233 		{ST_Q_FORCE_BLKSIZE, 512, DDS},		/* minor 4-7 */
234 		{ST_Q_FORCE_BLKSIZE, 1024, DDS},	/* minor 8-11 */
235 		{ST_Q_FORCE_BLKSIZE, 0, DDS}		/* minor 12-15 */
236 	}}},
237 	{{T_SEQUENTIAL, T_REMOV,
238 	 "EXABYTE ", "EXB-8200        ", "263H"}, {0, 5, {
239 		{0, 0, 0},				/* minor 0-3 */
240 		{0, 0, 0},				/* minor 4-7 */
241 		{0, 0, 0},				/* minor 8-11 */
242 		{0, 0, 0}				/* minor 12-15 */
243 	}}},
244 	{{T_SEQUENTIAL, T_REMOV,
245 	 "STK",      "9490",             ""},
246 				{ST_Q_FORCE_BLKSIZE, 0, {
247 		{0, 0, 0},				/* minor 0-3 */
248 		{0, 0, 0},				/* minor 4-7 */
249 		{0, 0, 0},				/* minor 8-11 */
250 		{0, 0, 0}				/* minor 12-15 */
251 	}}},
252 	{{T_SEQUENTIAL, T_REMOV,
253 	 "STK",      "SD-3",             ""},
254 				{ST_Q_FORCE_BLKSIZE, 0, {
255 		{0, 0, 0},				/* minor 0-3 */
256 		{0, 0, 0},				/* minor 4-7 */
257 		{0, 0, 0},				/* minor 8-11 */
258 		{0, 0, 0}				/* minor 12-15 */
259 	}}},
260 	{{T_SEQUENTIAL, T_REMOV,
261 	 "IBM",      "03590",            ""},     {ST_Q_IGNORE_LOADS, 0, {
262 		{0, 0, 0},				/* minor 0-3 */
263 		{0, 0, 0},				/* minor 4-7 */
264 		{0, 0, 0},				/* minor 8-11 */
265 		{0, 0, 0}				/* minor 12-15 */
266 	}}},
267 	{{T_SEQUENTIAL, T_REMOV,
268 	 "HP      ", "T4000s          ", ""},     {ST_Q_UNIMODAL, 0, {
269 		{0, 0, QIC_3095},			/* minor 0-3 */
270 		{0, 0, QIC_3095},			/* minor 4-7 */
271 		{0, 0, QIC_3095},			/* minor 8-11 */
272 		{0, 0, QIC_3095},			/* minor 12-15 */
273 	}}},
274 #if 0
275 	{{T_SEQUENTIAL, T_REMOV,
276 	 "EXABYTE ", "EXB-8200        ", ""},     {0, 12, {
277 		{0, 0, 0},				/* minor 0-3 */
278 		{0, 0, 0},				/* minor 4-7 */
279 		{0, 0, 0},				/* minor 8-11 */
280 		{0, 0, 0}				/* minor 12-15 */
281 	}}},
282 #endif
283 };
284 
285 #define NOEJECT 0
286 #define EJECT 1
287 
288 struct st_softc {
289 	struct device sc_dev;
290 /*--------------------present operating parameters, flags etc.---------------*/
291 	int flags;		/* see below                         */
292 	u_int quirks;		/* quirks for the open mode          */
293 	int blksize;		/* blksize we are using              */
294 	u_int8_t density;	/* present density                   */
295 	u_int page_0_size;	/* size of page 0 data		     */
296 	u_int last_dsty;	/* last density opened               */
297 	short mt_resid;		/* last (short) resid                */
298 	short mt_erreg;		/* last error (sense key) seen       */
299 /*--------------------device/scsi parameters---------------------------------*/
300 	struct scsipi_link *sc_link;	/* our link to the adpter etc.       */
301 /*--------------------parameters reported by the device ---------------------*/
302 	int blkmin;		/* min blk size                       */
303 	int blkmax;		/* max blk size                       */
304 	struct quirkdata *quirkdata;	/* if we have a rogue entry          */
305 /*--------------------parameters reported by the device for this media-------*/
306 	u_long numblks;		/* nominal blocks capacity            */
307 	int media_blksize;	/* 0 if not ST_FIXEDBLOCKS            */
308 	u_int8_t media_density;	/* this is what it said when asked    */
309 /*--------------------quirks for the whole drive-----------------------------*/
310 	u_int drive_quirks;	/* quirks of this drive               */
311 /*--------------------How we should set up when opening each minor device----*/
312 	struct modes modes[4];	/* plus more for each mode            */
313 	u_int8_t  modeflags[4];	/* flags for the modes                */
314 #define DENSITY_SET_BY_USER	0x01
315 #define DENSITY_SET_BY_QUIRK	0x02
316 #define BLKSIZE_SET_BY_USER	0x04
317 #define BLKSIZE_SET_BY_QUIRK	0x08
318 /*--------------------storage for sense data returned by the drive-----------*/
319 	u_char sense_data[MAX_PAGE_0_SIZE];	/*
320 						 * additional sense data needed
321 						 * for mode sense/select.
322 						 */
323 	struct buf buf_queue;		/* the queue of pending IO */
324 					/* operations */
325 #if NRND > 0
326 	rndsource_element_t	rnd_source;
327 #endif
328 };
329 
330 
331 int	stmatch __P((struct device *, struct cfdata *, void *));
332 void	stattach __P((struct device *, struct device *, void *));
333 void	st_identify_drive __P((struct st_softc *,
334 	    struct scsipi_inquiry_pattern *));
335 void	st_loadquirks __P((struct st_softc *));
336 int	st_mount_tape __P((dev_t, int));
337 void	st_unmount __P((struct st_softc *, boolean));
338 int	st_decide_mode __P((struct st_softc *, boolean));
339 void	ststart __P((void *));
340 void	stdone __P((struct scsipi_xfer *));
341 int	st_read __P((struct st_softc *, char *, int, int));
342 int	st_read_block_limits __P((struct st_softc *, int));
343 int	st_mode_sense __P((struct st_softc *, int));
344 int	st_mode_select __P((struct st_softc *, int));
345 int	st_cmprss __P((struct st_softc *, int));
346 int	st_space __P((struct st_softc *, int, u_int, int));
347 int	st_write_filemarks __P((struct st_softc *, int, int));
348 int	st_check_eod __P((struct st_softc *, boolean, int *, int));
349 int	st_load __P((struct st_softc *, u_int, int));
350 int	st_rewind __P((struct st_softc *, u_int, int));
351 int	st_interpret_sense __P((struct scsipi_xfer *));
352 int	st_touch_tape __P((struct st_softc *));
353 int	st_erase __P((struct st_softc *, int full, int flags));
354 int	st_rdpos __P((struct st_softc *, int, u_int32_t *));
355 int	st_setpos __P((struct st_softc *, int, u_int32_t *));
356 
357 struct cfattach st_ca = {
358 	sizeof(struct st_softc), stmatch, stattach
359 };
360 
361 extern struct cfdriver st_cd;
362 
363 struct scsipi_device st_switch = {
364 	st_interpret_sense,
365 	ststart,
366 	NULL,
367 	stdone
368 };
369 
370 #define	ST_INFO_VALID	0x0001
371 #define	ST_BLOCK_SET	0x0002	/* block size, mode set by ioctl      */
372 #define	ST_WRITTEN	0x0004	/* data has been written, EOD needed */
373 #define	ST_FIXEDBLOCKS	0x0008
374 #define	ST_AT_FILEMARK	0x0010
375 #define	ST_EIO_PENDING	0x0020	/* error reporting deferred until next op */
376 #define	ST_NEW_MOUNT	0x0040	/* still need to decide mode             */
377 #define	ST_READONLY	0x0080	/* st_mode_sense says write protected */
378 #define	ST_FM_WRITTEN	0x0100	/*
379 				 * EOF file mark written  -- used with
380 				 * ~ST_WRITTEN to indicate that multiple file
381 				 * marks have been written
382 				 */
383 #define	ST_BLANK_READ	0x0200	/* BLANK CHECK encountered already */
384 #define	ST_2FM_AT_EOD	0x0400	/* write 2 file marks at EOD */
385 #define	ST_MOUNTED	0x0800	/* Device is presently mounted */
386 #define	ST_DONTBUFFER	0x1000	/* Disable buffering/caching */
387 #define	ST_EARLYWARN	0x2000	/* Do (deferred) EOM for variable mode */
388 #define	ST_EOM_PENDING	0x4000	/* EOM reporting deferred until next op */
389 
390 #define	ST_PER_ACTION	(ST_AT_FILEMARK | ST_EIO_PENDING | ST_EOM_PENDING | \
391 			 ST_BLANK_READ)
392 #define	ST_PER_MOUNT	(ST_INFO_VALID | ST_BLOCK_SET | ST_WRITTEN |	\
393 			 ST_FIXEDBLOCKS | ST_READONLY | ST_FM_WRITTEN |	\
394 			 ST_2FM_AT_EOD | ST_PER_ACTION)
395 
396 #if	defined(ST_ENABLE_EARLYWARN)
397 #define	ST_INIT_FLAGS	ST_EARLYWARN
398 #else
399 #define	ST_INIT_FLAGS	0
400 #endif
401 
402 struct scsipi_inquiry_pattern st_patterns[] = {
403 	{T_SEQUENTIAL, T_REMOV,
404 	 "",         "",                 ""},
405 };
406 
407 int
408 stmatch(parent, match, aux)
409 	struct device *parent;
410 	struct cfdata *match;
411 	void *aux;
412 {
413 	struct scsipibus_attach_args *sa = aux;
414 	int priority;
415 
416 	(void)scsipi_inqmatch(&sa->sa_inqbuf,
417 	    (caddr_t)st_patterns, sizeof(st_patterns)/sizeof(st_patterns[0]),
418 	    sizeof(st_patterns[0]), &priority);
419 	return (priority);
420 }
421 
422 /*
423  * The routine called by the low level scsi routine when it discovers
424  * A device suitable for this driver
425  */
426 void
427 stattach(parent, self, aux)
428 	struct device *parent, *self;
429 	void *aux;
430 {
431 	struct st_softc *st = (void *)self;
432 	struct scsipibus_attach_args *sa = aux;
433 	struct scsipi_link *sc_link = sa->sa_sc_link;
434 
435 	SC_DEBUG(sc_link, SDEV_DB2, ("stattach: "));
436 
437 	/*
438 	 * Store information needed to contact our base driver
439 	 */
440 	st->sc_link = sc_link;
441 	sc_link->device = &st_switch;
442 	sc_link->device_softc = st;
443 	sc_link->openings = 1;
444 
445 	/*
446 	 * Set initial flags
447 	 */
448 
449 	st->flags = ST_INIT_FLAGS;
450 
451 	/*
452 	 * Check if the drive is a known criminal and take
453 	 * Any steps needed to bring it into line
454 	 */
455 	st_identify_drive(st, &sa->sa_inqbuf);
456 	/*
457 	 * Use the subdriver to request information regarding
458 	 * the drive. We cannot use interrupts yet, so the
459 	 * request must specify this.
460 	 */
461 	printf("\n");
462 	printf("%s: %s", st->sc_dev.dv_xname, st->quirkdata ? "rogue, " : "");
463 	if (scsipi_test_unit_ready(sc_link,
464 	    XS_CTL_DISCOVERY | XS_CTL_SILENT | XS_CTL_IGNORE_MEDIA_CHANGE) ||
465 	    st_mode_sense(st,
466 	    XS_CTL_DISCOVERY | XS_CTL_SILENT | XS_CTL_IGNORE_MEDIA_CHANGE))
467 		printf("drive empty\n");
468 	else {
469 		printf("density code 0x%x, ", st->media_density);
470 		if (st->media_blksize > 0)
471 			printf("%d-byte", st->media_blksize);
472 		else
473 			printf("variable");
474 		printf(" blocks, write-%s\n",
475 		    (st->flags & ST_READONLY) ? "protected" : "enabled");
476 	}
477 
478 	/*
479 	 * Set up the buf queue for this device
480 	 */
481 	st->buf_queue.b_active = 0;
482 	st->buf_queue.b_actf = 0;
483 	st->buf_queue.b_actb = &st->buf_queue.b_actf;
484 
485 #if NRND > 0
486 	rnd_attach_source(&st->rnd_source, st->sc_dev.dv_xname,
487 			  RND_TYPE_TAPE, 0);
488 #endif
489 }
490 
491 /*
492  * Use the inquiry routine in 'scsi_base' to get drive info so we can
493  * Further tailor our behaviour.
494  */
495 void
496 st_identify_drive(st, inqbuf)
497 	struct st_softc *st;
498 	struct scsipi_inquiry_pattern *inqbuf;
499 {
500 	struct st_quirk_inquiry_pattern *finger;
501 	int priority;
502 
503 	finger = (struct st_quirk_inquiry_pattern *)scsipi_inqmatch(inqbuf,
504 	    (caddr_t)st_quirk_patterns,
505 	    sizeof(st_quirk_patterns) / sizeof(st_quirk_patterns[0]),
506 	    sizeof(st_quirk_patterns[0]), &priority);
507 	if (priority != 0) {
508 		st->quirkdata = &finger->quirkdata;
509 		st->drive_quirks = finger->quirkdata.quirks;
510 		st->quirks = finger->quirkdata.quirks;	/* start value */
511 		st->page_0_size = finger->quirkdata.page_0_size;
512 		st_loadquirks(st);
513 	}
514 }
515 
516 /*
517  * initialise the subdevices to the default (QUIRK) state.
518  * this will remove any setting made by the system operator or previous
519  * operations.
520  */
521 void
522 st_loadquirks(st)
523 	struct st_softc *st;
524 {
525 	int i;
526 	struct	modes *mode;
527 	struct	modes *mode2;
528 
529 	mode = st->quirkdata->modes;
530 	mode2 = st->modes;
531 	for (i = 0; i < 4; i++) {
532 		bzero(mode2, sizeof(struct modes));
533 		st->modeflags[i] &= ~(BLKSIZE_SET_BY_QUIRK |
534 		    DENSITY_SET_BY_QUIRK | BLKSIZE_SET_BY_USER |
535 		    DENSITY_SET_BY_USER);
536 		if ((mode->quirks | st->drive_quirks) & ST_Q_FORCE_BLKSIZE) {
537 			mode2->blksize = mode->blksize;
538 			st->modeflags[i] |= BLKSIZE_SET_BY_QUIRK;
539 		}
540 		if (mode->density) {
541 			mode2->density = mode->density;
542 			st->modeflags[i] |= DENSITY_SET_BY_QUIRK;
543 		}
544 		mode++;
545 		mode2++;
546 	}
547 }
548 
549 /*
550  * open the device.
551  */
552 int
553 stopen(dev, flags, mode, p)
554 	dev_t dev;
555 	int flags;
556 	int mode;
557 	struct proc *p;
558 {
559 	int unit;
560 	u_int stmode, dsty;
561 	int error;
562 	struct st_softc *st;
563 	struct scsipi_link *sc_link;
564 
565 	unit = STUNIT(dev);
566 	if (unit >= st_cd.cd_ndevs)
567 		return (ENXIO);
568 	st = st_cd.cd_devs[unit];
569 	if (st == NULL)
570 		return (ENXIO);
571 
572 	stmode = STMODE(dev);
573 	dsty = STDSTY(dev);
574 	sc_link = st->sc_link;
575 
576 	SC_DEBUG(sc_link, SDEV_DB1, ("open: dev=0x%x (unit %d (of %d))\n", dev,
577 	    unit, st_cd.cd_ndevs));
578 
579 
580 	/*
581 	 * Only allow one at a time
582 	 */
583 	if (sc_link->flags & SDEV_OPEN) {
584 		printf("%s: already open\n", st->sc_dev.dv_xname);
585 		return (EBUSY);
586 	}
587 
588 	if ((error = scsipi_adapter_addref(sc_link)) != 0)
589 		return (error);
590 
591 	/*
592 	 * clear any latched errors.
593 	 */
594 	st->mt_resid = 0;
595 	st->mt_erreg = 0;
596 
597 	/*
598 	 * Catch any unit attention errors.
599 	 */
600 	error = scsipi_test_unit_ready(sc_link, XS_CTL_IGNORE_MEDIA_CHANGE |
601 	    (stmode == CTRL_MODE ? XS_CTL_SILENT : 0));
602 	if (error && stmode != CTRL_MODE) {
603 		goto bad;
604 	}
605 	sc_link->flags |= SDEV_OPEN;	/* unit attn are now errors */
606 
607 	/*
608 	 * If the mode is 3 (e.g. minor = 3,7,11,15) then the device has
609 	 * been opened to set defaults and perform other, usually non-I/O
610 	 * related, operations. In this case, do a quick check to see
611 	 * whether the unit actually had a tape loaded (this will be known
612 	 * as to whether or not we got a NOT READY for the above
613 	 * unit attention). If a tape is there, go do a mount sequence.
614 	 */
615 	if (stmode == CTRL_MODE && st->mt_erreg == SKEY_NOT_READY) {
616 		return (0);
617 	}
618 
619 	/*
620 	 * If it's a different mode, or if the media has been
621 	 * invalidated, unmount the tape from the previous
622 	 * session but continue with open processing
623 	 */
624 	if (st->last_dsty != dsty || !(sc_link->flags & SDEV_MEDIA_LOADED))
625 		st_unmount(st, NOEJECT);
626 
627 	/*
628 	 * If we are not mounted, then we should start a new
629 	 * mount session.
630 	 */
631 	if (!(st->flags & ST_MOUNTED)) {
632 		st_mount_tape(dev, flags);
633 		st->last_dsty = dsty;
634 	}
635 
636 	SC_DEBUG(sc_link, SDEV_DB2, ("open complete\n"));
637 	return (0);
638 
639 bad:
640 	st_unmount(st, NOEJECT);
641 	scsipi_adapter_delref(sc_link);
642 	sc_link->flags &= ~SDEV_OPEN;
643 	return (error);
644 }
645 
646 /*
647  * close the device.. only called if we are the LAST
648  * occurence of an open device
649  */
650 int
651 stclose(dev, flags, mode, p)
652 	dev_t dev;
653 	int flags;
654 	int mode;
655 	struct proc *p;
656 {
657 	int stxx, error = 0;
658 	struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
659 
660 	SC_DEBUG(st->sc_link, SDEV_DB1, ("closing\n"));
661 
662 	/*
663 	 * Make sure that a tape opened in write-only mode will have
664 	 * file marks written on it when closed, even if not written to.
665 	 *
666 	 * This is for SUN compatibility. Actually, the Sun way of
667 	 * things is to:
668 	 *
669 	 *	only write filemarks if there are fmks to be written and
670 	 *   		- open for write (possibly read/write)
671 	 *		- the last operation was a write
672 	 * 	or:
673 	 *		- opened for wronly
674 	 *		- no data was written (including filemarks)
675 	 */
676 
677 	stxx = st->flags & (ST_WRITTEN | ST_FM_WRITTEN);
678 	if (((flags & FWRITE) && stxx == ST_WRITTEN) ||
679 	    ((flags & O_ACCMODE) == FWRITE && stxx == 0)) {
680 		int nm;
681 		error = st_check_eod(st, FALSE, &nm, 0);
682 	}
683 
684 	switch (STMODE(dev)) {
685 	case NORMAL_MODE:
686 		st_unmount(st, NOEJECT);
687 		break;
688 	case NOREW_MODE:
689 	case CTRL_MODE:
690 		/*
691 		 * Leave mounted unless media seems to have been removed.
692 		 *
693 		 * Otherwise, if we're to terminate a tape with more than one
694 		 * filemark [ and because we're not rewinding here ], backspace
695 		 * one filemark so that later appends will see an unbroken
696 		 * sequence of:
697 		 *
698 		 *	file - FMK - file - FMK ... file - FMK FMK (EOM)
699 		 */
700 		if (!(st->sc_link->flags & SDEV_MEDIA_LOADED)) {
701 			st_unmount(st, NOEJECT);
702 		} else if (error == 0) {
703 			/*
704 			 * ST_WRITTEN was preserved from above.
705 			 *
706 			 * All we need to know here is:
707 			 *
708 			 *	Were we writing this tape and was the last
709 			 *	operation a write?
710 			 *
711 			 *	Are there supposed to be 2FM at EOD?
712 			 *
713 			 * If both statements are true, then we backspace
714 			 * one filemark.
715 			 */
716 			stxx |= (st->flags & ST_2FM_AT_EOD);
717 			if ((flags & FWRITE) != 0 &&
718 			    (stxx == (ST_2FM_AT_EOD|ST_WRITTEN))) {
719 				error = st_space(st, -1, SP_FILEMARKS, 0);
720 			}
721 		}
722 		break;
723 	case EJECT_MODE:
724 		st_unmount(st, EJECT);
725 		break;
726 	}
727 
728 	scsipi_wait_drain(st->sc_link);
729 
730 	scsipi_adapter_delref(st->sc_link);
731 	st->sc_link->flags &= ~SDEV_OPEN;
732 
733 	return (error);
734 }
735 
736 /*
737  * Start a new mount session.
738  * Copy in all the default parameters from the selected device mode.
739  * and try guess any that seem to be defaulted.
740  */
741 int
742 st_mount_tape(dev, flags)
743 	dev_t dev;
744 	int flags;
745 {
746 	int unit;
747 	u_int dsty;
748 	struct st_softc *st;
749 	struct scsipi_link *sc_link;
750 	int error = 0;
751 
752 	unit = STUNIT(dev);
753 	dsty = STDSTY(dev);
754 	st = st_cd.cd_devs[unit];
755 	sc_link = st->sc_link;
756 
757 	if (st->flags & ST_MOUNTED)
758 		return (0);
759 
760 	SC_DEBUG(sc_link, SDEV_DB1, ("mounting\n "));
761 	st->flags |= ST_NEW_MOUNT;
762 	st->quirks = st->drive_quirks | st->modes[dsty].quirks;
763 	/*
764 	 * If the media is new, then make sure we give it a chance to
765 	 * to do a 'load' instruction.  (We assume it is new.)
766 	 */
767 	if ((error = st_load(st, LD_LOAD, 0)) != 0)
768 		return (error);
769 	/*
770 	 * Throw another dummy instruction to catch
771 	 * 'Unit attention' errors. Many drives give
772 	 * these after doing a Load instruction (with
773 	 * the MEDIUM MAY HAVE CHANGED asc/ascq).
774 	 */
775 	scsipi_test_unit_ready(sc_link, XS_CTL_SILENT);	/* XXX */
776 
777 	/*
778 	 * Some devices can't tell you much until they have been
779 	 * asked to look at the media. This quirk does this.
780 	 */
781 	if (st->quirks & ST_Q_SENSE_HELP)
782 		if ((error = st_touch_tape(st)) != 0)
783 			return (error);
784 	/*
785 	 * Load the physical device parameters
786 	 * loads: blkmin, blkmax
787 	 */
788 	if ((error = st_read_block_limits(st, 0)) != 0)
789 		return (error);
790 	/*
791 	 * Load the media dependent parameters
792 	 * includes: media_blksize,media_density,numblks
793 	 * As we have a tape in, it should be reflected here.
794 	 * If not you may need the "quirk" above.
795 	 */
796 	if ((error = st_mode_sense(st, 0)) != 0)
797 		return (error);
798 	/*
799 	 * If we have gained a permanent density from somewhere,
800 	 * then use it in preference to the one supplied by
801 	 * default by the driver.
802 	 */
803 	if (st->modeflags[dsty] & (DENSITY_SET_BY_QUIRK | DENSITY_SET_BY_USER))
804 		st->density = st->modes[dsty].density;
805 	else
806 		st->density = st->media_density;
807 	/*
808 	 * If we have gained a permanent blocksize
809 	 * then use it in preference to the one supplied by
810 	 * default by the driver.
811 	 */
812 	st->flags &= ~ST_FIXEDBLOCKS;
813 	if (st->modeflags[dsty] &
814 	    (BLKSIZE_SET_BY_QUIRK | BLKSIZE_SET_BY_USER)) {
815 		st->blksize = st->modes[dsty].blksize;
816 		if (st->blksize)
817 			st->flags |= ST_FIXEDBLOCKS;
818 	} else {
819 		if ((error = st_decide_mode(st, FALSE)) != 0)
820 			return (error);
821 	}
822 	if ((error = st_mode_select(st, 0)) != 0) {
823 		printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
824 		return (error);
825 	}
826 	scsipi_prevent(sc_link, PR_PREVENT,
827 	    XS_CTL_IGNORE_ILLEGAL_REQUEST | XS_CTL_IGNORE_NOT_READY);
828 	st->flags &= ~ST_NEW_MOUNT;
829 	st->flags |= ST_MOUNTED;
830 	sc_link->flags |= SDEV_MEDIA_LOADED;	/* move earlier? */
831 
832 	return (0);
833 }
834 
835 /*
836  * End the present mount session.
837  * Rewind, and optionally eject the tape.
838  * Reset various flags to indicate that all new
839  * operations require another mount operation
840  */
841 void
842 st_unmount(st, eject)
843 	struct st_softc *st;
844 	boolean eject;
845 {
846 	struct scsipi_link *sc_link = st->sc_link;
847 	int nmarks;
848 
849 	if (!(st->flags & ST_MOUNTED))
850 		return;
851 	SC_DEBUG(sc_link, SDEV_DB1, ("unmounting\n"));
852 	st_check_eod(st, FALSE, &nmarks, XS_CTL_IGNORE_NOT_READY);
853 	st_rewind(st, 0, XS_CTL_IGNORE_NOT_READY);
854 	scsipi_prevent(sc_link, PR_ALLOW,
855 	    XS_CTL_IGNORE_ILLEGAL_REQUEST | XS_CTL_IGNORE_NOT_READY);
856 	if (eject)
857 		st_load(st, LD_UNLOAD, XS_CTL_IGNORE_NOT_READY);
858 	st->flags &= ~(ST_MOUNTED | ST_NEW_MOUNT);
859 	sc_link->flags &= ~SDEV_MEDIA_LOADED;
860 }
861 
862 /*
863  * Given all we know about the device, media, mode, 'quirks' and
864  * initial operation, make a decision as to how we should be set
865  * to run (regarding blocking and EOD marks)
866  */
867 int
868 st_decide_mode(st, first_read)
869 	struct st_softc *st;
870 	boolean	first_read;
871 {
872 #ifdef SCSIDEBUG
873 	struct scsipi_link *sc_link = st->sc_link;
874 #endif
875 
876 	SC_DEBUG(sc_link, SDEV_DB2, ("starting block mode decision\n"));
877 
878 	/*
879 	 * If the drive can only handle fixed-length blocks and only at
880 	 * one size, perhaps we should just do that.
881 	 */
882 	if (st->blkmin && (st->blkmin == st->blkmax)) {
883 		st->flags |= ST_FIXEDBLOCKS;
884 		st->blksize = st->blkmin;
885 		SC_DEBUG(sc_link, SDEV_DB3,
886 		    ("blkmin == blkmax of %d\n", st->blkmin));
887 		goto done;
888 	}
889 	/*
890 	 * If the tape density mandates (or even suggests) use of fixed
891 	 * or variable-length blocks, comply.
892 	 */
893 	switch (st->density) {
894 	case HALFINCH_800:
895 	case HALFINCH_1600:
896 	case HALFINCH_6250:
897 	case DDS:
898 		st->flags &= ~ST_FIXEDBLOCKS;
899 		st->blksize = 0;
900 		SC_DEBUG(sc_link, SDEV_DB3, ("density specified variable\n"));
901 		goto done;
902 	case QIC_11:
903 	case QIC_24:
904 	case QIC_120:
905 	case QIC_150:
906 	case QIC_525:
907 	case QIC_1320:
908 		st->flags |= ST_FIXEDBLOCKS;
909 		if (st->media_blksize > 0)
910 			st->blksize = st->media_blksize;
911 		else
912 			st->blksize = DEF_FIXED_BSIZE;
913 		SC_DEBUG(sc_link, SDEV_DB3, ("density specified fixed\n"));
914 		goto done;
915 	}
916 	/*
917 	 * If we're about to read the tape, perhaps we should choose
918 	 * fixed or variable-length blocks and block size according to
919 	 * what the drive found on the tape.
920 	 */
921 	if (first_read &&
922 	    (!(st->quirks & ST_Q_BLKSIZE) || (st->media_blksize == 0) ||
923 	    (st->media_blksize == DEF_FIXED_BSIZE) ||
924 	    (st->media_blksize == 1024))) {
925 		if (st->media_blksize > 0)
926 			st->flags |= ST_FIXEDBLOCKS;
927 		else
928 			st->flags &= ~ST_FIXEDBLOCKS;
929 		st->blksize = st->media_blksize;
930 		SC_DEBUG(sc_link, SDEV_DB3,
931 		    ("Used media_blksize of %d\n", st->media_blksize));
932 		goto done;
933 	}
934 	/*
935 	 * We're getting no hints from any direction.  Choose variable-
936 	 * length blocks arbitrarily.
937 	 */
938 	st->flags &= ~ST_FIXEDBLOCKS;
939 	st->blksize = 0;
940 	SC_DEBUG(sc_link, SDEV_DB3,
941 	    ("Give up and default to variable mode\n"));
942 
943 done:
944 	/*
945 	 * Decide whether or not to write two file marks to signify end-
946 	 * of-data.  Make the decision as a function of density.  If
947 	 * the decision is not to use a second file mark, the SCSI BLANK
948 	 * CHECK condition code will be recognized as end-of-data when
949 	 * first read.
950 	 * (I think this should be a by-product of fixed/variable..julian)
951 	 */
952 	switch (st->density) {
953 /*      case 8 mm:   What is the SCSI density code for 8 mm, anyway? */
954 	case QIC_11:
955 	case QIC_24:
956 	case QIC_120:
957 	case QIC_150:
958 	case QIC_525:
959 	case QIC_1320:
960 		st->flags &= ~ST_2FM_AT_EOD;
961 		break;
962 	default:
963 		st->flags |= ST_2FM_AT_EOD;
964 	}
965 	return (0);
966 }
967 
968 /*
969  * Actually translate the requested transfer into
970  * one the physical driver can understand
971  * The transfer is described by a buf and will include
972  * only one physical transfer.
973  */
974 void
975 ststrategy(bp)
976 	struct buf *bp;
977 {
978 	struct st_softc *st = st_cd.cd_devs[STUNIT(bp->b_dev)];
979 	struct buf *dp;
980 	int s;
981 
982 	SC_DEBUG(st->sc_link, SDEV_DB1,
983 	    ("ststrategy %ld bytes @ blk %d\n", bp->b_bcount, bp->b_blkno));
984 	/*
985 	 * If it's a null transfer, return immediatly
986 	 */
987 	if (bp->b_bcount == 0)
988 		goto done;
989 
990 	/* If offset is negative, error */
991 	if (bp->b_blkno < 0) {
992 		bp->b_error = EINVAL;
993 		goto bad;
994 	}
995 
996 	/*
997 	 * Odd sized request on fixed drives are verboten
998 	 */
999 	if (st->flags & ST_FIXEDBLOCKS) {
1000 		if (bp->b_bcount % st->blksize) {
1001 			printf("%s: bad request, must be multiple of %d\n",
1002 			    st->sc_dev.dv_xname, st->blksize);
1003 			bp->b_error = EIO;
1004 			goto bad;
1005 		}
1006 	}
1007 	/*
1008 	 * as are out-of-range requests on variable drives.
1009 	 */
1010 	else if (bp->b_bcount < st->blkmin ||
1011 	    (st->blkmax && bp->b_bcount > st->blkmax)) {
1012 		printf("%s: bad request, must be between %d and %d\n",
1013 		    st->sc_dev.dv_xname, st->blkmin, st->blkmax);
1014 		bp->b_error = EIO;
1015 		goto bad;
1016 	}
1017 	s = splbio();
1018 
1019 	/*
1020 	 * Place it in the queue of activities for this tape
1021 	 * at the end (a bit silly because we only have on user..
1022 	 * (but it could fork()))
1023 	 */
1024 	dp = &st->buf_queue;
1025 	bp->b_actf = NULL;
1026 	bp->b_actb = dp->b_actb;
1027 	*dp->b_actb = bp;
1028 	dp->b_actb = &bp->b_actf;
1029 
1030 	/*
1031 	 * Tell the device to get going on the transfer if it's
1032 	 * not doing anything, otherwise just wait for completion
1033 	 * (All a bit silly if we're only allowing 1 open but..)
1034 	 */
1035 	ststart(st);
1036 
1037 	splx(s);
1038 	return;
1039 bad:
1040 	bp->b_flags |= B_ERROR;
1041 done:
1042 	/*
1043 	 * Correctly set the buf to indicate a completed xfer
1044 	 */
1045 	bp->b_resid = bp->b_bcount;
1046 	biodone(bp);
1047 	return;
1048 }
1049 
1050 /*
1051  * ststart looks to see if there is a buf waiting for the device
1052  * and that the device is not already busy. If both are true,
1053  * It dequeues the buf and creates a scsi command to perform the
1054  * transfer required. The transfer request will call scsipi_done
1055  * on completion, which will in turn call this routine again
1056  * so that the next queued transfer is performed.
1057  * The bufs are queued by the strategy routine (ststrategy)
1058  *
1059  * This routine is also called after other non-queued requests
1060  * have been made of the scsi driver, to ensure that the queue
1061  * continues to be drained.
1062  * ststart() is called at splbio
1063  */
1064 void
1065 ststart(v)
1066 	void *v;
1067 {
1068 	struct st_softc *st = v;
1069 	struct scsipi_link *sc_link = st->sc_link;
1070 	register struct buf *bp, *dp;
1071 	struct scsi_rw_tape cmd;
1072 	int flags, error;
1073 
1074 	SC_DEBUG(sc_link, SDEV_DB2, ("ststart "));
1075 	/*
1076 	 * See if there is a buf to do and we are not already
1077 	 * doing one
1078 	 */
1079 	while (sc_link->active < sc_link->openings) {
1080 		/* if a special awaits, let it proceed first */
1081 		if (sc_link->flags & SDEV_WAITING) {
1082 			sc_link->flags &= ~SDEV_WAITING;
1083 			wakeup((caddr_t)sc_link);
1084 			return;
1085 		}
1086 
1087 		dp = &st->buf_queue;
1088 		if ((bp = dp->b_actf) == NULL)
1089 			return;
1090 		if ((dp = bp->b_actf) != NULL)
1091 			dp->b_actb = bp->b_actb;
1092 		else
1093 			st->buf_queue.b_actb = bp->b_actb;
1094 		*bp->b_actb = dp;
1095 
1096 		/*
1097 		 * if the device has been unmounted bye the user
1098 		 * then throw away all requests until done
1099 		 */
1100 		if (!(st->flags & ST_MOUNTED) ||
1101 		    !(sc_link->flags & SDEV_MEDIA_LOADED)) {
1102 			/* make sure that one implies the other.. */
1103 			sc_link->flags &= ~SDEV_MEDIA_LOADED;
1104 			bp->b_flags |= B_ERROR;
1105 			bp->b_error = EIO;
1106 			bp->b_resid = bp->b_bcount;
1107 			biodone(bp);
1108 			continue;
1109 		}
1110 		/*
1111 		 * only FIXEDBLOCK devices have pending I/O or space operations.
1112 		 */
1113 		if (st->flags & ST_FIXEDBLOCKS) {
1114 			/*
1115 			 * If we are at a filemark but have not reported it yet
1116 			 * then we should report it now
1117 			 */
1118 			if (st->flags & ST_AT_FILEMARK) {
1119 				if ((bp->b_flags & B_READ) == B_WRITE) {
1120 					/*
1121 					 * Handling of ST_AT_FILEMARK in
1122 					 * st_space will fill in the right file
1123 					 * mark count.
1124 					 * Back up over filemark
1125 					 */
1126 					if (st_space(st, 0, SP_FILEMARKS, 0)) {
1127 						bp->b_flags |= B_ERROR;
1128 						bp->b_error = EIO;
1129 						biodone(bp);
1130 						continue;
1131 					}
1132 				} else {
1133 					bp->b_resid = bp->b_bcount;
1134 					bp->b_error = 0;
1135 					bp->b_flags &= ~B_ERROR;
1136 					st->flags &= ~ST_AT_FILEMARK;
1137 					biodone(bp);
1138 					continue;	/* seek more work */
1139 				}
1140 			}
1141 		}
1142 		/*
1143 		 * If we are at EOM but have not reported it
1144 		 * yet then we should report it now.
1145 		 */
1146 		if (st->flags & (ST_EOM_PENDING|ST_EIO_PENDING)) {
1147 			bp->b_resid = bp->b_bcount;
1148 			if (st->flags & ST_EIO_PENDING) {
1149 				bp->b_error = EIO;
1150 				bp->b_flags |= B_ERROR;
1151 			}
1152 			st->flags &= ~(ST_EOM_PENDING|ST_EIO_PENDING);
1153 			biodone(bp);
1154 			continue;	/* seek more work */
1155 		}
1156 
1157 		/*
1158 		 *  Fill out the scsi command
1159 		 */
1160 		bzero(&cmd, sizeof(cmd));
1161 		if ((bp->b_flags & B_READ) == B_WRITE) {
1162 			cmd.opcode = WRITE;
1163 			st->flags &= ~ST_FM_WRITTEN;
1164 			flags = XS_CTL_DATA_OUT;
1165 		} else {
1166 			cmd.opcode = READ;
1167 			flags = XS_CTL_DATA_IN;
1168 		}
1169 
1170 		/*
1171 		 * Handle "fixed-block-mode" tape drives by using the
1172 		 * block count instead of the length.
1173 		 */
1174 		if (st->flags & ST_FIXEDBLOCKS) {
1175 			cmd.byte2 |= SRW_FIXED;
1176 			_lto3b(bp->b_bcount / st->blksize, cmd.len);
1177 		} else
1178 			_lto3b(bp->b_bcount, cmd.len);
1179 
1180 		/*
1181 		 * go ask the adapter to do all this for us
1182 		 * XXX Really need NOSLEEP?
1183 		 */
1184 		error = scsipi_command(sc_link,
1185 		    (struct scsipi_generic *)&cmd, sizeof(cmd),
1186 		    (u_char *)bp->b_data, bp->b_bcount,
1187 		    0, ST_IO_TIME, bp, flags | XS_CTL_NOSLEEP | XS_CTL_ASYNC);
1188 		if (error) {
1189 			printf("%s: not queued, error %d\n",
1190 			    st->sc_dev.dv_xname, error);
1191 		}
1192 	} /* go back and see if we can cram more work in.. */
1193 }
1194 
1195 void
1196 stdone(xs)
1197 	struct scsipi_xfer *xs;
1198 {
1199 
1200 	if (xs->bp != NULL) {
1201 		struct st_softc *st = xs->sc_link->device_softc;
1202 		if ((xs->bp->b_flags & B_READ) == B_WRITE) {
1203 			st->flags |= ST_WRITTEN;
1204 		} else {
1205 			st->flags &= ~ST_WRITTEN;
1206 		}
1207 #if NRND > 0
1208 		rnd_add_uint32(&st->rnd_source, xs->bp->b_blkno);
1209 #endif
1210 	}
1211 }
1212 
1213 int
1214 stread(dev, uio, iomode)
1215 	dev_t dev;
1216 	struct uio *uio;
1217 	int iomode;
1218 {
1219 	struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
1220 
1221 	return (physio(ststrategy, NULL, dev, B_READ,
1222 	    st->sc_link->adapter->scsipi_minphys, uio));
1223 }
1224 
1225 int
1226 stwrite(dev, uio, iomode)
1227 	dev_t dev;
1228 	struct uio *uio;
1229 	int iomode;
1230 {
1231 	struct st_softc *st = st_cd.cd_devs[STUNIT(dev)];
1232 
1233 	return (physio(ststrategy, NULL, dev, B_WRITE,
1234 	    st->sc_link->adapter->scsipi_minphys, uio));
1235 }
1236 
1237 /*
1238  * Perform special action on behalf of the user;
1239  * knows about the internals of this device
1240  */
1241 int
1242 stioctl(dev, cmd, arg, flag, p)
1243 	dev_t dev;
1244 	u_long cmd;
1245 	caddr_t arg;
1246 	int flag;
1247 	struct proc *p;
1248 {
1249 	int error = 0;
1250 	int unit;
1251 	int number, nmarks, dsty;
1252 	int flags;
1253 	struct st_softc *st;
1254 	int hold_blksize;
1255 	u_int8_t hold_density;
1256 	struct mtop *mt = (struct mtop *) arg;
1257 
1258 	/*
1259 	 * Find the device that the user is talking about
1260 	 */
1261 	flags = 0;		/* give error messages, act on errors etc. */
1262 	unit = STUNIT(dev);
1263 	dsty = STDSTY(dev);
1264 	st = st_cd.cd_devs[unit];
1265 	hold_blksize = st->blksize;
1266 	hold_density = st->density;
1267 
1268 	switch ((u_int) cmd) {
1269 
1270 	case MTIOCGET: {
1271 		struct mtget *g = (struct mtget *) arg;
1272 		/*
1273 		 * (to get the current state of READONLY)
1274 		 */
1275 		error = st_mode_sense(st, XS_CTL_SILENT);
1276 		if (error)
1277 			break;
1278 		SC_DEBUG(st->sc_link, SDEV_DB1, ("[ioctl: get status]\n"));
1279 		bzero(g, sizeof(struct mtget));
1280 		g->mt_type = 0x7;	/* Ultrix compat *//*? */
1281 		g->mt_blksiz = st->blksize;
1282 		g->mt_density = st->density;
1283 		g->mt_mblksiz[0] = st->modes[0].blksize;
1284 		g->mt_mblksiz[1] = st->modes[1].blksize;
1285 		g->mt_mblksiz[2] = st->modes[2].blksize;
1286 		g->mt_mblksiz[3] = st->modes[3].blksize;
1287 		g->mt_mdensity[0] = st->modes[0].density;
1288 		g->mt_mdensity[1] = st->modes[1].density;
1289 		g->mt_mdensity[2] = st->modes[2].density;
1290 		g->mt_mdensity[3] = st->modes[3].density;
1291 		if (st->flags & ST_READONLY)
1292 			g->mt_dsreg |= MT_DS_RDONLY;
1293 		if (st->flags & ST_MOUNTED)
1294 			g->mt_dsreg |= MT_DS_MOUNTED;
1295 		g->mt_resid = st->mt_resid;
1296 		g->mt_erreg = st->mt_erreg;
1297 		/*
1298 		 * clear latched errors.
1299 		 */
1300 		st->mt_resid = 0;
1301 		st->mt_erreg = 0;
1302 		break;
1303 	}
1304 	case MTIOCTOP: {
1305 
1306 		SC_DEBUG(st->sc_link, SDEV_DB1,
1307 		    ("[ioctl: op=0x%x count=0x%x]\n", mt->mt_op,
1308 			mt->mt_count));
1309 
1310 		/* compat: in U*x it is a short */
1311 		number = mt->mt_count;
1312 		switch ((short) (mt->mt_op)) {
1313 		case MTWEOF:	/* write an end-of-file record */
1314 			error = st_write_filemarks(st, number, flags);
1315 			break;
1316 		case MTBSF:	/* backward space file */
1317 			number = -number;
1318 		case MTFSF:	/* forward space file */
1319 			error = st_check_eod(st, FALSE, &nmarks, flags);
1320 			if (!error)
1321 				error = st_space(st, number - nmarks,
1322 				    SP_FILEMARKS, flags);
1323 			break;
1324 		case MTBSR:	/* backward space record */
1325 			number = -number;
1326 		case MTFSR:	/* forward space record */
1327 			error = st_check_eod(st, TRUE, &nmarks, flags);
1328 			if (!error)
1329 				error = st_space(st, number, SP_BLKS, flags);
1330 			break;
1331 		case MTREW:	/* rewind */
1332 			error = st_rewind(st, 0, flags);
1333 			break;
1334 		case MTOFFL:	/* rewind and put the drive offline */
1335 			st_unmount(st, EJECT);
1336 			break;
1337 		case MTNOP:	/* no operation, sets status only */
1338 			break;
1339 		case MTRETEN:	/* retension the tape */
1340 			error = st_load(st, LD_RETENSION, flags);
1341 			if (!error)
1342 				error = st_load(st, LD_LOAD, flags);
1343 			break;
1344 		case MTEOM:	/* forward space to end of media */
1345 			error = st_check_eod(st, FALSE, &nmarks, flags);
1346 			if (!error)
1347 				error = st_space(st, 1, SP_EOM, flags);
1348 			break;
1349 		case MTCACHE:	/* enable controller cache */
1350 			st->flags &= ~ST_DONTBUFFER;
1351 			goto try_new_value;
1352 		case MTNOCACHE:	/* disable controller cache */
1353 			st->flags |= ST_DONTBUFFER;
1354 			goto try_new_value;
1355 		case MTERASE:	/* erase volume */
1356 			error = st_erase(st, number, flags);
1357 			break;
1358 		case MTSETBSIZ:	/* Set block size for device */
1359 #ifdef	NOTYET
1360 			if (!(st->flags & ST_NEW_MOUNT)) {
1361 				uprintf("re-mount tape before changing blocksize");
1362 				error = EINVAL;
1363 				break;
1364 			}
1365 #endif
1366 			if (number == 0)
1367 				st->flags &= ~ST_FIXEDBLOCKS;
1368 			else {
1369 				if ((st->blkmin || st->blkmax) &&
1370 				    (number < st->blkmin ||
1371 				    number > st->blkmax)) {
1372 					error = EINVAL;
1373 					break;
1374 				}
1375 				st->flags |= ST_FIXEDBLOCKS;
1376 			}
1377 			st->blksize = number;
1378 			st->flags |= ST_BLOCK_SET;	/*XXX */
1379 			goto try_new_value;
1380 
1381 		case MTSETDNSTY:	/* Set density for device and mode */
1382 			/*
1383 			 * Any number >= 0 and <= 0xff is legal. Numbers
1384 			 * above 0x80 are 'vendor unique'.
1385 			 */
1386 			if (number < 0 || number > 255) {
1387 				error = EINVAL;
1388 				break;
1389 			} else
1390 				st->density = number;
1391 			goto try_new_value;
1392 
1393 		case MTCMPRESS:
1394 			error = st_cmprss(st, number);
1395 			break;
1396 
1397 		case MTEWARN:
1398 			if (number)
1399 				st->flags |= ST_EARLYWARN;
1400 			else
1401 				st->flags &= ~ST_EARLYWARN;
1402 			break;
1403 
1404 		default:
1405 			error = EINVAL;
1406 		}
1407 		break;
1408 	}
1409 	case MTIOCIEOT:
1410 	case MTIOCEEOT:
1411 		break;
1412 
1413 	case MTIOCRDSPOS:
1414 		error = st_rdpos(st, 0, (u_int32_t *) arg);
1415 		break;
1416 
1417 	case MTIOCRDHPOS:
1418 		error = st_rdpos(st, 1, (u_int32_t *) arg);
1419 		break;
1420 
1421 	case MTIOCSLOCATE:
1422 		error = st_setpos(st, 0, (u_int32_t *) arg);
1423 		break;
1424 
1425 	case MTIOCHLOCATE:
1426 		error = st_setpos(st, 1, (u_int32_t *) arg);
1427 		break;
1428 
1429 
1430 	default:
1431 		error = scsipi_do_ioctl(st->sc_link, dev, cmd, arg,
1432 					flag, p);
1433 		break;
1434 	}
1435 	return (error);
1436 /*-----------------------------*/
1437 try_new_value:
1438 	/*
1439 	 * Check that the mode being asked for is aggreeable to the
1440 	 * drive. If not, put it back the way it was.
1441 	 */
1442 	if ((error = st_mode_select(st, 0)) != 0) {/* put it back as it was */
1443 		printf("%s: cannot set selected mode\n", st->sc_dev.dv_xname);
1444 		st->density = hold_density;
1445 		st->blksize = hold_blksize;
1446 		if (st->blksize)
1447 			st->flags |= ST_FIXEDBLOCKS;
1448 		else
1449 			st->flags &= ~ST_FIXEDBLOCKS;
1450 		return (error);
1451 	}
1452 	/*
1453 	 * As the drive liked it, if we are setting a new default,
1454 	 * set it into the structures as such.
1455 	 *
1456 	 * The means for deciding this are not finalised yet- but
1457 	 * if the device was opened in Control Mode, the values
1458 	 * are persistent now across mounts.
1459 	 */
1460 	if (STMODE(dev) == CTRL_MODE) {
1461 		switch ((short) (mt->mt_op)) {
1462 		case MTSETBSIZ:
1463 			st->modes[dsty].blksize = st->blksize;
1464 			st->modeflags[dsty] |= BLKSIZE_SET_BY_USER;
1465 			break;
1466 		case MTSETDNSTY:
1467 			st->modes[dsty].density = st->density;
1468 			st->modeflags[dsty] |= DENSITY_SET_BY_USER;
1469 			break;
1470 		}
1471 	}
1472 	return (0);
1473 }
1474 
1475 /*
1476  * Do a synchronous read.
1477  */
1478 int
1479 st_read(st, buf, size, flags)
1480 	struct st_softc *st;
1481 	int size;
1482 	int flags;
1483 	char *buf;
1484 {
1485 	struct scsi_rw_tape cmd;
1486 
1487 	/*
1488 	 * If it's a null transfer, return immediatly
1489 	 */
1490 	if (size == 0)
1491 		return (0);
1492 	bzero(&cmd, sizeof(cmd));
1493 	cmd.opcode = READ;
1494 	if (st->flags & ST_FIXEDBLOCKS) {
1495 		cmd.byte2 |= SRW_FIXED;
1496 		_lto3b(size / (st->blksize ? st->blksize : DEF_FIXED_BSIZE),
1497 		    cmd.len);
1498 	} else
1499 		_lto3b(size, cmd.len);
1500 	return (scsipi_command(st->sc_link,
1501 	    (struct scsipi_generic *)&cmd, sizeof(cmd),
1502 	    (u_char *)buf, size, 0, ST_IO_TIME, NULL, flags | XS_CTL_DATA_IN));
1503 }
1504 
1505 /*
1506  * Ask the drive what it's min and max blk sizes are.
1507  */
1508 int
1509 st_read_block_limits(st, flags)
1510 	struct st_softc *st;
1511 	int flags;
1512 {
1513 	struct scsi_block_limits cmd;
1514 	struct scsi_block_limits_data block_limits;
1515 	struct scsipi_link *sc_link = st->sc_link;
1516 	int error;
1517 
1518 	/*
1519 	 * First check if we have it all loaded
1520 	 */
1521 	if ((sc_link->flags & SDEV_MEDIA_LOADED))
1522 		return (0);
1523 
1524 	/*
1525 	 * do a 'Read Block Limits'
1526 	 */
1527 	bzero(&cmd, sizeof(cmd));
1528 	cmd.opcode = READ_BLOCK_LIMITS;
1529 
1530 	/*
1531 	 * do the command, update the global values
1532 	 */
1533 	error = scsipi_command(sc_link, (struct scsipi_generic *)&cmd,
1534 	    sizeof(cmd), (u_char *)&block_limits, sizeof(block_limits),
1535 	    ST_RETRIES, ST_CTL_TIME, NULL, flags | XS_CTL_DATA_IN);
1536 	if (error)
1537 		return (error);
1538 
1539 	st->blkmin = _2btol(block_limits.min_length);
1540 	st->blkmax = _3btol(block_limits.max_length);
1541 
1542 	SC_DEBUG(sc_link, SDEV_DB3,
1543 	    ("(%d <= blksize <= %d)\n", st->blkmin, st->blkmax));
1544 	return (0);
1545 }
1546 
1547 /*
1548  * Get the scsi driver to send a full inquiry to the
1549  * device and use the results to fill out the global
1550  * parameter structure.
1551  *
1552  * called from:
1553  * attach
1554  * open
1555  * ioctl (to reset original blksize)
1556  */
1557 int
1558 st_mode_sense(st, flags)
1559 	struct st_softc *st;
1560 	int flags;
1561 {
1562 	u_int scsipi_sense_len;
1563 	int error;
1564 	struct scsi_mode_sense cmd;
1565 	struct scsipi_sense {
1566 		struct scsi_mode_header header;
1567 		struct scsi_blk_desc blk_desc;
1568 		u_char sense_data[MAX_PAGE_0_SIZE];
1569 	} scsipi_sense;
1570 	struct scsipi_link *sc_link = st->sc_link;
1571 
1572 	scsipi_sense_len = 12 + st->page_0_size;
1573 
1574 	/*
1575 	 * Set up a mode sense
1576 	 */
1577 	bzero(&cmd, sizeof(cmd));
1578 	cmd.opcode = SCSI_MODE_SENSE;
1579 	cmd.length = scsipi_sense_len;
1580 
1581 	/*
1582 	 * do the command, but we don't need the results
1583 	 * just print them for our interest's sake, if asked,
1584 	 * or if we need it as a template for the mode select
1585 	 * store it away.
1586 	 */
1587 	error = scsipi_command(sc_link, (struct scsipi_generic *)&cmd,
1588 	    sizeof(cmd), (u_char *)&scsipi_sense, scsipi_sense_len,
1589 	    ST_RETRIES, ST_CTL_TIME, NULL, flags | XS_CTL_DATA_IN);
1590 	if (error)
1591 		return (error);
1592 
1593 	st->numblks = _3btol(scsipi_sense.blk_desc.nblocks);
1594 	st->media_blksize = _3btol(scsipi_sense.blk_desc.blklen);
1595 	st->media_density = scsipi_sense.blk_desc.density;
1596 	if (scsipi_sense.header.dev_spec & SMH_DSP_WRITE_PROT)
1597 		st->flags |= ST_READONLY;
1598 	else
1599 		st->flags &= ~ST_READONLY;
1600 	SC_DEBUG(sc_link, SDEV_DB3,
1601 	    ("density code 0x%x, %d-byte blocks, write-%s, ",
1602 	    st->media_density, st->media_blksize,
1603 	    st->flags & ST_READONLY ? "protected" : "enabled"));
1604 	SC_DEBUG(sc_link, SDEV_DB3,
1605 	    ("%sbuffered\n",
1606 	    scsipi_sense.header.dev_spec & SMH_DSP_BUFF_MODE ? "" : "un"));
1607 	if (st->page_0_size)
1608 		bcopy(scsipi_sense.sense_data, st->sense_data,
1609 		    st->page_0_size);
1610 	sc_link->flags |= SDEV_MEDIA_LOADED;
1611 	return (0);
1612 }
1613 
1614 /*
1615  * Send a filled out parameter structure to the drive to
1616  * set it into the desire modes etc.
1617  */
1618 int
1619 st_mode_select(st, flags)
1620 	struct st_softc *st;
1621 	int flags;
1622 {
1623 	u_int scsi_select_len;
1624 	struct scsi_mode_select cmd;
1625 	struct scsi_select {
1626 		struct scsi_mode_header header;
1627 		struct scsi_blk_desc blk_desc;
1628 		u_char sense_data[MAX_PAGE_0_SIZE];
1629 	} scsi_select;
1630 	struct scsipi_link *sc_link = st->sc_link;
1631 
1632 	scsi_select_len = 12 + st->page_0_size;
1633 
1634 	/*
1635 	 * This quirk deals with drives that have only one valid mode
1636 	 * and think this gives them license to reject all mode selects,
1637 	 * even if the selected mode is the one that is supported.
1638 	 */
1639 	if (st->quirks & ST_Q_UNIMODAL) {
1640 		SC_DEBUG(sc_link, SDEV_DB3,
1641 		    ("not setting density 0x%x blksize 0x%x\n",
1642 		    st->density, st->blksize));
1643 		return (0);
1644 	}
1645 
1646 	/*
1647 	 * Set up for a mode select
1648 	 */
1649 	bzero(&cmd, sizeof(cmd));
1650 	cmd.opcode = SCSI_MODE_SELECT;
1651 	cmd.length = scsi_select_len;
1652 
1653 	bzero(&scsi_select, scsi_select_len);
1654 	scsi_select.header.blk_desc_len = sizeof(struct scsi_blk_desc);
1655 	scsi_select.header.dev_spec &= ~SMH_DSP_BUFF_MODE;
1656 	scsi_select.blk_desc.density = st->density;
1657 	if (st->flags & ST_DONTBUFFER)
1658 		scsi_select.header.dev_spec |= SMH_DSP_BUFF_MODE_OFF;
1659 	else
1660 		scsi_select.header.dev_spec |= SMH_DSP_BUFF_MODE_ON;
1661 	if (st->flags & ST_FIXEDBLOCKS)
1662 		_lto3b(st->blksize, scsi_select.blk_desc.blklen);
1663 	if (st->page_0_size)
1664 		bcopy(st->sense_data, scsi_select.sense_data, st->page_0_size);
1665 
1666 	/*
1667 	 * do the command
1668 	 */
1669 	return (scsipi_command(sc_link, (struct scsipi_generic *)&cmd,
1670 	    sizeof(cmd), (u_char *)&scsi_select, scsi_select_len,
1671 	    ST_RETRIES, ST_CTL_TIME, NULL, flags | XS_CTL_DATA_OUT));
1672 }
1673 
1674 int
1675 st_cmprss(st, onoff)
1676 	struct st_softc *st;
1677 	int onoff;
1678 {
1679 	u_int scsi_dlen;
1680 	struct scsi_mode_select mcmd;
1681 	struct scsi_mode_sense scmd;
1682 	struct scsi_select {
1683 		struct scsi_mode_header header;
1684 		struct scsi_blk_desc blk_desc;
1685 		u_char pdata[max(sizeof(struct scsi_tape_dev_conf_page),
1686 		    sizeof(struct scsi_tape_dev_compression_page))];
1687 	} scsi_pdata;
1688 	struct scsi_tape_dev_conf_page *ptr;
1689 	struct scsi_tape_dev_compression_page *cptr;
1690 	struct scsipi_link *sc_link = st->sc_link;
1691 	int error, ison, flags;
1692 
1693 	scsi_dlen = sizeof(scsi_pdata);
1694 	bzero(&scsi_pdata, scsi_dlen);
1695 
1696 	/*
1697 	 * Set up for a mode sense.
1698 	 * Do DATA COMPRESSION page first.
1699 	 */
1700 	bzero(&scmd, sizeof(scmd));
1701 	scmd.opcode = SCSI_MODE_SENSE;
1702 	scmd.page = SMS_PAGE_CTRL_CURRENT | 0xf;
1703 	scmd.length = scsi_dlen;
1704 
1705 	flags = XS_CTL_SILENT;
1706 
1707 	/*
1708 	 * Do the MODE SENSE command...
1709 	 */
1710 again:
1711 	bzero(&scsi_pdata, scsi_dlen);
1712 	error = scsipi_command(sc_link,
1713 	    (struct scsipi_generic *)&scmd, sizeof(scmd),
1714 	    (u_char *)&scsi_pdata, scsi_dlen,
1715 	    ST_RETRIES, ST_CTL_TIME, NULL, flags | XS_CTL_DATA_IN);
1716 
1717 	if (error) {
1718 		if (scmd.byte2 != SMS_DBD) {
1719 			scmd.byte2 = SMS_DBD;
1720 			goto again;
1721 		}
1722 		/*
1723 		 * Try a different page?
1724 		 */
1725 		if (scmd.page == (SMS_PAGE_CTRL_CURRENT | 0xf)) {
1726 			scmd.page = SMS_PAGE_CTRL_CURRENT | 0x10;
1727 			scmd.byte2 = 0;
1728 			goto again;
1729 		}
1730 		return (error);
1731 	}
1732 
1733 	if (scsi_pdata.header.blk_desc_len)
1734 		ptr = (struct scsi_tape_dev_conf_page *) scsi_pdata.pdata;
1735 	else
1736 		ptr = (struct scsi_tape_dev_conf_page *) &scsi_pdata.blk_desc;
1737 
1738 	if ((scmd.page & SMS_PAGE_CODE) == 0xf) {
1739 		cptr = (struct scsi_tape_dev_compression_page *) ptr;
1740 		ison = (cptr->dce_dcc & DCP_DCE) != 0;
1741 		if (onoff)
1742 			cptr->dce_dcc |= DCP_DCE;
1743 		else
1744 			cptr->dce_dcc &= ~DCP_DCE;
1745 		cptr->pagecode &= ~0x80;
1746 	} else {
1747 		ison =  (ptr->sel_comp_alg != 0);
1748 		if (onoff)
1749 			ptr->sel_comp_alg = 1;
1750 		else
1751 			ptr->sel_comp_alg = 0;
1752 		ptr->pagecode &= ~0x80;
1753 		ptr->byte2 = 0;
1754 		ptr->active_partition = 0;
1755 		ptr->wb_full_ratio = 0;
1756 		ptr->rb_empty_ratio = 0;
1757 		ptr->byte8 &= ~0x30;
1758 		ptr->gap_size = 0;
1759 		ptr->byte10 &= ~0xe7;
1760 		ptr->ew_bufsize[0] = 0;
1761 		ptr->ew_bufsize[1] = 0;
1762 		ptr->ew_bufsize[2] = 0;
1763 		ptr->reserved = 0;
1764 	}
1765 	onoff = onoff ? 1 : 0;
1766 	/*
1767 	 * There might be a virtue in actually doing the MODE SELECTS,
1768 	 * but let's not clog the bus over it.
1769 	 */
1770 	if (onoff == ison)
1771 		return (0);
1772 
1773 	/*
1774 	 * Set up for a mode select
1775 	 */
1776 
1777 	scsi_pdata.header.data_length = 0;
1778 	scsi_pdata.header.medium_type = 0;
1779 	if ((st->flags & ST_DONTBUFFER) == 0)
1780 		scsi_pdata.header.dev_spec = SMH_DSP_BUFF_MODE_ON;
1781 	else
1782 		scsi_pdata.header.dev_spec = 0;
1783 
1784 	bzero(&mcmd, sizeof(mcmd));
1785 	mcmd.opcode = SCSI_MODE_SELECT;
1786 	mcmd.byte2 = SMS_PF;
1787 	mcmd.length = scsi_dlen;
1788 	if (scsi_pdata.header.blk_desc_len) {
1789 		scsi_pdata.blk_desc.density = 0;
1790 		scsi_pdata.blk_desc.nblocks[0] = 0;
1791 		scsi_pdata.blk_desc.nblocks[1] = 0;
1792 		scsi_pdata.blk_desc.nblocks[2] = 0;
1793 	}
1794 
1795 	/*
1796 	 * Do the command
1797 	 */
1798 	error = scsipi_command(sc_link,
1799 	    (struct scsipi_generic *)&mcmd, sizeof(mcmd),
1800 	    (u_char *)&scsi_pdata, scsi_dlen,
1801 	    ST_RETRIES, ST_CTL_TIME, NULL, flags | XS_CTL_DATA_OUT);
1802 
1803 	if (error && (scmd.page & SMS_PAGE_CODE) == 0xf) {
1804 		/*
1805 		 * Try DEVICE CONFIGURATION page.
1806 		 */
1807 		scmd.page = SMS_PAGE_CTRL_CURRENT | 0x10;
1808 		goto again;
1809 	}
1810 	return (error);
1811 }
1812 /*
1813  * issue an erase command
1814  */
1815 int
1816 st_erase(st, full, flags)
1817 	struct st_softc *st;
1818 	int full, flags;
1819 {
1820 	int tmo;
1821 	struct scsi_erase cmd;
1822 
1823 	/*
1824 	 * Full erase means set LONG bit in erase command, which asks
1825 	 * the drive to erase the entire unit.  Without this bit, we're
1826 	 * asking the drive to write an erase gap.
1827 	 */
1828 	bzero(&cmd, sizeof(cmd));
1829 	cmd.opcode = ERASE;
1830 	if (full) {
1831 		cmd.byte2 = SE_IMMED|SE_LONG;
1832 		tmo = ST_SPC_TIME;
1833 	} else {
1834 		tmo = ST_IO_TIME;
1835 		cmd.byte2 = SE_IMMED;
1836 	}
1837 
1838 	/*
1839 	 * XXX We always do this asynchronously, for now.  How long should
1840 	 * we wait if we want to (eventually) to it synchronously?
1841 	 */
1842 	return (scsipi_command(st->sc_link,
1843 	    (struct scsipi_generic *)&cmd, sizeof(cmd),
1844 	    0, 0, ST_RETRIES, tmo, NULL, flags));
1845 }
1846 
1847 /*
1848  * skip N blocks/filemarks/seq filemarks/eom
1849  */
1850 int
1851 st_space(st, number, what, flags)
1852 	struct st_softc *st;
1853 	u_int what;
1854 	int flags;
1855 	int number;
1856 {
1857 	struct scsi_space cmd;
1858 	int error;
1859 
1860 	switch (what) {
1861 	case SP_BLKS:
1862 		if (st->flags & ST_PER_ACTION) {
1863 			if (number > 0) {
1864 				st->flags &= ~ST_PER_ACTION;
1865 				return (EIO);
1866 			} else if (number < 0) {
1867 				if (st->flags & ST_AT_FILEMARK) {
1868 					/*
1869 					 * Handling of ST_AT_FILEMARK
1870 					 * in st_space will fill in the
1871 					 * right file mark count.
1872 					 */
1873 					error = st_space(st, 0, SP_FILEMARKS,
1874 					    flags);
1875 					if (error)
1876 						return (error);
1877 				}
1878 				if (st->flags & ST_BLANK_READ) {
1879 					st->flags &= ~ST_BLANK_READ;
1880 					return (EIO);
1881 				}
1882 				st->flags &= ~(ST_EIO_PENDING|ST_EOM_PENDING);
1883 			}
1884 		}
1885 		break;
1886 	case SP_FILEMARKS:
1887 		if (st->flags & ST_EIO_PENDING) {
1888 			if (number > 0) {
1889 				/* pretend we just discovered the error */
1890 				st->flags &= ~ST_EIO_PENDING;
1891 				return (EIO);
1892 			} else if (number < 0) {
1893 				/* back away from the error */
1894 				st->flags &= ~ST_EIO_PENDING;
1895 			}
1896 		}
1897 		if (st->flags & ST_AT_FILEMARK) {
1898 			st->flags &= ~ST_AT_FILEMARK;
1899 			number--;
1900 		}
1901 		if ((st->flags & ST_BLANK_READ) && (number < 0)) {
1902 			/* back away from unwritten tape */
1903 			st->flags &= ~ST_BLANK_READ;
1904 			number++;	/* XXX dubious */
1905 		}
1906 		break;
1907 	case SP_EOM:
1908 		if (st->flags & ST_EOM_PENDING) {
1909 			/* we're already there */
1910 			st->flags &= ~ST_EOM_PENDING;
1911 			return (0);
1912 		}
1913 		if (st->flags & ST_EIO_PENDING) {
1914 			/* pretend we just discovered the error */
1915 			st->flags &= ~ST_EIO_PENDING;
1916 			return (EIO);
1917 		}
1918 		if (st->flags & ST_AT_FILEMARK)
1919 			st->flags &= ~ST_AT_FILEMARK;
1920 		break;
1921 	}
1922 	if (number == 0)
1923 		return (0);
1924 
1925 	bzero(&cmd, sizeof(cmd));
1926 	cmd.opcode = SPACE;
1927 	cmd.byte2 = what;
1928 	_lto3b(number, cmd.number);
1929 
1930 	return (scsipi_command(st->sc_link,
1931 	    (struct scsipi_generic *)&cmd, sizeof(cmd),
1932 	    0, 0, 0, ST_SPC_TIME, NULL, flags));
1933 }
1934 
1935 /*
1936  * write N filemarks
1937  */
1938 int
1939 st_write_filemarks(st, number, flags)
1940 	struct st_softc *st;
1941 	int flags;
1942 	int number;
1943 {
1944 	struct scsi_write_filemarks cmd;
1945 
1946 	/*
1947 	 * It's hard to write a negative number of file marks.
1948 	 * Don't try.
1949 	 */
1950 	if (number < 0)
1951 		return (EINVAL);
1952 	switch (number) {
1953 	case 0:		/* really a command to sync the drive's buffers */
1954 		break;
1955 	case 1:
1956 		if (st->flags & ST_FM_WRITTEN)	/* already have one down */
1957 			st->flags &= ~ST_WRITTEN;
1958 		else
1959 			st->flags |= ST_FM_WRITTEN;
1960 		st->flags &= ~ST_PER_ACTION;
1961 		break;
1962 	default:
1963 		st->flags &= ~(ST_PER_ACTION | ST_WRITTEN);
1964 	}
1965 
1966 	bzero(&cmd, sizeof(cmd));
1967 	cmd.opcode = WRITE_FILEMARKS;
1968 	_lto3b(number, cmd.number);
1969 
1970 	return (scsipi_command(st->sc_link,
1971 	    (struct scsipi_generic *)&cmd, sizeof(cmd),
1972 	    0, 0, 0, ST_IO_TIME * 4, NULL, flags));
1973 }
1974 
1975 /*
1976  * Make sure the right number of file marks is on tape if the
1977  * tape has been written.  If the position argument is true,
1978  * leave the tape positioned where it was originally.
1979  *
1980  * nmarks returns the number of marks to skip (or, if position
1981  * true, which were skipped) to get back original position.
1982  */
1983 int
1984 st_check_eod(st, position, nmarks, flags)
1985 	struct st_softc *st;
1986 	boolean position;
1987 	int *nmarks;
1988 	int flags;
1989 {
1990 	int error;
1991 
1992 	switch (st->flags & (ST_WRITTEN | ST_FM_WRITTEN | ST_2FM_AT_EOD)) {
1993 	default:
1994 		*nmarks = 0;
1995 		return (0);
1996 	case ST_WRITTEN:
1997 	case ST_WRITTEN | ST_FM_WRITTEN | ST_2FM_AT_EOD:
1998 		*nmarks = 1;
1999 		break;
2000 	case ST_WRITTEN | ST_2FM_AT_EOD:
2001 		*nmarks = 2;
2002 	}
2003 	error = st_write_filemarks(st, *nmarks, flags);
2004 	if (position && !error)
2005 		error = st_space(st, -*nmarks, SP_FILEMARKS, flags);
2006 	return (error);
2007 }
2008 
2009 /*
2010  * load/unload/retension
2011  */
2012 int
2013 st_load(st, type, flags)
2014 	struct st_softc *st;
2015 	u_int type;
2016 	int flags;
2017 {
2018 	int error;
2019 	struct scsi_load cmd;
2020 
2021 	if (type != LD_LOAD) {
2022 		int nmarks;
2023 
2024 		error = st_check_eod(st, FALSE, &nmarks, flags);
2025 		if (error) {
2026 			printf("%s: failed to write closing filemarks at "
2027 			    "unload, errno=%d\n", st->sc_dev.dv_xname, error);
2028 			return (error);
2029 		}
2030 	}
2031 	if (st->quirks & ST_Q_IGNORE_LOADS) {
2032 		if (type == LD_LOAD) {
2033 			/*
2034 			 * If we ignore loads, at least we should try a rewind.
2035 			 */
2036 			return st_rewind(st, 0, flags);
2037 		}
2038 		/* otherwise, we should do what's asked of us */
2039 	}
2040 
2041 	bzero(&cmd, sizeof(cmd));
2042 	cmd.opcode = LOAD;
2043 	cmd.how = type;
2044 
2045 	error = scsipi_command(st->sc_link,
2046 	    (struct scsipi_generic *)&cmd, sizeof(cmd),
2047 	    0, 0, ST_RETRIES, ST_SPC_TIME, NULL, flags);
2048 	if (error) {
2049 		printf("%s: error %d in st_load (op %d)\n",
2050 		    st->sc_dev.dv_xname, error, type);
2051 	}
2052 	return (error);
2053 }
2054 
2055 /*
2056  *  Rewind the device
2057  */
2058 int
2059 st_rewind(st, immediate, flags)
2060 	struct st_softc *st;
2061 	u_int immediate;
2062 	int flags;
2063 {
2064 	struct scsi_rewind cmd;
2065 	int error;
2066 	int nmarks;
2067 
2068 	error = st_check_eod(st, FALSE, &nmarks, flags);
2069 	if (error) {
2070 		printf("%s: failed to write closing filemarks at "
2071 		    "rewind, errno=%d\n", st->sc_dev.dv_xname, error);
2072 		return (error);
2073 	}
2074 	st->flags &= ~ST_PER_ACTION;
2075 
2076 	bzero(&cmd, sizeof(cmd));
2077 	cmd.opcode = REWIND;
2078 	cmd.byte2 = immediate;
2079 
2080 	error = scsipi_command(st->sc_link,
2081 	    (struct scsipi_generic *)&cmd, sizeof(cmd), 0, 0, ST_RETRIES,
2082 	    immediate ? ST_CTL_TIME: ST_SPC_TIME, NULL, flags);
2083 	if (error) {
2084 		printf("%s: error %d trying to rewind\n",
2085 		    st->sc_dev.dv_xname, error);
2086 	}
2087 	return (error);
2088 }
2089 
2090 int
2091 st_rdpos(st, hard, blkptr)
2092 	struct st_softc *st;
2093 	int hard;
2094 	u_int32_t *blkptr;
2095 {
2096 	int error;
2097 	u_int8_t posdata[20];
2098 	struct scsi_tape_read_position cmd;
2099 
2100 	/*
2101 	 * First flush any pending writes...
2102 	 */
2103 	error = st_write_filemarks(st, 0, XS_CTL_SILENT);
2104 
2105 	/*
2106 	 * The latter case is for 'write protected' tapes
2107 	 * which are too stupid to recognize a zero count
2108 	 * for writing filemarks as a no-op.
2109 	 */
2110 	if (error != 0 && error != EACCES && error != EROFS)
2111 		return (error);
2112 
2113 	bzero(&cmd, sizeof(cmd));
2114 	bzero(&posdata, sizeof(posdata));
2115 	cmd.opcode = READ_POSITION;
2116 	if (hard)
2117 		cmd.byte1 = 1;
2118 
2119 	error = scsipi_command(st->sc_link,
2120 	    (struct scsipi_generic *)&cmd, sizeof(cmd), (u_char *)&posdata,
2121 	    sizeof(posdata), ST_RETRIES, ST_CTL_TIME, NULL,
2122 	    XS_CTL_SILENT | XS_CTL_DATA_IN);
2123 
2124 	if (error == 0) {
2125 #if	0
2126 		printf("posdata:");
2127 		for (hard = 0; hard < sizeof(posdata); hard++)
2128 			printf("%02x ", posdata[hard] & 0xff);
2129 		printf("\n");
2130 #endif
2131 		if (posdata[0] & 0x4)	/* Block Position Unknown */
2132 			error = EINVAL;
2133 		else
2134 			*blkptr = _4btol(&posdata[4]);
2135 	}
2136 	return (error);
2137 }
2138 
2139 int
2140 st_setpos(st, hard, blkptr)
2141 	struct st_softc *st;
2142 	int hard;
2143 	u_int32_t *blkptr;
2144 {
2145 	int error;
2146 	struct scsi_tape_locate cmd;
2147 
2148 	/*
2149 	 * First flush any pending writes. Strictly speaking,
2150 	 * we're not supposed to have to worry about this,
2151 	 * but let's be untrusting.
2152 	 */
2153 	error = st_write_filemarks(st, 0, XS_CTL_SILENT);
2154 
2155 	/*
2156 	 * The latter case is for 'write protected' tapes
2157 	 * which are too stupid to recognize a zero count
2158 	 * for writing filemarks as a no-op.
2159 	 */
2160 	if (error != 0 && error != EACCES && error != EROFS)
2161 		return (error);
2162 
2163 	bzero(&cmd, sizeof(cmd));
2164 	cmd.opcode = LOCATE;
2165 	if (hard)
2166 		cmd.byte2 = 1 << 2;
2167 	_lto4b(*blkptr, cmd.blkaddr);
2168 	error = scsipi_command(st->sc_link,
2169 		(struct scsipi_generic *)&cmd, sizeof(cmd),
2170 		NULL, 0, ST_RETRIES, ST_SPC_TIME, NULL, 0);
2171 	/*
2172 	 * XXX: Note file && block number position now unknown (if
2173 	 * XXX: these things ever start being maintained in this driver)
2174 	 */
2175 	return (error);
2176 }
2177 
2178 
2179 /*
2180  * Look at the returned sense and act on the error and determine
2181  * the unix error number to pass back..., 0 (== report no error),
2182  * -1 = retry the operation, -2 continue error processing.
2183  */
2184 int
2185 st_interpret_sense(xs)
2186 	struct scsipi_xfer *xs;
2187 {
2188 	struct scsipi_link *sc_link = xs->sc_link;
2189 	struct scsipi_sense_data *sense = &xs->sense.scsi_sense;
2190 	struct buf *bp = xs->bp;
2191 	struct st_softc *st = sc_link->device_softc;
2192 	int retval = SCSIRET_CONTINUE;
2193 	int doprint = ((xs->xs_control & XS_CTL_SILENT) == 0);
2194 	u_int8_t key;
2195 	int32_t info;
2196 
2197 	/*
2198 	 * If it isn't a extended or extended/deferred error, let
2199 	 * the generic code handle it.
2200 	 */
2201 	if ((sense->error_code & SSD_ERRCODE) != 0x70 &&
2202 	    (sense->error_code & SSD_ERRCODE) != 0x71) {	/* DEFFERRED */
2203 		return (retval);
2204 	}
2205 
2206 	if (sense->error_code & SSD_ERRCODE_VALID)
2207 		info = _4btol(sense->info);
2208 	else
2209 		info = xs->datalen;	/* bad choice if fixed blocks */
2210 	key = sense->flags & SSD_KEY;
2211 	st->mt_erreg = key;
2212 	st->mt_resid = (short) info;
2213 
2214 	/*
2215 	 * If the device is not open yet, let generic handle
2216 	 */
2217 	if ((sc_link->flags & SDEV_OPEN) == 0) {
2218 		return (retval);
2219 	}
2220 
2221 
2222 	if (st->flags & ST_FIXEDBLOCKS) {
2223 		xs->resid = info * st->blksize;
2224 		if (sense->flags & SSD_EOM) {
2225 			if ((st->flags & ST_EARLYWARN) == 0)
2226 				st->flags |= ST_EIO_PENDING;
2227 			st->flags |= ST_EOM_PENDING;
2228 			if (bp)
2229 				bp->b_resid = xs->resid;
2230 		}
2231 		if (sense->flags & SSD_FILEMARK) {
2232 			st->flags |= ST_AT_FILEMARK;
2233 			if (bp)
2234 				bp->b_resid = xs->resid;
2235 		}
2236 		if (sense->flags & SSD_ILI) {
2237 			st->flags |= ST_EIO_PENDING;
2238 			if (bp)
2239 				bp->b_resid = xs->resid;
2240 			if (sense->error_code & SSD_ERRCODE_VALID &&
2241 			    (xs->xs_control & XS_CTL_SILENT) == 0)
2242 				printf("%s: block wrong size, %d blocks "
2243 				    "residual\n", st->sc_dev.dv_xname, info);
2244 
2245 			/*
2246 			 * This quirk code helps the drive read
2247 			 * the first tape block, regardless of
2248 			 * format.  That is required for these
2249 			 * drives to return proper MODE SENSE
2250 			 * information.
2251 			 */
2252 			if ((st->quirks & ST_Q_SENSE_HELP) &&
2253 			    !(sc_link->flags & SDEV_MEDIA_LOADED))
2254 				st->blksize -= 512;
2255 		}
2256 		/*
2257 		 * If data wanted and no data was tranfered, do it immediatly
2258 		 */
2259 		if (xs->datalen && xs->resid >= xs->datalen) {
2260 			if (st->flags & ST_EIO_PENDING)
2261 				return (EIO);
2262 			if (st->flags & ST_AT_FILEMARK) {
2263 				if (bp)
2264 					bp->b_resid = xs->resid;
2265 				return (SCSIRET_NOERROR);
2266 			}
2267 		}
2268 	} else {		/* must be variable mode */
2269 		if (sense->flags & SSD_EOM) {
2270 			/*
2271 			 * The current semantics of this
2272 			 * driver requires EOM detection
2273 			 * to return EIO unless early
2274 			 * warning detection is enabled
2275 			 * for variable mode (this is always
2276 			 * on for fixed block mode).
2277 			 */
2278 			if (st->flags & ST_EARLYWARN) {
2279 				st->flags |= ST_EOM_PENDING;
2280 				retval = SCSIRET_NOERROR;
2281 			} else {
2282 				retval = EIO;
2283 			}
2284 
2285 			/*
2286 			 * If it's an unadorned EOM detection,
2287 			 * suppress printing an error.
2288 			 */
2289 			if (key == SKEY_NO_SENSE) {
2290 				doprint = 0;
2291 			}
2292 		} else if (sense->flags & SSD_FILEMARK) {
2293 			retval = SCSIRET_NOERROR;
2294 		} else if (sense->flags & SSD_ILI) {
2295 			if (info < 0) {
2296 				/*
2297 				 * The tape record was bigger than the read
2298 				 * we issued.
2299 				 */
2300 				if ((xs->xs_control & XS_CTL_SILENT) == 0) {
2301 					printf("%s: %d-byte tape record too big"
2302 					    " for %d-byte user buffer\n",
2303 					    st->sc_dev.dv_xname,
2304 					    xs->datalen - info, xs->datalen);
2305 				}
2306 				retval = EIO;
2307 			} else {
2308 				retval = SCSIRET_NOERROR;
2309 			}
2310 		}
2311 		xs->resid = info;
2312 		if (bp)
2313 			bp->b_resid = info;
2314 	}
2315 
2316 #ifndef	SCSIDEBUG
2317 	if (retval == SCSIRET_NOERROR && key == SKEY_NO_SENSE) {
2318 		doprint = 0;
2319 	}
2320 #endif
2321 	if (key == SKEY_BLANK_CHECK) {
2322 		/*
2323 		 * This quirk code helps the drive read the
2324 		 * first tape block, regardless of format.  That
2325 		 * is required for these drives to return proper
2326 		 * MODE SENSE information.
2327 		 */
2328 		if ((st->quirks & ST_Q_SENSE_HELP) &&
2329 		    !(sc_link->flags & SDEV_MEDIA_LOADED)) {
2330 			/* still starting */
2331 			st->blksize -= 512;
2332 		} else if (!(st->flags & (ST_2FM_AT_EOD | ST_BLANK_READ))) {
2333 			st->flags |= ST_BLANK_READ;
2334 			xs->resid = xs->datalen;
2335 			if (bp) {
2336 				bp->b_resid = xs->resid;
2337 				/* return an EOF */
2338 			}
2339 			retval = SCSIRET_NOERROR;
2340 		}
2341 	}
2342 #ifdef	SCSIVERBOSE
2343 	if (doprint) {
2344 		scsipi_print_sense(xs, 0);
2345 	}
2346 #else
2347 	if (doprint) {
2348 		xs->sc_link->sc_print_addr(xs->sc_link);
2349 		printf("Sense Key 0x%02x", key);
2350 		if ((sense->error_code & SSD_ERRCODE_VALID) != 0) {
2351 			switch (key) {
2352 			case SKEY_NOT_READY:
2353 			case SKEY_ILLEGAL_REQUEST:
2354 			case SKEY_UNIT_ATTENTION:
2355 			case SKEY_WRITE_PROTECT:
2356 				break;
2357 			case SKEY_BLANK_CHECK:
2358 				printf(", requested size: %d (decimal)", info);
2359 				break;
2360 			case SKEY_ABORTED_COMMAND:
2361 				if (xs->retries)
2362 					printf(", retrying");
2363 				printf(", cmd 0x%x, info 0x%x",
2364 				    xs->cmd->opcode, info);
2365 				break;
2366 			default:
2367 				printf(", info = %d (decimal)", info);
2368 			}
2369 		}
2370 		if (sense->extra_len != 0) {
2371 			int n;
2372 			printf(", data =");
2373 			for (n = 0; n < sense->extra_len; n++)
2374 				printf(" %02x", sense->cmd_spec_info[n]);
2375 		}
2376 		printf("\n");
2377 	}
2378 #endif
2379 	return (retval);
2380 }
2381 
2382 /*
2383  * The quirk here is that the drive returns some value to st_mode_sense
2384  * incorrectly until the tape has actually passed by the head.
2385  *
2386  * The method is to set the drive to large fixed-block state (user-specified
2387  * density and 1024-byte blocks), then read and rewind to get it to sense the
2388  * tape.  If that doesn't work, try 512-byte fixed blocks.  If that doesn't
2389  * work, as a last resort, try variable- length blocks.  The result will be
2390  * the ability to do an accurate st_mode_sense.
2391  *
2392  * We know we can do a rewind because we just did a load, which implies rewind.
2393  * Rewind seems preferable to space backward if we have a virgin tape.
2394  *
2395  * The rest of the code for this quirk is in ILI processing and BLANK CHECK
2396  * error processing, both part of st_interpret_sense.
2397  */
2398 int
2399 st_touch_tape(st)
2400 	struct st_softc *st;
2401 {
2402 	char *buf;
2403 	int readsize;
2404 	int error;
2405 
2406 	buf = malloc(1024, M_TEMP, M_NOWAIT);
2407 	if (buf == NULL)
2408 		return (ENOMEM);
2409 
2410 	if ((error = st_mode_sense(st, 0)) != 0)
2411 		goto bad;
2412 	st->blksize = 1024;
2413 	do {
2414 		switch (st->blksize) {
2415 		case 512:
2416 		case 1024:
2417 			readsize = st->blksize;
2418 			st->flags |= ST_FIXEDBLOCKS;
2419 			break;
2420 		default:
2421 			readsize = 1;
2422 			st->flags &= ~ST_FIXEDBLOCKS;
2423 		}
2424 		if ((error = st_mode_select(st, 0)) != 0)
2425 			goto bad;
2426 		st_read(st, buf, readsize, XS_CTL_SILENT);	/* XXX */
2427 		if ((error = st_rewind(st, 0, 0)) != 0) {
2428 bad:			free(buf, M_TEMP);
2429 			return (error);
2430 		}
2431 	} while (readsize != 1 && readsize > st->blksize);
2432 
2433 	free(buf, M_TEMP);
2434 	return (0);
2435 }
2436 
2437 int
2438 stdump(dev, blkno, va, size)
2439 	dev_t dev;
2440 	daddr_t blkno;
2441 	caddr_t va;
2442 	size_t size;
2443 {
2444 
2445 	/* Not implemented. */
2446 	return (ENXIO);
2447 }
2448