xref: /illumos-gate/usr/src/uts/common/io/scsi/targets/st.c (revision 9f931db8ff77a6b55fe0a9f1be60c8a6d13654b5)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 /*
30  * SCSI	 SCSA-compliant and not-so-DDI-compliant Tape Driver
31  */
32 
33 #if defined(lint) && !defined(DEBUG)
34 #define	DEBUG	1
35 #endif
36 
37 #include <sys/modctl.h>
38 #include <sys/scsi/scsi.h>
39 #include <sys/mtio.h>
40 #include <sys/scsi/targets/stdef.h>
41 #include <sys/file.h>
42 #include <sys/kstat.h>
43 #include <sys/ddidmareq.h>
44 #include <sys/ddi.h>
45 #include <sys/sunddi.h>
46 #include <sys/byteorder.h>
47 
48 #define	IOSP	KSTAT_IO_PTR(un->un_stats)
49 /*
50  * stats maintained only for reads/writes as commands
51  * like rewind etc skew the wait/busy times
52  */
53 #define	IS_RW(bp) 	((bp)->b_bcount > 0)
54 #define	ST_DO_KSTATS(bp, kstat_function) \
55 	if ((bp != un->un_sbufp) && un->un_stats && IS_RW(bp)) { \
56 		kstat_function(IOSP); \
57 	}
58 
59 #define	ST_DO_ERRSTATS(un, x)  \
60 	if (un->un_errstats) { \
61 		struct st_errstats *stp; \
62 		stp = (struct st_errstats *)un->un_errstats->ks_data; \
63 		stp->x.value.ul++; \
64 	}
65 
66 #define	FILL_SCSI1_LUN(devp, pkt) 					\
67 	if ((devp)->sd_inq->inq_ansi == 0x1) {				\
68 		int _lun;						\
69 		_lun = ddi_prop_get_int(DDI_DEV_T_ANY, (devp)->sd_dev,	\
70 		    DDI_PROP_DONTPASS, SCSI_ADDR_PROP_LUN, 0);		\
71 		if (_lun > 0) {						\
72 			((union scsi_cdb *)(pkt)->pkt_cdbp)->scc_lun =	\
73 			    _lun;					\
74 		}							\
75 	}
76 
77 /*
78  * get an available contig mem header, cp.
79  * when big_enough is true, we will return NULL, if no big enough
80  * contig mem is found.
81  * when big_enough is false, we will try to find cp containing big
82  * enough contig mem. if not found, we will ruturn the last cp available.
83  *
84  * used by st_get_contig_mem()
85  */
86 #define	ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough) {		\
87 	struct contig_mem *tmp_cp = NULL;				\
88 	for ((cp) = (un)->un_contig_mem;				\
89 	    (cp) != NULL;						\
90 	    tmp_cp = (cp), (cp) = (cp)->cm_next) { 			\
91 		if (((cp)->cm_len >= (len)) || 				\
92 		    (!(big_enough) && ((cp)->cm_next == NULL))) { 	\
93 			if (tmp_cp == NULL) { 				\
94 				(un)->un_contig_mem = (cp)->cm_next; 	\
95 			} else { 					\
96 				tmp_cp->cm_next = (cp)->cm_next; 	\
97 			} 						\
98 			(cp)->cm_next = NULL; 				\
99 			(un)->un_contig_mem_available_num--; 		\
100 			break; 						\
101 		} 							\
102 	} 								\
103 }
104 
105 #define	ST_NUM_MEMBERS(array)	(sizeof (array) / sizeof (array[0]))
106 #define	COPY_POS(dest, source) bcopy(source, dest, sizeof (tapepos_t))
107 
108 #define	ONE_K	1024
109 
110 /*
111  * Global External Data Definitions
112  */
113 extern struct scsi_key_strings scsi_cmds[];
114 extern uchar_t	scsi_cdb_size[];
115 
116 /*
117  * Local Static Data
118  */
119 static void *st_state;
120 static char *const st_label = "st";
121 
122 #ifdef	__x86
123 /*
124  * We need to use below DMA attr to alloc physically contiguous
125  * memory to do I/O in big block size
126  */
127 static ddi_dma_attr_t st_contig_mem_dma_attr = {
128 	DMA_ATTR_V0,    /* version number */
129 	0x0,		/* lowest usable address */
130 	0xFFFFFFFFull,  /* high DMA address range */
131 	0xFFFFFFFFull,  /* DMA counter register */
132 	1,		/* DMA address alignment */
133 	1,		/* DMA burstsizes */
134 	1,		/* min effective DMA size */
135 	0xFFFFFFFFull,  /* max DMA xfer size */
136 	0xFFFFFFFFull,  /* segment boundary */
137 	1,		/* s/g list length */
138 	1,		/* granularity of device */
139 	0		/* DMA transfer flags */
140 };
141 
142 static ddi_device_acc_attr_t st_acc_attr = {
143 	DDI_DEVICE_ATTR_V0,
144 	DDI_NEVERSWAP_ACC,
145 	DDI_STRICTORDER_ACC
146 };
147 
148 /* set limitation for the number of contig_mem */
149 static int st_max_contig_mem_num = ST_MAX_CONTIG_MEM_NUM;
150 #endif
151 
152 /*
153  * Tunable parameters
154  *
155  * DISCLAIMER
156  * ----------
157  * These parameters are intended for use only in system testing; if you use
158  * them in production systems, you do so at your own risk. Altering any
159  * variable not listed below may cause unpredictable system behavior.
160  *
161  * st_check_media_time
162  *
163  *   Three second state check
164  *
165  * st_allow_large_xfer
166  *
167  *   Gated with ST_NO_RECSIZE_LIMIT
168  *
169  *   0 - Transfers larger than 64KB will not be allowed
170  *       regardless of the setting of ST_NO_RECSIZE_LIMIT
171  *   1 - Transfers larger than 64KB will be allowed
172  *       if ST_NO_RECSIZE_LIMIT is TRUE for the drive
173  *
174  * st_report_soft_errors_on_close
175  *
176  *  Gated with ST_SOFT_ERROR_REPORTING
177  *
178  *  0 - Errors will not be reported on close regardless
179  *      of the setting of ST_SOFT_ERROR_REPORTING
180  *
181  *  1 - Errors will be reported on close if
182  *      ST_SOFT_ERROR_REPORTING is TRUE for the drive
183  */
184 static int st_selection_retry_count = ST_SEL_RETRY_COUNT;
185 static int st_retry_count	= ST_RETRY_COUNT;
186 
187 static int st_io_time		= ST_IO_TIME;
188 static int st_long_timeout_x	= ST_LONG_TIMEOUT_X;
189 
190 static int st_space_time	= ST_SPACE_TIME;
191 static int st_long_space_time_x	= ST_LONG_SPACE_TIME_X;
192 
193 static int st_error_level	= SCSI_ERR_RETRYABLE;
194 static int st_check_media_time	= 3000000;	/* 3 Second State Check */
195 
196 static int st_max_throttle	= ST_MAX_THROTTLE;
197 
198 static clock_t st_wait_cmds_complete = ST_WAIT_CMDS_COMPLETE;
199 
200 static int st_allow_large_xfer = 1;
201 static int st_report_soft_errors_on_close = 1;
202 
203 /*
204  * End of tunable parameters list
205  */
206 
207 
208 
209 /*
210  * Asynchronous I/O and persistent errors, refer to PSARC/1995/228
211  *
212  * Asynchronous I/O's main offering is that it is a non-blocking way to do
213  * reads and writes.  The driver will queue up all the requests it gets and
214  * have them ready to transport to the HBA.  Unfortunately, we cannot always
215  * just ship the I/O requests to the HBA, as there errors and exceptions
216  * that may happen when we don't want the HBA to continue.  Therein comes
217  * the flush-on-errors capability.  If the HBA supports it, then st will
218  * send in st_max_throttle I/O requests at the same time.
219  *
220  * Persistent errors : This was also reasonably simple.  In the interrupt
221  * routines, if there was an error or exception (FM, LEOT, media error,
222  * transport error), the persistent error bits are set and shuts everything
223  * down, but setting the throttle to zero.  If we hit and exception in the
224  * HBA, and flush-on-errors were set, we wait for all outstanding I/O's to
225  * come back (with CMD_ABORTED), then flush all bp's in the wait queue with
226  * the appropriate error, and this will preserve order. Of course, depending
227  * on the exception we have to show a zero read or write before we show
228  * errors back to the application.
229  */
230 
231 extern const int st_ndrivetypes;	/* defined in st_conf.c */
232 extern const struct st_drivetype st_drivetypes[];
233 extern const char st_conf_version[];
234 
235 #ifdef STDEBUG
236 static int st_soft_error_report_debug = 0;
237 volatile int st_debug = 0;
238 #endif
239 
240 #define	ST_MT02_NAME	"Emulex  MT02 QIC-11/24  "
241 
242 static const struct vid_drivetype {
243 	char	*vid;
244 	char	type;
245 } st_vid_dt[] = {
246 	{"LTO-CVE ",	MT_LTO},
247 	{"QUANTUM ",    MT_ISDLT},
248 	{"SONY    ",    MT_ISAIT},
249 	{"STK     ",	MT_ISSTK9840}
250 };
251 
252 static const struct driver_minor_data {
253 	char	*name;
254 	int	minor;
255 } st_minor_data[] = {
256 	/*
257 	 * The top 4 entries are for the default densities,
258 	 * don't alter their position.
259 	 */
260 	{"",	0},
261 	{"n",	MT_NOREWIND},
262 	{"b",	MT_BSD},
263 	{"bn",	MT_NOREWIND | MT_BSD},
264 	{"l",	MT_DENSITY1},
265 	{"m",	MT_DENSITY2},
266 	{"h",	MT_DENSITY3},
267 	{"c",	MT_DENSITY4},
268 	{"u",	MT_DENSITY4},
269 	{"ln",	MT_DENSITY1 | MT_NOREWIND},
270 	{"mn",	MT_DENSITY2 | MT_NOREWIND},
271 	{"hn",	MT_DENSITY3 | MT_NOREWIND},
272 	{"cn",	MT_DENSITY4 | MT_NOREWIND},
273 	{"un",	MT_DENSITY4 | MT_NOREWIND},
274 	{"lb",	MT_DENSITY1 | MT_BSD},
275 	{"mb",	MT_DENSITY2 | MT_BSD},
276 	{"hb",	MT_DENSITY3 | MT_BSD},
277 	{"cb",	MT_DENSITY4 | MT_BSD},
278 	{"ub",	MT_DENSITY4 | MT_BSD},
279 	{"lbn",	MT_DENSITY1 | MT_NOREWIND | MT_BSD},
280 	{"mbn",	MT_DENSITY2 | MT_NOREWIND | MT_BSD},
281 	{"hbn",	MT_DENSITY3 | MT_NOREWIND | MT_BSD},
282 	{"cbn",	MT_DENSITY4 | MT_NOREWIND | MT_BSD},
283 	{"ubn",	MT_DENSITY4 | MT_NOREWIND | MT_BSD}
284 };
285 
286 /* strings used in many debug and warning messages */
287 static const char wr_str[]  = "write";
288 static const char rd_str[]  = "read";
289 static const char wrg_str[] = "writing";
290 static const char rdg_str[] = "reading";
291 static const char *space_strs[] = {
292 	"records",
293 	"filemarks",
294 	"sequential filemarks",
295 	"eod",
296 	"setmarks",
297 	"sequential setmarks",
298 	"Reserved",
299 	"Reserved"
300 };
301 
302 /* default density offsets in the table above */
303 #define	DEF_BLANK	0
304 #define	DEF_NOREWIND	1
305 #define	DEF_BSD		2
306 #define	DEF_BSD_NR	3
307 
308 /* Sense Key, ASC/ASCQ for which tape ejection is needed */
309 
310 static struct tape_failure_code {
311 	uchar_t key;
312 	uchar_t add_code;
313 	uchar_t qual_code;
314 } st_tape_failure_code[] = {
315 	{ KEY_HARDWARE_ERROR, 0x15, 0x01},
316 	{ KEY_HARDWARE_ERROR, 0x44, 0x00},
317 	{ KEY_HARDWARE_ERROR, 0x53, 0x00},
318 	{ KEY_HARDWARE_ERROR, 0x53, 0x01},
319 	{ KEY_NOT_READY, 0x53, 0x00},
320 	{ 0xff}
321 };
322 
323 /*  clean bit position and mask */
324 
325 static struct cln_bit_position {
326 	ushort_t cln_bit_byte;
327 	uchar_t cln_bit_mask;
328 } st_cln_bit_position[] = {
329 	{ 21, 0x08},
330 	{ 70, 0xc0},
331 	{ 18, 0x81}  /* 80 bit indicates in bit mode, 1 bit clean light is on */
332 };
333 
334 /*
335  * architecture dependent allocation restrictions. For x86, we'll set
336  * dma_attr_addr_hi to st_max_phys_addr and dma_attr_sgllen to
337  * st_sgl_size during _init().
338  */
339 #if defined(__sparc)
340 static ddi_dma_attr_t st_alloc_attr = {
341 	DMA_ATTR_V0,	/* version number */
342 	0x0,		/* lowest usable address */
343 	0xFFFFFFFFull,	/* high DMA address range */
344 	0xFFFFFFFFull,	/* DMA counter register */
345 	1,		/* DMA address alignment */
346 	1,		/* DMA burstsizes */
347 	1,		/* min effective DMA size */
348 	0xFFFFFFFFull,	/* max DMA xfer size */
349 	0xFFFFFFFFull,	/* segment boundary */
350 	1,		/* s/g list length */
351 	512,		/* granularity of device */
352 	0		/* DMA transfer flags */
353 };
354 #elif defined(__x86)
355 static ddi_dma_attr_t st_alloc_attr = {
356 	DMA_ATTR_V0,	/* version number */
357 	0x0,		/* lowest usable address */
358 	0x0,		/* high DMA address range [set in _init()] */
359 	0xFFFFull,	/* DMA counter register */
360 	512,		/* DMA address alignment */
361 	1,		/* DMA burstsizes */
362 	1,		/* min effective DMA size */
363 	0xFFFFFFFFull,	/* max DMA xfer size */
364 	0xFFFFFFFFull,  /* segment boundary */
365 	0,		/* s/g list length */
366 	512,		/* granularity of device [set in _init()] */
367 	0		/* DMA transfer flags */
368 };
369 uint64_t st_max_phys_addr = 0xFFFFFFFFull;
370 int st_sgl_size = 0xF;
371 
372 #endif
373 
374 /*
375  * Configuration Data:
376  *
377  * Device driver ops vector
378  */
379 static int st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p);
380 static int st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p);
381 static int st_read(dev_t  dev,  struct   uio   *uio_p,   cred_t *cred_p);
382 static int st_write(dev_t  dev,  struct  uio   *uio_p,   cred_t *cred_p);
383 static int st_open(dev_t  *devp,  int  flag,  int  otyp,  cred_t *cred_p);
384 static int st_close(dev_t  dev,  int  flag,  int  otyp,  cred_t *cred_p);
385 static int st_strategy(struct buf *bp);
386 static int st_ioctl(dev_t dev, int cmd, intptr_t arg, int  flag,
387 	cred_t *cred_p, int *rval_p);
388 extern int nulldev(), nodev();
389 
390 static struct cb_ops st_cb_ops = {
391 	st_open,		/* open */
392 	st_close,		/* close */
393 	st_strategy,		/* strategy */
394 	nodev,			/* print */
395 	nodev,			/* dump */
396 	st_read,		/* read */
397 	st_write,		/* write */
398 	st_ioctl,		/* ioctl */
399 	nodev,			/* devmap */
400 	nodev,			/* mmap */
401 	nodev,			/* segmap */
402 	nochpoll,		/* poll */
403 	ddi_prop_op,		/* cb_prop_op */
404 	0,			/* streamtab  */
405 	D_64BIT | D_MP | D_NEW | D_HOTPLUG |
406 	D_OPEN_RETURNS_EINTR,	/* cb_flag */
407 	CB_REV,			/* cb_rev */
408 	st_aread, 		/* async I/O read entry point */
409 	st_awrite		/* async I/O write entry point */
410 
411 };
412 
413 static int stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
414 		void **result);
415 static int st_probe(dev_info_t *dev);
416 static int st_attach(dev_info_t *dev, ddi_attach_cmd_t cmd);
417 static int st_detach(dev_info_t *dev, ddi_detach_cmd_t cmd);
418 
419 static struct dev_ops st_ops = {
420 	DEVO_REV,		/* devo_rev, */
421 	0,			/* refcnt  */
422 	stinfo,			/* info */
423 	nulldev,		/* identify */
424 	st_probe,		/* probe */
425 	st_attach,		/* attach */
426 	st_detach,		/* detach */
427 	nodev,			/* reset */
428 	&st_cb_ops,		/* driver operations */
429 	(struct bus_ops *)0,	/* bus operations */
430 	nulldev			/* power */
431 };
432 
433 /*
434  * Local Function Declarations
435  */
436 static char *st_print_scsi_cmd(char cmd);
437 static void st_print_cdb(dev_info_t *dip, char *label, uint_t level,
438     char *title, char *cdb);
439 static void st_clean_print(dev_info_t *dev, char *label, uint_t level,
440 	char *title, char *data, int len);
441 static int st_doattach(struct scsi_device *devp, int (*canwait)());
442 static void st_known_tape_type(struct scsi_tape *un);
443 static int st_get_conf_from_st_dot_conf(struct scsi_tape *, char *,
444     struct st_drivetype *);
445 static int st_get_conf_from_st_conf_dot_c(struct scsi_tape *, char *,
446     struct st_drivetype *);
447 static int st_get_conf_from_tape_drive(struct scsi_tape *, char *,
448     struct st_drivetype *);
449 static int st_get_densities_from_tape_drive(struct scsi_tape *,
450     struct st_drivetype *);
451 static int st_get_timeout_values_from_tape_drive(struct scsi_tape *,
452     struct st_drivetype *);
453 static int st_get_timeouts_value(struct scsi_tape *, uchar_t, ushort_t *,
454     ushort_t);
455 static int st_get_default_conf(struct scsi_tape *, char *,
456     struct st_drivetype *);
457 static int st_rw(dev_t dev, struct uio *uio, int flag);
458 static int st_arw(dev_t dev, struct aio_req *aio, int flag);
459 static int st_find_eod(dev_t dev);
460 static int st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag);
461 static int st_ioctl_cmd(dev_t dev, struct uscsi_cmd *, int flag);
462 static int st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag);
463 static int st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag);
464 static int st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop);
465 static void st_start(struct scsi_tape *un);
466 static int st_handle_start_busy(struct scsi_tape *un, struct buf *bp,
467     clock_t timeout_interval);
468 static int st_handle_intr_busy(struct scsi_tape *un, struct buf *bp,
469     clock_t timeout_interval);
470 static int st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp);
471 static void st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp);
472 static void st_init(struct scsi_tape *un);
473 static void st_make_cmd(struct scsi_tape *un, struct buf *bp,
474     int (*func)(caddr_t));
475 static void st_make_uscsi_cmd(struct scsi_tape *, struct uscsi_cmd *,
476     struct buf *bp, int (*func)(caddr_t));
477 static void st_intr(struct scsi_pkt *pkt);
478 static void st_set_state(struct scsi_tape *un);
479 static void st_test_append(struct buf *bp);
480 static int st_runout(caddr_t);
481 static int st_cmd(dev_t dev, int com, int count, int wait);
482 static int st_set_compression(struct scsi_tape *un);
483 static int st_write_fm(dev_t dev, int wfm);
484 static int st_determine_generic(dev_t dev);
485 static int st_determine_density(dev_t dev, int rw);
486 static int st_get_density(dev_t dev);
487 static int st_set_density(dev_t dev);
488 static int st_loadtape(dev_t dev);
489 static int st_modesense(struct scsi_tape *un);
490 static int st_modeselect(struct scsi_tape *un);
491 static int st_handle_incomplete(struct scsi_tape *un, struct buf *bp);
492 static int st_wrongtapetype(struct scsi_tape *un);
493 static int st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt);
494 static int st_handle_sense(struct scsi_tape *un, struct buf *bp);
495 static int st_handle_autosense(struct scsi_tape *un, struct buf *bp);
496 static int st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt,
497     struct scsi_status *);
498 static int st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag);
499 static void st_update_error_stack(struct scsi_tape *un, struct scsi_pkt *pkt,
500     struct scsi_arq_status *cmd);
501 static void st_empty_error_stack(struct scsi_tape *un);
502 static int st_report_soft_errors(dev_t dev, int flag);
503 static void st_delayed_cv_broadcast(void *arg);
504 static int st_check_media(dev_t dev, enum mtio_state state);
505 static int st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
506 static void st_intr_restart(void *arg);
507 static void st_start_restart(void *arg);
508 static int st_gen_mode_sense(struct scsi_tape *un, int page,
509     struct seq_mode *page_data, int page_size);
510 static int st_change_block_size(dev_t dev, uint32_t nblksz);
511 static int st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data,
512     int page_size);
513 static int st_read_block_limits(struct scsi_tape *un,
514     struct read_blklim *read_blk);
515 static int st_report_density_support(struct scsi_tape *un,
516     uchar_t *density_data, size_t buflen);
517 static int st_report_supported_operation(struct scsi_tape *un,
518     uchar_t *oper_data, uchar_t option_code, ushort_t service_action);
519 static int st_tape_init(dev_t dev);
520 static void st_flush(struct scsi_tape *un);
521 static void st_set_pe_errno(struct scsi_tape *un);
522 static void st_hba_unflush(struct scsi_tape *un);
523 static void st_turn_pe_on(struct scsi_tape *un);
524 static void st_turn_pe_off(struct scsi_tape *un);
525 static void st_set_pe_flag(struct scsi_tape *un);
526 static void st_clear_pe(struct scsi_tape *un);
527 static void st_wait_for_io(struct scsi_tape *un);
528 static int st_set_devconfig_page(struct scsi_tape *un, int compression_on);
529 static int st_set_datacomp_page(struct scsi_tape *un, int compression_on);
530 static int st_reserve_release(struct scsi_tape *un, int command);
531 static int st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb);
532 static int st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd,
533     int count);
534 static int st_take_ownership(dev_t dev);
535 static int st_check_asc_ascq(struct scsi_tape *un);
536 static int st_check_clean_bit(dev_t dev);
537 static int st_check_alert_flags(dev_t dev);
538 static int st_check_sequential_clean_bit(dev_t dev);
539 static int st_check_sense_clean_bit(dev_t dev);
540 static int st_clear_unit_attentions(dev_t dev_instance, int max_trys);
541 static void st_calculate_timeouts(struct scsi_tape *un);
542 static writablity st_is_drive_worm(struct scsi_tape *un);
543 static int st_read_attributes(struct scsi_tape *un, uint16_t attribute,
544     caddr_t buf, size_t size);
545 static int st_get_special_inquiry(struct scsi_tape *un, uchar_t size,
546     caddr_t dest, uchar_t page);
547 static int st_update_block_pos(struct scsi_tape *un);
548 static int st_interpret_read_pos(struct scsi_tape *un, read_p_types type,
549     size_t data_sz, caddr_t responce);
550 static int st_get_read_pos(struct scsi_tape *un, buf_t *bp);
551 static int st_logical_block_locate(struct scsi_tape *un, uint64_t lblk,
552     uchar_t partition);
553 static int st_mtfsf_ioctl(struct scsi_tape *un, int files);
554 static int st_mtfsr_ioctl(struct scsi_tape *un, int count);
555 static int st_mtbsf_ioctl(struct scsi_tape *un, int files);
556 static int st_mtnbsf_ioctl(struct scsi_tape *un, int count);
557 static int st_mtbsr_ioctl(struct scsi_tape *un, int num);
558 static int st_mtfsfm_ioctl(struct scsi_tape *un, int cnt);
559 static int st_mtbsfm_ioctl(struct scsi_tape *un, int cnt);
560 static int st_backward_space_files(struct scsi_tape *un, int count,
561     int infront);
562 static int st_forward_space_files(struct scsi_tape *un, int files);
563 static int st_scenic_route_to_begining_of_file(struct scsi_tape *un,
564     int32_t fileno);
565 static int st_space_to_begining_of_file(struct scsi_tape *un);
566 static int st_space_records(struct scsi_tape *un, int records);
567 
568 #ifdef	__x86
569 /*
570  * routines for I/O in big block size
571  */
572 static void st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp);
573 static struct contig_mem *st_get_contig_mem(struct scsi_tape *un, size_t len,
574     int alloc_flags);
575 static int st_bigblk_xfer_done(struct buf *bp);
576 static struct buf *st_get_bigblk_bp(struct buf *bp);
577 #endif
578 static void st_print_position(struct scsi_tape *un, const char *comment,
579     tapepos_t *pos);
580 
581 /*
582  * error statistics create/update functions
583  */
584 static int st_create_errstats(struct scsi_tape *, int);
585 static int st_validate_tapemarks(struct scsi_tape *un, tapepos_t *pos);
586 
587 #ifdef STDEBUG
588 static void st_debug_cmds(struct scsi_tape *un, int com, int count, int wait);
589 static char *st_dev_name(dev_t dev);
590 #endif /* STDEBUG */
591 
592 #if !defined(lint)
593 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt",
594     scsi_pkt buf uio scsi_cdb uscsi_cmd))
595 _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_extended_sense scsi_status))
596 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device))
597 _NOTE(DATA_READABLE_WITHOUT_LOCK(st_drivetype scsi_address))
598 #endif
599 
600 /*
601  * autoconfiguration routines.
602  */
603 char _depends_on[] = "misc/scsi";
604 
605 static struct modldrv modldrv = {
606 	&mod_driverops,		/* Type of module. This one is a driver */
607 	"SCSI tape Driver %I%", /* Name of the module. */
608 	&st_ops			/* driver ops */
609 };
610 
611 static struct modlinkage modlinkage = {
612 	MODREV_1, &modldrv, NULL
613 };
614 
615 /*
616  * Notes on Post Reset Behavior in the tape driver:
617  *
618  * When the tape drive is opened, the driver  attempts  to make sure that
619  * the tape head is positioned exactly where it was left when it was last
620  * closed  provided  the  medium  is not  changed.  If the tape  drive is
621  * opened in O_NDELAY mode, the repositioning  (if necessary for any loss
622  * of position due to reset) will happen when the first tape operation or
623  * I/O occurs.  The repositioning (if required) may not be possible under
624  * certain situations such as when the device firmware not able to report
625  * the medium  change in the REQUEST  SENSE data  because of a reset or a
626  * misbehaving  bus  not  allowing  the  reposition  to  happen.  In such
627  * extraordinary  situations, where the driver fails to position the head
628  * at its  original  position,  it will fail the open the first  time, to
629  * save the applications from overwriting the data.  All further attempts
630  * to open the tape device will result in the driver  attempting  to load
631  * the  tape at BOT  (beginning  of  tape).  Also a  warning  message  to
632  * indicate  that further  attempts to open the tape device may result in
633  * the tape being  loaded at BOT will be printed on the  console.  If the
634  * tape  device is opened  in  O_NDELAY  mode,  failure  to  restore  the
635  * original tape head  position,  will result in the failure of the first
636  * tape  operation  or I/O,  Further,  the  driver  will  invalidate  its
637  * internal tape position  which will  necessitate  the  applications  to
638  * validate the position by using either a tape  positioning  ioctl (such
639  * as MTREW) or closing and reopening the tape device.
640  *
641  */
642 
643 int
644 _init(void)
645 {
646 	int	e;
647 
648 	if (((e = ddi_soft_state_init(&st_state,
649 	    sizeof (struct scsi_tape), ST_MAXUNIT)) != 0)) {
650 		return (e);
651 	}
652 
653 	if ((e = mod_install(&modlinkage)) != 0) {
654 		ddi_soft_state_fini(&st_state);
655 	}
656 
657 #if defined(__x86)
658 	/* set the max physical address for iob allocs on x86 */
659 	st_alloc_attr.dma_attr_addr_hi = st_max_phys_addr;
660 
661 	/*
662 	 * set the sgllen for iob allocs on x86. If this is set less than
663 	 * the number of pages the buffer will take (taking into account
664 	 * alignment), it would force the allocator to try and allocate
665 	 * contiguous pages.
666 	 */
667 	st_alloc_attr.dma_attr_sgllen = st_sgl_size;
668 #endif
669 
670 	return (e);
671 }
672 
673 int
674 _fini(void)
675 {
676 	int e;
677 
678 	if ((e = mod_remove(&modlinkage)) != 0) {
679 		return (e);
680 	}
681 
682 	ddi_soft_state_fini(&st_state);
683 
684 	return (e);
685 }
686 
687 int
688 _info(struct modinfo *modinfop)
689 {
690 	return (mod_info(&modlinkage, modinfop));
691 }
692 
693 
694 static int
695 st_probe(dev_info_t *devi)
696 {
697 	int instance;
698 	struct scsi_device *devp;
699 	int rval;
700 
701 #if !defined(__sparc)
702 	char    *tape_prop;
703 	int	tape_prop_len;
704 #endif
705 
706 	ST_ENTR(devi, st_probe);
707 
708 	/* If self identifying device */
709 	if (ddi_dev_is_sid(devi) == DDI_SUCCESS) {
710 		return (DDI_PROBE_DONTCARE);
711 	}
712 
713 #if !defined(__sparc)
714 	/*
715 	 * Since some x86 HBAs have devnodes that look like SCSI as
716 	 * far as we can tell but aren't really SCSI (DADK, like mlx)
717 	 * we check for the presence of the "tape" property.
718 	 */
719 	if (ddi_prop_op(DDI_DEV_T_NONE, devi, PROP_LEN_AND_VAL_ALLOC,
720 	    DDI_PROP_CANSLEEP, "tape",
721 	    (caddr_t)&tape_prop, &tape_prop_len) != DDI_PROP_SUCCESS) {
722 		return (DDI_PROBE_FAILURE);
723 	}
724 	if (strncmp(tape_prop, "sctp", tape_prop_len) != 0) {
725 		kmem_free(tape_prop, tape_prop_len);
726 		return (DDI_PROBE_FAILURE);
727 	}
728 	kmem_free(tape_prop, tape_prop_len);
729 #endif
730 
731 	devp = ddi_get_driver_private(devi);
732 	instance = ddi_get_instance(devi);
733 
734 	if (ddi_get_soft_state(st_state, instance) != NULL) {
735 		return (DDI_PROBE_PARTIAL);
736 	}
737 
738 
739 	/*
740 	 * Turn around and call probe routine to see whether
741 	 * we actually have a tape at this SCSI nexus.
742 	 */
743 	if (scsi_probe(devp, NULL_FUNC) == SCSIPROBE_EXISTS) {
744 
745 		/*
746 		 * In checking the whole inq_dtype byte we are looking at both
747 		 * the Peripheral Qualifier and the Peripheral Device Type.
748 		 * For this driver we are only interested in sequential devices
749 		 * that are connected or capable if connecting to this logical
750 		 * unit.
751 		 */
752 		if (devp->sd_inq->inq_dtype ==
753 		    (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) {
754 			ST_DEBUG6(devi, st_label, SCSI_DEBUG,
755 			    "probe exists\n");
756 			rval = DDI_PROBE_SUCCESS;
757 		} else {
758 			rval = DDI_PROBE_FAILURE;
759 		}
760 	} else {
761 		ST_DEBUG6(devi, st_label, SCSI_DEBUG,
762 		    "probe failure: nothing there\n");
763 		rval = DDI_PROBE_FAILURE;
764 	}
765 	scsi_unprobe(devp);
766 	return (rval);
767 }
768 
769 static int
770 st_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
771 {
772 	int 	instance;
773 	int	wide;
774 	int 	dev_instance;
775 	int	ret_status;
776 	struct	scsi_device *devp;
777 	int	node_ix;
778 	struct	scsi_tape *un;
779 
780 	ST_ENTR(devi, st_attach);
781 
782 	devp = ddi_get_driver_private(devi);
783 	instance = ddi_get_instance(devi);
784 
785 	switch (cmd) {
786 		case DDI_ATTACH:
787 			if (st_doattach(devp, SLEEP_FUNC) == DDI_FAILURE) {
788 				return (DDI_FAILURE);
789 			}
790 			break;
791 		case DDI_RESUME:
792 			/*
793 			 * Suspend/Resume
794 			 *
795 			 * When the driver suspended, there might be
796 			 * outstanding cmds and therefore we need to
797 			 * reset the suspended flag and resume the scsi
798 			 * watch thread and restart commands and timeouts
799 			 */
800 
801 			if (!(un = ddi_get_soft_state(st_state, instance))) {
802 				return (DDI_FAILURE);
803 			}
804 			dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) :
805 			    un->un_dev);
806 
807 			mutex_enter(ST_MUTEX);
808 
809 			un->un_throttle = un->un_max_throttle;
810 			un->un_tids_at_suspend = 0;
811 			un->un_pwr_mgmt = ST_PWR_NORMAL;
812 
813 			if (un->un_swr_token) {
814 				scsi_watch_resume(un->un_swr_token);
815 			}
816 
817 			/*
818 			 * Restart timeouts
819 			 */
820 			if ((un->un_tids_at_suspend & ST_DELAY_TID) != 0) {
821 				mutex_exit(ST_MUTEX);
822 				un->un_delay_tid = timeout(
823 				    st_delayed_cv_broadcast, un,
824 				    drv_usectohz((clock_t)
825 				    MEDIA_ACCESS_DELAY));
826 				mutex_enter(ST_MUTEX);
827 			}
828 
829 			if (un->un_tids_at_suspend & ST_HIB_TID) {
830 				mutex_exit(ST_MUTEX);
831 				un->un_hib_tid = timeout(st_intr_restart, un,
832 				    ST_STATUS_BUSY_TIMEOUT);
833 				mutex_enter(ST_MUTEX);
834 			}
835 
836 			ret_status = st_clear_unit_attentions(dev_instance, 5);
837 
838 			/*
839 			 * now check if we need to restore the tape position
840 			 */
841 			if ((un->un_suspend_pos.pmode != invalid) &&
842 			    ((un->un_suspend_pos.fileno > 0) ||
843 			    (un->un_suspend_pos.blkno > 0)) ||
844 			    (un->un_suspend_pos.lgclblkno > 0)) {
845 				if (ret_status != 0) {
846 					/*
847 					 * tape didn't get good TUR
848 					 * just print out error messages
849 					 */
850 					scsi_log(ST_DEVINFO, st_label, CE_WARN,
851 					    "st_attach-RESUME: tape failure "
852 					    " tape position will be lost");
853 				} else {
854 					/* this prints errors */
855 					(void) st_validate_tapemarks(un,
856 					    &un->un_suspend_pos);
857 				}
858 				/*
859 				 * there are no retries, if there is an error
860 				 * we don't know if the tape has changed
861 				 */
862 				un->un_suspend_pos.pmode = invalid;
863 			}
864 
865 			/* now we are ready to start up any queued I/Os */
866 			if (un->un_ncmds || un->un_quef) {
867 				st_start(un);
868 			}
869 
870 			cv_broadcast(&un->un_suspend_cv);
871 			mutex_exit(ST_MUTEX);
872 			return (DDI_SUCCESS);
873 
874 		default:
875 			return (DDI_FAILURE);
876 	}
877 
878 	un = ddi_get_soft_state(st_state, instance);
879 
880 	ST_DEBUG(devi, st_label, SCSI_DEBUG,
881 	    "st_attach: instance=%x\n", instance);
882 
883 	/*
884 	 * Add a zero-length attribute to tell the world we support
885 	 * kernel ioctls (for layered drivers)
886 	 */
887 	(void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
888 	    DDI_KERNEL_IOCTL, NULL, 0);
889 
890 	ddi_report_dev((dev_info_t *)devi);
891 
892 	/*
893 	 * If it's a SCSI-2 tape drive which supports wide,
894 	 * tell the host adapter to use wide.
895 	 */
896 	wide = ((devp->sd_inq->inq_rdf == RDF_SCSI2) &&
897 	    (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) ?  1 : 0;
898 
899 	if (scsi_ifsetcap(ROUTE, "wide-xfer", wide, 1) == 1) {
900 		ST_DEBUG(devi, st_label, SCSI_DEBUG,
901 		    "Wide Transfer %s\n", wide ? "enabled" : "disabled");
902 	}
903 
904 	/*
905 	 * enable autorequest sense; keep the rq packet around in case
906 	 * the autorequest sense fails because of a busy condition
907 	 * do a getcap first in case the capability is not variable
908 	 */
909 	if (scsi_ifgetcap(ROUTE, "auto-rqsense", 1) == 1) {
910 		un->un_arq_enabled = 1;
911 	} else {
912 		un->un_arq_enabled =
913 		    ((scsi_ifsetcap(ROUTE, "auto-rqsense", 1, 1) == 1) ? 1 : 0);
914 	}
915 
916 	ST_DEBUG(devi, st_label, SCSI_DEBUG, "auto request sense %s\n",
917 	    (un->un_arq_enabled ? "enabled" : "disabled"));
918 
919 	un->un_untagged_qing =
920 	    (scsi_ifgetcap(ROUTE, "untagged-qing", 0) == 1);
921 
922 	/*
923 	 * XXX - This is just for 2.6.  to tell users that write buffering
924 	 *	has gone away.
925 	 */
926 	if (un->un_arq_enabled && un->un_untagged_qing) {
927 		if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
928 		    "tape-driver-buffering", 0) != 0) {
929 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
930 			    "Write Data Buffering has been depricated. Your "
931 			    "applications should continue to work normally.\n"
932 			    " But, they should  ported to use Asynchronous "
933 			    " I/O\n"
934 			    " For more information, read about "
935 			    " tape-driver-buffering "
936 			    "property in the st(7d) man page\n");
937 		}
938 	}
939 
940 	un->un_max_throttle = un->un_throttle = un->un_last_throttle = 1;
941 	un->un_flush_on_errors = 0;
942 	un->un_mkr_pkt = (struct scsi_pkt *)NULL;
943 
944 	ST_DEBUG(devi, st_label, SCSI_DEBUG,
945 	    "throttle=%x, max_throttle = %x\n",
946 	    un->un_throttle, un->un_max_throttle);
947 
948 	/* initialize persistent errors to nil */
949 	un->un_persistence = 0;
950 	un->un_persist_errors = 0;
951 
952 	/*
953 	 * Get dma-max from HBA driver. If it is not defined, use 64k
954 	 */
955 	un->un_maxdma	= scsi_ifgetcap(&devp->sd_address, "dma-max", 1);
956 	if (un->un_maxdma == -1) {
957 		ST_DEBUG(devi, st_label, SCSI_DEBUG,
958 		    "Received a value that looked like -1. Using 64k maxdma");
959 		un->un_maxdma = (64 * ONE_K);
960 	}
961 
962 #ifdef	__x86
963 	/*
964 	 * for x86, the device may be able to DMA more than the system will
965 	 * allow under some circumstances. We need account for both the HBA's
966 	 * and system's contraints.
967 	 *
968 	 * Get the maximum DMA under worse case conditions. e.g. looking at the
969 	 * device constraints, the max copy buffer size, and the worse case
970 	 * fragmentation. NOTE: this may differ from dma-max since dma-max
971 	 * doesn't take the worse case framentation into account.
972 	 *
973 	 * e.g. a device may be able to DMA 16MBytes, but can only DMA 1MByte
974 	 * if none of the pages are contiguous. Keeping track of both of these
975 	 * values allows us to support larger tape block sizes on some devices.
976 	 */
977 	un->un_maxdma_arch = scsi_ifgetcap(&devp->sd_address, "dma-max-arch",
978 	    1);
979 
980 	/*
981 	 * If the dma-max-arch capability is not implemented, or the value
982 	 * comes back higher than what was reported in dma-max, use dma-max.
983 	 */
984 	if ((un->un_maxdma_arch == -1) ||
985 	    ((uint_t)un->un_maxdma < (uint_t)un->un_maxdma_arch)) {
986 		un->un_maxdma_arch = un->un_maxdma;
987 	}
988 #endif
989 
990 	/*
991 	 * Get the max allowable cdb size
992 	 */
993 	un->un_max_cdb_sz =
994 	    scsi_ifgetcap(&devp->sd_address, "max-cdb-length", 1);
995 	if (un->un_max_cdb_sz < CDB_GROUP0) {
996 		ST_DEBUG(devi, st_label, SCSI_DEBUG,
997 		    "HBA reported max-cdb-length as %d\n", un->un_max_cdb_sz);
998 		un->un_max_cdb_sz = CDB_GROUP4; /* optimistic default */
999 	}
1000 
1001 	un->un_maxbsize = MAXBSIZE_UNKNOWN;
1002 
1003 	un->un_mediastate = MTIO_NONE;
1004 	un->un_HeadClean  = TAPE_ALERT_SUPPORT_UNKNOWN;
1005 
1006 	/*
1007 	 * initialize kstats
1008 	 */
1009 	un->un_stats = kstat_create("st", instance, NULL, "tape",
1010 	    KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT);
1011 	if (un->un_stats) {
1012 		un->un_stats->ks_lock = ST_MUTEX;
1013 		kstat_install(un->un_stats);
1014 	}
1015 	(void) st_create_errstats(un, instance);
1016 
1017 	/*
1018 	 * find the drive type for this target
1019 	 */
1020 	mutex_enter(ST_MUTEX);
1021 	un->un_dev = MT_TEM_DEV(instance);
1022 	st_known_tape_type(un);
1023 	un->un_dev = 0;
1024 	mutex_exit(ST_MUTEX);
1025 
1026 	for (node_ix = 0; node_ix < ST_NUM_MEMBERS(st_minor_data); node_ix++) {
1027 		int minor;
1028 		char *name;
1029 
1030 		name  = st_minor_data[node_ix].name;
1031 		minor = st_minor_data[node_ix].minor;
1032 
1033 		/*
1034 		 * For default devices set the density to the
1035 		 * preferred default density for this device.
1036 		 */
1037 		if (node_ix <= DEF_BSD_NR) {
1038 			minor |= un->un_dp->default_density;
1039 		}
1040 		minor |= MTMINOR(instance);
1041 
1042 		if (ddi_create_minor_node(devi, name, S_IFCHR, minor,
1043 		    DDI_NT_TAPE, NULL) == DDI_SUCCESS) {
1044 			continue;
1045 		}
1046 
1047 		ddi_remove_minor_node(devi, NULL);
1048 
1049 		cv_destroy(&un->un_clscv);
1050 		cv_destroy(&un->un_sbuf_cv);
1051 		cv_destroy(&un->un_queue_cv);
1052 		cv_destroy(&un->un_state_cv);
1053 		cv_destroy(&un->un_suspend_cv);
1054 		cv_destroy(&un->un_tape_busy_cv);
1055 
1056 		if (un->un_sbufp) {
1057 			freerbuf(un->un_sbufp);
1058 		}
1059 		if (un->un_uscsi_rqs_buf) {
1060 			kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
1061 		}
1062 		if (un->un_mspl) {
1063 			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1064 		}
1065 		if (un->un_dp_size) {
1066 			kmem_free(un->un_dp, un->un_dp_size);
1067 		}
1068 		if (un->un_state) {
1069 			kstat_delete(un->un_stats);
1070 		}
1071 		if (un->un_errstats) {
1072 			kstat_delete(un->un_errstats);
1073 		}
1074 
1075 		scsi_destroy_pkt(un->un_rqs);
1076 		scsi_free_consistent_buf(un->un_rqs_bp);
1077 		ddi_soft_state_free(st_state, instance);
1078 		devp->sd_private = NULL;
1079 		devp->sd_sense = NULL;
1080 
1081 		ddi_prop_remove_all(devi);
1082 		return (DDI_FAILURE);
1083 	}
1084 
1085 	return (DDI_SUCCESS);
1086 }
1087 
1088 /*
1089  * st_detach:
1090  *
1091  * we allow a detach if and only if:
1092  *	- no tape is currently inserted
1093  *	- tape position is at BOT or unknown
1094  *		(if it is not at BOT then a no rewind
1095  *		device was opened and we have to preserve state)
1096  *	- it must be in a closed state : no timeouts or scsi_watch requests
1097  *		will exist if it is closed, so we don't need to check for
1098  *		them here.
1099  */
1100 /*ARGSUSED*/
1101 static int
1102 st_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
1103 {
1104 	int 	instance;
1105 	int 	dev_instance;
1106 	struct scsi_device *devp;
1107 	struct scsi_tape *un;
1108 	clock_t wait_cmds_complete;
1109 
1110 	ST_ENTR(devi, st_detach);
1111 
1112 	instance = ddi_get_instance(devi);
1113 
1114 	if (!(un = ddi_get_soft_state(st_state, instance))) {
1115 		return (DDI_FAILURE);
1116 	}
1117 
1118 	mutex_enter(ST_MUTEX);
1119 
1120 	/*
1121 	 * Clear error entry stack
1122 	 */
1123 	st_empty_error_stack(un);
1124 
1125 	mutex_exit(ST_MUTEX);
1126 
1127 	switch (cmd) {
1128 
1129 	case DDI_DETACH:
1130 		/*
1131 		 * Undo what we did in st_attach & st_doattach,
1132 		 * freeing resources and removing things we installed.
1133 		 * The system framework guarantees we are not active
1134 		 * with this devinfo node in any other entry points at
1135 		 * this time.
1136 		 */
1137 
1138 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1139 		    "st_detach: instance=%x, un=%p\n", instance,
1140 		    (void *)un);
1141 
1142 		if (((un->un_dp->options & ST_UNLOADABLE) == 0) ||
1143 		    (un->un_ncmds != 0) || (un->un_quef != NULL) ||
1144 		    (un->un_state != ST_STATE_CLOSED)) {
1145 			/*
1146 			 * we cannot unload some targets because the
1147 			 * inquiry returns junk unless immediately
1148 			 * after a reset
1149 			 */
1150 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
1151 			    "cannot unload instance %x\n", instance);
1152 			return (DDI_FAILURE);
1153 		}
1154 
1155 		/*
1156 		 * if the tape has been removed then we may unload;
1157 		 * do a test unit ready and if it returns NOT READY
1158 		 * then we assume that it is safe to unload.
1159 		 * as a side effect, pmode may be set to invalid if the
1160 		 * the test unit ready fails;
1161 		 * also un_state may be set to non-closed, so reset it
1162 		 */
1163 		if ((un->un_dev) &&		/* Been opened since attach */
1164 		    ((un->un_pos.pmode == legacy) &&
1165 		    (un->un_pos.fileno > 0) ||	/* Known position not rewound */
1166 		    (un->un_pos.blkno != 0)) ||	/* Or within first file */
1167 		    ((un->un_pos.pmode == logical) &&
1168 		    (un->un_pos.lgclblkno > 0))) {
1169 			mutex_enter(ST_MUTEX);
1170 			/*
1171 			 * Send Test Unit Ready in the hopes that if
1172 			 * the drive is not in the state we think it is.
1173 			 * And the state will be changed so it can be detached.
1174 			 * If the command fails to reach the device and
1175 			 * the drive was not rewound or unloaded we want
1176 			 * to fail the detach till a user command fails
1177 			 * where after the detach will succead.
1178 			 */
1179 			(void) st_cmd(un->un_dev, SCMD_TEST_UNIT_READY,
1180 			    0, SYNC_CMD);
1181 			/*
1182 			 * After TUR un_state may be set to non-closed,
1183 			 * so reset it back.
1184 			 */
1185 			un->un_state = ST_STATE_CLOSED;
1186 			mutex_exit(ST_MUTEX);
1187 		}
1188 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1189 		    "un_status=%x, fileno=%x, blkno=%x\n",
1190 		    un->un_status, un->un_pos.fileno, un->un_pos.blkno);
1191 
1192 		/*
1193 		 * check again:
1194 		 * if we are not at BOT then it is not safe to unload
1195 		 */
1196 		if ((un->un_dev) &&		/* Been opened since attach */
1197 		    (((un->un_pos.pmode == legacy) &&
1198 		    (un->un_pos.fileno > 0) ||	/* Known position not rewound */
1199 		    (un->un_pos.blkno != 0)) ||	/* Or within first file */
1200 		    ((un->un_pos.pmode == logical) &&
1201 		    (un->un_pos.lgclblkno > 0)))) {
1202 
1203 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1204 			    "cannot detach: pmode=%d fileno=%x, blkno=%x"
1205 			    " lgclblkno=0x%"PRIx64"\n", un->un_pos.pmode,
1206 			    un->un_pos.fileno, un->un_pos.blkno,
1207 			    un->un_pos.lgclblkno);
1208 			return (DDI_FAILURE);
1209 		}
1210 
1211 		/*
1212 		 * Just To make sure that we have released the
1213 		 * tape unit .
1214 		 */
1215 		if (un->un_dev && (un->un_rsvd_status & ST_RESERVE) &&
1216 		    !DEVI_IS_DEVICE_REMOVED(devi)) {
1217 			mutex_enter(ST_MUTEX);
1218 			(void) st_reserve_release(un, ST_RELEASE);
1219 			mutex_exit(ST_MUTEX);
1220 		}
1221 
1222 		/*
1223 		 * now remove other data structures allocated in st_doattach()
1224 		 */
1225 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1226 		    "destroying/freeing\n");
1227 		cv_destroy(&un->un_clscv);
1228 		cv_destroy(&un->un_sbuf_cv);
1229 		cv_destroy(&un->un_queue_cv);
1230 		cv_destroy(&un->un_suspend_cv);
1231 		cv_destroy(&un->un_tape_busy_cv);
1232 
1233 		if (un->un_hib_tid) {
1234 			(void) untimeout(un->un_hib_tid);
1235 			un->un_hib_tid = 0;
1236 		}
1237 
1238 		if (un->un_delay_tid) {
1239 			(void) untimeout(un->un_delay_tid);
1240 			un->un_delay_tid = 0;
1241 		}
1242 		cv_destroy(&un->un_state_cv);
1243 
1244 #ifdef	__x86
1245 		if (un->un_contig_mem_hdl != NULL) {
1246 			ddi_dma_free_handle(&un->un_contig_mem_hdl);
1247 		}
1248 #endif
1249 		if (un->un_sbufp) {
1250 			freerbuf(un->un_sbufp);
1251 		}
1252 		if (un->un_uscsi_rqs_buf) {
1253 			kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
1254 		}
1255 		if (un->un_mspl) {
1256 			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1257 		}
1258 		if (un->un_rqs) {
1259 			scsi_destroy_pkt(un->un_rqs);
1260 			scsi_free_consistent_buf(un->un_rqs_bp);
1261 		}
1262 		if (un->un_mkr_pkt) {
1263 			scsi_destroy_pkt(un->un_mkr_pkt);
1264 		}
1265 		if (un->un_arq_enabled) {
1266 			(void) scsi_ifsetcap(ROUTE, "auto-rqsense", 0, 1);
1267 		}
1268 		if (un->un_dp_size) {
1269 			kmem_free(un->un_dp, un->un_dp_size);
1270 		}
1271 		if (un->un_stats) {
1272 			kstat_delete(un->un_stats);
1273 			un->un_stats = (kstat_t *)0;
1274 		}
1275 		if (un->un_errstats) {
1276 			kstat_delete(un->un_errstats);
1277 			un->un_errstats = (kstat_t *)0;
1278 		}
1279 		devp = ST_SCSI_DEVP;
1280 		ddi_soft_state_free(st_state, instance);
1281 		devp->sd_private = NULL;
1282 		devp->sd_sense = NULL;
1283 		scsi_unprobe(devp);
1284 		ddi_prop_remove_all(devi);
1285 		ddi_remove_minor_node(devi, NULL);
1286 		ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach done\n");
1287 		return (DDI_SUCCESS);
1288 
1289 	case DDI_SUSPEND:
1290 
1291 		/*
1292 		 * Suspend/Resume
1293 		 *
1294 		 * To process DDI_SUSPEND, we must do the following:
1295 		 *
1296 		 *  - check ddi_removing_power to see if power will be turned
1297 		 *    off. if so, return DDI_FAILURE
1298 		 *  - check if we are already suspended,
1299 		 *    if so, return DDI_FAILURE
1300 		 *  - check if device state is CLOSED,
1301 		 *    if not, return DDI_FAILURE.
1302 		 *  - wait until outstanding operations complete
1303 		 *  - save tape state
1304 		 *  - block new operations
1305 		 *  - cancel pending timeouts
1306 		 *
1307 		 */
1308 
1309 		if (ddi_removing_power(devi)) {
1310 			return (DDI_FAILURE);
1311 		}
1312 		mutex_enter(ST_MUTEX);
1313 
1314 		/*
1315 		 * Shouldn't already be suspended, if so return failure
1316 		 */
1317 		if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
1318 			mutex_exit(ST_MUTEX);
1319 			return (DDI_FAILURE);
1320 		}
1321 		if (un->un_state != ST_STATE_CLOSED) {
1322 			mutex_exit(ST_MUTEX);
1323 			return (DDI_FAILURE);
1324 		}
1325 
1326 		/*
1327 		 * Wait for all outstanding I/O's to complete
1328 		 *
1329 		 * we wait on both ncmds and the wait queue for times
1330 		 * when we are flushing after persistent errors are
1331 		 * flagged, which is when ncmds can be 0, and the
1332 		 * queue can still have I/O's.  This way we preserve
1333 		 * order of biodone's.
1334 		 */
1335 		wait_cmds_complete = ddi_get_lbolt();
1336 		wait_cmds_complete +=
1337 		    st_wait_cmds_complete * drv_usectohz(1000000);
1338 		while (un->un_ncmds || un->un_quef ||
1339 		    (un->un_state == ST_STATE_RESOURCE_WAIT)) {
1340 
1341 			if (cv_timedwait(&un->un_tape_busy_cv, ST_MUTEX,
1342 			    wait_cmds_complete) == -1) {
1343 				/*
1344 				 * Time expired then cancel the command
1345 				 */
1346 				mutex_exit(ST_MUTEX);
1347 				if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
1348 					mutex_enter(ST_MUTEX);
1349 					if (un->un_last_throttle) {
1350 						un->un_throttle =
1351 						    un->un_last_throttle;
1352 					}
1353 					mutex_exit(ST_MUTEX);
1354 					return (DDI_FAILURE);
1355 				} else {
1356 					mutex_enter(ST_MUTEX);
1357 					break;
1358 				}
1359 			}
1360 		}
1361 
1362 		/*
1363 		 * DDI_SUSPEND says that the system "may" power down, we
1364 		 * remember the file and block number before rewinding.
1365 		 * we also need to save state before issuing
1366 		 * any WRITE_FILE_MARK command.
1367 		 */
1368 		(void) st_update_block_pos(un);
1369 		COPY_POS(&un->un_suspend_pos, &un->un_pos);
1370 
1371 		dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) :
1372 		    un->un_dev);
1373 
1374 		/*
1375 		 * Issue a zero write file fmk command to tell the drive to
1376 		 * flush any buffered tape marks
1377 		 */
1378 		(void) st_cmd(dev_instance, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD);
1379 
1380 		/*
1381 		 * Because not all tape drives correctly implement buffer
1382 		 * flushing with the zero write file fmk command, issue a
1383 		 * synchronous rewind command to force data flushing.
1384 		 * st_validate_tapemarks() will do a rewind during DDI_RESUME
1385 		 * anyway.
1386 		 */
1387 		(void) st_cmd(dev_instance, SCMD_REWIND, 0, SYNC_CMD);
1388 
1389 		/* stop any new operations */
1390 		un->un_pwr_mgmt = ST_PWR_SUSPENDED;
1391 		un->un_throttle = 0;
1392 
1393 		/*
1394 		 * cancel any outstanding timeouts
1395 		 */
1396 		if (un->un_delay_tid) {
1397 			timeout_id_t temp_id = un->un_delay_tid;
1398 			un->un_delay_tid = 0;
1399 			un->un_tids_at_suspend |= ST_DELAY_TID;
1400 			mutex_exit(ST_MUTEX);
1401 			(void) untimeout(temp_id);
1402 			mutex_enter(ST_MUTEX);
1403 		}
1404 
1405 		if (un->un_hib_tid) {
1406 			timeout_id_t temp_id = un->un_hib_tid;
1407 			un->un_hib_tid = 0;
1408 			un->un_tids_at_suspend |= ST_HIB_TID;
1409 			mutex_exit(ST_MUTEX);
1410 			(void) untimeout(temp_id);
1411 			mutex_enter(ST_MUTEX);
1412 		}
1413 
1414 		/*
1415 		 * Suspend the scsi_watch_thread
1416 		 */
1417 		if (un->un_swr_token) {
1418 			opaque_t temp_token = un->un_swr_token;
1419 			mutex_exit(ST_MUTEX);
1420 			scsi_watch_suspend(temp_token);
1421 		} else {
1422 			mutex_exit(ST_MUTEX);
1423 		}
1424 
1425 		return (DDI_SUCCESS);
1426 
1427 	default:
1428 		ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach failed\n");
1429 		return (DDI_FAILURE);
1430 	}
1431 }
1432 
1433 
1434 /* ARGSUSED */
1435 static int
1436 stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
1437 {
1438 	dev_t dev;
1439 	struct scsi_tape *un;
1440 	int instance, error;
1441 
1442 	ST_ENTR(dip, stinfo);
1443 
1444 	switch (infocmd) {
1445 	case DDI_INFO_DEVT2DEVINFO:
1446 		dev = (dev_t)arg;
1447 		instance = MTUNIT(dev);
1448 		if ((un = ddi_get_soft_state(st_state, instance)) == NULL)
1449 			return (DDI_FAILURE);
1450 		*result = (void *) ST_DEVINFO;
1451 		error = DDI_SUCCESS;
1452 		break;
1453 	case DDI_INFO_DEVT2INSTANCE:
1454 		dev = (dev_t)arg;
1455 		instance = MTUNIT(dev);
1456 		*result = (void *)(uintptr_t)instance;
1457 		error = DDI_SUCCESS;
1458 		break;
1459 	default:
1460 		error = DDI_FAILURE;
1461 	}
1462 	return (error);
1463 }
1464 
1465 static int
1466 st_doattach(struct scsi_device *devp, int (*canwait)())
1467 {
1468 	struct scsi_pkt *rqpkt = NULL;
1469 	struct scsi_tape *un = NULL;
1470 	int km_flags = (canwait != NULL_FUNC) ? KM_SLEEP : KM_NOSLEEP;
1471 	int instance;
1472 	struct buf *bp;
1473 	size_t rlen;
1474 
1475 	ST_FUNC(devp->sd_dev, st_doattach);
1476 	/*
1477 	 * Call the routine scsi_probe to do some of the dirty work.
1478 	 * If the INQUIRY command succeeds, the field sd_inq in the
1479 	 * device structure will be filled in.
1480 	 */
1481 	ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1482 	    "st_doattach(): probing\n");
1483 
1484 	if (scsi_probe(devp, canwait) == SCSIPROBE_EXISTS) {
1485 
1486 		/*
1487 		 * In checking the whole inq_dtype byte we are looking at both
1488 		 * the Peripheral Qualifier and the Peripheral Device Type.
1489 		 * For this driver we are only interested in sequential devices
1490 		 * that are connected or capable if connecting to this logical
1491 		 * unit.
1492 		 */
1493 		if (devp->sd_inq->inq_dtype ==
1494 		    (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) {
1495 			ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1496 			    "probe exists\n");
1497 		} else {
1498 			/* Something there but not a tape device */
1499 			scsi_unprobe(devp);
1500 			return (DDI_FAILURE);
1501 		}
1502 	} else {
1503 		/* Nothing there */
1504 		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1505 		    "probe failure: nothing there\n");
1506 		scsi_unprobe(devp);
1507 		return (DDI_FAILURE);
1508 	}
1509 
1510 	bp = scsi_alloc_consistent_buf(&devp->sd_address, (struct buf *)NULL,
1511 	    SENSE_LENGTH, B_READ, canwait, NULL);
1512 	if (!bp) {
1513 		goto error;
1514 	}
1515 	rqpkt = scsi_init_pkt(&devp->sd_address, NULL, bp, CDB_GROUP0, 1, 0,
1516 	    PKT_CONSISTENT, canwait, NULL);
1517 	if (!rqpkt) {
1518 		goto error;
1519 	}
1520 	devp->sd_sense = (struct scsi_extended_sense *)bp->b_un.b_addr;
1521 	ASSERT(geterror(bp) == NULL);
1522 
1523 	(void) scsi_setup_cdb((union scsi_cdb *)rqpkt->pkt_cdbp,
1524 	    SCMD_REQUEST_SENSE, 0, SENSE_LENGTH, 0);
1525 	FILL_SCSI1_LUN(devp, rqpkt);
1526 
1527 	/*
1528 	 * The actual unit is present.
1529 	 * Now is the time to fill in the rest of our info..
1530 	 */
1531 	instance = ddi_get_instance(devp->sd_dev);
1532 
1533 	if (ddi_soft_state_zalloc(st_state, instance) != DDI_SUCCESS) {
1534 		goto error;
1535 	}
1536 	un = ddi_get_soft_state(st_state, instance);
1537 
1538 	ASSERT(un != NULL);
1539 
1540 	un->un_sbufp = getrbuf(km_flags);
1541 
1542 	un->un_uscsi_rqs_buf = kmem_alloc(SENSE_LENGTH, KM_SLEEP);
1543 
1544 	/*
1545 	 * use i_ddi_mem_alloc() for now until we have an interface to allocate
1546 	 * memory for DMA which doesn't require a DMA handle. ddi_iopb_alloc()
1547 	 * is obsolete and we want more flexibility in controlling the DMA
1548 	 * address constraints.
1549 	 */
1550 	(void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr,
1551 	    sizeof (struct seq_mode), ((km_flags == KM_SLEEP) ? 1 : 0), 0,
1552 	    NULL, (caddr_t *)&un->un_mspl, &rlen, NULL);
1553 
1554 	(void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr,
1555 	    sizeof (read_pos_data_t), ((km_flags == KM_SLEEP) ? 1 : 0), 0,
1556 	    NULL, (caddr_t *)&un->un_read_pos_data, &rlen, NULL);
1557 
1558 	if (!un->un_sbufp || !un->un_mspl || !un->un_read_pos_data) {
1559 		ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG,
1560 		    "probe partial failure: no space\n");
1561 		goto error;
1562 	}
1563 
1564 	bzero(un->un_mspl, sizeof (struct seq_mode));
1565 
1566 	cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL);
1567 	cv_init(&un->un_queue_cv, NULL, CV_DRIVER, NULL);
1568 	cv_init(&un->un_clscv, NULL, CV_DRIVER, NULL);
1569 	cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL);
1570 #ifdef	__x86
1571 	cv_init(&un->un_contig_mem_cv, NULL, CV_DRIVER, NULL);
1572 #endif
1573 
1574 	/* Initialize power managemnet condition variable */
1575 	cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL);
1576 	cv_init(&un->un_tape_busy_cv, NULL, CV_DRIVER, NULL);
1577 
1578 	rqpkt->pkt_flags |= (FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON);
1579 
1580 	un->un_pos.pmode = invalid;
1581 	rqpkt->pkt_time = st_io_time;
1582 	rqpkt->pkt_comp = st_intr;
1583 	un->un_rqs	= rqpkt;
1584 	un->un_sd	= devp;
1585 	un->un_rqs_bp	= bp;
1586 	un->un_swr_token = (opaque_t)NULL;
1587 	un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE;
1588 	un->un_wormable = st_is_drive_worm;
1589 	un->un_read_pos_type = LONG_POS;
1590 
1591 	un->un_suspend_pos.pmode = invalid;
1592 
1593 #ifdef	__x86
1594 	if (ddi_dma_alloc_handle(ST_DEVINFO, &st_contig_mem_dma_attr,
1595 	    DDI_DMA_SLEEP, NULL, &un->un_contig_mem_hdl) != DDI_SUCCESS) {
1596 		ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG,
1597 		    "allocation of contiguous memory dma handle failed!");
1598 		un->un_contig_mem_hdl = NULL;
1599 		goto error;
1600 	}
1601 #endif
1602 
1603 	/*
1604 	 * Since this driver manages devices with "remote" hardware,
1605 	 * i.e. the devices themselves have no "reg" properties,
1606 	 * the SUSPEND/RESUME commands in detach/attach will not be
1607 	 * called by the power management framework unless we request
1608 	 * it by creating a "pm-hardware-state" property and setting it
1609 	 * to value "needs-suspend-resume".
1610 	 */
1611 	if (ddi_prop_update_string(DDI_DEV_T_NONE, devp->sd_dev,
1612 	    "pm-hardware-state", "needs-suspend-resume") !=
1613 	    DDI_PROP_SUCCESS) {
1614 
1615 		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1616 		    "ddi_prop_update(\"pm-hardware-state\") failed\n");
1617 		goto error;
1618 	}
1619 
1620 	if (ddi_prop_create(DDI_DEV_T_NONE, devp->sd_dev, DDI_PROP_CANSLEEP,
1621 	    "no-involuntary-power-cycles", NULL, 0) != DDI_PROP_SUCCESS) {
1622 
1623 		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1624 		    "ddi_prop_create(\"no-involuntary-power-cycles\") "
1625 		    "failed\n");
1626 		goto error;
1627 	}
1628 
1629 	ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, "probe success\n");
1630 	return (DDI_SUCCESS);
1631 
1632 error:
1633 	devp->sd_sense = NULL;
1634 
1635 	ddi_remove_minor_node(devp->sd_dev, NULL);
1636 	if (un) {
1637 		if (un->un_mspl) {
1638 			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1639 		}
1640 		if (un->un_read_pos_data) {
1641 			i_ddi_mem_free((caddr_t)un->un_read_pos_data, 0);
1642 		}
1643 		if (un->un_sbufp) {
1644 			freerbuf(un->un_sbufp);
1645 		}
1646 		if (un->un_uscsi_rqs_buf) {
1647 			kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
1648 		}
1649 #ifdef	__x86
1650 		if (un->un_contig_mem_hdl != NULL) {
1651 			ddi_dma_free_handle(&un->un_contig_mem_hdl);
1652 		}
1653 #endif
1654 		ddi_soft_state_free(st_state, instance);
1655 		devp->sd_private = NULL;
1656 	}
1657 
1658 	if (rqpkt) {
1659 		scsi_destroy_pkt(rqpkt);
1660 	}
1661 
1662 	if (bp) {
1663 		scsi_free_consistent_buf(bp);
1664 	}
1665 
1666 	if (devp->sd_inq) {
1667 		scsi_unprobe(devp);
1668 	}
1669 	return (DDI_FAILURE);
1670 }
1671 
1672 typedef int
1673 (*cfg_functp)(struct scsi_tape *, char *vidpid, struct st_drivetype *);
1674 
1675 static cfg_functp config_functs[] = {
1676 	st_get_conf_from_st_dot_conf,
1677 	st_get_conf_from_st_conf_dot_c,
1678 	st_get_conf_from_tape_drive,
1679 	st_get_default_conf
1680 };
1681 
1682 
1683 /*
1684  * determine tape type, using tape-config-list or built-in table or
1685  * use a generic tape config entry
1686  */
1687 static void
1688 st_known_tape_type(struct scsi_tape *un)
1689 {
1690 	struct st_drivetype *dp;
1691 	cfg_functp *config_funct;
1692 
1693 	ST_FUNC(ST_DEVINFO, st_known_tape_type);
1694 	/*
1695 	 * XXX:  Emulex MT-02 (and emulators) predates SCSI-1 and has
1696 	 *	 no vid & pid inquiry data.  So, we provide one.
1697 	 */
1698 	if (ST_INQUIRY->inq_len == 0 ||
1699 	    (bcmp("\0\0\0\0\0\0\0\0", ST_INQUIRY->inq_vid, 8) == 0)) {
1700 		(void) strcpy((char *)ST_INQUIRY->inq_vid, ST_MT02_NAME);
1701 	}
1702 
1703 	un->un_dp_size = sizeof (struct st_drivetype);
1704 	dp = kmem_zalloc((size_t)un->un_dp_size, KM_SLEEP);
1705 	un->un_dp = dp;
1706 
1707 	un->un_dp->non_motion_timeout = st_io_time;
1708 	/*
1709 	 * Loop through the configuration methods till one works.
1710 	 */
1711 	for (config_funct = &config_functs[0]; ; config_funct++) {
1712 		if ((*config_funct)(un, ST_INQUIRY->inq_vid, dp)) {
1713 			break;
1714 		}
1715 	}
1716 
1717 	/*
1718 	 * If we didn't just make up this configuration and
1719 	 * all the density codes are the same..
1720 	 * Set Auto Density over ride.
1721 	 */
1722 	if (*config_funct != st_get_default_conf) {
1723 		/*
1724 		 * If this device is one that is configured and all
1725 		 * densities are the same, This saves doing gets and set
1726 		 * that yield nothing.
1727 		 */
1728 		if ((dp->densities[0]) == (dp->densities[1]) &&
1729 		    (dp->densities[0]) == (dp->densities[2]) &&
1730 		    (dp->densities[0]) == (dp->densities[3])) {
1731 
1732 			dp->options |= ST_AUTODEN_OVERRIDE;
1733 		}
1734 	}
1735 
1736 
1737 	/*
1738 	 * Store tape drive characteristics.
1739 	 */
1740 	un->un_status = 0;
1741 	un->un_attached = 1;
1742 	un->un_init_options = dp->options;
1743 
1744 	/* setup operation time-outs based on options */
1745 	st_calculate_timeouts(un);
1746 
1747 	/* make sure if we are supposed to be variable, make it variable */
1748 	if (dp->options & ST_VARIABLE) {
1749 		dp->bsize = 0;
1750 	}
1751 
1752 	scsi_log(ST_DEVINFO, st_label, CE_NOTE, "?<%s>\n", dp->name);
1753 }
1754 
1755 
1756 typedef struct {
1757 	int mask;
1758 	int bottom;
1759 	int top;
1760 	char *name;
1761 } conf_limit;
1762 
1763 static const conf_limit conf_limits[] = {
1764 
1765 	-1,		1,		2,		"conf version",
1766 	-1,		MT_ISTS,	ST_LAST_TYPE,	"drive type",
1767 	-1,		0,		0xffffff,	"block size",
1768 	ST_VALID_OPTS,	0,		ST_VALID_OPTS,	"options",
1769 	-1,		0,		4,		"number of densities",
1770 	-1,		0,		UINT8_MAX,	"density code",
1771 	-1,		0,		3,		"default density",
1772 	-1,		0,		UINT16_MAX,	"non motion timeout",
1773 	-1,		0,		UINT16_MAX,	"I/O timeout",
1774 	-1,		0,		UINT16_MAX,	"space timeout",
1775 	-1,		0,		UINT16_MAX,	"load timeout",
1776 	-1,		0,		UINT16_MAX,	"unload timeout",
1777 	-1,		0,		UINT16_MAX,	"erase timeout",
1778 	0,		0,		0,		NULL
1779 };
1780 
1781 static int
1782 st_validate_conf_data(struct scsi_tape *un, int *list, int list_len,
1783     const char *conf_name)
1784 {
1785 	int dens;
1786 	int ndens;
1787 	int value;
1788 	int type;
1789 	int count;
1790 	const conf_limit *limit = &conf_limits[0];
1791 
1792 	ST_FUNC(ST_DEVINFO, st_validate_conf_data);
1793 
1794 	ST_DEBUG3(ST_DEVINFO, st_label, CE_NOTE,
1795 	    "Checking %d entrys total with %d densities\n", list_len, list[4]);
1796 
1797 	count = list_len;
1798 	type = *list;
1799 	for (;  count && limit->name; count--, list++, limit++) {
1800 
1801 		value = *list;
1802 		if (value & ~limit->mask) {
1803 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1804 			    "%s %s value invalid bits set: 0x%X\n",
1805 			    conf_name, limit->name, value & ~limit->mask);
1806 			*list &= limit->mask;
1807 		} else if (value < limit->bottom) {
1808 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1809 			    "%s %s value too low: value = %d limit %d\n",
1810 			    conf_name, limit->name, value, limit->bottom);
1811 		} else if (value > limit->top) {
1812 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1813 			    "%s %s value too high: value = %d limit %d\n",
1814 			    conf_name, limit->name, value, limit->top);
1815 		} else {
1816 			ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT,
1817 			    "%s %s value = 0x%X\n",
1818 			    conf_name, limit->name, value);
1819 		}
1820 
1821 		/* If not the number of densities continue */
1822 		if (limit != &conf_limits[4]) {
1823 			continue;
1824 		}
1825 
1826 		/* If number of densities is not in range can't use config */
1827 		if (value < limit->bottom || value > limit->top) {
1828 			return (-1);
1829 		}
1830 
1831 		ndens = min(value, NDENSITIES);
1832 		if ((type == 1) && (list_len - ndens) != 6) {
1833 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1834 			    "%s conf version 1 with %d densities has %d items"
1835 			    " should have %d",
1836 			    conf_name, ndens, list_len, 6 + ndens);
1837 		} else if ((type == 2) && (list_len - ndens) != 13) {
1838 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1839 			    "%s conf version 2 with %d densities has %d items"
1840 			    " should have %d",
1841 			    conf_name, ndens, list_len, 13 + ndens);
1842 		}
1843 
1844 		limit++;
1845 		for (dens = 0; dens < ndens && count; dens++) {
1846 			count--;
1847 			list++;
1848 			value = *list;
1849 			if (value < limit->bottom) {
1850 				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1851 				    "%s density[%d] value too low: value ="
1852 				    " 0x%X limit 0x%X\n",
1853 				    conf_name, dens, value, limit->bottom);
1854 			} else if (value > limit->top) {
1855 				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1856 				    "%s density[%d] value too high: value ="
1857 				    " 0x%X limit 0x%X\n",
1858 				    conf_name, dens, value, limit->top);
1859 			} else {
1860 				ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT,
1861 				    "%s density[%d] value = 0x%X\n",
1862 				    conf_name, dens, value);
1863 			}
1864 		}
1865 	}
1866 
1867 	return (0);
1868 }
1869 
1870 static int
1871 st_get_conf_from_st_dot_conf(struct scsi_tape *un, char *vidpid,
1872     struct st_drivetype *dp)
1873 {
1874 	caddr_t config_list = NULL;
1875 	caddr_t data_list = NULL;
1876 	int	*data_ptr;
1877 	caddr_t vidptr, prettyptr, datanameptr;
1878 	size_t	vidlen, prettylen, datanamelen, tripletlen = 0;
1879 	int config_list_len, data_list_len, len, i;
1880 	int version;
1881 	int found = 0;
1882 
1883 	ST_FUNC(ST_DEVINFO, st_get_conf_from_st_dot_conf);
1884 
1885 	/*
1886 	 * Determine type of tape controller. Type is determined by
1887 	 * checking the vendor ids of the earlier inquiry command and
1888 	 * comparing those with vids in tape-config-list defined in st.conf
1889 	 */
1890 	if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, DDI_PROP_DONTPASS,
1891 	    "tape-config-list", (caddr_t)&config_list, &config_list_len)
1892 	    != DDI_PROP_SUCCESS) {
1893 		return (found);
1894 	}
1895 
1896 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
1897 	    "st_get_conf_from_st_dot_conf(): st.conf has tape-config-list\n");
1898 
1899 	/*
1900 	 * Compare vids in each triplet - if it matches, get value for
1901 	 * data_name and contruct a st_drivetype struct
1902 	 * tripletlen is not set yet!
1903 	 */
1904 	for (len = config_list_len, vidptr = config_list;
1905 	    len > 0;
1906 	    vidptr += tripletlen, len -= tripletlen) {
1907 
1908 		vidlen = strlen(vidptr);
1909 		prettyptr = vidptr + vidlen + 1;
1910 		prettylen = strlen(prettyptr);
1911 		datanameptr = prettyptr + prettylen + 1;
1912 		datanamelen = strlen(datanameptr);
1913 		tripletlen = vidlen + prettylen + datanamelen + 3;
1914 
1915 		if (vidlen == 0) {
1916 			continue;
1917 		}
1918 
1919 		/*
1920 		 * If inquiry vid dosen't match this triplets vid,
1921 		 * try the next.
1922 		 */
1923 		if (strncasecmp(vidpid, vidptr, vidlen)) {
1924 			continue;
1925 		}
1926 
1927 		/*
1928 		 * if prettylen is zero then use the vid string
1929 		 */
1930 		if (prettylen == 0) {
1931 			prettyptr = vidptr;
1932 			prettylen = vidlen;
1933 		}
1934 
1935 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1936 		    "vid = %s, pretty=%s, dataname = %s\n",
1937 		    vidptr, prettyptr, datanameptr);
1938 
1939 		/*
1940 		 * get the data list
1941 		 */
1942 		if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, 0,
1943 		    datanameptr, (caddr_t)&data_list,
1944 		    &data_list_len) != DDI_PROP_SUCCESS) {
1945 			/*
1946 			 * Error in getting property value
1947 			 * print warning!
1948 			 */
1949 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1950 			    "data property (%s) has no value\n",
1951 			    datanameptr);
1952 			continue;
1953 		}
1954 
1955 		/*
1956 		 * now initialize the st_drivetype struct
1957 		 */
1958 		(void) strncpy(dp->name, prettyptr, ST_NAMESIZE - 1);
1959 		dp->length = (int)min(vidlen, (VIDPIDLEN - 1));
1960 		(void) strncpy(dp->vid, vidptr, dp->length);
1961 		data_ptr = (int *)data_list;
1962 		/*
1963 		 * check if data is enough for version, type,
1964 		 * bsize, options, # of densities, density1,
1965 		 * density2, ..., default_density
1966 		 */
1967 		if ((data_list_len < 5 * sizeof (int)) ||
1968 		    (data_list_len < 6 * sizeof (int) +
1969 		    *(data_ptr + 4) * sizeof (int))) {
1970 			/*
1971 			 * print warning and skip to next triplet.
1972 			 */
1973 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1974 			    "data property (%s) incomplete\n",
1975 			    datanameptr);
1976 			kmem_free(data_list, data_list_len);
1977 			continue;
1978 		}
1979 
1980 		if (st_validate_conf_data(un, data_ptr,
1981 		    data_list_len / sizeof (int), datanameptr)) {
1982 			kmem_free(data_list, data_list_len);
1983 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1984 			    "data property (%s) rejected\n",
1985 			    datanameptr);
1986 			continue;
1987 		}
1988 
1989 		/*
1990 		 * check version
1991 		 */
1992 		version = *data_ptr++;
1993 		if (version != 1 && version != 2) {
1994 			/* print warning but accept it */
1995 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1996 			    "Version # for data property (%s) "
1997 			    "not set to 1 or 2\n", datanameptr);
1998 		}
1999 
2000 		dp->type    = *data_ptr++;
2001 		dp->bsize   = *data_ptr++;
2002 		dp->options = *data_ptr++;
2003 		dp->options |= ST_DYNAMIC;
2004 		len = *data_ptr++;
2005 		for (i = 0; i < NDENSITIES; i++) {
2006 			if (i < len) {
2007 				dp->densities[i] = *data_ptr++;
2008 			}
2009 		}
2010 		dp->default_density = *data_ptr << 3;
2011 		if (version == 2 &&
2012 		    data_list_len >= (13 + len) * sizeof (int)) {
2013 			data_ptr++;
2014 			dp->non_motion_timeout	= *data_ptr++;
2015 			dp->io_timeout		= *data_ptr++;
2016 			dp->rewind_timeout	= *data_ptr++;
2017 			dp->space_timeout	= *data_ptr++;
2018 			dp->load_timeout	= *data_ptr++;
2019 			dp->unload_timeout	= *data_ptr++;
2020 			dp->erase_timeout	= *data_ptr++;
2021 		}
2022 		kmem_free(data_list, data_list_len);
2023 		found = 1;
2024 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
2025 		    "found in st.conf: vid = %s, pretty=%s\n",
2026 		    dp->vid, dp->name);
2027 		break;
2028 	}
2029 
2030 	/*
2031 	 * free up the memory allocated by ddi_getlongprop
2032 	 */
2033 	if (config_list) {
2034 		kmem_free(config_list, config_list_len);
2035 	}
2036 	return (found);
2037 }
2038 
2039 static int
2040 st_get_conf_from_st_conf_dot_c(struct scsi_tape *un, char *vidpid,
2041     struct st_drivetype *dp)
2042 {
2043 	int i;
2044 
2045 	ST_FUNC(ST_DEVINFO, st_get_conf_from_st_conf_dot_c);
2046 	/*
2047 	 * Determine type of tape controller.  Type is determined by
2048 	 * checking the result of the earlier inquiry command and
2049 	 * comparing vendor ids with strings in a table declared in st_conf.c.
2050 	 */
2051 	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2052 	    "st_get_conf_from_st_conf_dot_c(): looking at st_drivetypes\n");
2053 
2054 	for (i = 0; i < st_ndrivetypes; i++) {
2055 		if (st_drivetypes[i].length == 0) {
2056 			continue;
2057 		}
2058 		if (strncasecmp(vidpid, st_drivetypes[i].vid,
2059 		    st_drivetypes[i].length)) {
2060 			continue;
2061 		}
2062 		bcopy(&st_drivetypes[i], dp, sizeof (st_drivetypes[i]));
2063 		return (1);
2064 	}
2065 	return (0);
2066 }
2067 
2068 static int
2069 st_get_conf_from_tape_drive(struct scsi_tape *un, char *vidpid,
2070     struct st_drivetype *dp)
2071 {
2072 	int bsize;
2073 	ulong_t maxbsize;
2074 	caddr_t buf;
2075 	struct st_drivetype *tem_dp;
2076 	struct read_blklim *blklim;
2077 	int rval;
2078 	int i;
2079 
2080 	ST_FUNC(ST_DEVINFO, st_get_conf_from_type_drive);
2081 
2082 	/*
2083 	 * Determine the type of tape controller. Type is determined by
2084 	 * sending SCSI commands to tape drive and deriving the type from
2085 	 * the returned data.
2086 	 */
2087 	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2088 	    "st_get_conf_from_tape_drive(): asking tape drive\n");
2089 
2090 	tem_dp = kmem_zalloc(sizeof (struct st_drivetype), KM_SLEEP);
2091 
2092 	/*
2093 	 * Make up a name
2094 	 */
2095 	bcopy(vidpid, tem_dp->name, VIDPIDLEN);
2096 	tem_dp->name[VIDPIDLEN] = '\0';
2097 	tem_dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1));
2098 	(void) strncpy(tem_dp->vid, ST_INQUIRY->inq_vid, tem_dp->length);
2099 	/*
2100 	 * 'clean' vendor and product strings of non-printing chars
2101 	 */
2102 	for (i = 0; i < VIDPIDLEN - 1; i ++) {
2103 		if (tem_dp->name[i] < ' ' || tem_dp->name[i] > '~') {
2104 			tem_dp->name[i] = '.';
2105 		}
2106 	}
2107 
2108 	/*
2109 	 * MODE SENSE to determine block size.
2110 	 */
2111 	un->un_dp->options |= ST_MODE_SEL_COMP;
2112 	if (st_modesense(un)) {
2113 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2114 		    "st_get_conf_from_tape_drive(): fail to mode sense\n");
2115 		un->un_dp->options &= ~ST_MODE_SEL_COMP;
2116 		kmem_free(tem_dp, sizeof (struct st_drivetype));
2117 		return (0);
2118 	}
2119 
2120 	/* Can mode sense page 0x10 or 0xf */
2121 	tem_dp->options |= ST_MODE_SEL_COMP;
2122 	bsize = (un->un_mspl->high_bl << 16)	|
2123 	    (un->un_mspl->mid_bl << 8)		|
2124 	    (un->un_mspl->low_bl);
2125 
2126 	if (bsize == 0) {
2127 		tem_dp->options |= ST_VARIABLE;
2128 		tem_dp->bsize = 0;
2129 	} else if (bsize > ST_MAXRECSIZE_FIXED) {
2130 		if (st_change_block_size(un->un_dev, 0) != 0) {
2131 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2132 			    "st_get_conf_from_tape_drive(): "
2133 			    "Fixed record size is too large and"
2134 			    "cannot switch to variable record size");
2135 			kmem_free(tem_dp, sizeof (struct st_drivetype));
2136 			return (0);
2137 		}
2138 		tem_dp->options |= ST_VARIABLE;
2139 	} else if (st_change_block_size(un->un_dev, 0) == 0) {
2140 		tem_dp->options |= ST_VARIABLE;
2141 		tem_dp->bsize = 0;
2142 	} else {
2143 		tem_dp->bsize = bsize;
2144 	}
2145 
2146 	/*
2147 	 * If READ BLOCk LIMITS works and upper block size limit is
2148 	 * more than 64K, ST_NO_RECSIZE_LIMIT is supported.
2149 	 */
2150 	blklim = kmem_zalloc(sizeof (struct read_blklim), KM_SLEEP);
2151 	if (st_read_block_limits(un, blklim) != 0) {
2152 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2153 		    "st_get_conf_from_tape_drive(): "
2154 		    "fail to read block limits.\n");
2155 		kmem_free(blklim, sizeof (struct read_blklim));
2156 		kmem_free(tem_dp, sizeof (struct st_drivetype));
2157 		return (0);
2158 	}
2159 	maxbsize = (blklim->max_hi << 16) +
2160 	    (blklim->max_mid << 8) + blklim->max_lo;
2161 	if (maxbsize > ST_MAXRECSIZE_VARIABLE) {
2162 		tem_dp->options |= ST_NO_RECSIZE_LIMIT;
2163 	}
2164 	kmem_free(blklim, sizeof (struct read_blklim));
2165 
2166 	/*
2167 	 * Inquiry VPD page 0xb0 to see if the tape drive supports WORM
2168 	 */
2169 	buf = kmem_zalloc(6, KM_SLEEP);
2170 	rval = st_get_special_inquiry(un, 6, buf, 0xb0);
2171 	if (rval != 0) {
2172 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2173 		    "st_get_conf_from_tape_drive(): "
2174 		    "fail to read vitial inquiry.\n");
2175 		kmem_free(buf, 6);
2176 		kmem_free(tem_dp, sizeof (struct st_drivetype));
2177 		return (0);
2178 	}
2179 	if (buf[4] & 1) {
2180 		tem_dp->options |= ST_WORMABLE;
2181 	}
2182 	kmem_free(buf, 6);
2183 
2184 	/* Assume BSD BSR KNOWS_EOD */
2185 	tem_dp->options |= ST_BSF | ST_BSR | ST_KNOWS_EOD | ST_UNLOADABLE;
2186 	tem_dp->max_rretries = -1;
2187 	tem_dp->max_wretries = -1;
2188 
2189 	/*
2190 	 * Decide the densities supported by tape drive by sending
2191 	 * REPORT DENSITY SUPPORT command.
2192 	 */
2193 	if (st_get_densities_from_tape_drive(un, tem_dp) == 0) {
2194 		kmem_free(tem_dp, sizeof (struct st_drivetype));
2195 		return (0);
2196 	}
2197 
2198 	/*
2199 	 * Decide the timeout values for several commands by sending
2200 	 * REPORT SUPPORTED OPERATION CODES command.
2201 	 */
2202 	if (st_get_timeout_values_from_tape_drive(un, tem_dp) == 0) {
2203 		kmem_free(tem_dp, sizeof (struct st_drivetype));
2204 		return (0);
2205 	}
2206 
2207 	bcopy(tem_dp, dp, sizeof (struct st_drivetype));
2208 	kmem_free(tem_dp, sizeof (struct st_drivetype));
2209 	return (1);
2210 }
2211 
2212 static int
2213 st_get_densities_from_tape_drive(struct scsi_tape *un,
2214     struct st_drivetype *dp)
2215 {
2216 	int i, p;
2217 	size_t buflen;
2218 	ushort_t des_len;
2219 	uchar_t *den_header;
2220 	uchar_t num_den;
2221 	uchar_t den[NDENSITIES];
2222 	uchar_t deflt[NDENSITIES];
2223 	struct report_density_desc *den_desc;
2224 
2225 	ST_FUNC(ST_DEVINFO, st_get_densities_from_type_drive);
2226 
2227 	/*
2228 	 * Since we have no idea how many densitiy support entries
2229 	 * will be returned, we send the command firstly assuming
2230 	 * there is only one. Then we can decide the number of
2231 	 * entries by available density support length. If multiple
2232 	 * entries exist, we will resend the command with enough
2233 	 * buffer size.
2234 	 */
2235 	buflen = sizeof (struct report_density_header) +
2236 	    sizeof (struct report_density_desc);
2237 	den_header = kmem_zalloc(buflen, KM_SLEEP);
2238 	if (st_report_density_support(un, den_header, buflen) != 0) {
2239 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2240 		    "st_get_conf_from_tape_drive(): fail to report density.\n");
2241 		kmem_free(den_header, buflen);
2242 		return (0);
2243 	}
2244 	des_len =
2245 	    BE_16(((struct report_density_header *)den_header)->ava_dens_len);
2246 	num_den = (des_len - 2) / sizeof (struct report_density_desc);
2247 
2248 	if (num_den > 1) {
2249 		kmem_free(den_header, buflen);
2250 		buflen = sizeof (struct report_density_header) +
2251 		    sizeof (struct report_density_desc) * num_den;
2252 		den_header = kmem_zalloc(buflen, KM_SLEEP);
2253 		if (st_report_density_support(un, den_header, buflen) != 0) {
2254 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2255 			    "st_get_conf_from_tape_drive(): "
2256 			    "fail to report density.\n");
2257 			kmem_free(den_header, buflen);
2258 			return (0);
2259 		}
2260 	}
2261 
2262 	den_desc = (struct report_density_desc *)(den_header
2263 	    + sizeof (struct report_density_header));
2264 
2265 	/*
2266 	 * Decide the drive type by assigning organization
2267 	 */
2268 	for (i = 0; i < ST_NUM_MEMBERS(st_vid_dt); i ++) {
2269 		if (strncmp(st_vid_dt[i].vid, (char *)(den_desc->ass_org),
2270 		    8) == 0) {
2271 			dp->type = st_vid_dt[i].type;
2272 			break;
2273 		}
2274 	}
2275 	if (i == ST_NUM_MEMBERS(st_vid_dt)) {
2276 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2277 		    "st_get_conf_from_tape_drive(): "
2278 		    "can't find match of assigned ort.\n");
2279 		kmem_free(den_header, buflen);
2280 		return (0);
2281 	}
2282 
2283 	/*
2284 	 * The tape drive may support many tape formats, but the st driver
2285 	 * supports only the four highest densities. Since density code
2286 	 * values are returned by ascending sequence, we start from the
2287 	 * last entry of density support data block descriptor.
2288 	 */
2289 	p = 0;
2290 	den_desc += num_den - 1;
2291 	for (i = 0; i < num_den && p < NDENSITIES; i ++, den_desc --) {
2292 		if ((den_desc->pri_den != 0) && (den_desc->wrtok)) {
2293 			if (p != 0) {
2294 				if (den_desc->pri_den >= den[p - 1]) {
2295 					continue;
2296 				}
2297 			}
2298 			den[p] = den_desc->pri_den;
2299 			deflt[p] = den_desc->deflt;
2300 			p ++;
2301 		}
2302 	}
2303 
2304 	switch (p) {
2305 	case 0:
2306 		bzero(dp->densities, NDENSITIES);
2307 		dp->options |= ST_AUTODEN_OVERRIDE;
2308 		dp->default_density = MT_DENSITY4;
2309 		break;
2310 
2311 	case 1:
2312 		(void) memset(dp->densities, den[0], NDENSITIES);
2313 		dp->options |= ST_AUTODEN_OVERRIDE;
2314 		dp->default_density = MT_DENSITY4;
2315 		break;
2316 
2317 	case 2:
2318 		dp->densities[0] = den[1];
2319 		dp->densities[1] = den[1];
2320 		dp->densities[2] = den[0];
2321 		dp->densities[3] = den[0];
2322 		if (deflt[0]) {
2323 			dp->default_density = MT_DENSITY4;
2324 		} else {
2325 			dp->default_density = MT_DENSITY2;
2326 		}
2327 		break;
2328 
2329 	case 3:
2330 		dp->densities[0] = den[2];
2331 		dp->densities[1] = den[1];
2332 		dp->densities[2] = den[0];
2333 		dp->densities[3] = den[0];
2334 		if (deflt[0]) {
2335 			dp->default_density = MT_DENSITY4;
2336 		} else if (deflt[1]) {
2337 			dp->default_density = MT_DENSITY2;
2338 		} else {
2339 			dp->default_density = MT_DENSITY1;
2340 		}
2341 		break;
2342 
2343 	default:
2344 		for (i = p; i > p - NDENSITIES; i --) {
2345 			dp->densities[i - 1] = den[p - i];
2346 		}
2347 		if (deflt[0]) {
2348 			dp->default_density = MT_DENSITY4;
2349 		} else if (deflt[1]) {
2350 			dp->default_density = MT_DENSITY3;
2351 		} else if (deflt[2]) {
2352 			dp->default_density = MT_DENSITY2;
2353 		} else {
2354 			dp->default_density = MT_DENSITY1;
2355 		}
2356 		break;
2357 	}
2358 
2359 	bzero(dp->mediatype, NDENSITIES);
2360 
2361 	kmem_free(den_header, buflen);
2362 	return (1);
2363 }
2364 
2365 static int
2366 st_get_timeout_values_from_tape_drive(struct scsi_tape *un,
2367     struct st_drivetype *dp)
2368 {
2369 	ushort_t timeout;
2370 
2371 	ST_FUNC(ST_DEVINFO, st_get_timeout_values_from_type_drive);
2372 
2373 	if (st_get_timeouts_value(un, SCMD_ERASE, &timeout, 0) != 0) {
2374 		return (0);
2375 	}
2376 	dp->erase_timeout = timeout;
2377 
2378 	if (st_get_timeouts_value(un, SCMD_READ, &timeout, 0) != 0) {
2379 		return (0);
2380 	}
2381 	dp->io_timeout = timeout;
2382 
2383 	if (st_get_timeouts_value(un, SCMD_WRITE, &timeout, 0) != 0) {
2384 		return (0);
2385 	}
2386 	dp->io_timeout = max(dp->io_timeout, timeout);
2387 
2388 	if (st_get_timeouts_value(un, SCMD_SPACE, &timeout, 0) != 0) {
2389 		return (0);
2390 	}
2391 	dp->space_timeout = timeout;
2392 
2393 	if (st_get_timeouts_value(un, SCMD_LOAD, &timeout, 0) != 0) {
2394 		return (0);
2395 	}
2396 	dp->load_timeout = timeout;
2397 	dp->unload_timeout = timeout;
2398 
2399 	if (st_get_timeouts_value(un, SCMD_REWIND, &timeout, 0) != 0) {
2400 		return (0);
2401 	}
2402 	dp->rewind_timeout = timeout;
2403 
2404 	if (st_get_timeouts_value(un, SCMD_INQUIRY, &timeout, 0) != 0) {
2405 		return (0);
2406 	}
2407 	dp->non_motion_timeout = timeout;
2408 
2409 	return (1);
2410 }
2411 
2412 static int
2413 st_get_timeouts_value(struct scsi_tape *un, uchar_t option_code,
2414     ushort_t *timeout_value, ushort_t service_action)
2415 {
2416 	uchar_t *timeouts;
2417 	uchar_t *oper;
2418 	uchar_t support;
2419 	uchar_t cdbsize;
2420 	uchar_t ctdp;
2421 	size_t buflen;
2422 	int rval;
2423 
2424 	ST_FUNC(ST_DEVINFO, st_get_timeouts_value);
2425 
2426 	buflen = sizeof (struct one_com_des) +
2427 	    sizeof (struct com_timeout_des);
2428 	oper = kmem_zalloc(buflen, KM_SLEEP);
2429 	rval = st_report_supported_operation(un, oper, option_code,
2430 	    service_action);
2431 
2432 	if (rval != 0) {
2433 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2434 		    "st_get_timeouts_value(): "
2435 		    "fail to timeouts value for command %d.\n", option_code);
2436 		kmem_free(oper, buflen);
2437 		return (rval);
2438 	}
2439 
2440 	support = ((struct one_com_des *)oper)->support;
2441 	if ((support != SUPPORT_VALUES_SUPPORT_SCSI) &&
2442 	    (support != SUPPORT_VALUES_SUPPORT_VENDOR)) {
2443 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2444 		    "st_get_timeouts_value(): "
2445 		    "command %d is not supported.\n", option_code);
2446 		kmem_free(oper, buflen);
2447 		return (-1);
2448 	}
2449 
2450 	ctdp = ((struct one_com_des *)oper)->ctdp;
2451 	if (!ctdp) {
2452 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2453 		    "st_get_timeouts_value(): "
2454 		    "command timeout is not included.\n");
2455 		kmem_free(oper, buflen);
2456 		return (-1);
2457 	}
2458 
2459 	cdbsize = BE_16(((struct one_com_des *)oper)->cdb_size);
2460 	timeouts = (uchar_t *)(oper + cdbsize + 4);
2461 
2462 	/*
2463 	 * Timeout value in seconds is 4 bytes, but we only support the lower 2
2464 	 * bytes. If the higher 2 bytes are not zero, the timeout value is set
2465 	 * to 0xFFFF.
2466 	 */
2467 	if (*(timeouts + 8) != 0 || *(timeouts + 9) != 0) {
2468 		*timeout_value = USHRT_MAX;
2469 	} else {
2470 		*timeout_value = ((*(timeouts + 10)) << 8) |
2471 		    (*(timeouts + 11));
2472 	}
2473 
2474 	kmem_free(oper, buflen);
2475 	return (0);
2476 }
2477 
2478 static int
2479 st_get_default_conf(struct scsi_tape *un, char *vidpid, struct st_drivetype *dp)
2480 {
2481 	int i;
2482 
2483 	ST_FUNC(ST_DEVINFO, st_get_default_conf);
2484 
2485 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
2486 	    "st_get_default_conf(): making drivetype from INQ cmd\n");
2487 
2488 	/*
2489 	 * Make up a name
2490 	 */
2491 	bcopy("Vendor '", dp->name, 8);
2492 	bcopy(vidpid, &dp->name[8], VIDLEN);
2493 	bcopy("' Product '", &dp->name[16], 11);
2494 	bcopy(&vidpid[8], &dp->name[27], PIDLEN);
2495 	dp->name[ST_NAMESIZE - 2] = '\'';
2496 	dp->name[ST_NAMESIZE - 1] = '\0';
2497 	dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1));
2498 	(void) strncpy(dp->vid, ST_INQUIRY->inq_vid, dp->length);
2499 	/*
2500 	 * 'clean' vendor and product strings of non-printing chars
2501 	 */
2502 	for (i = 0; i < ST_NAMESIZE - 2; i++) {
2503 		if (dp->name[i] < ' ' || dp->name[i] > '~') {
2504 			dp->name[i] = '.';
2505 		}
2506 	}
2507 	dp->type = ST_TYPE_INVALID;
2508 	dp->options |= (ST_DYNAMIC | ST_UNLOADABLE | ST_MODE_SEL_COMP);
2509 
2510 	return (1); /* Can Not Fail */
2511 }
2512 
2513 /*
2514  * Regular Unix Entry points
2515  */
2516 
2517 
2518 
2519 /* ARGSUSED */
2520 static int
2521 st_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
2522 {
2523 	dev_t dev = *dev_p;
2524 	int rval = 0;
2525 
2526 	GET_SOFT_STATE(dev);
2527 
2528 	ST_ENTR(ST_DEVINFO, st_open);
2529 
2530 	/*
2531 	 * validate that we are addressing a sensible unit
2532 	 */
2533 	mutex_enter(ST_MUTEX);
2534 
2535 #ifdef	STDEBUG
2536 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2537 	    "st_open(node = %s dev = 0x%lx, flag = %d, otyp = %d)\n",
2538 	    st_dev_name(dev), *dev_p, flag, otyp);
2539 #endif
2540 
2541 	/*
2542 	 * All device accesss go thru st_strategy() where we check
2543 	 * suspend status
2544 	 */
2545 
2546 	if (!un->un_attached) {
2547 		st_known_tape_type(un);
2548 		if (!un->un_attached) {
2549 			rval = ENXIO;
2550 			goto exit;
2551 		}
2552 
2553 	}
2554 
2555 	/*
2556 	 * Check for the case of the tape in the middle of closing.
2557 	 * This isn't simply a check of the current state, because
2558 	 * we could be in state of sensing with the previous state
2559 	 * that of closing.
2560 	 *
2561 	 * And don't allow multiple opens.
2562 	 */
2563 	if (!(flag & (FNDELAY | FNONBLOCK)) && IS_CLOSING(un)) {
2564 		un->un_laststate = un->un_state;
2565 		un->un_state = ST_STATE_CLOSE_PENDING_OPEN;
2566 		while (IS_CLOSING(un) ||
2567 		    un->un_state == ST_STATE_CLOSE_PENDING_OPEN) {
2568 			if (cv_wait_sig(&un->un_clscv, ST_MUTEX) == 0) {
2569 				rval = EINTR;
2570 				un->un_state = un->un_laststate;
2571 				goto exit;
2572 			}
2573 		}
2574 	} else if (un->un_state != ST_STATE_CLOSED) {
2575 		rval = EBUSY;
2576 		goto busy;
2577 	}
2578 
2579 	/*
2580 	 * record current dev
2581 	 */
2582 	un->un_dev = dev;
2583 	un->un_oflags = flag;	/* save for use in st_tape_init() */
2584 	un->un_errno = 0;	/* no errors yet */
2585 	un->un_restore_pos = 0;
2586 	un->un_rqs_state = 0;
2587 
2588 	/*
2589 	 * If we are opening O_NDELAY, or O_NONBLOCK, we don't check for
2590 	 * anything, leave internal states alone, if fileno >= 0
2591 	 */
2592 	if (flag & (FNDELAY | FNONBLOCK)) {
2593 		switch (un->un_pos.pmode) {
2594 
2595 		case invalid:
2596 			un->un_state = ST_STATE_OFFLINE;
2597 			break;
2598 
2599 		case legacy:
2600 			/*
2601 			 * If position is anything other than rewound.
2602 			 */
2603 			if (un->un_pos.fileno != 0 || un->un_pos.blkno != 0) {
2604 				/*
2605 				 * set un_read_only/write-protect status.
2606 				 *
2607 				 * If the tape is not bot we can assume
2608 				 * that mspl->wp_status is set properly.
2609 				 * else
2610 				 * we need to do a mode sense/Tur once
2611 				 * again to get the actual tape status.(since
2612 				 * user might have replaced the tape)
2613 				 * Hence make the st state OFFLINE so that
2614 				 * we re-intialize the tape once again.
2615 				 */
2616 				un->un_read_only =
2617 				    (un->un_oflags & FWRITE) ? RDWR : RDONLY;
2618 				un->un_state = ST_STATE_OPEN_PENDING_IO;
2619 			} else {
2620 				un->un_state = ST_STATE_OFFLINE;
2621 			}
2622 			break;
2623 		case logical:
2624 			/* swag not sure how we were open last time */
2625 			(void) st_update_block_pos(un);
2626 			if (un->un_pos.lgclblkno == 0) {
2627 				un->un_state = ST_STATE_OFFLINE;
2628 			} else {
2629 				un->un_read_only =
2630 				    (un->un_oflags & FWRITE) ? 0 : 1;
2631 				un->un_state = ST_STATE_OPEN_PENDING_IO;
2632 			}
2633 			break;
2634 		}
2635 		rval = 0;
2636 	} else {
2637 		/*
2638 		 * Not opening O_NDELAY.
2639 		 */
2640 		un->un_state = ST_STATE_OPENING;
2641 
2642 		/*
2643 		 * Clear error entry stack
2644 		 */
2645 		st_empty_error_stack(un);
2646 
2647 		rval = st_tape_init(dev);
2648 		if ((rval == EACCES) && (un->un_read_only & WORM)) {
2649 			un->un_state = ST_STATE_OPEN_PENDING_IO;
2650 			rval = 0; /* so open doesn't fail */
2651 		} else if (rval) {
2652 			/*
2653 			 * Release the tape unit, if reserved and not
2654 			 * preserve reserve.
2655 			 */
2656 			if ((un->un_rsvd_status &
2657 			    (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) {
2658 				(void) st_reserve_release(un, ST_RELEASE);
2659 			}
2660 		} else {
2661 			un->un_state = ST_STATE_OPEN_PENDING_IO;
2662 		}
2663 	}
2664 
2665 exit:
2666 	/*
2667 	 * we don't want any uninvited guests scrogging our data when we're
2668 	 * busy with something, so for successful opens or failed opens
2669 	 * (except for EBUSY), reset these counters and state appropriately.
2670 	 */
2671 	if (rval != EBUSY) {
2672 		if (rval) {
2673 			un->un_state = ST_STATE_CLOSED;
2674 		}
2675 		un->un_err_resid = 0;
2676 		un->un_retry_ct = 0;
2677 		un->un_tran_retry_ct = 0;
2678 	}
2679 busy:
2680 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2681 	    "st_open: return val = %x, state = %d\n", rval, un->un_state);
2682 	mutex_exit(ST_MUTEX);
2683 	return (rval);
2684 
2685 }
2686 
2687 static int
2688 st_tape_init(dev_t dev)
2689 {
2690 	int err;
2691 	int rval = 0;
2692 
2693 	GET_SOFT_STATE(dev);
2694 
2695 	ST_FUNC(ST_DEVINFO, st_tape_init);
2696 
2697 	ASSERT(mutex_owned(ST_MUTEX));
2698 
2699 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2700 	    "st_tape_init(dev = 0x%lx, oflags = %d)\n", dev, un->un_oflags);
2701 
2702 	/*
2703 	 * Clean up after any errors left by 'last' close.
2704 	 * This also handles the case of the initial open.
2705 	 */
2706 	if (un->un_state != ST_STATE_INITIALIZING) {
2707 		un->un_laststate = un->un_state;
2708 		un->un_state = ST_STATE_OPENING;
2709 	}
2710 
2711 	un->un_kbytes_xferred = 0;
2712 
2713 	/*
2714 	 * do a throw away TUR to clear check condition
2715 	 */
2716 	err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
2717 
2718 	/*
2719 	 * If test unit ready fails because the drive is reserved
2720 	 * by another host fail the open for no access.
2721 	 */
2722 	if (err) {
2723 		if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) {
2724 			un->un_state = ST_STATE_CLOSED;
2725 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
2726 			    "st_tape_init: RESERVATION CONFLICT\n");
2727 			rval = EACCES;
2728 			goto exit;
2729 		}
2730 	}
2731 
2732 	/*
2733 	 * See whether this is a generic device that we haven't figured
2734 	 * anything out about yet.
2735 	 */
2736 	if (un->un_dp->type == ST_TYPE_INVALID) {
2737 		rval = st_determine_generic(dev);
2738 		if (rval) {
2739 			if (rval != EACCES) {
2740 				rval = EIO;
2741 			}
2742 			un->un_state = ST_STATE_CLOSED;
2743 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2744 			    "st_tape_init: %s invalid type\n",
2745 			    rval == EACCES ? "EACCES" : "EIO");
2746 			goto exit;
2747 		}
2748 		/*
2749 		 * If this is a Unknown Type drive,
2750 		 * Use the READ BLOCK LIMITS to determine if
2751 		 * allow large xfer is approprate if not globally
2752 		 * disabled with st_allow_large_xfer.
2753 		 */
2754 		un->un_allow_large_xfer = (uchar_t)st_allow_large_xfer;
2755 	} else {
2756 
2757 		/*
2758 		 * If we allow_large_xfer (ie >64k) and have not yet found out
2759 		 * the max block size supported by the drive,
2760 		 * find it by issueing a READ_BLKLIM command.
2761 		 * if READ_BLKLIM cmd fails, assume drive doesn't
2762 		 * allow_large_xfer and min/max block sizes as 1 byte and 63k.
2763 		 */
2764 		un->un_allow_large_xfer = st_allow_large_xfer &&
2765 		    (un->un_dp->options & ST_NO_RECSIZE_LIMIT);
2766 	}
2767 	/*
2768 	 * if maxbsize is unknown, set the maximum block size.
2769 	 */
2770 	if (un->un_maxbsize == MAXBSIZE_UNKNOWN) {
2771 
2772 		/*
2773 		 * Get the Block limits of the tape drive.
2774 		 * if un->un_allow_large_xfer = 0 , then make sure
2775 		 * that maxbsize is <= ST_MAXRECSIZE_FIXED.
2776 		 */
2777 		un->un_rbl = kmem_zalloc(RBLSIZE, KM_SLEEP);
2778 
2779 		err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD);
2780 		if (err) {
2781 			/* Retry */
2782 			err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD);
2783 		}
2784 		if (!err) {
2785 
2786 			/*
2787 			 * if cmd successful, use limit returned
2788 			 */
2789 			un->un_maxbsize = (un->un_rbl->max_hi << 16) +
2790 			    (un->un_rbl->max_mid << 8) +
2791 			    un->un_rbl->max_lo;
2792 			un->un_minbsize = (un->un_rbl->min_hi << 8) +
2793 			    un->un_rbl->min_lo;
2794 			un->un_data_mod = 1 << un->un_rbl->granularity;
2795 			if ((un->un_maxbsize == 0) ||
2796 			    (un->un_allow_large_xfer == 0 &&
2797 			    un->un_maxbsize > ST_MAXRECSIZE_FIXED)) {
2798 				un->un_maxbsize = ST_MAXRECSIZE_FIXED;
2799 
2800 			} else if (un->un_dp->type == ST_TYPE_DEFAULT) {
2801 				/*
2802 				 * Drive is not one that is configured, But the
2803 				 * READ BLOCK LIMITS tells us it can do large
2804 				 * xfers.
2805 				 */
2806 				if (un->un_maxbsize > ST_MAXRECSIZE_FIXED) {
2807 					un->un_dp->options |=
2808 					    ST_NO_RECSIZE_LIMIT;
2809 				}
2810 				/*
2811 				 * If max and mimimum block limits are the
2812 				 * same this is a fixed block size device.
2813 				 */
2814 				if (un->un_maxbsize == un->un_minbsize) {
2815 					un->un_dp->options &= ~ST_VARIABLE;
2816 				}
2817 			}
2818 
2819 			if (un->un_minbsize == 0) {
2820 				un->un_minbsize = 1;
2821 			}
2822 
2823 		} else { /* error on read block limits */
2824 
2825 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
2826 			    "!st_tape_init: Error on READ BLOCK LIMITS,"
2827 			    " errno = %d un_rsvd_status = 0x%X\n",
2828 			    err, un->un_rsvd_status);
2829 
2830 			/*
2831 			 * since read block limits cmd failed,
2832 			 * do not allow large xfers.
2833 			 * use old values in st_minphys
2834 			 */
2835 			if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) {
2836 				rval = EACCES;
2837 			} else {
2838 				un->un_allow_large_xfer = 0;
2839 				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
2840 				    "!Disabling large transfers\n");
2841 
2842 				/*
2843 				 * we guess maxbsize and minbsize
2844 				 */
2845 				if (un->un_bsize) {
2846 					un->un_maxbsize = un->un_minbsize =
2847 					    un->un_bsize;
2848 				} else {
2849 					un->un_maxbsize = ST_MAXRECSIZE_FIXED;
2850 					un->un_minbsize = 1;
2851 				}
2852 				/*
2853 				 * Data Mod must be set,
2854 				 * Even if read block limits fails.
2855 				 * Prevents Divide By Zero in st_rw().
2856 				 */
2857 				un->un_data_mod = 1;
2858 			}
2859 		}
2860 		if (un->un_rbl) {
2861 			kmem_free(un->un_rbl, RBLSIZE);
2862 			un->un_rbl = NULL;
2863 		}
2864 
2865 		if (rval) {
2866 			goto exit;
2867 		}
2868 	}
2869 
2870 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
2871 	    "maxdma = %d, maxbsize = %d, minbsize = %d, %s large xfer\n",
2872 	    un->un_maxdma, un->un_maxbsize, un->un_minbsize,
2873 	    (un->un_allow_large_xfer ? "ALLOW": "DON'T ALLOW"));
2874 
2875 	err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
2876 
2877 	if (err != 0) {
2878 		if (err == EINTR) {
2879 			un->un_laststate = un->un_state;
2880 			un->un_state = ST_STATE_CLOSED;
2881 			rval = EINTR;
2882 			goto exit;
2883 		}
2884 		/*
2885 		 * Make sure the tape is ready
2886 		 */
2887 		un->un_pos.pmode = invalid;
2888 		if (un->un_status != KEY_UNIT_ATTENTION) {
2889 			/*
2890 			 * allow open no media.  Subsequent MTIOCSTATE
2891 			 * with media present will complete the open
2892 			 * logic.
2893 			 */
2894 			un->un_laststate = un->un_state;
2895 			if (un->un_oflags & (FNONBLOCK|FNDELAY)) {
2896 				un->un_mediastate = MTIO_EJECTED;
2897 				un->un_state = ST_STATE_OFFLINE;
2898 				rval = 0;
2899 				goto exit;
2900 			} else {
2901 				un->un_state = ST_STATE_CLOSED;
2902 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2903 				    "st_tape_init EIO no media, not opened "
2904 				    "O_NONBLOCK|O_EXCL\n");
2905 				rval = EIO;
2906 				goto exit;
2907 			}
2908 		}
2909 	}
2910 
2911 	/*
2912 	 * On each open, initialize block size from drivetype struct,
2913 	 * as it could have been changed by MTSRSZ ioctl.
2914 	 * Now, ST_VARIABLE simply means drive is capable of variable
2915 	 * mode. All drives are assumed to support fixed records.
2916 	 * Hence, un_bsize tells what mode the drive is in.
2917 	 *	un_bsize	= 0	- variable record length
2918 	 *			= x	- fixed record length is x
2919 	 */
2920 	un->un_bsize = un->un_dp->bsize;
2921 
2922 	/*
2923 	 * If saved position is valid go there
2924 	 */
2925 	if (un->un_restore_pos) {
2926 		rval = st_validate_tapemarks(un, &un->un_pos);
2927 		if (rval != 0) {
2928 			if (rval != EACCES) {
2929 				rval = EIO;
2930 			}
2931 			un->un_restore_pos = 0;
2932 			un->un_laststate = un->un_state;
2933 			un->un_state = ST_STATE_CLOSED;
2934 			goto exit;
2935 		}
2936 		un->un_pos.fileno = un->un_save_fileno;
2937 		un->un_pos.blkno = un->un_save_blkno;
2938 		un->un_restore_pos = 0;
2939 	}
2940 
2941 	if (un->un_pos.pmode == invalid) {
2942 		rval = st_loadtape(dev);
2943 		if (rval) {
2944 			if (rval != EACCES) {
2945 				rval = EIO;
2946 			}
2947 			un->un_laststate = un->un_state;
2948 			un->un_state = ST_STATE_CLOSED;
2949 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2950 			    "st_tape_init: %s can't open tape\n",
2951 			    rval == EACCES ? "EACCES" : "EIO");
2952 			goto exit;
2953 		}
2954 	}
2955 
2956 	/*
2957 	 * do a mode sense to pick up state of current write-protect,
2958 	 * Could cause reserve and fail due to conflict.
2959 	 */
2960 	rval = st_modesense(un);
2961 	if (rval == EACCES) {
2962 		goto exit;
2963 	}
2964 
2965 	/*
2966 	 * If we are opening the tape for writing, check
2967 	 * to make sure that the tape can be written.
2968 	 */
2969 	if (un->un_oflags & FWRITE) {
2970 		err = 0;
2971 		if (un->un_mspl->wp) {
2972 			un->un_status = KEY_WRITE_PROTECT;
2973 			un->un_laststate = un->un_state;
2974 			un->un_state = ST_STATE_CLOSED;
2975 			rval = EACCES;
2976 			/*
2977 			 * STK sets the wp bit if volsafe tape is loaded.
2978 			 */
2979 			if ((un->un_dp->type == MT_ISSTK9840) &&
2980 			    (un->un_dp->options & ST_WORMABLE)) {
2981 				un->un_read_only = RDONLY;
2982 			} else {
2983 				goto exit;
2984 			}
2985 		} else {
2986 			un->un_read_only = RDWR;
2987 		}
2988 	} else {
2989 		un->un_read_only = RDONLY;
2990 	}
2991 
2992 	if (un->un_dp->options & ST_WORMABLE) {
2993 		un->un_read_only |= un->un_wormable(un);
2994 
2995 		if (((un->un_read_only == WORM) ||
2996 		    (un->un_read_only == RDWORM)) &&
2997 		    ((un->un_oflags & FWRITE) == FWRITE)) {
2998 			un->un_status = KEY_DATA_PROTECT;
2999 			rval = EACCES;
3000 			ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE,
3001 			    "read_only = %d eof = %d oflag = %d\n",
3002 			    un->un_read_only, un->un_pos.eof, un->un_oflags);
3003 		}
3004 	}
3005 
3006 	/*
3007 	 * If we're opening the tape write-only, we need to
3008 	 * write 2 filemarks on the HP 1/2 inch drive, to
3009 	 * create a null file.
3010 	 */
3011 	if ((un->un_read_only == RDWR) ||
3012 	    (un->un_read_only == WORM) && (un->un_oflags & FWRITE)) {
3013 		if (un->un_dp->options & ST_REEL) {
3014 			un->un_fmneeded = 2;
3015 		} else {
3016 			un->un_fmneeded = 1;
3017 		}
3018 	} else {
3019 		un->un_fmneeded = 0;
3020 	}
3021 
3022 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
3023 	    "fmneeded = %x\n", un->un_fmneeded);
3024 
3025 	/*
3026 	 * Make sure the density can be selected correctly.
3027 	 * If WORM can only write at the append point which in most cases
3028 	 * isn't BOP. st_determine_density() with a B_WRITE only attempts
3029 	 * to set and try densities if a BOP.
3030 	 */
3031 	if (st_determine_density(dev,
3032 	    un->un_read_only == RDWR ? B_WRITE : B_READ)) {
3033 		un->un_status = KEY_ILLEGAL_REQUEST;
3034 		un->un_laststate = un->un_state;
3035 		un->un_state = ST_STATE_CLOSED;
3036 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
3037 		    "st_tape_init: EIO can't determine density\n");
3038 		rval = EIO;
3039 		goto exit;
3040 	}
3041 
3042 	/*
3043 	 * Destroy the knowledge that we have 'determined'
3044 	 * density so that a later read at BOT comes along
3045 	 * does the right density determination.
3046 	 */
3047 
3048 	un->un_density_known = 0;
3049 
3050 
3051 	/*
3052 	 * Okay, the tape is loaded and either at BOT or somewhere past.
3053 	 * Mark the state such that any I/O or tape space operations
3054 	 * will get/set the right density, etc..
3055 	 */
3056 	un->un_laststate = un->un_state;
3057 	un->un_lastop = ST_OP_NIL;
3058 	un->un_mediastate = MTIO_INSERTED;
3059 	cv_broadcast(&un->un_state_cv);
3060 
3061 	/*
3062 	 *  Set test append flag if writing.
3063 	 *  First write must check that tape is positioned correctly.
3064 	 */
3065 	un->un_test_append = (un->un_oflags & FWRITE);
3066 
3067 exit:
3068 	un->un_err_resid = 0;
3069 	un->un_last_resid = 0;
3070 	un->un_last_count = 0;
3071 
3072 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3073 	    "st_tape_init: return val = %x\n", rval);
3074 	return (rval);
3075 
3076 }
3077 
3078 
3079 
3080 /* ARGSUSED */
3081 static int
3082 st_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
3083 {
3084 	int err = 0;
3085 	int norew, count, last_state;
3086 #ifdef	__x86
3087 	struct contig_mem *cp, *cp_temp;
3088 #endif
3089 
3090 	GET_SOFT_STATE(dev);
3091 
3092 	ST_ENTR(ST_DEVINFO, st_close);
3093 
3094 	/*
3095 	 * wait till all cmds in the pipeline have been completed
3096 	 */
3097 	mutex_enter(ST_MUTEX);
3098 
3099 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3100 	    "st_close(dev = 0x%lx, flag = %d, otyp = %d)\n", dev, flag, otyp);
3101 
3102 	st_wait_for_io(un);
3103 
3104 	/* turn off persistent errors on close, as we want close to succeed */
3105 	TURN_PE_OFF(un);
3106 
3107 	/*
3108 	 * set state to indicate that we are in process of closing
3109 	 */
3110 	last_state = un->un_laststate = un->un_state;
3111 	un->un_state = ST_STATE_CLOSING;
3112 
3113 	/*
3114 	 * BSD behavior:
3115 	 * a close always causes a silent span to the next file if we've hit
3116 	 * an EOF (but not yet read across it).
3117 	 */
3118 #ifdef DEBUG
3119 	if ((st_debug & 0xf) >= 6)
3120 		st_print_position(un, "st_close1:", &un->un_pos);
3121 #endif
3122 
3123 	if (BSD_BEHAVIOR && (un->un_pos.eof == ST_EOF)) {
3124 		if (un->un_pos.pmode != invalid) {
3125 			un->un_pos.fileno++;
3126 			un->un_pos.blkno = 0;
3127 		}
3128 		un->un_pos.eof = ST_NO_EOF;
3129 	}
3130 
3131 	/*
3132 	 * rewinding?
3133 	 */
3134 	norew = (getminor(dev) & MT_NOREWIND);
3135 
3136 	/*
3137 	 * SVR4 behavior for skipping to next file:
3138 	 *
3139 	 * If we have not seen a filemark, space to the next file
3140 	 *
3141 	 * If we have already seen the filemark we are physically in the next
3142 	 * file and we only increment the filenumber
3143 	 */
3144 
3145 
3146 	if (norew && SVR4_BEHAVIOR && (flag & FREAD) &&
3147 	    (un->un_pos.blkno != 0) &&
3148 	    ((un->un_lastop != ST_OP_WRITE) && (un->un_lastop != ST_OP_WEOF))) {
3149 		switch (un->un_pos.eof) {
3150 		case ST_NO_EOF:
3151 			/*
3152 			 * if we were reading and did not read the complete file
3153 			 * skip to the next file, leaving the tape correctly
3154 			 * positioned to read the first record of the next file
3155 			 * Check first for REEL if we are at EOT by trying to
3156 			 * read a block
3157 			 */
3158 			if ((un->un_dp->options & ST_REEL) &&
3159 			    (!(un->un_dp->options & ST_READ_IGNORE_EOFS)) &&
3160 			    (un->un_pos.blkno == 0)) {
3161 				if (st_cmd(dev, SCMD_SPACE, Blk(1), SYNC_CMD)) {
3162 					ST_DEBUG2(ST_DEVINFO, st_label,
3163 					    SCSI_DEBUG,
3164 					    "st_close : EIO can't space\n");
3165 					err = EIO;
3166 					break;
3167 				}
3168 				if (un->un_pos.eof >= ST_EOF_PENDING) {
3169 					un->un_pos.eof = ST_EOT_PENDING;
3170 					un->un_pos.fileno += 1;
3171 					un->un_pos.blkno   = 0;
3172 					break;
3173 				}
3174 			}
3175 			if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) {
3176 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3177 				    "st_close: EIO can't space #2\n");
3178 				err = EIO;
3179 			} else {
3180 				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3181 				    "st_close2: fileno=%x,blkno=%x,eof=%x\n",
3182 				    un->un_pos.fileno, un->un_pos.blkno,
3183 				    un->un_pos.eof);
3184 				un->un_pos.eof = ST_NO_EOF;
3185 			}
3186 			break;
3187 
3188 		case ST_EOF_PENDING:
3189 		case ST_EOF:
3190 			un->un_pos.fileno += 1;
3191 			un->un_pos.blkno   = 0;
3192 			un->un_pos.eof = ST_NO_EOF;
3193 			break;
3194 
3195 		case ST_EOT:
3196 		case ST_EOT_PENDING:
3197 			/* nothing to do */
3198 			break;
3199 		default:
3200 			scsi_log(ST_DEVINFO, st_label, CE_PANIC,
3201 			    "Undefined state 0x%x", un->un_pos.eof);
3202 
3203 		}
3204 	}
3205 
3206 
3207 	/*
3208 	 * For performance reasons (HP 88780), the driver should
3209 	 * postpone writing the second tape mark until just before a file
3210 	 * positioning ioctl is issued (e.g., rewind).	This means that
3211 	 * the user must not manually rewind the tape because the tape will
3212 	 * be missing the second tape mark which marks EOM.
3213 	 * However, this small performance improvement is not worth the risk.
3214 	 */
3215 
3216 	/*
3217 	 * We need to back up over the filemark we inadvertently popped
3218 	 * over doing a read in between the two filemarks that constitute
3219 	 * logical eot for 1/2" tapes. Note that ST_EOT_PENDING is only
3220 	 * set while reading.
3221 	 *
3222 	 * If we happen to be at physical eot (ST_EOM) (writing case),
3223 	 * the writing of filemark(s) will clear the ST_EOM state, which
3224 	 * we don't want, so we save this state and restore it later.
3225 	 */
3226 
3227 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3228 	    "flag=%x, fmneeded=%x, lastop=%x, eof=%x\n",
3229 	    flag, un->un_fmneeded, un->un_lastop, un->un_pos.eof);
3230 
3231 	if (un->un_pos.eof == ST_EOT_PENDING) {
3232 		if (norew) {
3233 			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
3234 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3235 				    "st_close: EIO can't space #3\n");
3236 				err = EIO;
3237 			} else {
3238 				un->un_pos.blkno = 0;
3239 				un->un_pos.eof = ST_EOT;
3240 			}
3241 		} else {
3242 			un->un_pos.eof = ST_NO_EOF;
3243 		}
3244 
3245 	/*
3246 	 * Do we need to write a file mark?
3247 	 *
3248 	 * only write filemarks if there are fmks to be written and
3249 	 *   - open for write (possibly read/write)
3250 	 *   - the last operation was a write
3251 	 * or:
3252 	 *   -	opened for wronly
3253 	 *   -	no data was written
3254 	 */
3255 	} else if ((un->un_pos.pmode != invalid) && (un->un_fmneeded > 0) &&
3256 	    (((flag & FWRITE) && (un->un_lastop == ST_OP_WRITE)) ||
3257 	    ((flag & FWRITE) && (un->un_lastop == ST_OP_WEOF)) ||
3258 	    ((flag == FWRITE) && (un->un_lastop == ST_OP_NIL)))) {
3259 
3260 		/* save ST_EOM state */
3261 		int was_at_eom = (un->un_pos.eof == ST_EOM) ? 1 : 0;
3262 
3263 		/*
3264 		 * Note that we will write a filemark if we had opened
3265 		 * the tape write only and no data was written, thus
3266 		 * creating a null file.
3267 		 *
3268 		 * If the user already wrote one, we only have to write 1 more.
3269 		 * If they wrote two, we don't have to write any.
3270 		 */
3271 
3272 		count = un->un_fmneeded;
3273 		if (count > 0) {
3274 			if (st_cmd(dev, SCMD_WRITE_FILE_MARK,
3275 			    count, SYNC_CMD)) {
3276 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3277 				    "st_close : EIO can't wfm\n");
3278 				err = EIO;
3279 			}
3280 			if ((un->un_dp->options & ST_REEL) && norew) {
3281 				if (st_cmd(dev, SCMD_SPACE, Fmk((-1)),
3282 				    SYNC_CMD)) {
3283 					ST_DEBUG2(ST_DEVINFO, st_label,
3284 					    SCSI_DEBUG,
3285 					    "st_close : EIO space fmk(-1)\n");
3286 					err = EIO;
3287 				}
3288 				un->un_pos.eof = ST_NO_EOF;
3289 				/* fix up block number */
3290 				un->un_pos.blkno = 0;
3291 			}
3292 		}
3293 
3294 		/*
3295 		 * If we aren't going to be rewinding, and we were at
3296 		 * physical eot, restore the state that indicates we
3297 		 * are at physical eot. Once you have reached physical
3298 		 * eot, and you close the tape, the only thing you can
3299 		 * do on the next open is to rewind. Access to trailer
3300 		 * records is only allowed without closing the device.
3301 		 */
3302 		if (norew == 0 && was_at_eom) {
3303 			un->un_pos.eof = ST_EOM;
3304 		}
3305 	}
3306 
3307 	/*
3308 	 * report soft errors if enabled and available, if we never accessed
3309 	 * the drive, don't get errors. This will prevent some DAT error
3310 	 * messages upon LOG SENSE.
3311 	 */
3312 	if (st_report_soft_errors_on_close &&
3313 	    (un->un_dp->options & ST_SOFT_ERROR_REPORTING) &&
3314 	    (last_state != ST_STATE_OFFLINE)) {
3315 		(void) st_report_soft_errors(dev, flag);
3316 	}
3317 
3318 
3319 	/*
3320 	 * Do we need to rewind? Can we rewind?
3321 	 */
3322 	if (norew == 0 && un->un_pos.pmode != invalid && err == 0) {
3323 		/*
3324 		 * We'd like to rewind with the
3325 		 * 'immediate' bit set, but this
3326 		 * causes problems on some drives
3327 		 * where subsequent opens get a
3328 		 * 'NOT READY' error condition
3329 		 * back while the tape is rewinding,
3330 		 * which is impossible to distinguish
3331 		 * from the condition of 'no tape loaded'.
3332 		 *
3333 		 * Also, for some targets, if you disconnect
3334 		 * with the 'immediate' bit set, you don't
3335 		 * actually return right away, i.e., the
3336 		 * target ignores your request for immediate
3337 		 * return.
3338 		 *
3339 		 * Instead, we'll fire off an async rewind
3340 		 * command. We'll mark the device as closed,
3341 		 * and any subsequent open will stall on
3342 		 * the first TEST_UNIT_READY until the rewind
3343 		 * completes.
3344 		 */
3345 
3346 		/*
3347 		 * Used to be if reserve was not supported we'd send an
3348 		 * asynchronious rewind. Comments above may be slightly invalid
3349 		 * as the immediate bit was never set. Doing an immedate rewind
3350 		 * makes sense, I think fixes to not ready status might handle
3351 		 * the problems described above.
3352 		 */
3353 		if (un->un_sd->sd_inq->inq_ansi < 2) {
3354 			(void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
3355 		} else {
3356 			(void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD);
3357 		}
3358 	}
3359 
3360 	/*
3361 	 * eject tape if necessary
3362 	 */
3363 	if (un->un_eject_tape_on_failure) {
3364 		un->un_eject_tape_on_failure = 0;
3365 		if (st_cmd(dev, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) {
3366 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3367 			    "st_close : can't unload tape\n");
3368 		} else {
3369 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3370 			    "st_close : tape unloaded \n");
3371 			un->un_pos.eof = ST_NO_EOF;
3372 			un->un_mediastate = MTIO_EJECTED;
3373 		}
3374 	}
3375 	/*
3376 	 * Release the tape unit, if default reserve/release
3377 	 * behaviour.
3378 	 */
3379 	if ((un->un_rsvd_status &
3380 	    (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) {
3381 		(void) st_reserve_release(un, ST_RELEASE);
3382 	}
3383 
3384 	/*
3385 	 * clear up state
3386 	 */
3387 	un->un_laststate = un->un_state;
3388 	un->un_state = ST_STATE_CLOSED;
3389 	un->un_lastop = ST_OP_NIL;
3390 	un->un_throttle = 1;	/* assume one request at time, for now */
3391 	un->un_retry_ct = 0;
3392 	un->un_tran_retry_ct = 0;
3393 	un->un_errno = 0;
3394 	un->un_swr_token = (opaque_t)NULL;
3395 	un->un_rsvd_status &= ~(ST_INIT_RESERVE);
3396 
3397 	/* Restore the options to the init time settings */
3398 	if (un->un_init_options & ST_READ_IGNORE_ILI) {
3399 		un->un_dp->options |= ST_READ_IGNORE_ILI;
3400 	} else {
3401 		un->un_dp->options &= ~ST_READ_IGNORE_ILI;
3402 	}
3403 
3404 	if (un->un_init_options & ST_READ_IGNORE_EOFS) {
3405 		un->un_dp->options |= ST_READ_IGNORE_EOFS;
3406 	} else {
3407 		un->un_dp->options &= ~ST_READ_IGNORE_EOFS;
3408 	}
3409 
3410 	if (un->un_init_options & ST_SHORT_FILEMARKS) {
3411 		un->un_dp->options |= ST_SHORT_FILEMARKS;
3412 	} else {
3413 		un->un_dp->options &= ~ST_SHORT_FILEMARKS;
3414 	}
3415 
3416 	ASSERT(mutex_owned(ST_MUTEX));
3417 
3418 	/*
3419 	 * Signal anyone awaiting a close operation to complete.
3420 	 */
3421 	cv_signal(&un->un_clscv);
3422 
3423 	/*
3424 	 * any kind of error on closing causes all state to be tossed
3425 	 */
3426 	if (err && un->un_status != KEY_ILLEGAL_REQUEST) {
3427 		/*
3428 		 * note that st_intr has already set
3429 		 * un_pos.pmode to invalid.
3430 		 */
3431 		un->un_density_known = 0;
3432 	}
3433 
3434 #ifdef	__x86
3435 	/*
3436 	 * free any contiguous mem alloc'ed for big block I/O
3437 	 */
3438 	cp = un->un_contig_mem;
3439 	while (cp) {
3440 		if (cp->cm_addr) {
3441 			ddi_dma_mem_free(&cp->cm_acc_hdl);
3442 		}
3443 		cp_temp = cp;
3444 		cp = cp->cm_next;
3445 		kmem_free(cp_temp,
3446 		    sizeof (struct contig_mem) + biosize());
3447 	}
3448 	un->un_contig_mem_total_num = 0;
3449 	un->un_contig_mem_available_num = 0;
3450 	un->un_contig_mem = NULL;
3451 	un->un_max_contig_mem_len = 0;
3452 #endif
3453 
3454 	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
3455 	    "st_close3: return val = %x, fileno=%x, blkno=%x, eof=%x\n",
3456 	    err, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof);
3457 
3458 	mutex_exit(ST_MUTEX);
3459 	return (err);
3460 }
3461 
3462 /*
3463  * These routines perform raw i/o operations.
3464  */
3465 
3466 /* ARGSUSED2 */
3467 static int
3468 st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p)
3469 {
3470 #ifdef DEBUG
3471 	GET_SOFT_STATE(dev);
3472 	ST_ENTR(ST_DEVINFO, st_aread);
3473 #endif
3474 	return (st_arw(dev, aio, B_READ));
3475 }
3476 
3477 
3478 /* ARGSUSED2 */
3479 static int
3480 st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p)
3481 {
3482 #ifdef DEBUG
3483 	GET_SOFT_STATE(dev);
3484 	ST_ENTR(ST_DEVINFO, st_awrite);
3485 #endif
3486 	return (st_arw(dev, aio, B_WRITE));
3487 }
3488 
3489 
3490 
3491 /* ARGSUSED */
3492 static int
3493 st_read(dev_t dev, struct uio *uiop, cred_t *cred_p)
3494 {
3495 #ifdef DEBUG
3496 	GET_SOFT_STATE(dev);
3497 	ST_ENTR(ST_DEVINFO, st_read);
3498 #endif
3499 	return (st_rw(dev, uiop, B_READ));
3500 }
3501 
3502 /* ARGSUSED */
3503 static int
3504 st_write(dev_t dev, struct uio *uiop, cred_t *cred_p)
3505 {
3506 #ifdef DEBUG
3507 	GET_SOFT_STATE(dev);
3508 	ST_ENTR(ST_DEVINFO, st_write);
3509 #endif
3510 	return (st_rw(dev, uiop, B_WRITE));
3511 }
3512 
3513 /*
3514  * Due to historical reasons, old limits are: For variable-length devices:
3515  * if greater than 64KB - 1 (ST_MAXRECSIZE_VARIABLE), block into 64 KB - 2
3516  * ST_MAXRECSIZE_VARIABLE_LIMIT) requests; otherwise,
3517  * (let it through unmodified. For fixed-length record devices:
3518  * 63K (ST_MAXRECSIZE_FIXED) is max (default minphys).
3519  *
3520  * The new limits used are un_maxdma (retrieved using scsi_ifgetcap()
3521  * from the HBA) and un_maxbsize (retrieved by sending SCMD_READ_BLKLIM
3522  * command to the drive).
3523  *
3524  */
3525 static void
3526 st_minphys(struct buf *bp)
3527 {
3528 	struct scsi_tape *un;
3529 
3530 	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
3531 
3532 	ST_FUNC(ST_DEVINFO, st_minphys);
3533 
3534 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3535 	    "st_minphys(bp = 0x%p): b_bcount = 0x%lx\n", (void *)bp,
3536 	    bp->b_bcount);
3537 
3538 	if (un->un_allow_large_xfer) {
3539 
3540 		/*
3541 		 * check un_maxbsize for variable length devices only
3542 		 */
3543 		if (un->un_bsize == 0 && bp->b_bcount > un->un_maxbsize) {
3544 			bp->b_bcount = un->un_maxbsize;
3545 		}
3546 		/*
3547 		 * can't go more that HBA maxdma limit in either fixed-length
3548 		 * or variable-length tape drives.
3549 		 */
3550 		if (bp->b_bcount > un->un_maxdma) {
3551 			bp->b_bcount = un->un_maxdma;
3552 		}
3553 	} else {
3554 
3555 		/*
3556 		 *  use old fixed limits
3557 		 */
3558 		if (un->un_bsize == 0) {
3559 			if (bp->b_bcount > ST_MAXRECSIZE_VARIABLE) {
3560 				bp->b_bcount = ST_MAXRECSIZE_VARIABLE_LIMIT;
3561 			}
3562 		} else {
3563 			if (bp->b_bcount > ST_MAXRECSIZE_FIXED) {
3564 				bp->b_bcount = ST_MAXRECSIZE_FIXED;
3565 			}
3566 		}
3567 	}
3568 
3569 	/*
3570 	 * For regular raw I/O and Fixed Block length devices, make sure
3571 	 * the adjusted block count is a whole multiple of the device
3572 	 * block size.
3573 	 */
3574 	if (bp != un->un_sbufp && un->un_bsize) {
3575 		bp->b_bcount -= (bp->b_bcount % un->un_bsize);
3576 	}
3577 }
3578 
3579 static int
3580 st_rw(dev_t dev, struct uio *uio, int flag)
3581 {
3582 	int rval = 0;
3583 	long len;
3584 
3585 	GET_SOFT_STATE(dev);
3586 
3587 	ST_FUNC(ST_DEVINFO, st_rw);
3588 
3589 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3590 	    "st_rw(dev = 0x%lx, flag = %s)\n", dev,
3591 	    (flag == B_READ ? rd_str: wr_str));
3592 
3593 	/* get local copy of transfer length */
3594 	len = uio->uio_iov->iov_len;
3595 
3596 	mutex_enter(ST_MUTEX);
3597 
3598 	/*
3599 	 * Clear error entry stack
3600 	 */
3601 	st_empty_error_stack(un);
3602 
3603 	/*
3604 	 * If in fixed block size mode and requested read or write
3605 	 * is not an even multiple of that block size.
3606 	 */
3607 	if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) {
3608 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3609 		    "%s: not modulo %d block size\n",
3610 		    (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize);
3611 		rval = EINVAL;
3612 	}
3613 
3614 	/* If device has set granularity in the READ_BLKLIM we honor it. */
3615 	if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) {
3616 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3617 		    "%s: not modulo %d device granularity\n",
3618 		    (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod);
3619 		rval = EINVAL;
3620 	}
3621 
3622 	if (rval != 0) {
3623 		un->un_errno = rval;
3624 		mutex_exit(ST_MUTEX);
3625 		return (rval);
3626 	}
3627 
3628 	/*
3629 	 * Reset this so it can be set if Berkeley and read over a filemark.
3630 	 */
3631 	un->un_silent_skip = 0;
3632 	mutex_exit(ST_MUTEX);
3633 
3634 	len = uio->uio_resid;
3635 
3636 	rval = physio(st_strategy, (struct buf *)NULL,
3637 	    dev, flag, st_minphys, uio);
3638 	/*
3639 	 * if we have hit logical EOT during this xfer and there is not a
3640 	 * full residue, then set eof back  to ST_EOM to make sure that
3641 	 * the user will see at least one zero write
3642 	 * after this short write
3643 	 */
3644 	mutex_enter(ST_MUTEX);
3645 	if (un->un_pos.eof > ST_NO_EOF) {
3646 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3647 		"eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid);
3648 	}
3649 	if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) {
3650 		if ((uio->uio_resid != len) && (uio->uio_resid != 0)) {
3651 			un->un_pos.eof = ST_EOM;
3652 		} else if (uio->uio_resid == len) {
3653 			un->un_pos.eof = ST_NO_EOF;
3654 		}
3655 	}
3656 
3657 	if (un->un_silent_skip && uio->uio_resid != len) {
3658 		un->un_pos.eof = ST_EOF;
3659 		un->un_pos.blkno = un->un_save_blkno;
3660 		un->un_pos.fileno--;
3661 	}
3662 
3663 	un->un_errno = rval;
3664 
3665 	mutex_exit(ST_MUTEX);
3666 
3667 	return (rval);
3668 }
3669 
3670 static int
3671 st_arw(dev_t dev, struct aio_req *aio, int flag)
3672 {
3673 	struct uio *uio = aio->aio_uio;
3674 	int rval = 0;
3675 	long len;
3676 
3677 	GET_SOFT_STATE(dev);
3678 
3679 	ST_FUNC(ST_DEVINFO, st_arw);
3680 
3681 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3682 	    "st_rw(dev = 0x%lx, flag = %s)\n", dev,
3683 	    (flag == B_READ ? rd_str: wr_str));
3684 
3685 	/* get local copy of transfer length */
3686 	len = uio->uio_iov->iov_len;
3687 
3688 	mutex_enter(ST_MUTEX);
3689 
3690 	/*
3691 	 * If in fixed block size mode and requested read or write
3692 	 * is not an even multiple of that block size.
3693 	 */
3694 	if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) {
3695 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3696 		    "%s: not modulo %d block size\n",
3697 		    (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize);
3698 		rval = EINVAL;
3699 	}
3700 
3701 	/* If device has set granularity in the READ_BLKLIM we honor it. */
3702 	if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) {
3703 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3704 		    "%s: not modulo %d device granularity\n",
3705 		    (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod);
3706 		rval = EINVAL;
3707 	}
3708 
3709 	if (rval != 0) {
3710 		un->un_errno = rval;
3711 		mutex_exit(ST_MUTEX);
3712 		return (rval);
3713 	}
3714 
3715 	mutex_exit(ST_MUTEX);
3716 
3717 	len = uio->uio_resid;
3718 
3719 	rval = aphysio(st_strategy, anocancel, dev, flag, st_minphys, aio);
3720 
3721 	/*
3722 	 * if we have hit logical EOT during this xfer and there is not a
3723 	 * full residue, then set eof back  to ST_EOM to make sure that
3724 	 * the user will see at least one zero write
3725 	 * after this short write
3726 	 *
3727 	 * we keep this here just in case the application is not using
3728 	 * persistent errors
3729 	 */
3730 	mutex_enter(ST_MUTEX);
3731 	if (un->un_pos.eof > ST_NO_EOF) {
3732 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3733 		    "eof=%d resid=%lx\n", un->un_pos.eof, uio->uio_resid);
3734 	}
3735 	if (un->un_pos.eof >= ST_EOM && (flag == B_WRITE)) {
3736 		if ((uio->uio_resid != len) && (uio->uio_resid != 0)) {
3737 			un->un_pos.eof = ST_EOM;
3738 		} else if (uio->uio_resid == len && !IS_PE_FLAG_SET(un)) {
3739 			un->un_pos.eof = ST_NO_EOF;
3740 		}
3741 	}
3742 	un->un_errno = rval;
3743 	mutex_exit(ST_MUTEX);
3744 
3745 	return (rval);
3746 }
3747 
3748 
3749 
3750 static int
3751 st_strategy(struct buf *bp)
3752 {
3753 	struct scsi_tape *un;
3754 	dev_t dev = bp->b_edev;
3755 
3756 	/*
3757 	 * validate arguments
3758 	 */
3759 	if ((un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev))) == NULL) {
3760 		bp->b_resid = bp->b_bcount;
3761 		mutex_enter(ST_MUTEX);
3762 		st_bioerror(bp, ENXIO);
3763 		mutex_exit(ST_MUTEX);
3764 		goto error;
3765 	}
3766 
3767 	ST_ENTR(ST_DEVINFO, st_strategy);
3768 
3769 	mutex_enter(ST_MUTEX);
3770 
3771 	while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
3772 		cv_wait(&un->un_suspend_cv, ST_MUTEX);
3773 	}
3774 
3775 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3776 	    "st_strategy(): bcount=0x%lx, fileno=%d, blkno=%x, eof=%d\n",
3777 	    bp->b_bcount, un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof);
3778 
3779 	/*
3780 	 * If persistent errors have been flagged, just nix this one. We wait
3781 	 * for any outstanding I/O's below, so we will be in order.
3782 	 */
3783 	if (IS_PE_FLAG_SET(un)) {
3784 		goto exit;
3785 	}
3786 
3787 	if (bp != un->un_sbufp) {
3788 		char reading = bp->b_flags & B_READ;
3789 		int wasopening = 0;
3790 
3791 		/*
3792 		 * If we haven't done/checked reservation on the tape unit
3793 		 * do it now.
3794 		 */
3795 		if ((un->un_rsvd_status &
3796 		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
3797 			if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) {
3798 				if (st_reserve_release(un, ST_RESERVE)) {
3799 					st_bioerror(bp, un->un_errno);
3800 					goto exit;
3801 				}
3802 			} else if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3803 				/*
3804 				 * Enter here to restore position for possible
3805 				 * resets when the device was closed and opened
3806 				 * in O_NDELAY mode subsequently
3807 				 */
3808 				un->un_state = ST_STATE_INITIALIZING;
3809 				(void) st_cmd(dev, SCMD_TEST_UNIT_READY,
3810 				    0, SYNC_CMD);
3811 				un->un_state = ST_STATE_OPEN_PENDING_IO;
3812 			}
3813 			un->un_rsvd_status |= ST_INIT_RESERVE;
3814 		}
3815 
3816 		/*
3817 		 * If we are offline, we have to initialize everything first.
3818 		 * This is to handle either when opened with O_NDELAY, or
3819 		 * we just got a new tape in the drive, after an offline.
3820 		 * We don't observe O_NDELAY past the open,
3821 		 * as it will not make sense for tapes.
3822 		 */
3823 		if (un->un_state == ST_STATE_OFFLINE || un->un_restore_pos) {
3824 			/* reset state to avoid recursion */
3825 			un->un_state = ST_STATE_INITIALIZING;
3826 			if (st_tape_init(dev)) {
3827 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3828 				    "stioctl : OFFLINE init failure ");
3829 				un->un_state = ST_STATE_OFFLINE;
3830 				un->un_pos.pmode = invalid;
3831 				goto b_done_err;
3832 			}
3833 			un->un_state = ST_STATE_OPEN_PENDING_IO;
3834 		}
3835 		/*
3836 		 * Check for legal operations
3837 		 */
3838 		if (un->un_pos.pmode == invalid) {
3839 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3840 			    "strategy with un->un_pos.pmode invalid\n");
3841 			goto b_done_err;
3842 		}
3843 
3844 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3845 		    "st_strategy(): regular io\n");
3846 
3847 		/*
3848 		 * Process this first. If we were reading, and we're pending
3849 		 * logical eot, that means we've bumped one file mark too far.
3850 		 */
3851 
3852 		/*
3853 		 * Recursion warning: st_cmd will route back through here.
3854 		 */
3855 		if (un->un_pos.eof == ST_EOT_PENDING) {
3856 			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
3857 				un->un_pos.pmode = invalid;
3858 				un->un_density_known = 0;
3859 				goto b_done_err;
3860 			}
3861 			un->un_pos.blkno = 0; /* fix up block number.. */
3862 			un->un_pos.eof = ST_EOT;
3863 		}
3864 
3865 		/*
3866 		 * If we are in the process of opening, we may have to
3867 		 * determine/set the correct density. We also may have
3868 		 * to do a test_append (if QIC) to see whether we are
3869 		 * in a position to append to the end of the tape.
3870 		 *
3871 		 * If we're already at logical eot, we transition
3872 		 * to ST_NO_EOF. If we're at physical eot, we punt
3873 		 * to the switch statement below to handle.
3874 		 */
3875 		if ((un->un_state == ST_STATE_OPEN_PENDING_IO) ||
3876 		    (un->un_test_append && (un->un_dp->options & ST_QIC))) {
3877 
3878 			if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3879 				if (st_determine_density(dev, (int)reading)) {
3880 					goto b_done_err;
3881 				}
3882 			}
3883 
3884 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3885 			    "pending_io@fileno %d rw %d qic %d eof %d\n",
3886 			    un->un_pos.fileno, (int)reading,
3887 			    (un->un_dp->options & ST_QIC) ? 1 : 0,
3888 			    un->un_pos.eof);
3889 
3890 			if (!reading && un->un_pos.eof != ST_EOM) {
3891 				if (un->un_pos.eof == ST_EOT) {
3892 					un->un_pos.eof = ST_NO_EOF;
3893 				} else if (un->un_pos.pmode != invalid &&
3894 				    (un->un_dp->options & ST_QIC)) {
3895 					/*
3896 					 * st_test_append() will do it all
3897 					 */
3898 					st_test_append(bp);
3899 					goto done;
3900 				}
3901 			}
3902 			if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3903 				wasopening = 1;
3904 			}
3905 			un->un_laststate = un->un_state;
3906 			un->un_state = ST_STATE_OPEN;
3907 		}
3908 
3909 
3910 		/*
3911 		 * Process rest of END OF FILE and END OF TAPE conditions
3912 		 */
3913 
3914 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3915 		    "eof=%x, wasopening=%x\n",
3916 		    un->un_pos.eof, wasopening);
3917 
3918 		switch (un->un_pos.eof) {
3919 		case ST_EOM:
3920 			/*
3921 			 * This allows writes to proceed past physical
3922 			 * eot. We'll *really* be in trouble if the
3923 			 * user continues blindly writing data too
3924 			 * much past this point (unwind the tape).
3925 			 * Physical eot really means 'early warning
3926 			 * eot' in this context.
3927 			 *
3928 			 * Every other write from now on will succeed
3929 			 * (if sufficient  tape left).
3930 			 * This write will return with resid == count
3931 			 * but the next one should be successful
3932 			 *
3933 			 * Note that we only transition to logical EOT
3934 			 * if the last state wasn't the OPENING state.
3935 			 * We explicitly prohibit running up to physical
3936 			 * eot, closing the device, and then re-opening
3937 			 * to proceed. Trailer records may only be gotten
3938 			 * at by keeping the tape open after hitting eot.
3939 			 *
3940 			 * Also note that ST_EOM cannot be set by reading-
3941 			 * this can only be set during writing. Reading
3942 			 * up to the end of the tape gets a blank check
3943 			 * or a double-filemark indication (ST_EOT_PENDING),
3944 			 * and we prohibit reading after that point.
3945 			 *
3946 			 */
3947 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOM\n");
3948 			if (wasopening == 0) {
3949 				/*
3950 				 * this allows st_rw() to reset it back to
3951 				 * ST_EOM to make sure that the application
3952 				 * will see a zero write
3953 				 */
3954 				un->un_pos.eof = ST_WRITE_AFTER_EOM;
3955 			}
3956 			un->un_status = SUN_KEY_EOT;
3957 			goto b_done;
3958 
3959 		case ST_WRITE_AFTER_EOM:
3960 		case ST_EOT:
3961 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOT\n");
3962 			un->un_status = SUN_KEY_EOT;
3963 			if (SVR4_BEHAVIOR && reading) {
3964 				goto b_done_err;
3965 			}
3966 
3967 			if (reading) {
3968 				goto b_done;
3969 			}
3970 			un->un_pos.eof = ST_NO_EOF;
3971 			break;
3972 
3973 		case ST_EOF_PENDING:
3974 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3975 			    "EOF PENDING\n");
3976 			un->un_status = SUN_KEY_EOF;
3977 			if (SVR4_BEHAVIOR) {
3978 				un->un_pos.eof = ST_EOF;
3979 				goto b_done;
3980 			}
3981 			/* FALLTHROUGH */
3982 		case ST_EOF:
3983 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOF\n");
3984 			un->un_status = SUN_KEY_EOF;
3985 			if (SVR4_BEHAVIOR) {
3986 				goto b_done_err;
3987 			}
3988 
3989 			if (BSD_BEHAVIOR) {
3990 				un->un_pos.eof = ST_NO_EOF;
3991 				un->un_pos.fileno += 1;
3992 				un->un_pos.blkno   = 0;
3993 			}
3994 
3995 			if (reading) {
3996 				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3997 				    "now file %d (read)\n",
3998 				    un->un_pos.fileno);
3999 				goto b_done;
4000 			}
4001 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4002 			    "now file %d (write)\n", un->un_pos.fileno);
4003 			break;
4004 		default:
4005 			un->un_status = 0;
4006 			break;
4007 		}
4008 	}
4009 
4010 	bp->b_flags &= ~(B_DONE);
4011 	st_bioerror(bp, 0);
4012 	bp->av_forw = NULL;
4013 	bp->b_resid = 0;
4014 	SET_BP_PKT(bp, 0);
4015 
4016 
4017 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4018 	    "st_strategy: cmd=0x%p  count=%ld  resid=%ld flags=0x%x"
4019 	    " pkt=0x%p\n",
4020 	    (void *)bp->b_forw, bp->b_bcount,
4021 	    bp->b_resid, bp->b_flags, (void *)BP_PKT(bp));
4022 
4023 #ifdef	__x86
4024 	/*
4025 	 * We will replace bp with a new bp that can do big blk xfer
4026 	 * if the requested xfer size is bigger than un->un_maxdma_arch
4027 	 *
4028 	 * Also, we need to make sure that we're handling real I/O
4029 	 * by checking group 0/1 SCSI I/O commands, if needed
4030 	 */
4031 	if (bp->b_bcount > un->un_maxdma_arch &&
4032 	    (bp != un->un_sbufp					||
4033 	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ		||
4034 	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ_G1	||
4035 	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE	||
4036 	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE_G1)) {
4037 		mutex_exit(ST_MUTEX);
4038 		bp = st_get_bigblk_bp(bp);
4039 		mutex_enter(ST_MUTEX);
4040 	}
4041 #endif
4042 
4043 	/* put on wait queue */
4044 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4045 	    "st_strategy: un->un_quef = 0x%p, bp = 0x%p\n",
4046 	    (void *)un->un_quef, (void *)bp);
4047 
4048 	if (un->un_quef) {
4049 		un->un_quel->b_actf = bp;
4050 	} else {
4051 		un->un_quef = bp;
4052 	}
4053 	un->un_quel = bp;
4054 
4055 	ST_DO_KSTATS(bp, kstat_waitq_enter);
4056 
4057 	st_start(un);
4058 
4059 done:
4060 	mutex_exit(ST_MUTEX);
4061 	return (0);
4062 
4063 
4064 error:
4065 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4066 	    "st_strategy: error exit\n");
4067 
4068 	biodone(bp);
4069 	return (0);
4070 
4071 b_done_err:
4072 	st_bioerror(bp, EIO);
4073 	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4074 	    "st_strategy : EIO b_done_err\n");
4075 
4076 b_done:
4077 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4078 	    "st_strategy: b_done\n");
4079 
4080 exit:
4081 	/*
4082 	 * make sure no commands are outstanding or waiting before closing,
4083 	 * so we can guarantee order
4084 	 */
4085 	st_wait_for_io(un);
4086 	un->un_err_resid = bp->b_resid = bp->b_bcount;
4087 
4088 	/* override errno here, if persistent errors were flagged */
4089 	if (IS_PE_FLAG_SET(un))
4090 		bioerror(bp, un->un_errno);
4091 
4092 	mutex_exit(ST_MUTEX);
4093 
4094 	biodone(bp);
4095 	ASSERT(mutex_owned(ST_MUTEX) == 0);
4096 	return (0);
4097 }
4098 
4099 
4100 
4101 /*
4102  * this routine spaces forward over filemarks
4103  */
4104 static int
4105 st_space_fmks(dev_t dev, int count)
4106 {
4107 	int rval = 0;
4108 
4109 	GET_SOFT_STATE(dev);
4110 
4111 	ST_FUNC(ST_DEVINFO, st_space_fmks);
4112 
4113 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4114 	    "st_space_fmks(dev = 0x%lx, count = %d)\n", dev, count);
4115 
4116 	ASSERT(mutex_owned(ST_MUTEX));
4117 
4118 	/*
4119 	 * the risk with doing only one space operation is that we
4120 	 * may accidentily jump in old data
4121 	 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD
4122 	 * because the 8200 does not append a marker; in order not to
4123 	 * sacrifice the fast file skip, we do a slow skip if the low
4124 	 * density device has been opened
4125 	 */
4126 
4127 	if ((un->un_dp->options & ST_KNOWS_EOD) &&
4128 	    !((un->un_dp->type == ST_TYPE_EXB8500 && MT_DENSITY(dev) == 0))) {
4129 		if (st_cmd(dev, SCMD_SPACE, Fmk(count), SYNC_CMD)) {
4130 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4131 			    "space_fmks : EIO can't do space cmd #1\n");
4132 			rval = EIO;
4133 		}
4134 	} else {
4135 		while (count > 0) {
4136 			if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) {
4137 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4138 				    "space_fmks : EIO can't do space cmd #2\n");
4139 				rval = EIO;
4140 				break;
4141 			}
4142 			count -= 1;
4143 			/*
4144 			 * read a block to see if we have reached
4145 			 * end of medium (double filemark for reel or
4146 			 * medium error for others)
4147 			 */
4148 			if (count > 0) {
4149 				if (st_cmd(dev, SCMD_SPACE, Blk(1),
4150 				    SYNC_CMD)) {
4151 					ST_DEBUG2(ST_DEVINFO, st_label,
4152 					    SCSI_DEBUG,
4153 					    "space_fmks : EIO can't do "
4154 					    "space cmd #3\n");
4155 					rval = EIO;
4156 					break;
4157 				}
4158 				if ((un->un_pos.eof >= ST_EOF_PENDING) &&
4159 				    (un->un_dp->options & ST_REEL)) {
4160 					un->un_status = SUN_KEY_EOT;
4161 					ST_DEBUG2(ST_DEVINFO, st_label,
4162 					    SCSI_DEBUG,
4163 					    "space_fmks : EIO ST_REEL\n");
4164 					rval = EIO;
4165 					break;
4166 				} else if (IN_EOF(un->un_pos)) {
4167 					un->un_pos.eof = ST_NO_EOF;
4168 					un->un_pos.fileno++;
4169 					un->un_pos.blkno = 0;
4170 					count--;
4171 				} else if (un->un_pos.eof > ST_EOF) {
4172 					ST_DEBUG2(ST_DEVINFO, st_label,
4173 					    SCSI_DEBUG,
4174 					    "space_fmks, EIO > ST_EOF\n");
4175 					rval = EIO;
4176 					break;
4177 				}
4178 
4179 			}
4180 		}
4181 		un->un_err_resid = count;
4182 		COPY_POS(&un->un_pos, &un->un_err_pos);
4183 	}
4184 	ASSERT(mutex_owned(ST_MUTEX));
4185 	return (rval);
4186 }
4187 
4188 /*
4189  * this routine spaces to EOD
4190  *
4191  * it keeps track of the current filenumber and returns the filenumber after
4192  * the last successful space operation, we keep the number high because as
4193  * tapes are getting larger, the possibility of more and more files exist,
4194  * 0x100000 (1 Meg of files) probably will never have to be changed any time
4195  * soon
4196  */
4197 #define	MAX_SKIP	0x100000 /* somewhat arbitrary */
4198 
4199 static int
4200 st_find_eod(dev_t dev)
4201 {
4202 	tapepos_t savepos;
4203 	int sp_type;
4204 	struct scsi_tape *un;
4205 	int instance;
4206 	int result;
4207 
4208 	instance = MTUNIT(dev);
4209 	un = ddi_get_soft_state(st_state, instance);
4210 	if (un == NULL) {
4211 		return (-1);
4212 	}
4213 
4214 	ST_FUNC(ST_DEVINFO, st_find_eod);
4215 
4216 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4217 	    "st_find_eod(dev = 0x%lx): fileno = %d\n", dev, un->un_pos.fileno);
4218 
4219 	ASSERT(mutex_owned(ST_MUTEX));
4220 
4221 	COPY_POS(&savepos, &un->un_pos);
4222 
4223 	/*
4224 	 * see if the drive is smart enough to do the skips in
4225 	 * one operation; 1/2" use two filemarks
4226 	 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD
4227 	 * because the 8200 does not append a marker; in order not to
4228 	 * sacrifice the fast file skip, we do a slow skip if the low
4229 	 * density device has been opened
4230 	 */
4231 	if ((un->un_dp->options & ST_KNOWS_EOD) != 0) {
4232 		if ((un->un_dp->type == ST_TYPE_EXB8500) &&
4233 		    (MT_DENSITY(dev) == 0)) {
4234 			sp_type = Fmk(1);
4235 		} else if (un->un_pos.pmode == logical) {
4236 			sp_type = SPACE(SP_EOD, 0);
4237 		} else {
4238 			sp_type = Fmk(MAX_SKIP);
4239 		}
4240 	} else {
4241 		sp_type = Fmk(1);
4242 	}
4243 
4244 	for (;;) {
4245 		result = st_cmd(dev, SCMD_SPACE, sp_type, SYNC_CMD);
4246 
4247 		if (result == 0) {
4248 			COPY_POS(&savepos, &un->un_pos);
4249 		}
4250 
4251 		if (sp_type == SPACE(SP_EOD, 0)) {
4252 			if (result != 0) {
4253 				sp_type = Fmk(MAX_SKIP);
4254 				continue;
4255 			}
4256 
4257 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4258 			    "st_find_eod: 0x%"PRIx64"\n",
4259 			    savepos.lgclblkno);
4260 			/*
4261 			 * What we return will become the current file position.
4262 			 * After completing the space command with the position
4263 			 * mode that is not invalid a read position command will
4264 			 * be automaticly issued. If the drive support the long
4265 			 * read position format a valid file position can be
4266 			 * returned.
4267 			 */
4268 			return (un->un_pos.fileno);
4269 		}
4270 
4271 		if (result != 0) {
4272 			break;
4273 		}
4274 
4275 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4276 		    "count=%x, eof=%x, status=%x\n",
4277 		    SPACE_CNT(sp_type),  un->un_pos.eof, un->un_status);
4278 
4279 		/*
4280 		 * If we're not EOM smart,  space a record
4281 		 * to see whether we're now in the slot between
4282 		 * the two sequential filemarks that logical
4283 		 * EOM consists of (REEL) or hit nowhere land
4284 		 * (8mm).
4285 		 */
4286 		if (sp_type == Fmk(1)) {
4287 			/*
4288 			 * no fast skipping, check a record
4289 			 */
4290 			if (st_cmd(dev, SCMD_SPACE, Blk((1)), SYNC_CMD)) {
4291 				break;
4292 			}
4293 			if ((un->un_pos.eof >= ST_EOF_PENDING) &&
4294 			    (un->un_dp->options & ST_REEL)) {
4295 				un->un_status = KEY_BLANK_CHECK;
4296 				un->un_pos.fileno++;
4297 				un->un_pos.blkno = 0;
4298 				break;
4299 			}
4300 			if (IN_EOF(un->un_pos)) {
4301 				un->un_pos.eof = ST_NO_EOF;
4302 				un->un_pos.fileno++;
4303 				un->un_pos.blkno = 0;
4304 			}
4305 			if (un->un_pos.eof > ST_EOF) {
4306 				break;
4307 			}
4308 		} else {
4309 			if (un->un_pos.eof > ST_EOF) {
4310 				break;
4311 			}
4312 		}
4313 	}
4314 
4315 	if (un->un_dp->options & ST_KNOWS_EOD) {
4316 		COPY_POS(&savepos, &un->un_pos);
4317 	}
4318 
4319 	ASSERT(mutex_owned(ST_MUTEX));
4320 
4321 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
4322 	    "st_find_eod: %x\n", savepos.fileno);
4323 	return (savepos.fileno);
4324 }
4325 
4326 
4327 /*
4328  * this routine is frequently used in ioctls below;
4329  * it determines whether we know the density and if not will
4330  * determine it
4331  * if we have written the tape before, one or more filemarks are written
4332  *
4333  * depending on the stepflag, the head is repositioned to where it was before
4334  * the filemarks were written in order not to confuse step counts
4335  */
4336 #define	STEPBACK    0
4337 #define	NO_STEPBACK 1
4338 
4339 static int
4340 st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag)
4341 {
4342 
4343 	GET_SOFT_STATE(dev);
4344 
4345 	ST_FUNC(ST_DEVINFO, st_check_density_or_wfm);
4346 
4347 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4348 	    "st_check_density_or_wfm(dev= 0x%lx, wfm= %d, mode= %d, stpflg= %d)"
4349 	    "\n", dev, wfm, mode, stepflag);
4350 
4351 	ASSERT(mutex_owned(ST_MUTEX));
4352 
4353 	/*
4354 	 * If we don't yet know the density of the tape we have inserted,
4355 	 * we have to either unconditionally set it (if we're 'writing'),
4356 	 * or we have to determine it. As side effects, check for any
4357 	 * write-protect errors, and for the need to put out any file-marks
4358 	 * before positioning a tape.
4359 	 *
4360 	 * If we are going to be spacing forward, and we haven't determined
4361 	 * the tape density yet, we have to do so now...
4362 	 */
4363 	if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
4364 		if (st_determine_density(dev, mode)) {
4365 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4366 			    "check_density_or_wfm : EIO can't determine "
4367 			    "density\n");
4368 			un->un_errno = EIO;
4369 			return (EIO);
4370 		}
4371 		/*
4372 		 * Presumably we are at BOT. If we attempt to write, it will
4373 		 * either work okay, or bomb. We don't do a st_test_append
4374 		 * unless we're past BOT.
4375 		 */
4376 		un->un_laststate = un->un_state;
4377 		un->un_state = ST_STATE_OPEN;
4378 
4379 	} else if (un->un_pos.pmode != invalid && un->un_fmneeded > 0 &&
4380 	    ((un->un_lastop == ST_OP_WEOF && wfm) ||
4381 	    (un->un_lastop == ST_OP_WRITE && wfm))) {
4382 
4383 		tapepos_t spos;
4384 
4385 		COPY_POS(&spos, &un->un_pos);
4386 
4387 		/*
4388 		 * We need to write one or two filemarks.
4389 		 * In the case of the HP, we need to
4390 		 * position the head between the two
4391 		 * marks.
4392 		 */
4393 		if ((un->un_fmneeded > 0) || (un->un_lastop == ST_OP_WEOF)) {
4394 			wfm = un->un_fmneeded;
4395 			un->un_fmneeded = 0;
4396 		}
4397 
4398 		if (st_write_fm(dev, wfm)) {
4399 			un->un_pos.pmode = invalid;
4400 			un->un_density_known = 0;
4401 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4402 			    "check_density_or_wfm : EIO can't write fm\n");
4403 			un->un_errno = EIO;
4404 			return (EIO);
4405 		}
4406 
4407 		if (stepflag == STEPBACK) {
4408 			if (st_cmd(dev, SCMD_SPACE, Fmk((-wfm)), SYNC_CMD)) {
4409 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4410 				    "check_density_or_wfm : EIO can't space "
4411 				    "(-wfm)\n");
4412 				un->un_errno = EIO;
4413 				return (EIO);
4414 			}
4415 			COPY_POS(&un->un_pos, &spos);
4416 		}
4417 	}
4418 
4419 	/*
4420 	 * Whatever we do at this point clears the state of the eof flag.
4421 	 */
4422 
4423 	un->un_pos.eof = ST_NO_EOF;
4424 
4425 	/*
4426 	 * If writing, let's check that we're positioned correctly
4427 	 * at the end of tape before issuing the next write.
4428 	 */
4429 	if (un->un_read_only == RDWR) {
4430 		un->un_test_append = 1;
4431 	}
4432 
4433 	ASSERT(mutex_owned(ST_MUTEX));
4434 	return (0);
4435 }
4436 
4437 
4438 /*
4439  * Wait for all outstaning I/O's to complete
4440  *
4441  * we wait on both ncmds and the wait queue for times when we are flushing
4442  * after persistent errors are flagged, which is when ncmds can be 0, and the
4443  * queue can still have I/O's.  This way we preserve order of biodone's.
4444  */
4445 static void
4446 st_wait_for_io(struct scsi_tape *un)
4447 {
4448 	ST_FUNC(ST_DEVINFO, st_wait_for_io);
4449 	ASSERT(mutex_owned(ST_MUTEX));
4450 	while (un->un_ncmds && un->un_quef) { /* XXX fix for async write@EOM */
4451 		cv_wait(&un->un_queue_cv, ST_MUTEX);
4452 	}
4453 }
4454 
4455 /*
4456  * This routine implements the ioctl calls.  It is called
4457  * from the device switch at normal priority.
4458  */
4459 /*ARGSUSED*/
4460 static int
4461 st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p,
4462     int *rval_p)
4463 {
4464 	int tmp, rval = 0;
4465 
4466 	GET_SOFT_STATE(dev);
4467 
4468 	ST_ENTR(ST_DEVINFO, st_ioctl);
4469 
4470 	mutex_enter(ST_MUTEX);
4471 
4472 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4473 	    "st_ioctl(): fileno=%x, blkno=%x, eof=%x, state = %d, "
4474 	    "pe_flag = %d\n",
4475 	    un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof, un->un_state,
4476 	    IS_PE_FLAG_SET(un));
4477 
4478 	/*
4479 	 * We don't want to block on these, so let them through
4480 	 * and we don't care about setting driver states here.
4481 	 */
4482 	if ((cmd == MTIOCGETDRIVETYPE) ||
4483 	    (cmd == MTIOCGUARANTEEDORDER) ||
4484 	    (cmd == MTIOCPERSISTENTSTATUS)) {
4485 		goto check_commands;
4486 	}
4487 
4488 	/*
4489 	 * We clear error entry stack except command
4490 	 * MTIOCGETERROR and MTIOCGET
4491 	 */
4492 	if ((cmd != MTIOCGETERROR) &&
4493 	    (cmd != MTIOCGET)) {
4494 		st_empty_error_stack(un);
4495 	}
4496 
4497 	/*
4498 	 * wait for all outstanding commands to complete, or be dequeued.
4499 	 * And because ioctl's are synchronous commands, any return value
4500 	 * after this,  will be in order
4501 	 */
4502 	st_wait_for_io(un);
4503 
4504 	/*
4505 	 * allow only a through clear errors and persistent status, and
4506 	 * status
4507 	 */
4508 	if (IS_PE_FLAG_SET(un)) {
4509 		if ((cmd == MTIOCLRERR) ||
4510 		    (cmd == MTIOCPERSISTENT) ||
4511 		    (cmd == MTIOCGET)) {
4512 			goto check_commands;
4513 		} else {
4514 			rval = un->un_errno;
4515 			goto exit;
4516 		}
4517 	}
4518 
4519 	un->un_throttle = 1;	/* > 1 will never happen here */
4520 	un->un_errno = 0;	/* start clean from here */
4521 
4522 	/*
4523 	 * first and foremost, handle any ST_EOT_PENDING cases.
4524 	 * That is, if a logical eot is pending notice, notice it.
4525 	 */
4526 	if (un->un_pos.eof == ST_EOT_PENDING) {
4527 		int resid = un->un_err_resid;
4528 		uchar_t status = un->un_status;
4529 		uchar_t lastop = un->un_lastop;
4530 
4531 		if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
4532 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4533 			    "stioctl : EIO can't space fmk(-1)\n");
4534 			rval = EIO;
4535 			goto exit;
4536 		}
4537 		un->un_lastop = lastop; /* restore last operation */
4538 		if (status == SUN_KEY_EOF) {
4539 			un->un_status = SUN_KEY_EOT;
4540 		} else {
4541 			un->un_status = status;
4542 		}
4543 		un->un_err_resid  = resid;
4544 		/* fix up block number */
4545 		un->un_err_pos.blkno = un->un_pos.blkno = 0;
4546 		/* now we're at logical eot */
4547 		un->un_pos.eof = ST_EOT;
4548 	}
4549 
4550 	/*
4551 	 * now, handle the rest of the situations
4552 	 */
4553 check_commands:
4554 	switch (cmd) {
4555 	case MTIOCGET:
4556 	{
4557 #ifdef _MULTI_DATAMODEL
4558 		/*
4559 		 * For use when a 32 bit app makes a call into a
4560 		 * 64 bit ioctl
4561 		 */
4562 		struct mtget32		mtg_local32;
4563 		struct mtget32 		*mtget_32 = &mtg_local32;
4564 #endif /* _MULTI_DATAMODEL */
4565 
4566 			/* Get tape status */
4567 		struct mtget mtg_local;
4568 		struct mtget *mtget = &mtg_local;
4569 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4570 		    "st_ioctl: MTIOCGET\n");
4571 
4572 		bzero((caddr_t)mtget, sizeof (struct mtget));
4573 		mtget->mt_erreg = un->un_status;
4574 		mtget->mt_resid = un->un_err_resid;
4575 		mtget->mt_dsreg = un->un_retry_ct;
4576 		if (un->un_err_pos.pmode == legacy) {
4577 			mtget->mt_fileno = un->un_err_pos.fileno;
4578 		} else {
4579 			mtget->mt_fileno = -1;
4580 		}
4581 		mtget->mt_blkno = un->un_err_pos.blkno;
4582 		mtget->mt_type = un->un_dp->type;
4583 		mtget->mt_flags = MTF_SCSI | MTF_ASF;
4584 		if (un->un_read_pos_type != NO_POS) {
4585 			mtget->mt_flags |= MTF_LOGICAL_BLOCK;
4586 		}
4587 		if (un->un_dp->options & ST_REEL) {
4588 			mtget->mt_flags |= MTF_REEL;
4589 			mtget->mt_bf = 20;
4590 		} else {		/* 1/4" cartridges */
4591 			switch (mtget->mt_type) {
4592 			/* Emulex cartridge tape */
4593 			case MT_ISMT02:
4594 				mtget->mt_bf = 40;
4595 				break;
4596 			default:
4597 				mtget->mt_bf = 126;
4598 				break;
4599 			}
4600 		}
4601 
4602 		/*
4603 		 * If large transfers are allowed and drive options
4604 		 * has no record size limit set. Calculate blocking
4605 		 * factor from the lesser of maxbsize and maxdma.
4606 		 */
4607 		if ((un->un_allow_large_xfer) &&
4608 		    (un->un_dp->options & ST_NO_RECSIZE_LIMIT)) {
4609 			mtget->mt_bf = min(un->un_maxbsize,
4610 			    un->un_maxdma) / SECSIZE;
4611 		}
4612 
4613 			if (un->un_read_only == WORM ||
4614 			    un->un_read_only == RDWORM) {
4615 				mtget->mt_flags |= MTF_WORM_MEDIA;
4616 			}
4617 
4618 			rval = st_check_clean_bit(dev);
4619 			if (rval == -1) {
4620 				rval = EIO;
4621 				goto exit;
4622 			} else {
4623 				mtget->mt_flags |= (ushort_t)rval;
4624 				rval = 0;
4625 			}
4626 
4627 		un->un_status = 0;		/* Reset status */
4628 		un->un_err_resid = 0;
4629 		tmp = sizeof (struct mtget);
4630 
4631 #ifdef _MULTI_DATAMODEL
4632 
4633 		switch (ddi_model_convert_from(flag & FMODELS)) {
4634 		case DDI_MODEL_ILP32:
4635 			/*
4636 			 * Convert 64 bit back to 32 bit before doing
4637 			 * copyout. This is what the ILP32 app expects.
4638 			 */
4639 			mtget_32->mt_erreg = 	mtget->mt_erreg;
4640 			mtget_32->mt_resid = 	mtget->mt_resid;
4641 			mtget_32->mt_dsreg = 	mtget->mt_dsreg;
4642 			mtget_32->mt_fileno = 	(daddr32_t)mtget->mt_fileno;
4643 			mtget_32->mt_blkno = 	(daddr32_t)mtget->mt_blkno;
4644 			mtget_32->mt_type =  	mtget->mt_type;
4645 			mtget_32->mt_flags = 	mtget->mt_flags;
4646 			mtget_32->mt_bf = 	mtget->mt_bf;
4647 
4648 			if (ddi_copyout(mtget_32, (void *)arg,
4649 			    sizeof (struct mtget32), flag)) {
4650 				rval = EFAULT;
4651 			}
4652 			break;
4653 
4654 		case DDI_MODEL_NONE:
4655 			if (ddi_copyout(mtget, (void *)arg, tmp, flag)) {
4656 				rval = EFAULT;
4657 			}
4658 			break;
4659 		}
4660 #else /* ! _MULTI_DATAMODE */
4661 		if (ddi_copyout(mtget, (void *)arg, tmp, flag)) {
4662 			rval = EFAULT;
4663 		}
4664 #endif /* _MULTI_DATAMODE */
4665 
4666 		break;
4667 	}
4668 	case MTIOCGETERROR:
4669 			/*
4670 			 * get error entry from error stack
4671 			 */
4672 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4673 			    "st_ioctl: MTIOCGETERROR\n");
4674 
4675 			rval = st_get_error_entry(un, arg, flag);
4676 
4677 			break;
4678 
4679 	case MTIOCSTATE:
4680 		{
4681 			/*
4682 			 * return when media presence matches state
4683 			 */
4684 			enum mtio_state state;
4685 
4686 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4687 			    "st_ioctl: MTIOCSTATE\n");
4688 
4689 			if (ddi_copyin((void *)arg, &state, sizeof (int), flag))
4690 				rval = EFAULT;
4691 
4692 			mutex_exit(ST_MUTEX);
4693 
4694 			rval = st_check_media(dev, state);
4695 
4696 			mutex_enter(ST_MUTEX);
4697 
4698 			if (rval != 0) {
4699 				break;
4700 			}
4701 
4702 			if (ddi_copyout(&un->un_mediastate, (void *)arg,
4703 			    sizeof (int), flag))
4704 				rval = EFAULT;
4705 			break;
4706 
4707 		}
4708 
4709 	case MTIOCGETDRIVETYPE:
4710 		{
4711 #ifdef _MULTI_DATAMODEL
4712 		/*
4713 		 * For use when a 32 bit app makes a call into a
4714 		 * 64 bit ioctl
4715 		 */
4716 		struct mtdrivetype_request32	mtdtrq32;
4717 #endif /* _MULTI_DATAMODEL */
4718 
4719 			/*
4720 			 * return mtdrivetype
4721 			 */
4722 			struct mtdrivetype_request mtdtrq;
4723 			struct mtdrivetype mtdrtyp;
4724 			struct mtdrivetype *mtdt = &mtdrtyp;
4725 			struct st_drivetype *stdt = un->un_dp;
4726 
4727 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4728 			    "st_ioctl: MTIOCGETDRIVETYPE\n");
4729 
4730 #ifdef _MULTI_DATAMODEL
4731 		switch (ddi_model_convert_from(flag & FMODELS)) {
4732 		case DDI_MODEL_ILP32:
4733 		{
4734 			if (ddi_copyin((void *)arg, &mtdtrq32,
4735 			    sizeof (struct mtdrivetype_request32), flag)) {
4736 				rval = EFAULT;
4737 				break;
4738 			}
4739 			mtdtrq.size = mtdtrq32.size;
4740 			mtdtrq.mtdtp =
4741 			    (struct  mtdrivetype *)(uintptr_t)mtdtrq32.mtdtp;
4742 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4743 			    "st_ioctl: size 0x%x\n", mtdtrq.size);
4744 			break;
4745 		}
4746 		case DDI_MODEL_NONE:
4747 			if (ddi_copyin((void *)arg, &mtdtrq,
4748 			    sizeof (struct mtdrivetype_request), flag)) {
4749 				rval = EFAULT;
4750 				break;
4751 			}
4752 			break;
4753 		}
4754 
4755 #else /* ! _MULTI_DATAMODEL */
4756 		if (ddi_copyin((void *)arg, &mtdtrq,
4757 		    sizeof (struct mtdrivetype_request), flag)) {
4758 			rval = EFAULT;
4759 			break;
4760 		}
4761 #endif /* _MULTI_DATAMODEL */
4762 
4763 			/*
4764 			 * if requested size is < 0 then return
4765 			 * error.
4766 			 */
4767 			if (mtdtrq.size < 0) {
4768 				rval = EINVAL;
4769 				break;
4770 			}
4771 			bzero(mtdt, sizeof (struct mtdrivetype));
4772 			(void) strncpy(mtdt->name, stdt->name, ST_NAMESIZE);
4773 			(void) strncpy(mtdt->vid, stdt->vid, VIDPIDLEN - 1);
4774 			mtdt->type = stdt->type;
4775 			mtdt->bsize = stdt->bsize;
4776 			mtdt->options = stdt->options;
4777 			mtdt->max_rretries = stdt->max_rretries;
4778 			mtdt->max_wretries = stdt->max_wretries;
4779 			for (tmp = 0; tmp < NDENSITIES; tmp++) {
4780 				mtdt->densities[tmp] = stdt->densities[tmp];
4781 			}
4782 			mtdt->default_density = stdt->default_density;
4783 			/*
4784 			 * Speed hasn't been used since the hayday of reel tape.
4785 			 * For all drives not setting the option ST_KNOWS_MEDIA
4786 			 * the speed member renamed to mediatype are zeros.
4787 			 * Those drives that have ST_KNOWS_MEDIA set use the
4788 			 * new mediatype member which is used to figure the
4789 			 * type of media loaded.
4790 			 *
4791 			 * So as to not break applications speed in the
4792 			 * mtdrivetype structure is not renamed.
4793 			 */
4794 			for (tmp = 0; tmp < NDENSITIES; tmp++) {
4795 				mtdt->speeds[tmp] = stdt->mediatype[tmp];
4796 			}
4797 			mtdt->non_motion_timeout = stdt->non_motion_timeout;
4798 			mtdt->io_timeout = stdt->io_timeout;
4799 			mtdt->rewind_timeout = stdt->rewind_timeout;
4800 			mtdt->space_timeout = stdt->space_timeout;
4801 			mtdt->load_timeout = stdt->load_timeout;
4802 			mtdt->unload_timeout = stdt->unload_timeout;
4803 			mtdt->erase_timeout = stdt->erase_timeout;
4804 
4805 			/*
4806 			 * Limit the maximum length of the result to
4807 			 * sizeof (struct mtdrivetype).
4808 			 */
4809 			tmp = sizeof (struct mtdrivetype);
4810 			if (mtdtrq.size < tmp)
4811 				tmp = mtdtrq.size;
4812 			if (ddi_copyout(mtdt, mtdtrq.mtdtp, tmp, flag)) {
4813 				rval = EFAULT;
4814 			}
4815 			break;
4816 		}
4817 	case MTIOCPERSISTENT:
4818 		{
4819 			int persistence = 0;
4820 
4821 			if (ddi_copyin((void *)arg, &persistence,
4822 			    sizeof (int), flag)) {
4823 				rval = EFAULT;
4824 				break;
4825 			}
4826 
4827 			/* non zero sets it, only 0 turns it off */
4828 			un->un_persistence = (uchar_t)persistence ? 1 : 0;
4829 
4830 			if (un->un_persistence) {
4831 				TURN_PE_ON(un);
4832 			} else {
4833 				TURN_PE_OFF(un);
4834 			}
4835 
4836 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4837 			    "st_ioctl: MTIOCPERSISTENT : persistence = %d\n",
4838 			    un->un_persistence);
4839 
4840 			break;
4841 		}
4842 	case MTIOCPERSISTENTSTATUS:
4843 		{
4844 			int persistence = (int)un->un_persistence;
4845 
4846 			if (ddi_copyout(&persistence, (void *)arg,
4847 			    sizeof (int), flag)) {
4848 				rval = EFAULT;
4849 			}
4850 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4851 			    "st_ioctl: MTIOCPERSISTENTSTATUS:persistece = %d\n",
4852 			    un->un_persistence);
4853 
4854 			break;
4855 		}
4856 
4857 
4858 	case MTIOCLRERR:
4859 		{
4860 			/* clear persistent errors */
4861 
4862 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4863 			    "st_ioctl: MTIOCLRERR\n");
4864 
4865 			CLEAR_PE(un);
4866 
4867 			break;
4868 		}
4869 
4870 	case MTIOCGUARANTEEDORDER:
4871 		{
4872 			/*
4873 			 * this is just a holder to make a valid ioctl and
4874 			 * it won't be in any earlier release
4875 			 */
4876 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4877 			    "st_ioctl: MTIOCGUARANTEEDORDER\n");
4878 
4879 			break;
4880 		}
4881 
4882 	case MTIOCRESERVE:
4883 		{
4884 			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4885 			    "st_ioctl: MTIOCRESERVE\n");
4886 
4887 			/*
4888 			 * Check if Reserve/Release is supported.
4889 			 */
4890 			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4891 				rval = ENOTTY;
4892 				break;
4893 			}
4894 
4895 			rval = st_reserve_release(un, ST_RESERVE);
4896 
4897 			if (rval == 0) {
4898 				un->un_rsvd_status |= ST_PRESERVE_RESERVE;
4899 			}
4900 			break;
4901 		}
4902 
4903 	case MTIOCRELEASE:
4904 		{
4905 			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4906 			    "st_ioctl: MTIOCRELEASE\n");
4907 
4908 			/*
4909 			 * Check if Reserve/Release is supported.
4910 			 */
4911 			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4912 				rval = ENOTTY;
4913 				break;
4914 			}
4915 
4916 			/*
4917 			 * Used to just clear ST_PRESERVE_RESERVE which
4918 			 * made the reservation release at next close.
4919 			 * As the user may have opened and then done a
4920 			 * persistant reservation we now need to drop
4921 			 * the reservation without closing if the user
4922 			 * attempts to do this.
4923 			 */
4924 			rval = st_reserve_release(un, ST_RELEASE);
4925 
4926 			un->un_rsvd_status &= ~ST_PRESERVE_RESERVE;
4927 
4928 			break;
4929 		}
4930 
4931 	case MTIOCFORCERESERVE:
4932 		{
4933 			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4934 			    "st_ioctl: MTIOCFORCERESERVE\n");
4935 
4936 			/*
4937 			 * Check if Reserve/Release is supported.
4938 			 */
4939 			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4940 				rval = ENOTTY;
4941 				break;
4942 			}
4943 			/*
4944 			 * allow only super user to run this.
4945 			 */
4946 			if (drv_priv(cred_p) != 0) {
4947 				rval = EPERM;
4948 				break;
4949 			}
4950 			/*
4951 			 * Throw away reserve,
4952 			 * not using test-unit-ready
4953 			 * since reserve can succeed without tape being
4954 			 * present in the drive.
4955 			 */
4956 			(void) st_reserve_release(un, ST_RESERVE);
4957 
4958 			rval = st_take_ownership(dev);
4959 
4960 			break;
4961 		}
4962 
4963 	case USCSICMD:
4964 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4965 		    "st_ioctl: USCSICMD\n");
4966 	{
4967 		cred_t	*cr;
4968 		cr = ddi_get_cred();
4969 		if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) {
4970 			rval = EPERM;
4971 		} else {
4972 			rval = st_ioctl_cmd(dev, (struct uscsi_cmd *)arg,
4973 			    flag);
4974 		}
4975 	}
4976 		break;
4977 
4978 	case MTIOCTOP:
4979 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4980 		    "st_ioctl: MTIOCTOP\n");
4981 		rval = st_mtioctop(un, arg, flag);
4982 		break;
4983 
4984 	case MTIOCLTOP:
4985 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4986 		    "st_ioctl: MTIOLCTOP\n");
4987 		rval = st_mtiocltop(un, arg, flag);
4988 		break;
4989 
4990 	case MTIOCREADIGNOREILI:
4991 		{
4992 			int set_ili;
4993 
4994 			if (ddi_copyin((void *)arg, &set_ili,
4995 			    sizeof (set_ili), flag)) {
4996 				rval = EFAULT;
4997 				break;
4998 			}
4999 
5000 			if (un->un_bsize) {
5001 				rval = ENOTTY;
5002 				break;
5003 			}
5004 
5005 			switch (set_ili) {
5006 			case 0:
5007 				un->un_dp->options &= ~ST_READ_IGNORE_ILI;
5008 				break;
5009 
5010 			case 1:
5011 				un->un_dp->options |= ST_READ_IGNORE_ILI;
5012 				break;
5013 
5014 			default:
5015 				rval = EINVAL;
5016 				break;
5017 			}
5018 			break;
5019 		}
5020 
5021 	case MTIOCREADIGNOREEOFS:
5022 		{
5023 			int ignore_eof;
5024 
5025 			if (ddi_copyin((void *)arg, &ignore_eof,
5026 			    sizeof (ignore_eof), flag)) {
5027 				rval = EFAULT;
5028 				break;
5029 			}
5030 
5031 			if (!(un->un_dp->options & ST_REEL)) {
5032 				rval = ENOTTY;
5033 				break;
5034 			}
5035 
5036 			switch (ignore_eof) {
5037 			case 0:
5038 				un->un_dp->options &= ~ST_READ_IGNORE_EOFS;
5039 				break;
5040 
5041 			case 1:
5042 				un->un_dp->options |= ST_READ_IGNORE_EOFS;
5043 				break;
5044 
5045 			default:
5046 				rval = EINVAL;
5047 				break;
5048 			}
5049 			break;
5050 		}
5051 
5052 	case MTIOCSHORTFMK:
5053 	{
5054 		int short_fmk;
5055 
5056 		if (ddi_copyin((void *)arg, &short_fmk,
5057 		    sizeof (short_fmk), flag)) {
5058 			rval = EFAULT;
5059 			break;
5060 		}
5061 
5062 		switch (un->un_dp->type) {
5063 		case ST_TYPE_EXB8500:
5064 		case ST_TYPE_EXABYTE:
5065 			if (!short_fmk) {
5066 				un->un_dp->options &= ~ST_SHORT_FILEMARKS;
5067 			} else if (short_fmk == 1) {
5068 				un->un_dp->options |= ST_SHORT_FILEMARKS;
5069 			} else {
5070 				rval = EINVAL;
5071 			}
5072 			break;
5073 
5074 		default:
5075 			rval = ENOTTY;
5076 			break;
5077 		}
5078 		break;
5079 	}
5080 
5081 	case MTIOCGETPOS:
5082 		rval = st_update_block_pos(un);
5083 		if (rval == 0) {
5084 			if (ddi_copyout((void *)&un->un_pos, (void *)arg,
5085 			    sizeof (tapepos_t), flag)) {
5086 				scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5087 				    "MTIOCGETPOS copy out failed\n");
5088 				rval = EFAULT;
5089 			}
5090 		}
5091 		break;
5092 
5093 	case MTIOCRESTPOS:
5094 	{
5095 		tapepos_t dest;
5096 
5097 		if (ddi_copyin((void *)arg, &dest, sizeof (tapepos_t),
5098 		    flag) != 0) {
5099 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5100 			    "MTIOCRESTPOS copy in failed\n");
5101 			rval = EFAULT;
5102 			break;
5103 		}
5104 		rval = st_validate_tapemarks(un, &dest);
5105 		if (rval != 0) {
5106 			rval = EIO;
5107 		}
5108 		break;
5109 	}
5110 	default:
5111 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5112 		    "st_ioctl: unknown ioctl\n");
5113 		rval = ENOTTY;
5114 	}
5115 
5116 exit:
5117 	if (!IS_PE_FLAG_SET(un)) {
5118 		un->un_errno = rval;
5119 	}
5120 
5121 	mutex_exit(ST_MUTEX);
5122 
5123 	return (rval);
5124 }
5125 
5126 
5127 /*
5128  * do some MTIOCTOP tape operations
5129  */
5130 static int
5131 st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag)
5132 {
5133 #ifdef _MULTI_DATAMODEL
5134 	/*
5135 	 * For use when a 32 bit app makes a call into a
5136 	 * 64 bit ioctl
5137 	 */
5138 	struct mtop32	mtop_32_for_64;
5139 #endif /* _MULTI_DATAMODEL */
5140 	struct mtop passed;
5141 	struct mtlop local;
5142 	int rval = 0;
5143 
5144 	ST_FUNC(ST_DEVINFO, st_mtioctop);
5145 
5146 	ASSERT(mutex_owned(ST_MUTEX));
5147 
5148 #ifdef _MULTI_DATAMODEL
5149 	switch (ddi_model_convert_from(flag & FMODELS)) {
5150 	case DDI_MODEL_ILP32:
5151 		if (ddi_copyin((void *)arg, &mtop_32_for_64,
5152 		    sizeof (struct mtop32), flag)) {
5153 			return (EFAULT);
5154 		}
5155 		local.mt_op = mtop_32_for_64.mt_op;
5156 		local.mt_count =  (int64_t)mtop_32_for_64.mt_count;
5157 		break;
5158 
5159 	case DDI_MODEL_NONE:
5160 		if (ddi_copyin((void *)arg, &passed, sizeof (passed), flag)) {
5161 			return (EFAULT);
5162 		}
5163 		local.mt_op = passed.mt_op;
5164 		/* prevent sign extention */
5165 		local.mt_count = (UINT32_MAX & passed.mt_count);
5166 		break;
5167 	}
5168 
5169 #else /* ! _MULTI_DATAMODEL */
5170 	if (ddi_copyin((void *)arg, &passed, sizeof (passed), flag)) {
5171 		return (EFAULT);
5172 	}
5173 	local.mt_op = passed.mt_op;
5174 	/* prevent sign extention */
5175 	local.mt_count = (UINT32_MAX & passed.mt_count);
5176 #endif /* _MULTI_DATAMODEL */
5177 
5178 	rval = st_do_mtioctop(un, &local);
5179 
5180 #ifdef _MULTI_DATAMODEL
5181 	switch (ddi_model_convert_from(flag & FMODELS)) {
5182 	case DDI_MODEL_ILP32:
5183 		if (((uint64_t)local.mt_count) > UINT32_MAX) {
5184 			rval = ERANGE;
5185 			break;
5186 		}
5187 		/*
5188 		 * Convert 64 bit back to 32 bit before doing
5189 		 * copyout. This is what the ILP32 app expects.
5190 		 */
5191 		mtop_32_for_64.mt_op = local.mt_op;
5192 		mtop_32_for_64.mt_count = local.mt_count;
5193 
5194 		if (ddi_copyout(&mtop_32_for_64, (void *)arg,
5195 		    sizeof (struct mtop32), flag)) {
5196 			rval = EFAULT;
5197 		}
5198 		break;
5199 
5200 	case DDI_MODEL_NONE:
5201 		passed.mt_count = local.mt_count;
5202 		passed.mt_op = local.mt_op;
5203 		if (ddi_copyout(&passed, (void *)arg, sizeof (passed), flag)) {
5204 			rval = EFAULT;
5205 		}
5206 		break;
5207 	}
5208 #else /* ! _MULTI_DATAMODE */
5209 	if (((uint64_t)local.mt_count) > UINT32_MAX) {
5210 		rval = ERANGE;
5211 	} else {
5212 		passed.mt_op = local.mt_op;
5213 		passed.mt_count = local.mt_count;
5214 		if (ddi_copyout(&passed, (void *)arg, sizeof (passed), flag)) {
5215 			rval = EFAULT;
5216 		}
5217 	}
5218 #endif /* _MULTI_DATAMODE */
5219 
5220 
5221 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5222 	    "st_ioctl: fileno=%x, blkno=%x, eof=%x\n", un->un_pos.fileno,
5223 	    un->un_pos.blkno, un->un_pos.eof);
5224 
5225 	if (un->un_pos.pmode == invalid) {
5226 		un->un_density_known = 0;
5227 	}
5228 
5229 	ASSERT(mutex_owned(ST_MUTEX));
5230 	return (rval);
5231 }
5232 
5233 static int
5234 st_mtiocltop(struct scsi_tape *un, intptr_t arg, int flag)
5235 {
5236 	struct mtlop local;
5237 	int rval;
5238 
5239 	ST_FUNC(ST_DEVINFO, st_mtiocltop);
5240 	if (ddi_copyin((void *)arg, &local, sizeof (local), flag)) {
5241 		return (EFAULT);
5242 	}
5243 
5244 	rval = st_do_mtioctop(un, &local);
5245 
5246 	if (ddi_copyout(&local, (void *)arg, sizeof (local), flag)) {
5247 		rval = EFAULT;
5248 	}
5249 	return (rval);
5250 }
5251 
5252 
5253 static int
5254 st_do_mtioctop(struct scsi_tape *un, struct mtlop *mtop)
5255 {
5256 	dev_t dev = un->un_dev;
5257 	int savefile;
5258 	int rval = 0;
5259 
5260 	ST_FUNC(ST_DEVINFO, st_do_mtioctop);
5261 
5262 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5263 	    "st_do_mtioctop(): mt_op=%x\n", mtop->mt_op);
5264 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5265 	    "fileno=%x, blkno=%x, eof=%x\n",
5266 	    un->un_pos.fileno, un->un_pos.blkno, un->un_pos.eof);
5267 
5268 	un->un_status = 0;
5269 
5270 	/*
5271 	 * if we are going to mess with a tape, we have to make sure we have
5272 	 * one and are not offline (i.e. no tape is initialized).  We let
5273 	 * commands pass here that don't actually touch the tape, except for
5274 	 * loading and initialization (rewinding).
5275 	 */
5276 	if (un->un_state == ST_STATE_OFFLINE) {
5277 		switch (mtop->mt_op) {
5278 		case MTLOAD:
5279 		case MTNOP:
5280 			/*
5281 			 * We don't want strategy calling st_tape_init here,
5282 			 * so, change state
5283 			 */
5284 			un->un_state = ST_STATE_INITIALIZING;
5285 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5286 			    "st_do_mtioctop : OFFLINE state = %d\n",
5287 			    un->un_state);
5288 			break;
5289 		default:
5290 			/*
5291 			 * reinitialize by normal means
5292 			 */
5293 			rval = st_tape_init(dev);
5294 			if (rval) {
5295 				un->un_state = ST_STATE_INITIALIZING;
5296 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5297 				    "st_do_mtioctop : OFFLINE init failure ");
5298 				un->un_state = ST_STATE_OFFLINE;
5299 				un->un_pos.pmode = invalid;
5300 				if (rval != EACCES) {
5301 					rval = EIO;
5302 				}
5303 				return (rval);
5304 			}
5305 			un->un_state = ST_STATE_OPEN_PENDING_IO;
5306 			break;
5307 		}
5308 	}
5309 
5310 	/*
5311 	 * If the file position is invalid, allow only those
5312 	 * commands that properly position the tape and fail
5313 	 * the rest with EIO
5314 	 */
5315 	if (un->un_pos.pmode == invalid) {
5316 		switch (mtop->mt_op) {
5317 		case MTWEOF:
5318 		case MTRETEN:
5319 		case MTERASE:
5320 		case MTEOM:
5321 		case MTFSF:
5322 		case MTFSR:
5323 		case MTBSF:
5324 		case MTNBSF:
5325 		case MTBSR:
5326 		case MTSRSZ:
5327 		case MTGRSZ:
5328 		case MTSEEK:
5329 		case MTBSSF:
5330 		case MTFSSF:
5331 			return (EIO);
5332 			/* NOTREACHED */
5333 		case MTREW:
5334 		case MTLOAD:
5335 		case MTOFFL:
5336 		case MTNOP:
5337 		case MTTELL:
5338 		case MTLOCK:
5339 		case MTUNLOCK:
5340 			break;
5341 
5342 		default:
5343 			return (ENOTTY);
5344 			/* NOTREACHED */
5345 		}
5346 	}
5347 
5348 	switch (mtop->mt_op) {
5349 	case MTERASE:
5350 		/*
5351 		 * MTERASE rewinds the tape, erase it completely, and returns
5352 		 * to the beginning of the tape
5353 		 */
5354 		if (un->un_mspl->wp || un->un_read_only & WORM) {
5355 			un->un_status = KEY_WRITE_PROTECT;
5356 			un->un_err_resid = mtop->mt_count;
5357 			COPY_POS(&un->un_err_pos, &un->un_pos);
5358 			return (EACCES);
5359 		}
5360 		if (un->un_dp->options & ST_REEL) {
5361 			un->un_fmneeded = 2;
5362 		} else {
5363 			un->un_fmneeded = 1;
5364 		}
5365 		if (st_check_density_or_wfm(dev, 1, B_WRITE, NO_STEPBACK) ||
5366 		    st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) ||
5367 		    st_cmd(dev, SCMD_ERASE, 0, SYNC_CMD)) {
5368 			un->un_pos.pmode = invalid;
5369 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5370 			    "st_do_mtioctop : EIO space or erase or "
5371 			    "check den)\n");
5372 			rval = EIO;
5373 		} else {
5374 			/* QIC and helical scan rewind after erase */
5375 			if (un->un_dp->options & ST_REEL) {
5376 				(void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD);
5377 			}
5378 		}
5379 		break;
5380 
5381 	case MTWEOF:
5382 		/*
5383 		 * write an end-of-file record
5384 		 */
5385 		if (un->un_mspl->wp || un->un_read_only & RDONLY) {
5386 			un->un_status = KEY_WRITE_PROTECT;
5387 			un->un_err_resid = mtop->mt_count;
5388 			COPY_POS(&un->un_err_pos, &un->un_pos);
5389 			return (EACCES);
5390 		}
5391 
5392 		/*
5393 		 * zero count means just flush buffers
5394 		 * negative count is not permitted
5395 		 */
5396 		if (mtop->mt_count < 0) {
5397 			return (EINVAL);
5398 		}
5399 
5400 		/* Not on worm */
5401 		if (un->un_read_only == RDWR) {
5402 			un->un_test_append = 1;
5403 		}
5404 
5405 		if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
5406 			if (st_determine_density(dev, B_WRITE)) {
5407 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5408 				    "st_do_mtioctop : EIO : MTWEOF can't "
5409 				    "determine density");
5410 				return (EIO);
5411 			}
5412 		}
5413 
5414 		rval = st_write_fm(dev, (int)mtop->mt_count);
5415 		if ((rval != 0) && (rval != EACCES)) {
5416 			/*
5417 			 * Failure due to something other than illegal
5418 			 * request results in loss of state (st_intr).
5419 			 */
5420 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5421 			    "st_do_mtioctop : EIO : MTWEOF can't write "
5422 			    "file mark");
5423 			rval = EIO;
5424 		}
5425 		break;
5426 
5427 	case MTRETEN:
5428 		/*
5429 		 * retension the tape
5430 		 */
5431 		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK) ||
5432 		    st_cmd(dev, SCMD_LOAD, LD_LOAD | LD_RETEN, SYNC_CMD)) {
5433 			un->un_pos.pmode = invalid;
5434 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5435 			    "st_do_mtioctop : EIO : MTRETEN ");
5436 			rval = EIO;
5437 		}
5438 		break;
5439 
5440 	case MTREW:
5441 		/*
5442 		 * rewind  the tape
5443 		 */
5444 		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) {
5445 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5446 			    "st_do_mtioctop : EIO:MTREW check "
5447 			    "density/wfm failed");
5448 			return (EIO);
5449 		}
5450 		if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
5451 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5452 			    "st_do_mtioctop : EIO : MTREW ");
5453 			rval = EIO;
5454 		}
5455 		break;
5456 
5457 	case MTOFFL:
5458 		/*
5459 		 * rewinds, and, if appropriate, takes the device offline by
5460 		 * unloading the tape
5461 		 */
5462 		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) {
5463 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5464 			    "st_do_mtioctop :EIO:MTOFFL check "
5465 			    "density/wfm failed");
5466 			return (EIO);
5467 		}
5468 		(void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
5469 		if (st_cmd(dev, SCMD_LOAD, LD_UNLOAD, SYNC_CMD)) {
5470 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5471 			    "st_do_mtioctop : EIO : MTOFFL");
5472 			return (EIO);
5473 		}
5474 		un->un_pos.eof = ST_NO_EOF;
5475 		un->un_laststate = un->un_state;
5476 		un->un_state = ST_STATE_OFFLINE;
5477 		un->un_mediastate = MTIO_EJECTED;
5478 		break;
5479 
5480 	case MTLOAD:
5481 		/*
5482 		 * This is to load a tape into the drive
5483 		 * Note that if the tape is not loaded, the device will have
5484 		 * to be opened via O_NDELAY or O_NONBLOCK.
5485 		 */
5486 		/*
5487 		 * Let's try and clean things up, if we are not
5488 		 * initializing, and then send in the load command, no
5489 		 * matter what.
5490 		 *
5491 		 * load after a media change by the user.
5492 		 */
5493 
5494 		if (un->un_state > ST_STATE_INITIALIZING) {
5495 			(void) st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK);
5496 		}
5497 		rval = st_cmd(dev, SCMD_LOAD, LD_LOAD, SYNC_CMD);
5498 		/* Load command to a drive that doesn't support load */
5499 		if ((rval == EIO) &&
5500 		    ((un->un_status == KEY_NOT_READY) &&
5501 			/* Medium not present */
5502 		    (un->un_uscsi_rqs_buf->es_add_code == 0x3a) ||
5503 		    ((un->un_status == KEY_ILLEGAL_REQUEST) &&
5504 		    (un->un_dp->type == MT_ISSTK9840) &&
5505 			/* CSL not present */
5506 		    (un->un_uscsi_rqs_buf->es_add_code == 0x80)))) {
5507 			rval = ENOTTY;
5508 			break;
5509 		} else if (rval != EACCES) {
5510 			rval = EIO;
5511 		}
5512 		if (rval) {
5513 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5514 			    "st_do_mtioctop : %s : MTLOAD\n",
5515 			    rval == EACCES ? "EACCES" : "EIO");
5516 			/*
5517 			 * If load tape fails, who knows what happened...
5518 			 */
5519 			un->un_pos.pmode = invalid;
5520 			break;
5521 		}
5522 
5523 		/*
5524 		 * reset all counters appropriately using rewind, as if LOAD
5525 		 * succeeds, we are at BOT
5526 		 */
5527 		un->un_state = ST_STATE_INITIALIZING;
5528 
5529 		rval = st_tape_init(dev);
5530 		if ((rval == EACCES) && (un->un_read_only & WORM)) {
5531 			rval = 0;
5532 			break;
5533 		}
5534 
5535 		if (rval != 0) {
5536 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5537 			    "st_do_mtioctop : EIO : MTLOAD calls "
5538 			    "st_tape_init\n");
5539 			rval = EIO;
5540 			un->un_state = ST_STATE_OFFLINE;
5541 		}
5542 
5543 		break;
5544 
5545 	case MTNOP:
5546 		un->un_status = 0;		/* Reset status */
5547 		un->un_err_resid = 0;
5548 		mtop->mt_count = MTUNIT(dev);
5549 		break;
5550 
5551 	case MTEOM:
5552 		/*
5553 		 * positions the tape at a location just after the last file
5554 		 * written on the tape. For cartridge and 8 mm, this after
5555 		 * the last file mark; for reel, this is inbetween the two
5556 		 * last 2 file marks
5557 		 */
5558 		if ((un->un_pos.pmode == legacy && un->un_pos.eof >= ST_EOT) ||
5559 		    (un->un_lastop == ST_OP_WRITE) ||
5560 		    (un->un_lastop == ST_OP_WEOF)) {
5561 			/*
5562 			 * If the command wants to move to logical end
5563 			 * of media, and we're already there, we're done.
5564 			 * If we were at logical eot, we reset the state
5565 			 * to be *not* at logical eot.
5566 			 *
5567 			 * If we're at physical or logical eot, we prohibit
5568 			 * forward space operations (unconditionally).
5569 			 *
5570 			 * Also if the last operation was a write of any
5571 			 * kind the tape is at EOD.
5572 			 */
5573 			return (0);
5574 		}
5575 		/*
5576 		 * physical tape position may not be what we've been
5577 		 * telling the user; adjust the request accordingly
5578 		 */
5579 		if (IN_EOF(un->un_pos)) {
5580 			un->un_pos.fileno++;
5581 			un->un_pos.blkno = 0;
5582 		}
5583 
5584 		if (st_check_density_or_wfm(dev, 1, B_READ, NO_STEPBACK)) {
5585 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5586 			    "st_do_mtioctop : EIO:MTEOM check density/wfm "
5587 			    " failed");
5588 			return (EIO);
5589 		}
5590 
5591 		/*
5592 		 * st_find_eod() returns the last fileno we knew about;
5593 		 */
5594 		savefile = st_find_eod(dev);
5595 
5596 		if ((un->un_status != KEY_BLANK_CHECK) &&
5597 		    (un->un_status != SUN_KEY_EOT)) {
5598 			un->un_pos.pmode = invalid;
5599 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5600 			    "st_do_mtioctop : EIO : MTEOM status check failed");
5601 			rval = EIO;
5602 		} else {
5603 			/*
5604 			 * For 1/2" reel tapes assume logical EOT marked
5605 			 * by two file marks or we don't care that we may
5606 			 * be extending the last file on the tape.
5607 			 */
5608 			if (un->un_dp->options & ST_REEL) {
5609 				if (st_cmd(dev, SCMD_SPACE, Fmk((-1)),
5610 				    SYNC_CMD)) {
5611 					un->un_pos.pmode = invalid;
5612 					ST_DEBUG2(ST_DEVINFO, st_label,
5613 					    SCSI_DEBUG,
5614 					    "st_do_mtioctop : EIO : MTEOM space"
5615 					    " cmd failed");
5616 					rval = EIO;
5617 					break;
5618 				}
5619 				/*
5620 				 * Fix up the block number.
5621 				 */
5622 				un->un_pos.blkno = 0;
5623 				un->un_err_pos.blkno = 0;
5624 			}
5625 			un->un_err_resid = 0;
5626 			un->un_pos.fileno = savefile;
5627 			un->un_pos.eof = ST_EOT;
5628 		}
5629 		un->un_status = 0;
5630 		break;
5631 
5632 	case MTFSF:
5633 		rval = st_mtfsf_ioctl(un, mtop->mt_count);
5634 		break;
5635 
5636 	case MTFSR:
5637 		rval = st_mtfsr_ioctl(un, mtop->mt_count);
5638 		break;
5639 
5640 	case MTBSF:
5641 		rval = st_mtbsf_ioctl(un, mtop->mt_count);
5642 		break;
5643 
5644 	case MTNBSF:
5645 		rval = st_mtnbsf_ioctl(un, mtop->mt_count);
5646 		break;
5647 
5648 	case MTBSR:
5649 		rval = st_mtbsr_ioctl(un, mtop->mt_count);
5650 		break;
5651 
5652 	case MTBSSF:
5653 		rval = st_mtbsfm_ioctl(un, mtop->mt_count);
5654 		break;
5655 
5656 	case MTFSSF:
5657 		rval = st_mtfsfm_ioctl(un, mtop->mt_count);
5658 		break;
5659 
5660 	case MTSRSZ:
5661 
5662 		/*
5663 		 * Set record-size to that sent by user
5664 		 * Check to see if there is reason that the requested
5665 		 * block size should not be set.
5666 		 */
5667 
5668 		/* If requesting variable block size is it ok? */
5669 		if ((mtop->mt_count == 0) &&
5670 		    ((un->un_dp->options & ST_VARIABLE) == 0)) {
5671 			return (ENOTTY);
5672 		}
5673 
5674 		/*
5675 		 * If requested block size is not variable "0",
5676 		 * is it less then minimum.
5677 		 */
5678 		if ((mtop->mt_count != 0) &&
5679 		    (mtop->mt_count < un->un_minbsize)) {
5680 			return (EINVAL);
5681 		}
5682 
5683 		/* Is the requested block size more then maximum */
5684 		if ((mtop->mt_count > min(un->un_maxbsize, un->un_maxdma)) &&
5685 		    (un->un_maxbsize != 0)) {
5686 			return (EINVAL);
5687 		}
5688 
5689 		/* Is requested block size a modulus the device likes */
5690 		if ((mtop->mt_count % un->un_data_mod) != 0) {
5691 			return (EINVAL);
5692 		}
5693 
5694 		if (st_change_block_size(dev, (uint32_t)mtop->mt_count) != 0) {
5695 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5696 			    "st_ioctl : MTSRSZ : EIO : cant set block size");
5697 			return (EIO);
5698 		}
5699 
5700 		return (0);
5701 
5702 	case MTGRSZ:
5703 		/*
5704 		 * Get record-size to the user
5705 		 */
5706 		mtop->mt_count = un->un_bsize;
5707 		rval = 0;
5708 		break;
5709 
5710 	case MTTELL:
5711 		rval = st_update_block_pos(un);
5712 		mtop->mt_count = un->un_pos.lgclblkno;
5713 		break;
5714 
5715 	case MTSEEK:
5716 		rval = st_logical_block_locate(un, (uint64_t)mtop->mt_count,
5717 		    un->un_pos.partition);
5718 		/*
5719 		 * This bit of magic make mt print the actual position if
5720 		 * the resulting position was not what was asked for.
5721 		 */
5722 		if (rval == ESPIPE) {
5723 			rval = EIO;
5724 			if ((uint64_t)mtop->mt_count != un->un_pos.lgclblkno) {
5725 				mtop->mt_op = MTTELL;
5726 				mtop->mt_count = un->un_pos.lgclblkno;
5727 			}
5728 		}
5729 		break;
5730 
5731 	case MTLOCK:
5732 		if (st_cmd(dev, SCMD_DOORLOCK, MR_LOCK, SYNC_CMD)) {
5733 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5734 			    "st_do_mtioctop : EIO : MTLOCK");
5735 			rval = EIO;
5736 		}
5737 		break;
5738 
5739 	case MTUNLOCK:
5740 		if (st_cmd(dev, SCMD_DOORLOCK, MR_UNLOCK, SYNC_CMD)) {
5741 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5742 			    "st_do_mtioctop : EIO : MTUNLOCK");
5743 			rval = EIO;
5744 		}
5745 		break;
5746 
5747 	default:
5748 		rval = ENOTTY;
5749 	}
5750 
5751 	return (rval);
5752 }
5753 
5754 
5755 /*
5756  * Run a command for uscsi ioctl.
5757  */
5758 static int
5759 st_ioctl_cmd(dev_t dev, struct uscsi_cmd *ucmd, int flag)
5760 {
5761 	struct uscsi_cmd	*uscmd;
5762 	struct buf	*bp;
5763 	enum uio_seg	uioseg;
5764 	int	offline_state = 0;
5765 	int	err = 0;
5766 
5767 	GET_SOFT_STATE(dev);
5768 
5769 	ST_FUNC(ST_DEVINFO, st_ioctl_cmd);
5770 
5771 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5772 	    "st_ioctl_cmd(dev = 0x%lx)\n", dev);
5773 
5774 	ASSERT(mutex_owned(ST_MUTEX));
5775 
5776 	/*
5777 	 * We really don't know what commands are coming in here and
5778 	 * we don't want to limit the commands coming in.
5779 	 *
5780 	 * If st_tape_init() gets called from st_strategy(), then we
5781 	 * will hang the process waiting for un->un_sbuf_busy to be cleared,
5782 	 * which it never will, as we set it below.  To prevent
5783 	 * st_tape_init() from getting called, we have to set state to other
5784 	 * than ST_STATE_OFFLINE, so we choose ST_STATE_INITIALIZING, which
5785 	 * achieves this purpose already.
5786 	 *
5787 	 * We use offline_state to preserve the OFFLINE state, if it exists,
5788 	 * so other entry points to the driver might have the chance to call
5789 	 * st_tape_init().
5790 	 */
5791 	if (un->un_state == ST_STATE_OFFLINE) {
5792 		un->un_laststate = ST_STATE_OFFLINE;
5793 		un->un_state = ST_STATE_INITIALIZING;
5794 		offline_state = 1;
5795 	}
5796 
5797 	mutex_exit(ST_MUTEX);
5798 	err = scsi_uscsi_alloc_and_copyin((intptr_t)ucmd, flag,
5799 	    ROUTE, &uscmd);
5800 	mutex_enter(ST_MUTEX);
5801 	if (err != 0) {
5802 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5803 		    "st_ioctl_cmd: scsi_uscsi_alloc_and_copyin failed\n");
5804 		goto exit;
5805 	}
5806 
5807 	uioseg = (flag & FKIOCTL) ? UIO_SYSSPACE : UIO_USERSPACE;
5808 
5809 	/* check to see if this command requires the drive to be reserved */
5810 	if (uscmd->uscsi_cdb != NULL) {
5811 		err = st_check_cdb_for_need_to_reserve(un,
5812 		    &((char *)uscmd->uscsi_cdb)[0]);
5813 		if (err) {
5814 			goto exit_free;
5815 		}
5816 	}
5817 
5818 	/*
5819 	 * Get buffer resources...
5820 	 */
5821 	while (un->un_sbuf_busy)
5822 		cv_wait(&un->un_sbuf_cv, ST_MUTEX);
5823 	un->un_sbuf_busy = 1;
5824 
5825 #ifdef STDEBUG
5826 	if ((uscmd->uscsi_cdb != NULL) && (st_debug & 0xf) > 6) {
5827 		int rw = (uscmd->uscsi_flags & USCSI_READ) ? B_READ : B_WRITE;
5828 		st_print_cdb(ST_DEVINFO, st_label, SCSI_DEBUG,
5829 		    "uscsi cdb", uscmd->uscsi_cdb);
5830 		if (uscmd->uscsi_buflen) {
5831 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5832 			    "uscsi %s of %ld bytes %s %s space\n",
5833 			    (rw == B_READ) ? rd_str : wr_str,
5834 			    uscmd->uscsi_buflen,
5835 			    (rw == B_READ) ? "to" : "from",
5836 			    (uioseg == UIO_SYSSPACE) ? "system" : "user");
5837 		}
5838 	}
5839 #endif /* ST_DEBUG */
5840 
5841 	/*
5842 	 * Although st_ioctl_cmd() never makes use of these
5843 	 * now, we are just being safe and consistent.
5844 	 */
5845 	uscmd->uscsi_flags &= ~(USCSI_NOINTR | USCSI_NOPARITY |
5846 	    USCSI_OTAG | USCSI_HTAG | USCSI_HEAD);
5847 
5848 	un->un_srqbufp = uscmd->uscsi_rqbuf;
5849 	bp = un->un_sbufp;
5850 	bzero(bp, sizeof (buf_t));
5851 	if (uscmd->uscsi_cdb != NULL) {
5852 		bp->b_forw =
5853 		    (struct buf *)(uintptr_t)((char *)uscmd->uscsi_cdb)[0];
5854 		bp->b_back = (struct buf *)uscmd;
5855 	}
5856 
5857 	mutex_exit(ST_MUTEX);
5858 	err = scsi_uscsi_handle_cmd(dev, uioseg, uscmd,
5859 	    st_strategy, bp, NULL);
5860 	mutex_enter(ST_MUTEX);
5861 
5862 	/*
5863 	 * If scsi reset successful, don't write any filemarks.
5864 	 */
5865 	if ((err == 0) && (uscmd->uscsi_flags &
5866 	    (USCSI_RESET_LUN | USCSI_RESET_TARGET | USCSI_RESET_ALL))) {
5867 		un->un_fmneeded = 0;
5868 	}
5869 
5870 exit_free:
5871 	/*
5872 	 * Free resources
5873 	 */
5874 	un->un_sbuf_busy = 0;
5875 	un->un_srqbufp = NULL;
5876 
5877 	/*
5878 	 * If was a space command need to update logical block position.
5879 	 * If the command failed such that positioning is invalid, Don't
5880 	 * update the position as the user must do this to validate the
5881 	 * position for data protection.
5882 	 */
5883 	if ((uscmd->uscsi_cdb != NULL) &&
5884 	    (uscmd->uscsi_cdb[0] == SCMD_SPACE) &&
5885 	    (un->un_pos.pmode != invalid)) {
5886 		uchar_t status = un->un_status;
5887 		(void) st_update_block_pos(un);
5888 		un->un_status = status;
5889 	}
5890 	cv_signal(&un->un_sbuf_cv);
5891 	mutex_exit(ST_MUTEX);
5892 	(void) scsi_uscsi_copyout_and_free((intptr_t)ucmd, uscmd);
5893 	mutex_enter(ST_MUTEX);
5894 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5895 	    "st_ioctl_cmd returns 0x%x\n", err);
5896 
5897 exit:
5898 	/* don't lose offline state */
5899 	if (offline_state) {
5900 		un->un_state = ST_STATE_OFFLINE;
5901 	}
5902 
5903 	ASSERT(mutex_owned(ST_MUTEX));
5904 	return (err);
5905 }
5906 
5907 static int
5908 st_write_fm(dev_t dev, int wfm)
5909 {
5910 	int i;
5911 	int rval;
5912 
5913 	GET_SOFT_STATE(dev);
5914 
5915 	ST_FUNC(ST_DEVINFO, st_write_fm);
5916 
5917 	ASSERT(mutex_owned(ST_MUTEX));
5918 
5919 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5920 	    "st_write_fm(dev = 0x%lx, wfm = %d)\n", dev, wfm);
5921 
5922 	/*
5923 	 * write one filemark at the time after EOT
5924 	 */
5925 	if (un->un_pos.eof >= ST_EOT) {
5926 		for (i = 0; i < wfm; i++) {
5927 			rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, 1, SYNC_CMD);
5928 			if (rval == EACCES) {
5929 				return (rval);
5930 			}
5931 			if (rval != 0) {
5932 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5933 				    "st_write_fm : EIO : write EOT file mark");
5934 				return (EIO);
5935 			}
5936 		}
5937 	} else {
5938 		rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, wfm, SYNC_CMD);
5939 		if (rval == EACCES) {
5940 			return (rval);
5941 		}
5942 		if (rval) {
5943 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5944 			    "st_write_fm : EIO : write file mark");
5945 			return (EIO);
5946 		}
5947 	}
5948 
5949 	ASSERT(mutex_owned(ST_MUTEX));
5950 	return (0);
5951 }
5952 
5953 #ifdef STDEBUG
5954 static void
5955 start_dump(struct scsi_tape *un, struct buf *bp)
5956 {
5957 	struct scsi_pkt *pkt = BP_PKT(bp);
5958 	uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp;
5959 
5960 	ST_FUNC(ST_DEVINFO, start_dump);
5961 
5962 	if ((st_debug & 0xf) < 6)
5963 		return;
5964 	scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5965 	    "st_start: cmd=0x%p count=%ld resid=%ld flags=0x%x pkt=0x%p\n",
5966 	    (void *)bp->b_forw, bp->b_bcount,
5967 	    bp->b_resid, bp->b_flags, (void *)BP_PKT(bp));
5968 
5969 	st_print_cdb(ST_DEVINFO, st_label, SCSI_DEBUG,
5970 	    "st_start: cdb",  (caddr_t)cdbp);
5971 	scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5972 	    "st_start: fileno=%d, blk=%d\n",
5973 	    un->un_pos.fileno, un->un_pos.blkno);
5974 }
5975 #endif
5976 
5977 
5978 /*
5979  * Command start && done functions
5980  */
5981 
5982 /*
5983  * st_start()
5984  *
5985  * Called from:
5986  *  st_strategy() to start a command.
5987  *  st_runout() to retry when scsi_pkt allocation fails on previous attempt(s).
5988  *  st_attach() when resuming from power down state.
5989  *  st_start_restart() to retry transport when device was previously busy.
5990  *  st_done_and_mutex_exit() to start the next command when previous is done.
5991  *
5992  * On entry:
5993  *  scsi_pkt may or may not be allocated.
5994  *
5995  */
5996 static void
5997 st_start(struct scsi_tape *un)
5998 {
5999 	struct buf *bp;
6000 	int status;
6001 
6002 	ST_FUNC(ST_DEVINFO, st_start);
6003 	ASSERT(mutex_owned(ST_MUTEX));
6004 
6005 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6006 	    "st_start(): dev = 0x%lx\n", un->un_dev);
6007 
6008 	if ((bp = un->un_quef) == NULL) {
6009 		return;
6010 	}
6011 
6012 	ASSERT((bp->b_flags & B_DONE) == 0);
6013 
6014 	/*
6015 	 * Don't send more than un_throttle commands to the HBA
6016 	 */
6017 	if ((un->un_throttle <= 0) || (un->un_ncmds >= un->un_throttle)) {
6018 		return;
6019 	}
6020 
6021 	/*
6022 	 * If the buf has no scsi_pkt call st_make_cmd() to get one and
6023 	 * build the command.
6024 	 */
6025 	if (BP_PKT(bp) == NULL) {
6026 		ASSERT((bp->b_flags & B_DONE) == 0);
6027 		st_make_cmd(un, bp, st_runout);
6028 		ASSERT((bp->b_flags & B_DONE) == 0);
6029 		status = geterror(bp);
6030 
6031 		/*
6032 		 * Some HBA's don't call bioerror() to set an error.
6033 		 * And geterror() returns zero if B_ERROR is not set.
6034 		 * So if we get zero we must check b_error.
6035 		 */
6036 		if (status == 0 && bp->b_error != 0) {
6037 			status = bp->b_error;
6038 			bioerror(bp, status);
6039 		}
6040 
6041 		/*
6042 		 * Some HBA's convert DDI_DMA_NORESOURCES into ENOMEM.
6043 		 * In tape ENOMEM has special meaning so we'll change it.
6044 		 */
6045 		if (status == ENOMEM) {
6046 			status = 0;
6047 			bioerror(bp, status);
6048 		}
6049 
6050 		/*
6051 		 * Did it fail and is it retryable?
6052 		 * If so return and wait for the callback through st_runout.
6053 		 * Also looks like scsi_init_pkt() will setup a callback even
6054 		 * if it isn't retryable.
6055 		 */
6056 		if (BP_PKT(bp) == NULL) {
6057 			if (status == 0) {
6058 				/*
6059 				 * If first attempt save state.
6060 				 */
6061 				if (un->un_state != ST_STATE_RESOURCE_WAIT) {
6062 					un->un_laststate = un->un_state;
6063 					un->un_state = ST_STATE_RESOURCE_WAIT;
6064 				}
6065 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
6066 				    "temp no resources for pkt\n");
6067 			} else {
6068 				/*
6069 				 * Unlikely that it would be retryable then not.
6070 				 */
6071 				if (un->un_state == ST_STATE_RESOURCE_WAIT) {
6072 					un->un_state = un->un_laststate;
6073 				}
6074 				scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
6075 				    "perm no resources for pkt errno = 0x%x\n",
6076 				    status);
6077 			}
6078 			return;
6079 		}
6080 		/*
6081 		 * Worked this time set the state back.
6082 		 */
6083 		if (un->un_state == ST_STATE_RESOURCE_WAIT) {
6084 			un->un_state = un->un_laststate;
6085 		}
6086 	}
6087 
6088 	/*
6089 	 * move from waitq to runq
6090 	 */
6091 	un->un_quef = bp->b_actf;
6092 	if (un->un_quel == bp) {
6093 		/*
6094 		 *  For the case of queue having one
6095 		 *  element, set the tail pointer to
6096 		 *  point to the element.
6097 		 */
6098 		un->un_quel = bp->b_actf;
6099 	}
6100 
6101 	bp->b_actf = NULL;
6102 
6103 	if (un->un_runqf) {
6104 		un->un_runql->b_actf = bp;
6105 	} else {
6106 		un->un_runqf = bp;
6107 	}
6108 	un->un_runql = bp;
6109 
6110 
6111 	ST_CDB(ST_DEVINFO, "Start CDB", (char *)BP_PKT(bp)->pkt_cdbp);
6112 
6113 #ifdef STDEBUG
6114 	start_dump(un, bp);
6115 #endif
6116 
6117 	/* could not get here if throttle was zero */
6118 	un->un_last_throttle = un->un_throttle;
6119 	un->un_throttle = 0;	/* so nothing else will come in here */
6120 	un->un_ncmds++;
6121 
6122 	ST_DO_KSTATS(bp, kstat_waitq_to_runq);
6123 
6124 	mutex_exit(ST_MUTEX);
6125 
6126 	status = scsi_transport(BP_PKT(bp));
6127 
6128 	mutex_enter(ST_MUTEX);
6129 
6130 	if (un->un_last_throttle) {
6131 		un->un_throttle = un->un_last_throttle;
6132 	}
6133 
6134 	if (status != TRAN_ACCEPT) {
6135 		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
6136 		mutex_exit(ST_MUTEX);
6137 
6138 		if (status == TRAN_BUSY) {
6139 			/* if too many retries, fail the transport */
6140 			if (st_handle_start_busy(un, bp,
6141 			    ST_TRAN_BUSY_TIMEOUT) == 0)
6142 				goto done;
6143 		}
6144 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
6145 		    "transport rejected\n");
6146 		bp->b_resid = bp->b_bcount;
6147 
6148 
6149 #ifndef __lock_lint
6150 		/*
6151 		 * warlock doesn't understand this potential
6152 		 * recursion?
6153 		 */
6154 		mutex_enter(ST_MUTEX);
6155 		ST_DO_KSTATS(bp, kstat_waitq_exit);
6156 		ST_DO_ERRSTATS(un, st_transerrs);
6157 		st_bioerror(bp, EIO);
6158 		SET_PE_FLAG(un);
6159 		st_done_and_mutex_exit(un, bp);
6160 #endif
6161 	} else {
6162 		un->un_tran_retry_ct = 0;
6163 		mutex_exit(ST_MUTEX);
6164 	}
6165 
6166 done:
6167 
6168 	mutex_enter(ST_MUTEX);
6169 }
6170 
6171 /*
6172  * if the transport is busy, then put this bp back on the waitq
6173  */
6174 static int
6175 st_handle_start_busy(struct scsi_tape *un, struct buf *bp,
6176     clock_t timeout_interval)
6177 {
6178 	struct buf *last_quef, *runq_bp;
6179 	int rval = 0;
6180 
6181 	ST_FUNC(ST_DEVINFO, st_handle_start_busy);
6182 
6183 	mutex_enter(ST_MUTEX);
6184 
6185 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6186 	    "st_handle_start_busy()\n");
6187 
6188 	/*
6189 	 * Check to see if we hit the retry timeout and one last check for
6190 	 * making sure this is the last on the runq, if it is not, we have
6191 	 * to fail
6192 	 */
6193 	if (((int)un->un_tran_retry_ct++ > st_retry_count) ||
6194 	    (un->un_runql != bp)) {
6195 		rval = -1;
6196 		goto exit;
6197 	}
6198 
6199 	/* put the bp back on the waitq */
6200 	if (un->un_quef) {
6201 		last_quef = un->un_quef;
6202 		un->un_quef = bp;
6203 		bp->b_actf = last_quef;
6204 	} else  {
6205 		bp->b_actf = NULL;
6206 		un->un_quef = bp;
6207 		un->un_quel = bp;
6208 	}
6209 
6210 	/*
6211 	 * Decrement un_ncmds so that this
6212 	 * gets thru' st_start() again.
6213 	 */
6214 	un->un_ncmds--;
6215 
6216 	/*
6217 	 * since this is an error case, we won't have to do
6218 	 * this list walking much.  We've already made sure this bp was the
6219 	 * last on the runq
6220 	 */
6221 	runq_bp = un->un_runqf;
6222 
6223 	if (un->un_runqf == bp) {
6224 		un->un_runqf = NULL;
6225 		un->un_runql = NULL;
6226 	} else {
6227 		while (runq_bp) {
6228 			if (runq_bp->b_actf == bp) {
6229 				runq_bp->b_actf = NULL;
6230 				un->un_runql = runq_bp;
6231 				break;
6232 			}
6233 			runq_bp = runq_bp->b_actf;
6234 		}
6235 	}
6236 
6237 
6238 	/*
6239 	 * send a marker pkt, if appropriate
6240 	 */
6241 	st_hba_unflush(un);
6242 
6243 	/*
6244 	 * all queues are aligned, we are just waiting to
6245 	 * transport, don't alloc any more buf p's, when
6246 	 * st_start is reentered.
6247 	 */
6248 	(void) timeout(st_start_restart, un, timeout_interval);
6249 
6250 exit:
6251 	mutex_exit(ST_MUTEX);
6252 	return (rval);
6253 }
6254 
6255 
6256 /*
6257  * st_runout a callback that is called what a resource allocatation failed
6258  */
6259 static int
6260 st_runout(caddr_t arg)
6261 {
6262 	struct scsi_tape *un = (struct scsi_tape *)arg;
6263 	struct buf *bp;
6264 	ASSERT(un != NULL);
6265 
6266 	ST_FUNC(ST_DEVINFO, st_runout);
6267 
6268 	mutex_enter(ST_MUTEX);
6269 
6270 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_runout()\n");
6271 
6272 	bp = un->un_quef;
6273 
6274 	/*
6275 	 * failed scsi_init_pkt(). If errno is zero its retryable.
6276 	 */
6277 	if ((bp != NULL) && (geterror(bp) != 0)) {
6278 
6279 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
6280 		    "errors after pkt alloc (b_flags=0x%x, b_error=0x%x)\n",
6281 		    bp->b_flags, geterror(bp));
6282 		ASSERT((bp->b_flags & B_DONE) == 0);
6283 
6284 		un->un_quef = bp->b_actf;
6285 		if (un->un_quel == bp) {
6286 			/*
6287 			 *  For the case of queue having one
6288 			 *  element, set the tail pointer to
6289 			 *  point to the element.
6290 			 */
6291 			un->un_quel = bp->b_actf;
6292 		}
6293 		mutex_exit(ST_MUTEX);
6294 		bp->b_actf = NULL;
6295 
6296 		ASSERT((bp->b_flags & B_DONE) == 0);
6297 
6298 		/*
6299 		 * Set resid, Error already set, then unblock calling thread.
6300 		 */
6301 		bp->b_resid = bp->b_bcount;
6302 		biodone(bp);
6303 	} else {
6304 		/*
6305 		 * Try Again
6306 		 */
6307 		st_start(un);
6308 		mutex_exit(ST_MUTEX);
6309 	}
6310 
6311 	/*
6312 	 * Comments courtesy of sd.c
6313 	 * The scsi_init_pkt routine allows for the callback function to
6314 	 * return a 0 indicating the callback should be rescheduled or a 1
6315 	 * indicating not to reschedule. This routine always returns 1
6316 	 * because the driver always provides a callback function to
6317 	 * scsi_init_pkt. This results in a callback always being scheduled
6318 	 * (via the scsi_init_pkt callback implementation) if a resource
6319 	 * failure occurs.
6320 	 */
6321 
6322 	return (1);
6323 }
6324 
6325 /*
6326  * st_done_and_mutex_exit()
6327  *	- remove bp from runq
6328  *	- start up the next request
6329  *	- if this was an asynch bp, clean up
6330  *	- exit with released mutex
6331  */
6332 static void
6333 st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp)
6334 {
6335 	struct buf *runqbp, *prevbp;
6336 	int	pe_flagged = 0;
6337 
6338 	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
6339 #if !defined(lint)
6340 	_NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex))
6341 #endif
6342 
6343 	ST_FUNC(ST_DEVINFO, st_done_and_mutex_exit);
6344 
6345 	ASSERT(mutex_owned(ST_MUTEX));
6346 
6347 	/*
6348 	 * if bp is still on the runq (anywhere), then remove it
6349 	 */
6350 	prevbp = NULL;
6351 	for (runqbp = un->un_runqf; runqbp != 0; runqbp = runqbp->b_actf) {
6352 		if (runqbp == bp) {
6353 			if (runqbp == un->un_runqf) {
6354 				un->un_runqf = bp->b_actf;
6355 			} else {
6356 				prevbp->b_actf = bp->b_actf;
6357 			}
6358 			if (un->un_runql == bp) {
6359 				un->un_runql = prevbp;
6360 			}
6361 			break;
6362 		}
6363 		prevbp = runqbp;
6364 	}
6365 	bp->b_actf = NULL;
6366 
6367 	un->un_ncmds--;
6368 	cv_signal(&un->un_queue_cv);
6369 
6370 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6371 	    "st_done_and_mutex_exit(): cmd=0x%x count=%ld resid=%ld  flags="
6372 	    "0x%x\n", (uchar_t)*((caddr_t)(BP_PKT(bp))->pkt_cdbp), bp->b_bcount,
6373 	    bp->b_resid, bp->b_flags);
6374 
6375 
6376 	/*
6377 	 * update kstats with transfer count info
6378 	 */
6379 	if (un->un_stats && (bp != un->un_sbufp) && IS_RW(bp)) {
6380 		uint32_t n_done =  bp->b_bcount - bp->b_resid;
6381 		if (bp->b_flags & B_READ) {
6382 			IOSP->reads++;
6383 			IOSP->nread += n_done;
6384 		} else {
6385 			IOSP->writes++;
6386 			IOSP->nwritten += n_done;
6387 		}
6388 	}
6389 
6390 	/*
6391 	 * Start the next one before releasing resources on this one, if
6392 	 * there is something on the queue and persistent errors has not been
6393 	 * flagged
6394 	 */
6395 
6396 	if ((pe_flagged = IS_PE_FLAG_SET(un)) != 0) {
6397 		un->un_last_resid = bp->b_resid;
6398 		un->un_last_count = bp->b_bcount;
6399 	}
6400 
6401 	if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
6402 		cv_broadcast(&un->un_tape_busy_cv);
6403 	} else if (un->un_quef && un->un_throttle && !pe_flagged) {
6404 		st_start(un);
6405 	}
6406 
6407 	if (bp == un->un_sbufp && (bp->b_flags & B_ASYNC)) {
6408 		/*
6409 		 * Since we marked this ourselves as ASYNC,
6410 		 * there isn't anybody around waiting for
6411 		 * completion any more.
6412 		 */
6413 		uchar_t com = (uchar_t)(uintptr_t)bp->b_forw;
6414 		if (com == SCMD_READ || com == SCMD_WRITE) {
6415 			bp->b_un.b_addr = (caddr_t)0;
6416 		}
6417 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6418 		    "st_done_and_mutex_exit(async): freeing pkt\n");
6419 		scsi_destroy_pkt(BP_PKT(bp));
6420 		un->un_sbuf_busy = 0;
6421 		cv_signal(&un->un_sbuf_cv);
6422 		mutex_exit(ST_MUTEX);
6423 		return;
6424 	}
6425 
6426 	if (bp == un->un_sbufp && BP_UCMD(bp)) {
6427 		/*
6428 		 * Copy status from scsi_pkt to uscsi_cmd
6429 		 * since st_ioctl_cmd needs it
6430 		 */
6431 		BP_UCMD(bp)->uscsi_status = SCBP_C(BP_PKT(bp));
6432 	}
6433 
6434 
6435 #ifdef STDEBUG
6436 	if (((st_debug & 0xf) >= 4) &&
6437 	    (((un->un_pos.blkno % 100) == 0) || IS_PE_FLAG_SET(un))) {
6438 
6439 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6440 		    "st_d_a_m_exit(): ncmds = %d, thr = %d, "
6441 		    "un_errno = %d, un_pe = %d\n",
6442 		    un->un_ncmds, un->un_throttle, un->un_errno,
6443 		    un->un_persist_errors);
6444 	}
6445 
6446 #endif
6447 
6448 	mutex_exit(ST_MUTEX);
6449 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6450 	    "st_done_and_mutex_exit: freeing pkt\n");
6451 
6452 	scsi_destroy_pkt(BP_PKT(bp));
6453 
6454 	biodone(bp);
6455 
6456 	/*
6457 	 * now that we biodoned that command, if persistent errors have been
6458 	 * flagged, flush the waitq
6459 	 */
6460 	if (pe_flagged)
6461 		st_flush(un);
6462 }
6463 
6464 
6465 /*
6466  * Tape error, flush tape driver queue.
6467  */
6468 static void
6469 st_flush(struct scsi_tape *un)
6470 {
6471 	struct buf *bp;
6472 
6473 	ST_FUNC(ST_DEVINFO, st_flush);
6474 
6475 	mutex_enter(ST_MUTEX);
6476 
6477 	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6478 	    "st_flush(), ncmds = %d, quef = 0x%p\n",
6479 	    un->un_ncmds, (void *)un->un_quef);
6480 
6481 	/*
6482 	 * if we still have commands outstanding, wait for them to come in
6483 	 * before flushing the queue, and make sure there is a queue
6484 	 */
6485 	if (un->un_ncmds || !un->un_quef)
6486 		goto exit;
6487 
6488 	/*
6489 	 * we have no more commands outstanding, so let's deal with special
6490 	 * cases in the queue for EOM and FM. If we are here, and un_errno
6491 	 * is 0, then we know there was no error and we return a 0 read or
6492 	 * write before showing errors
6493 	 */
6494 
6495 	/* Flush the wait queue. */
6496 	while ((bp = un->un_quef) != NULL) {
6497 		un->un_quef = bp->b_actf;
6498 
6499 		bp->b_resid = bp->b_bcount;
6500 
6501 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6502 		    "st_flush() : blkno=%d, err=%d, b_bcount=%ld\n",
6503 		    un->un_pos.blkno, un->un_errno, bp->b_bcount);
6504 
6505 		st_set_pe_errno(un);
6506 
6507 		bioerror(bp, un->un_errno);
6508 
6509 		mutex_exit(ST_MUTEX);
6510 		/* it should have one, but check anyway */
6511 		if (BP_PKT(bp)) {
6512 			scsi_destroy_pkt(BP_PKT(bp));
6513 		}
6514 		biodone(bp);
6515 		mutex_enter(ST_MUTEX);
6516 	}
6517 
6518 	/*
6519 	 * It's not a bad practice to reset the
6520 	 * waitq tail pointer to NULL.
6521 	 */
6522 	un->un_quel = NULL;
6523 
6524 exit:
6525 	/* we mucked with the queue, so let others know about it */
6526 	cv_signal(&un->un_queue_cv);
6527 	mutex_exit(ST_MUTEX);
6528 }
6529 
6530 
6531 /*
6532  * Utility functions
6533  */
6534 static int
6535 st_determine_generic(dev_t dev)
6536 {
6537 	int bsize;
6538 	static char *cart = "0.25 inch cartridge";
6539 	char *sizestr;
6540 
6541 	GET_SOFT_STATE(dev);
6542 
6543 	ST_FUNC(ST_DEVINFO, st_determine_generic);
6544 
6545 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6546 	    "st_determine_generic(dev = 0x%lx)\n", dev);
6547 
6548 	ASSERT(mutex_owned(ST_MUTEX));
6549 
6550 	if (st_modesense(un)) {
6551 		return (-1);
6552 	}
6553 
6554 	bsize = (un->un_mspl->high_bl << 16)	|
6555 	    (un->un_mspl->mid_bl << 8)	|
6556 	    (un->un_mspl->low_bl);
6557 
6558 	if (bsize == 0) {
6559 		un->un_dp->options |= ST_VARIABLE;
6560 		un->un_dp->bsize = 0;
6561 		un->un_bsize = 0;
6562 	} else if (bsize > ST_MAXRECSIZE_FIXED) {
6563 		/*
6564 		 * record size of this device too big.
6565 		 * try and convert it to variable record length.
6566 		 *
6567 		 */
6568 		un->un_dp->options |= ST_VARIABLE;
6569 		if (st_change_block_size(dev, 0) != 0) {
6570 			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
6571 			    "Fixed Record Size %d is too large\n", bsize);
6572 			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
6573 			    "Cannot switch to variable record size\n");
6574 			un->un_dp->options &= ~ST_VARIABLE;
6575 			return (-1);
6576 		}
6577 	} else if (st_change_block_size(dev, 0) == 0) {
6578 		/*
6579 		 * If the drive was set to a non zero block size,
6580 		 * See if it can be set to a zero block size.
6581 		 * If it works, ST_VARIABLE so user can set it as they want.
6582 		 */
6583 		un->un_dp->options |= ST_VARIABLE;
6584 		un->un_dp->bsize = 0;
6585 		un->un_bsize = 0;
6586 	} else {
6587 		un->un_dp->bsize = bsize;
6588 		un->un_bsize = bsize;
6589 	}
6590 
6591 
6592 	switch (un->un_mspl->density) {
6593 	default:
6594 	case 0x0:
6595 		/*
6596 		 * default density, cannot determine any other
6597 		 * information.
6598 		 */
6599 		sizestr = "Unknown type- assuming 0.25 inch cartridge";
6600 		un->un_dp->type = ST_TYPE_DEFAULT;
6601 		un->un_dp->options |= (ST_AUTODEN_OVERRIDE|ST_QIC);
6602 		break;
6603 	case 0x1:
6604 	case 0x2:
6605 	case 0x3:
6606 	case 0x6:
6607 		/*
6608 		 * 1/2" reel
6609 		 */
6610 		sizestr = "0.50 inch reel";
6611 		un->un_dp->type = ST_TYPE_REEL;
6612 		un->un_dp->options |= ST_REEL;
6613 		un->un_dp->densities[0] = 0x1;
6614 		un->un_dp->densities[1] = 0x2;
6615 		un->un_dp->densities[2] = 0x6;
6616 		un->un_dp->densities[3] = 0x3;
6617 		break;
6618 	case 0x4:
6619 	case 0x5:
6620 	case 0x7:
6621 	case 0x0b:
6622 
6623 		/*
6624 		 * Quarter inch.
6625 		 */
6626 		sizestr = cart;
6627 		un->un_dp->type = ST_TYPE_DEFAULT;
6628 		un->un_dp->options |= ST_QIC;
6629 
6630 		un->un_dp->densities[1] = 0x4;
6631 		un->un_dp->densities[2] = 0x5;
6632 		un->un_dp->densities[3] = 0x7;
6633 		un->un_dp->densities[0] = 0x0b;
6634 		break;
6635 
6636 	case 0x0f:
6637 	case 0x10:
6638 	case 0x11:
6639 	case 0x12:
6640 		/*
6641 		 * QIC-120, QIC-150, QIC-320, QIC-600
6642 		 */
6643 		sizestr = cart;
6644 		un->un_dp->type = ST_TYPE_DEFAULT;
6645 		un->un_dp->options |= ST_QIC;
6646 		un->un_dp->densities[0] = 0x0f;
6647 		un->un_dp->densities[1] = 0x10;
6648 		un->un_dp->densities[2] = 0x11;
6649 		un->un_dp->densities[3] = 0x12;
6650 		break;
6651 
6652 	case 0x09:
6653 	case 0x0a:
6654 	case 0x0c:
6655 	case 0x0d:
6656 		/*
6657 		 * 1/2" cartridge tapes. Include HI-TC.
6658 		 */
6659 		sizestr = cart;
6660 		sizestr[2] = '5';
6661 		sizestr[3] = '0';
6662 		un->un_dp->type = ST_TYPE_HIC;
6663 		un->un_dp->densities[0] = 0x09;
6664 		un->un_dp->densities[1] = 0x0a;
6665 		un->un_dp->densities[2] = 0x0c;
6666 		un->un_dp->densities[3] = 0x0d;
6667 		break;
6668 
6669 	case 0x13:
6670 			/* DDS-2/DDS-3 scsi spec densities */
6671 	case 0x24:
6672 	case 0x25:
6673 	case 0x26:
6674 		sizestr = "DAT Data Storage (DDS)";
6675 		un->un_dp->type = ST_TYPE_DAT;
6676 		un->un_dp->options |= ST_AUTODEN_OVERRIDE;
6677 		break;
6678 
6679 	case 0x14:
6680 		/*
6681 		 * Helical Scan (Exabyte) devices
6682 		 */
6683 		sizestr = "8mm helical scan cartridge";
6684 		un->un_dp->type = ST_TYPE_EXABYTE;
6685 		un->un_dp->options |= ST_AUTODEN_OVERRIDE;
6686 		break;
6687 	}
6688 
6689 	/*
6690 	 * Assume LONG ERASE, BSF and BSR
6691 	 */
6692 
6693 	un->un_dp->options |=
6694 	    (ST_LONG_ERASE | ST_UNLOADABLE | ST_BSF | ST_BSR | ST_KNOWS_EOD);
6695 
6696 	/*
6697 	 * Only if mode sense data says no buffered write, set NOBUF
6698 	 */
6699 	if (un->un_mspl->bufm == 0)
6700 		un->un_dp->options |= ST_NOBUF;
6701 
6702 	/*
6703 	 * set up large read and write retry counts
6704 	 */
6705 
6706 	un->un_dp->max_rretries = un->un_dp->max_wretries = 1000;
6707 
6708 	/*
6709 	 * If this is a 0.50 inch reel tape, and
6710 	 * it is *not* variable mode, try and
6711 	 * set it to variable record length
6712 	 * mode.
6713 	 */
6714 	if ((un->un_dp->options & ST_REEL) && un->un_bsize != 0 &&
6715 	    (un->un_dp->options & ST_VARIABLE)) {
6716 		if (st_change_block_size(dev, 0) == 0) {
6717 			un->un_dp->bsize = 0;
6718 			un->un_mspl->high_bl = un->un_mspl->mid_bl =
6719 			    un->un_mspl->low_bl = 0;
6720 		}
6721 	}
6722 
6723 	/*
6724 	 * Write to console about type of device found
6725 	 */
6726 	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
6727 	    "Generic Drive, Vendor=%s\n\t%s", un->un_dp->name,
6728 	    sizestr);
6729 	if (un->un_dp->options & ST_VARIABLE) {
6730 		scsi_log(ST_DEVINFO, st_label, CE_NOTE,
6731 		    "!Variable record length I/O\n");
6732 	} else {
6733 		scsi_log(ST_DEVINFO, st_label, CE_NOTE,
6734 		    "!Fixed record length (%d byte blocks) I/O\n",
6735 		    un->un_dp->bsize);
6736 	}
6737 	ASSERT(mutex_owned(ST_MUTEX));
6738 	return (0);
6739 }
6740 
6741 static int
6742 st_determine_density(dev_t dev, int rw)
6743 {
6744 	int rval = 0;
6745 
6746 	GET_SOFT_STATE(dev);
6747 
6748 	ST_FUNC(ST_DEVINFO, st_determine_density);
6749 
6750 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6751 	    "st_determine_density(dev = 0x%lx, rw = %s)\n",
6752 	    dev, (rw == B_WRITE ? wr_str: rd_str));
6753 
6754 	ASSERT(mutex_owned(ST_MUTEX));
6755 
6756 	/*
6757 	 * If we're past BOT, density is determined already.
6758 	 */
6759 	if (un->un_pos.pmode == logical) {
6760 		if (un->un_pos.lgclblkno != 0) {
6761 			goto exit;
6762 		}
6763 	} else if (un->un_pos.pmode == legacy) {
6764 		if ((un->un_pos.fileno != 0) || (un->un_pos.blkno != 0)) {
6765 			/*
6766 			 * XXX: put in a bitch message about attempting to
6767 			 * XXX: change density past BOT.
6768 			 */
6769 			goto exit;
6770 		}
6771 	} else {
6772 		goto exit;
6773 	}
6774 
6775 
6776 	/*
6777 	 * If we're going to be writing, we set the density
6778 	 */
6779 	if (rw == 0 || rw == B_WRITE) {
6780 		/* un_curdens is used as an index into densities table */
6781 		un->un_curdens = MT_DENSITY(un->un_dev);
6782 		if (st_set_density(dev)) {
6783 			rval = -1;
6784 		}
6785 		goto exit;
6786 	}
6787 
6788 	/*
6789 	 * If density is known already,
6790 	 * we don't have to get it again.(?)
6791 	 */
6792 	if (!un->un_density_known) {
6793 		if (st_get_density(dev)) {
6794 			rval = -1;
6795 		}
6796 	}
6797 
6798 exit:
6799 	ASSERT(mutex_owned(ST_MUTEX));
6800 	return (rval);
6801 }
6802 
6803 
6804 /*
6805  * Try to determine density. We do this by attempting to read the
6806  * first record off the tape, cycling through the available density
6807  * codes as we go.
6808  */
6809 
6810 static int
6811 st_get_density(dev_t dev)
6812 {
6813 	int succes = 0, rval = -1, i;
6814 	uint_t size;
6815 	uchar_t dens, olddens;
6816 
6817 	GET_SOFT_STATE(dev);
6818 
6819 	ST_FUNC(ST_DEVINFO, st_get_density);
6820 
6821 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6822 	    "st_get_density(dev = 0x%lx)\n", dev);
6823 
6824 	ASSERT(mutex_owned(ST_MUTEX));
6825 
6826 	/*
6827 	 * If Auto Density override is enabled The drive has
6828 	 * only one density and there is no point in attempting
6829 	 * find the correct one.
6830 	 *
6831 	 * Since most modern drives auto detect the density
6832 	 * and format of the recorded media before they come
6833 	 * ready. What this function does is a legacy behavior
6834 	 * and modern drives not only don't need it, The backup
6835 	 * utilities that do positioning via uscsi find the un-
6836 	 * expected rewinds problematic.
6837 	 *
6838 	 * The drives that need this are old reel to reel devices.
6839 	 * I took a swag and said they must be scsi-1 or older.
6840 	 * I don't beleave there will any of the newer devices
6841 	 * that need this. There will be some scsi-1 devices that
6842 	 * don't need this but I don't think they will be using the
6843 	 * BIG aftermarket backup and restore utilitys.
6844 	 */
6845 	if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) ||
6846 	    (un->un_sd->sd_inq->inq_ansi > 1)) {
6847 		un->un_density_known = 1;
6848 		rval = 0;
6849 		goto exit;
6850 	}
6851 
6852 	/*
6853 	 * This will only work on variable record length tapes
6854 	 * if and only if all variable record length tapes autodensity
6855 	 * select.
6856 	 */
6857 	size = (unsigned)(un->un_dp->bsize ? un->un_dp->bsize : SECSIZE);
6858 	un->un_tmpbuf = kmem_alloc(size, KM_SLEEP);
6859 
6860 	/*
6861 	 * Start at the specified density
6862 	 */
6863 
6864 	dens = olddens = un->un_curdens = MT_DENSITY(un->un_dev);
6865 
6866 	for (i = 0; i < NDENSITIES; i++, ((un->un_curdens == NDENSITIES - 1) ?
6867 	    (un->un_curdens = 0) : (un->un_curdens += 1))) {
6868 		/*
6869 		 * If we've done this density before,
6870 		 * don't bother to do it again.
6871 		 */
6872 		dens = un->un_dp->densities[un->un_curdens];
6873 		if (i > 0 && dens == olddens)
6874 			continue;
6875 		olddens = dens;
6876 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6877 		    "trying density 0x%x\n", dens);
6878 		if (st_set_density(dev)) {
6879 			continue;
6880 		}
6881 
6882 		/*
6883 		 * XXX - the creates lots of headaches and slowdowns - must
6884 		 * fix.
6885 		 */
6886 		succes = (st_cmd(dev, SCMD_READ, (int)size, SYNC_CMD) == 0);
6887 		if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
6888 			break;
6889 		}
6890 		if (succes) {
6891 			st_init(un);
6892 			rval = 0;
6893 			un->un_density_known = 1;
6894 			break;
6895 		}
6896 	}
6897 	kmem_free(un->un_tmpbuf, size);
6898 	un->un_tmpbuf = 0;
6899 
6900 exit:
6901 	ASSERT(mutex_owned(ST_MUTEX));
6902 	return (rval);
6903 }
6904 
6905 static int
6906 st_set_density(dev_t dev)
6907 {
6908 	int rval = 0;
6909 
6910 	GET_SOFT_STATE(dev);
6911 
6912 	ST_FUNC(ST_DEVINFO, st_set_density);
6913 
6914 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6915 	    "st_set_density(dev = 0x%lx): density = 0x%x\n", dev,
6916 	    un->un_dp->densities[un->un_curdens]);
6917 
6918 	ASSERT(mutex_owned(ST_MUTEX));
6919 
6920 	un->un_mspl->density = un->un_dp->densities[un->un_curdens];
6921 
6922 	if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) == 0) {
6923 		/*
6924 		 * If auto density override is not set, Use mode select
6925 		 * to set density and compression.
6926 		 */
6927 		if (st_modeselect(un)) {
6928 			rval = -1;
6929 		}
6930 	} else if ((un->un_dp->options & ST_MODE_SEL_COMP) != 0) {
6931 		/*
6932 		 * If auto density and mode select compression are set,
6933 		 * This is a drive with one density code but compression
6934 		 * can be enabled or disabled.
6935 		 * Set compression but no need to set density.
6936 		 */
6937 		rval = st_set_compression(un);
6938 		if ((rval != 0) && (rval != EALREADY)) {
6939 			rval = -1;
6940 		} else {
6941 			rval = 0;
6942 		}
6943 	}
6944 
6945 	/* If sucessful set density and/or compression, mark density known */
6946 	if (rval == 0) {
6947 		un->un_density_known = 1;
6948 	}
6949 
6950 	ASSERT(mutex_owned(ST_MUTEX));
6951 	return (rval);
6952 }
6953 
6954 static int
6955 st_loadtape(dev_t dev)
6956 {
6957 	int rval;
6958 
6959 	GET_SOFT_STATE(dev);
6960 
6961 	ST_FUNC(ST_DEVINFO, st_load_tape);
6962 
6963 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6964 	    "st_loadtape(dev = 0x%lx)\n", dev);
6965 
6966 	ASSERT(mutex_owned(ST_MUTEX));
6967 
6968 	/*
6969 	 * 'LOAD' the tape to BOT by rewinding
6970 	 */
6971 	rval = st_cmd(dev, SCMD_REWIND, 1, SYNC_CMD);
6972 	if (rval == 0) {
6973 		st_init(un);
6974 		un->un_density_known = 0;
6975 	}
6976 
6977 	ASSERT(mutex_owned(ST_MUTEX));
6978 	return (rval);
6979 }
6980 
6981 
6982 /*
6983  * Note: QIC devices aren't so smart.  If you try to append
6984  * after EOM, the write can fail because the device doesn't know
6985  * it's at EOM.	 In that case, issue a read.  The read should fail
6986  * because there's no data, but the device knows it's at EOM,
6987  * so a subsequent write should succeed.  To further confuse matters,
6988  * the target returns the same error if the tape is positioned
6989  * such that a write would overwrite existing data.  That's why
6990  * we have to do the append test.  A read in the middle of
6991  * recorded data would succeed, thus indicating we're attempting
6992  * something illegal.
6993  */
6994 
6995 
6996 static void
6997 st_test_append(struct buf *bp)
6998 {
6999 	dev_t dev = bp->b_edev;
7000 	struct scsi_tape *un;
7001 	uchar_t status;
7002 	unsigned bcount;
7003 
7004 	un = ddi_get_soft_state(st_state, MTUNIT(dev));
7005 
7006 	ST_FUNC(ST_DEVINFO, st_test_append);
7007 
7008 	ASSERT(mutex_owned(ST_MUTEX));
7009 
7010 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7011 	    "st_test_append(): fileno %d\n", un->un_pos.fileno);
7012 
7013 	un->un_laststate = un->un_state;
7014 	un->un_state = ST_STATE_APPEND_TESTING;
7015 	un->un_test_append = 0;
7016 
7017 	/*
7018 	 * first, map in the buffer, because we're doing a double write --
7019 	 * first into the kernel, then onto the tape.
7020 	 */
7021 	bp_mapin(bp);
7022 
7023 	/*
7024 	 * get a copy of the data....
7025 	 */
7026 	un->un_tmpbuf = kmem_alloc((unsigned)bp->b_bcount, KM_SLEEP);
7027 	bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount);
7028 
7029 	/*
7030 	 * attempt the write..
7031 	 */
7032 
7033 	if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount, SYNC_CMD) == 0) {
7034 success:
7035 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7036 		    "append write succeeded\n");
7037 		bp->b_resid = un->un_sbufp->b_resid;
7038 		mutex_exit(ST_MUTEX);
7039 		bcount = (unsigned)bp->b_bcount;
7040 		biodone(bp);
7041 		mutex_enter(ST_MUTEX);
7042 		un->un_laststate = un->un_state;
7043 		un->un_state = ST_STATE_OPEN;
7044 		kmem_free(un->un_tmpbuf, bcount);
7045 		un->un_tmpbuf = NULL;
7046 		return;
7047 	}
7048 
7049 	/*
7050 	 * The append failed. Do a short read. If that fails,  we are at EOM
7051 	 * so we can retry the write command. If that succeeds, than we're
7052 	 * all screwed up (the controller reported a real error).
7053 	 *
7054 	 * XXX: should the dummy read be > SECSIZE? should it be the device's
7055 	 * XXX: block size?
7056 	 *
7057 	 */
7058 	status = un->un_status;
7059 	un->un_status = 0;
7060 	(void) st_cmd(dev, SCMD_READ, SECSIZE, SYNC_CMD);
7061 	if (un->un_status == KEY_BLANK_CHECK) {
7062 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7063 		    "append at EOM\n");
7064 		/*
7065 		 * Okay- the read failed. We should actually have confused
7066 		 * the controller enough to allow writing. In any case, the
7067 		 * i/o is on its own from here on out.
7068 		 */
7069 		un->un_laststate = un->un_state;
7070 		un->un_state = ST_STATE_OPEN;
7071 		bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount);
7072 		if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount,
7073 		    SYNC_CMD) == 0) {
7074 			goto success;
7075 		}
7076 	}
7077 
7078 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7079 	    "append write failed- not at EOM\n");
7080 	bp->b_resid = bp->b_bcount;
7081 	st_bioerror(bp, EIO);
7082 
7083 	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
7084 	    "st_test_append : EIO : append write failed - not at EOM");
7085 
7086 	/*
7087 	 * backspace one record to get back to where we were
7088 	 */
7089 	if (st_cmd(dev, SCMD_SPACE, Blk(-1), SYNC_CMD)) {
7090 		un->un_pos.pmode = invalid;
7091 	}
7092 
7093 	un->un_err_resid = bp->b_resid;
7094 	un->un_status = status;
7095 
7096 	/*
7097 	 * Note: biodone will do a bp_mapout()
7098 	 */
7099 	mutex_exit(ST_MUTEX);
7100 	bcount = (unsigned)bp->b_bcount;
7101 	biodone(bp);
7102 	mutex_enter(ST_MUTEX);
7103 	un->un_laststate = un->un_state;
7104 	un->un_state = ST_STATE_OPEN_PENDING_IO;
7105 	kmem_free(un->un_tmpbuf, bcount);
7106 	un->un_tmpbuf = NULL;
7107 }
7108 
7109 /*
7110  * Special command handler
7111  */
7112 
7113 /*
7114  * common st_cmd code. The fourth parameter states
7115  * whether the caller wishes to await the results
7116  * Note the release of the mutex during most of the function
7117  */
7118 static int
7119 st_cmd(dev_t dev, int com, int count, int wait)
7120 {
7121 	struct buf *bp;
7122 	int err;
7123 
7124 	GET_SOFT_STATE(dev);
7125 
7126 	ST_FUNC(ST_DEVINFO, st_cmd);
7127 
7128 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7129 	    "st_cmd(dev = 0x%lx, com = 0x%x, count = %x, wait = %d)\n",
7130 	    dev, com, count, wait);
7131 
7132 	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
7133 	ASSERT(mutex_owned(ST_MUTEX));
7134 
7135 #ifdef STDEBUG
7136 	if ((st_debug & 0xf)) {
7137 		st_debug_cmds(un, com, count, wait);
7138 	}
7139 #endif
7140 
7141 	/* check to see if this command requires the drive to be reserved */
7142 	err = st_check_cmd_for_need_to_reserve(un, com, count);
7143 
7144 	if (err) {
7145 		return (err);
7146 	}
7147 
7148 	while (un->un_sbuf_busy)
7149 		cv_wait(&un->un_sbuf_cv, ST_MUTEX);
7150 	un->un_sbuf_busy = 1;
7151 
7152 	bp = un->un_sbufp;
7153 	bzero(bp, sizeof (buf_t));
7154 
7155 	bp->b_flags = (wait) ? B_BUSY : B_BUSY|B_ASYNC;
7156 
7157 	/*
7158 	 * Set count to the actual size of the data tranfer.
7159 	 * For commands with no data transfer, set bp->b_bcount
7160 	 * to the value to be used when constructing the
7161 	 * cdb in st_make_cmd().
7162 	 */
7163 	switch (com) {
7164 	case SCMD_READ:
7165 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7166 		    "special read %d\n", count);
7167 		bp->b_flags |= B_READ;
7168 		bp->b_un.b_addr = un->un_tmpbuf;
7169 		break;
7170 
7171 	case SCMD_WRITE:
7172 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7173 		    "special write %d\n", count);
7174 		bp->b_un.b_addr = un->un_tmpbuf;
7175 		break;
7176 
7177 	case SCMD_WRITE_FILE_MARK:
7178 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7179 		    "write %d file marks\n", count);
7180 		bp->b_bcount = count;
7181 		count = 0;
7182 		break;
7183 
7184 	case SCMD_REWIND:
7185 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "rewind\n");
7186 		bp->b_bcount = 0;
7187 		count = 0;
7188 		break;
7189 
7190 	case SCMD_SPACE:
7191 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "space\n");
7192 		/*
7193 		 * XXX The user could have entered a number that will
7194 		 * not fit in the 12 bit count field. Whats new here
7195 		 * checking that. Down the road this should use space(16).
7196 		 */
7197 		if ((SPACE_CNT(count) > 0x7fffff) ||
7198 		    (SPACE_CNT(count) < -(0x7fffff))) {
7199 			un->un_sbuf_busy = 0;
7200 			cv_signal(&un->un_sbuf_cv);
7201 			return (EINVAL);
7202 		}
7203 		bp->b_bcount = count;
7204 		count = 0;
7205 		break;
7206 
7207 	case SCMD_RESERVE:
7208 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "reserve");
7209 		bp->b_bcount = 0;
7210 		count = 0;
7211 		break;
7212 
7213 	case SCMD_RELEASE:
7214 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "release");
7215 		bp->b_bcount = 0;
7216 		count = 0;
7217 		break;
7218 
7219 	case SCMD_LOAD:
7220 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7221 		    "%s tape\n", (count & LD_LOAD) ? "load" : "unload");
7222 		bp->b_bcount = count;
7223 		count = 0;
7224 		break;
7225 
7226 	case SCMD_ERASE:
7227 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7228 		    "erase tape\n");
7229 		bp->b_bcount = 0;
7230 		count = 0;
7231 		break;
7232 
7233 	case SCMD_MODE_SENSE:
7234 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7235 		    "mode sense\n");
7236 		bp->b_flags |= B_READ;
7237 		bp->b_un.b_addr = (caddr_t)(un->un_mspl);
7238 		break;
7239 
7240 	case SCMD_MODE_SELECT:
7241 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7242 		    "mode select\n");
7243 		bp->b_un.b_addr = (caddr_t)(un->un_mspl);
7244 		break;
7245 
7246 	case SCMD_READ_BLKLIM:
7247 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7248 		    "read block limits\n");
7249 		bp->b_flags |= B_READ;
7250 		bp->b_un.b_addr = (caddr_t)(un->un_rbl);
7251 		break;
7252 
7253 	case SCMD_TEST_UNIT_READY:
7254 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7255 		    "test unit ready\n");
7256 		bp->b_bcount = 0;
7257 		count = 0;
7258 		break;
7259 
7260 	case SCMD_DOORLOCK:
7261 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7262 		    "%s tape\n", (count & MR_LOCK) ? "lock" : "unlock");
7263 		bp->b_bcount = count = 0;
7264 		break;
7265 
7266 	case SCMD_READ_POSITION:
7267 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7268 		    "read position\n");
7269 		switch (un->un_read_pos_type) {
7270 		case LONG_POS:
7271 			count = sizeof (tape_position_long_t);
7272 			break;
7273 		case EXT_POS:
7274 			count = min(count, sizeof (tape_position_ext_t));
7275 			break;
7276 		case SHORT_POS:
7277 			count = sizeof (tape_position_t);
7278 			break;
7279 		default:
7280 			ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
7281 			    "Unknown read position type 0x%x in "
7282 			    "st_make_cmd()\n", un->un_read_pos_type);
7283 		}
7284 		bp->b_bcount = count;
7285 		bp->b_flags |= B_READ;
7286 		bp->b_un.b_addr = (caddr_t)un->un_read_pos_data;
7287 		break;
7288 
7289 	default:
7290 		ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
7291 		    "Unhandled scsi command 0x%x in st_cmd()\n", com);
7292 	}
7293 
7294 	mutex_exit(ST_MUTEX);
7295 
7296 	if (count > 0) {
7297 		/*
7298 		 * We're going to do actual I/O.
7299 		 * Set things up for physio.
7300 		 */
7301 		struct iovec aiov;
7302 		struct uio auio;
7303 		struct uio *uio = &auio;
7304 
7305 		bzero(&auio, sizeof (struct uio));
7306 		bzero(&aiov, sizeof (struct iovec));
7307 		aiov.iov_base = bp->b_un.b_addr;
7308 		aiov.iov_len = count;
7309 
7310 		uio->uio_iov = &aiov;
7311 		uio->uio_iovcnt = 1;
7312 		uio->uio_resid = aiov.iov_len;
7313 		uio->uio_segflg = UIO_SYSSPACE;
7314 
7315 		/*
7316 		 * Let physio do the rest...
7317 		 */
7318 		bp->b_forw = (struct buf *)(uintptr_t)com;
7319 		bp->b_back = NULL;
7320 		err = physio(st_strategy, bp, dev,
7321 		    (bp->b_flags & B_READ) ? B_READ : B_WRITE,
7322 		    st_minphys, uio);
7323 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7324 		    "st_cmd: physio returns %d\n", err);
7325 	} else {
7326 		/*
7327 		 * Mimic physio
7328 		 */
7329 		bp->b_forw = (struct buf *)(uintptr_t)com;
7330 		bp->b_back = NULL;
7331 		bp->b_edev = dev;
7332 		bp->b_dev = cmpdev(dev);
7333 		bp->b_blkno = 0;
7334 		bp->b_resid = 0;
7335 		(void) st_strategy(bp);
7336 		if (!wait) {
7337 			/*
7338 			 * This is an async command- the caller won't wait
7339 			 * and doesn't care about errors.
7340 			 */
7341 			mutex_enter(ST_MUTEX);
7342 			return (0);
7343 		}
7344 
7345 		/*
7346 		 * BugTraq #4260046
7347 		 * ----------------
7348 		 * Restore Solaris 2.5.1 behavior, namely call biowait
7349 		 * unconditionally. The old comment said...
7350 		 *
7351 		 * "if strategy was flagged with  persistent errors, we would
7352 		 *  have an error here, and the bp would never be sent, so we
7353 		 *  don't want to wait on a bp that was never sent...or hang"
7354 		 *
7355 		 * The new rationale, courtesy of Chitrank...
7356 		 *
7357 		 * "we should unconditionally biowait() here because
7358 		 *  st_strategy() will do a biodone() in the persistent error
7359 		 *  case and the following biowait() will return immediately.
7360 		 *  If not, in the case of "errors after pkt alloc" in
7361 		 *  st_start(), we will not biowait here which will cause the
7362 		 *  next biowait() to return immediately which will cause
7363 		 *  us to send out the next command. In the case where both of
7364 		 *  these use the sbuf, when the first command completes we'll
7365 		 *  free the packet attached to sbuf and the same pkt will
7366 		 *  get freed again when we complete the second command.
7367 		 *  see esc 518987.  BTW, it is necessary to do biodone() in
7368 		 *  st_start() for the pkt alloc failure case because physio()
7369 		 *  does biowait() and will hang if we don't do biodone()"
7370 		 */
7371 
7372 		err = biowait(bp);
7373 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7374 		    "st_cmd: biowait returns %d\n", err);
7375 	}
7376 	mutex_enter(ST_MUTEX);
7377 
7378 	un->un_sbuf_busy = 0;
7379 
7380 	/*
7381 	 * If was a space command need to update logical block position.
7382 	 * If the command failed such that positioning is invalid, Don't
7383 	 * update the position as the user must do this to validate the
7384 	 * position for data protection.
7385 	 */
7386 	if ((com == SCMD_SPACE) && (un->un_pos.pmode != invalid)) {
7387 		uchar_t status = un->un_status;
7388 		(void) st_update_block_pos(un);
7389 		un->un_status = status;
7390 	}
7391 
7392 	cv_signal(&un->un_sbuf_cv);
7393 	return (err);
7394 }
7395 
7396 static int
7397 st_set_compression(struct scsi_tape *un)
7398 {
7399 	int rval;
7400 	int turn_compression_on;
7401 	minor_t minor;
7402 
7403 	ST_FUNC(ST_DEVINFO, st_set_compression);
7404 
7405 	/*
7406 	 * Drive either dosn't have compression or it is controlled with
7407 	 * special density codes. Return ENOTTY so caller
7408 	 * knows nothing was done.
7409 	 */
7410 	if ((un->un_dp->options & ST_MODE_SEL_COMP) == 0) {
7411 		un->un_comp_page = 0;
7412 		return (ENOTTY);
7413 	}
7414 
7415 	/* set compression based on minor node opened */
7416 	minor = MT_DENSITY(un->un_dev);
7417 
7418 	/*
7419 	 * If this the compression density or
7420 	 * the drive has two densities and uses mode select for
7421 	 * control of compression turn on compression for MT_DENSITY2
7422 	 * as well.
7423 	 */
7424 	if ((minor == ST_COMPRESSION_DENSITY) ||
7425 	    (minor == MT_DENSITY(MT_DENSITY2)) &&
7426 	    (un->un_dp->densities[0] == un->un_dp->densities[1]) &&
7427 	    (un->un_dp->densities[2] == un->un_dp->densities[3]) &&
7428 	    (un->un_dp->densities[0] != un->un_dp->densities[2])) {
7429 
7430 		turn_compression_on = 1;
7431 	} else {
7432 		turn_compression_on = 0;
7433 	}
7434 
7435 	un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16);
7436 	un->un_mspl->mid_bl  = (uchar_t)(un->un_bsize >> 8);
7437 	un->un_mspl->low_bl  = (uchar_t)(un->un_bsize);
7438 
7439 	/*
7440 	 * Need to determine which page does the device use for compression.
7441 	 * First try the data compression page. If this fails try the device
7442 	 * configuration page
7443 	 */
7444 
7445 	if ((un->un_comp_page & ST_DEV_DATACOMP_PAGE) == ST_DEV_DATACOMP_PAGE) {
7446 		rval = st_set_datacomp_page(un, turn_compression_on);
7447 		if (rval == EALREADY) {
7448 			return (rval);
7449 		}
7450 		if (rval != 0) {
7451 			if (un->un_status == KEY_ILLEGAL_REQUEST) {
7452 				/*
7453 				 * This device does not support data
7454 				 * compression page
7455 				 */
7456 				un->un_comp_page = ST_DEV_CONFIG_PAGE;
7457 			} else if (un->un_state >= ST_STATE_OPEN) {
7458 				un->un_pos.pmode = invalid;
7459 				rval = EIO;
7460 			} else {
7461 				rval = -1;
7462 			}
7463 		} else {
7464 			un->un_comp_page = ST_DEV_DATACOMP_PAGE;
7465 		}
7466 	}
7467 
7468 	if ((un->un_comp_page & ST_DEV_CONFIG_PAGE) == ST_DEV_CONFIG_PAGE) {
7469 		rval = st_set_devconfig_page(un, turn_compression_on);
7470 		if (rval == EALREADY) {
7471 			return (rval);
7472 		}
7473 		if (rval != 0) {
7474 			if (un->un_status == KEY_ILLEGAL_REQUEST) {
7475 				/*
7476 				 * This device does not support
7477 				 * compression at all advice the
7478 				 * user and unset ST_MODE_SEL_COMP
7479 				 */
7480 				un->un_dp->options &= ~ST_MODE_SEL_COMP;
7481 				un->un_comp_page = 0;
7482 				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
7483 				    "Device Does Not Support Compression\n");
7484 			} else if (un->un_state >= ST_STATE_OPEN) {
7485 				un->un_pos.pmode = invalid;
7486 				rval = EIO;
7487 			} else {
7488 				rval = -1;
7489 			}
7490 		}
7491 	}
7492 
7493 	return (rval);
7494 }
7495 
7496 /*
7497  * set or unset compression thru device configuration page.
7498  */
7499 static int
7500 st_set_devconfig_page(struct scsi_tape *un, int compression_on)
7501 {
7502 	unsigned char cflag;
7503 	int rval = 0;
7504 
7505 
7506 	ST_FUNC(ST_DEVINFO, st_set_devconfig_page);
7507 
7508 	ASSERT(mutex_owned(ST_MUTEX));
7509 	/*
7510 	 * Figure what to set compression flag to.
7511 	 */
7512 	if (compression_on) {
7513 		/* They have selected a compression node */
7514 		if (un->un_dp->type == ST_TYPE_FUJI) {
7515 			cflag = 0x84;   /* use EDRC */
7516 		} else {
7517 			cflag = ST_DEV_CONFIG_DEF_COMP;
7518 		}
7519 	} else {
7520 		cflag = ST_DEV_CONFIG_NO_COMP;
7521 	}
7522 
7523 	/*
7524 	 * If compression is already set the way it was requested.
7525 	 * And if this not the first time we has tried.
7526 	 */
7527 	if ((cflag == un->un_mspl->page.dev.comp_alg) &&
7528 	    (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) {
7529 		return (EALREADY);
7530 	}
7531 
7532 	un->un_mspl->page.dev.comp_alg = cflag;
7533 	/*
7534 	 * need to send mode select even if correct compression is
7535 	 * already set since need to set density code
7536 	 */
7537 
7538 #ifdef STDEBUG
7539 	if ((st_debug & 0xf) >= 6) {
7540 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
7541 		    "st_set_devconfig_page: sense data for mode select",
7542 		    (char *)un->un_mspl, sizeof (struct seq_mode));
7543 	}
7544 #endif
7545 	rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode));
7546 
7547 	return (rval);
7548 }
7549 
7550 /*
7551  * set/reset compression bit thru data compression page
7552  */
7553 static int
7554 st_set_datacomp_page(struct scsi_tape *un, int compression_on)
7555 {
7556 	int compression_on_already;
7557 	int rval = 0;
7558 
7559 
7560 	ST_FUNC(ST_DEVINFO, st_set_datacomp_page);
7561 
7562 	ASSERT(mutex_owned(ST_MUTEX));
7563 	/*
7564 	 * If drive is not capable of compression (at this time)
7565 	 * return EALREADY so caller doesn't think that this page
7566 	 * is not supported. This check is for drives that can
7567 	 * disable compression from the front panel or configuration.
7568 	 * I doubt that a drive that supports this page is not really
7569 	 * capable of compression.
7570 	 */
7571 	if (un->un_mspl->page.comp.dcc == 0) {
7572 		return (EALREADY);
7573 	}
7574 
7575 	/* See if compression currently turned on */
7576 	if (un->un_mspl->page.comp.dce) {
7577 		compression_on_already = 1;
7578 	} else {
7579 		compression_on_already = 0;
7580 	}
7581 
7582 	/*
7583 	 * If compression is already set the way it was requested.
7584 	 * And if this not the first time we has tried.
7585 	 */
7586 	if ((compression_on == compression_on_already) &&
7587 	    (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) {
7588 		return (EALREADY);
7589 	}
7590 
7591 	/*
7592 	 * if we are already set to the appropriate compression
7593 	 * mode, don't set it again
7594 	 */
7595 	if (compression_on) {
7596 		/* compression selected */
7597 		un->un_mspl->page.comp.dce = 1;
7598 	} else {
7599 		un->un_mspl->page.comp.dce = 0;
7600 	}
7601 
7602 
7603 #ifdef STDEBUG
7604 	if ((st_debug & 0xf) >= 6) {
7605 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
7606 		    "st_set_datacomp_page: sense data for mode select",
7607 		    (char *)un->un_mspl, sizeof (struct seq_mode));
7608 	}
7609 #endif
7610 	rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode));
7611 
7612 	return (rval);
7613 }
7614 
7615 static int
7616 st_modesense(struct scsi_tape *un)
7617 {
7618 	int rval;
7619 	uchar_t page;
7620 
7621 	ST_FUNC(ST_DEVINFO, st_modesense);
7622 
7623 	page = un->un_comp_page;
7624 
7625 	switch (page) {
7626 	case ST_DEV_DATACOMP_PAGE:
7627 	case ST_DEV_CONFIG_PAGE: /* fall through */
7628 		rval = st_gen_mode_sense(un, page, un->un_mspl,
7629 		    sizeof (struct seq_mode));
7630 		break;
7631 
7632 	case ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE:
7633 		if (un->un_dp->options & ST_MODE_SEL_COMP) {
7634 			page = ST_DEV_DATACOMP_PAGE;
7635 			rval = st_gen_mode_sense(un, page, un->un_mspl,
7636 			    sizeof (struct seq_mode));
7637 			if (rval == 0 && un->un_mspl->page_code == page) {
7638 				un->un_comp_page = page;
7639 				break;
7640 			}
7641 			page = ST_DEV_CONFIG_PAGE;
7642 			rval = st_gen_mode_sense(un, page, un->un_mspl,
7643 			    sizeof (struct seq_mode));
7644 			if (rval == 0 && un->un_mspl->page_code == page) {
7645 				un->un_comp_page = page;
7646 				break;
7647 			}
7648 			un->un_dp->options &= ~ST_MODE_SEL_COMP;
7649 			un->un_comp_page = 0;
7650 		} else {
7651 			un->un_comp_page = 0;
7652 		}
7653 
7654 	default:	/* fall through */
7655 		rval = st_cmd(un->un_dev, SCMD_MODE_SENSE, MSIZE, SYNC_CMD);
7656 	}
7657 	return (rval);
7658 }
7659 
7660 static int
7661 st_modeselect(struct scsi_tape *un)
7662 {
7663 	int rval = 0;
7664 	int ix;
7665 
7666 	ST_FUNC(ST_DEVINFO, st_modeselect);
7667 
7668 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7669 	    "st_modeselect(dev = 0x%lx): density = 0x%x\n",
7670 	    un->un_dev, un->un_mspl->density);
7671 
7672 	ASSERT(mutex_owned(ST_MUTEX));
7673 
7674 	/*
7675 	 * The parameter list should be the same for all of the
7676 	 * cases that follow so set them here
7677 	 *
7678 	 * Try mode select first if if fails set fields manually
7679 	 */
7680 	rval = st_modesense(un);
7681 	if (rval != 0) {
7682 		ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
7683 		    "st_modeselect: First mode sense failed\n");
7684 		un->un_mspl->bd_len  = 8;
7685 		un->un_mspl->high_nb = 0;
7686 		un->un_mspl->mid_nb  = 0;
7687 		un->un_mspl->low_nb  = 0;
7688 	}
7689 	un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16);
7690 	un->un_mspl->mid_bl  = (uchar_t)(un->un_bsize >> 8);
7691 	un->un_mspl->low_bl  = (uchar_t)(un->un_bsize);
7692 
7693 
7694 	/*
7695 	 * If configured to use a specific density code for a media type.
7696 	 * curdens is previously set by the minor node opened.
7697 	 * If the media type doesn't match the minor node we change it so it
7698 	 * looks like the correct one was opened.
7699 	 */
7700 	if (un->un_dp->options & ST_KNOWS_MEDIA) {
7701 		uchar_t best;
7702 
7703 		for (best = 0xff, ix = 0; ix < NDENSITIES; ix++) {
7704 			if (un->un_mspl->media_type ==
7705 			    un->un_dp->mediatype[ix]) {
7706 				best = ix;
7707 				/*
7708 				 * It matches but it might not be the only one.
7709 				 * Use the highest matching media type but not
7710 				 * to exceed the density selected by the open.
7711 				 */
7712 				if (ix < un->un_curdens) {
7713 					continue;
7714 				}
7715 				un->un_curdens = ix;
7716 				break;
7717 			}
7718 		}
7719 		/* If a match was found best will not be 0xff any more */
7720 		if (best < NDENSITIES) {
7721 			ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
7722 			    "found media 0x%X using density 0x%X\n",
7723 			    un->un_mspl->media_type,
7724 			    un->un_dp->densities[best]);
7725 			un->un_mspl->density = un->un_dp->densities[best];
7726 		} else {
7727 			/* Otherwise set density based on minor node opened */
7728 			un->un_mspl->density =
7729 			    un->un_dp->densities[un->un_curdens];
7730 		}
7731 	} else {
7732 		un->un_mspl->density = un->un_dp->densities[un->un_curdens];
7733 	}
7734 
7735 	if (un->un_dp->options & ST_NOBUF) {
7736 		un->un_mspl->bufm = 0;
7737 	} else {
7738 		un->un_mspl->bufm = 1;
7739 	}
7740 
7741 	rval = st_set_compression(un);
7742 
7743 	/*
7744 	 * If st_set_compression returned invalid or already it
7745 	 * found no need to do the mode select.
7746 	 * So do it here.
7747 	 */
7748 	if ((rval == ENOTTY) || (rval == EALREADY)) {
7749 
7750 		/* Zero non-writeable fields */
7751 		un->un_mspl->data_len = 0;
7752 		un->un_mspl->media_type = 0;
7753 		un->un_mspl->wp = 0;
7754 
7755 		/* need to set the density code */
7756 		rval = st_cmd(un->un_dev, SCMD_MODE_SELECT, MSIZE, SYNC_CMD);
7757 		if (rval != 0) {
7758 			if (un->un_state >= ST_STATE_OPEN) {
7759 				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
7760 				    "unable to set tape mode\n");
7761 				un->un_pos.pmode = invalid;
7762 				rval = EIO;
7763 			} else {
7764 				rval = -1;
7765 			}
7766 		}
7767 	}
7768 
7769 	/*
7770 	 * The spec recommends to send a mode sense after a mode select
7771 	 */
7772 	(void) st_modesense(un);
7773 
7774 	ASSERT(mutex_owned(ST_MUTEX));
7775 
7776 	return (rval);
7777 }
7778 
7779 /*
7780  * st_gen_mode_sense
7781  *
7782  * generic mode sense.. it allows for any page
7783  */
7784 static int
7785 st_gen_mode_sense(struct scsi_tape *un, int page, struct seq_mode *page_data,
7786     int page_size)
7787 {
7788 
7789 	int r;
7790 	char	cdb[CDB_GROUP0];
7791 	struct uscsi_cmd *com;
7792 
7793 	ST_FUNC(ST_DEVINFO, st_gen_mode_sense);
7794 
7795 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7796 
7797 	bzero(cdb, CDB_GROUP0);
7798 	cdb[0] = SCMD_MODE_SENSE;
7799 	cdb[2] = (char)page;
7800 	cdb[4] = (char)page_size;
7801 
7802 	com->uscsi_cdb = cdb;
7803 	com->uscsi_cdblen = CDB_GROUP0;
7804 	com->uscsi_bufaddr = (caddr_t)page_data;
7805 	com->uscsi_buflen = page_size;
7806 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7807 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
7808 
7809 	r = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
7810 	kmem_free(com, sizeof (*com));
7811 	return (r);
7812 }
7813 
7814 /*
7815  * st_gen_mode_select
7816  *
7817  * generic mode select.. it allows for any page
7818  */
7819 static int
7820 st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data,
7821     int page_size)
7822 {
7823 
7824 	int r;
7825 	char cdb[CDB_GROUP0];
7826 	struct uscsi_cmd *com;
7827 
7828 	ST_FUNC(ST_DEVINFO, st_gen_mode_select);
7829 
7830 	/* Zero non-writeable fields */
7831 	page_data->data_len = 0;
7832 	page_data->media_type = 0;
7833 	page_data->wp = 0;
7834 
7835 	/*
7836 	 * If mode select has any page data, zero the ps (Page Savable) bit.
7837 	 */
7838 	if (page_size > MSIZE) {
7839 		page_data->ps = 0;
7840 	}
7841 
7842 
7843 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7844 
7845 	/*
7846 	 * then, do a mode select to set what ever info
7847 	 */
7848 	bzero(cdb, CDB_GROUP0);
7849 	cdb[0] = SCMD_MODE_SELECT;
7850 	cdb[1] = 0x10;		/* set PF bit for many third party drives */
7851 	cdb[4] = (char)page_size;
7852 
7853 	com->uscsi_cdb = cdb;
7854 	com->uscsi_cdblen = CDB_GROUP0;
7855 	com->uscsi_bufaddr = (caddr_t)page_data;
7856 	com->uscsi_buflen = page_size;
7857 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7858 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_WRITE;
7859 
7860 	r = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
7861 
7862 	kmem_free(com, sizeof (*com));
7863 	return (r);
7864 }
7865 
7866 static int
7867 st_read_block_limits(struct scsi_tape *un, struct read_blklim *read_blk)
7868 {
7869 	int rval;
7870 	char cdb[CDB_GROUP0];
7871 	struct uscsi_cmd *com;
7872 
7873 	ST_FUNC(ST_DEVINFO, st_read_block_limits);
7874 
7875 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7876 
7877 	bzero(cdb, CDB_GROUP0);
7878 	cdb[0] = SCMD_READ_BLKLIM;
7879 
7880 	com->uscsi_cdb = cdb;
7881 	com->uscsi_cdblen = CDB_GROUP0;
7882 	com->uscsi_bufaddr = (caddr_t)read_blk;
7883 	com->uscsi_buflen = sizeof (struct read_blklim);
7884 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7885 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
7886 
7887 	rval = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
7888 	if (com->uscsi_status || com->uscsi_resid) {
7889 		rval = -1;
7890 	}
7891 
7892 	kmem_free(com, sizeof (*com));
7893 	return (rval);
7894 }
7895 
7896 static int
7897 st_report_density_support(struct scsi_tape *un, uchar_t *density_data,
7898     size_t buflen)
7899 {
7900 	int rval;
7901 	char cdb[CDB_GROUP1];
7902 	struct uscsi_cmd *com;
7903 
7904 	ST_FUNC(ST_DEVINFO, st_report_density_support);
7905 
7906 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7907 
7908 	bzero(cdb, CDB_GROUP1);
7909 	cdb[0] = SCMD_REPORT_DENSITIES;
7910 	cdb[7] = (buflen & 0xff00) >> 8;
7911 	cdb[8] = buflen & 0xff;
7912 
7913 	com->uscsi_cdb = cdb;
7914 	com->uscsi_cdblen = CDB_GROUP1;
7915 	com->uscsi_bufaddr = (caddr_t)density_data;
7916 	com->uscsi_buflen = buflen;
7917 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7918 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
7919 
7920 	rval = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
7921 	if (com->uscsi_status || com->uscsi_resid) {
7922 		rval = -1;
7923 	}
7924 
7925 	kmem_free(com, sizeof (*com));
7926 	return (rval);
7927 }
7928 
7929 static int
7930 st_report_supported_operation(struct scsi_tape *un, uchar_t *oper_data,
7931     uchar_t option_code, ushort_t service_action)
7932 {
7933 	int rval;
7934 	char cdb[CDB_GROUP5];
7935 	struct uscsi_cmd *com;
7936 	uint32_t allo_length;
7937 
7938 	ST_FUNC(ST_DEVINFO, st_report_supported_operation);
7939 
7940 	allo_length = sizeof (struct one_com_des) +
7941 	    sizeof (struct com_timeout_des);
7942 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7943 
7944 	bzero(cdb, CDB_GROUP5);
7945 	cdb[0] = (char)SCMD_REPORT_TARGET_PORT_GROUPS;
7946 	cdb[1] = 0x0c; /* service action */
7947 	if (service_action) {
7948 		cdb[2] = (char)(ONE_COMMAND_DATA_FORMAT | 0x80); /* RCTD */
7949 		cdb[4] = (service_action & 0xff00) >> 8;
7950 		cdb[5] = service_action & 0xff;
7951 	} else {
7952 		cdb[2] = (char)(ONE_COMMAND_NO_SERVICE_DATA_FORMAT |
7953 		    0x80); /* RCTD */
7954 	}
7955 	cdb[3] = option_code;
7956 	cdb[6] = (allo_length & 0xff000000) >> 24;
7957 	cdb[7] = (allo_length & 0xff0000) >> 16;
7958 	cdb[8] = (allo_length & 0xff00) >> 8;
7959 	cdb[9] = allo_length & 0xff;
7960 
7961 	com->uscsi_cdb = cdb;
7962 	com->uscsi_cdblen = CDB_GROUP5;
7963 	com->uscsi_bufaddr = (caddr_t)oper_data;
7964 	com->uscsi_buflen = allo_length;
7965 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7966 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
7967 
7968 	rval = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
7969 	if (com->uscsi_status) {
7970 		rval = -1;
7971 	}
7972 
7973 	kmem_free(com, sizeof (*com));
7974 	return (rval);
7975 }
7976 
7977 /*
7978  * Changes devices blocksize and bsize to requested blocksize nblksz.
7979  * Returns returned value from first failed call or zero on success.
7980  */
7981 static int
7982 st_change_block_size(dev_t dev, uint32_t nblksz)
7983 {
7984 	struct seq_mode *current;
7985 	int rval;
7986 	uint32_t oldblksz;
7987 
7988 	GET_SOFT_STATE(dev);
7989 
7990 	ST_FUNC(ST_DEVINFO, st_change_block_size);
7991 
7992 	current = kmem_zalloc(MSIZE, KM_SLEEP);
7993 
7994 	/* Read current settings */
7995 	rval = st_gen_mode_sense(un, 0, current, MSIZE);
7996 	if (rval != 0) {
7997 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
7998 		    "mode sense for change block size failed: rval = %d", rval);
7999 		goto finish;
8000 	}
8001 
8002 	/* Figure the current block size */
8003 	oldblksz =
8004 	    (current->high_bl << 16) |
8005 	    (current->mid_bl << 8) |
8006 	    (current->low_bl);
8007 
8008 	/* If current block size is the same as requested were done */
8009 	if (oldblksz == nblksz) {
8010 		un->un_bsize = nblksz;
8011 		rval = 0;
8012 		goto finish;
8013 	}
8014 
8015 	/* Change to requested block size */
8016 	current->high_bl = (uchar_t)(nblksz >> 16);
8017 	current->mid_bl  = (uchar_t)(nblksz >> 8);
8018 	current->low_bl  = (uchar_t)(nblksz);
8019 
8020 	/* Attempt to change block size */
8021 	rval = st_gen_mode_select(un, current, MSIZE);
8022 	if (rval != 0) {
8023 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
8024 		    "Set new block size failed: rval = %d", rval);
8025 		goto finish;
8026 	}
8027 
8028 	/* Read back and verify setting */
8029 	rval = st_modesense(un);
8030 	if (rval == 0) {
8031 		un->un_bsize =
8032 		    (un->un_mspl->high_bl << 16) |
8033 		    (un->un_mspl->mid_bl << 8) |
8034 		    (un->un_mspl->low_bl);
8035 
8036 		if (un->un_bsize != nblksz) {
8037 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
8038 			    "Blocksize set does not equal requested blocksize"
8039 			    "(read: %u requested: %u)\n", nblksz, un->un_bsize);
8040 			rval = EIO;
8041 		}
8042 	}
8043 finish:
8044 	kmem_free(current, MSIZE);
8045 	return (rval);
8046 }
8047 
8048 
8049 static void
8050 st_init(struct scsi_tape *un)
8051 {
8052 	ST_FUNC(ST_DEVINFO, st_init);
8053 
8054 	ASSERT(mutex_owned(ST_MUTEX));
8055 
8056 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8057 	    "st_init(): dev = 0x%lx, will reset fileno, blkno, eof\n",
8058 	    un->un_dev);
8059 
8060 	un->un_pos.blkno = 0;
8061 	un->un_pos.fileno = 0;
8062 	un->un_lastop = ST_OP_NIL;
8063 	un->un_pos.eof = ST_NO_EOF;
8064 	un->un_pwr_mgmt = ST_PWR_NORMAL;
8065 	if (st_error_level != SCSI_ERR_ALL) {
8066 		if (DEBUGGING) {
8067 			st_error_level = SCSI_ERR_ALL;
8068 		} else {
8069 			st_error_level = SCSI_ERR_RETRYABLE;
8070 		}
8071 	}
8072 }
8073 
8074 
8075 static void
8076 st_make_cmd(struct scsi_tape *un, struct buf *bp, int (*func)(caddr_t))
8077 {
8078 	struct scsi_pkt *pkt;
8079 	struct uscsi_cmd *ucmd;
8080 	int count, tval = 0;
8081 	uint_t addr = 0;
8082 	int flags = 0;
8083 	int cdb_len = CDB_GROUP0; /* default */
8084 	uchar_t com;
8085 	char fixbit;
8086 
8087 	ST_FUNC(ST_DEVINFO, st_make_cmd);
8088 
8089 	ASSERT(mutex_owned(ST_MUTEX));
8090 
8091 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8092 	    "st_make_cmd(): dev = 0x%lx\n", un->un_dev);
8093 
8094 
8095 	/*
8096 	 * fixbit is for setting the Fixed Mode and Suppress Incorrect
8097 	 * Length Indicator bits on read/write commands, for setting
8098 	 * the Long bit on erase commands, and for setting the Code
8099 	 * Field bits on space commands.
8100 	 * XXX why do we set lastop here?
8101 	 */
8102 
8103 	if (bp != un->un_sbufp) {		/* regular raw I/O */
8104 		int stat_size = (un->un_arq_enabled ?
8105 		    sizeof (struct scsi_arq_status) : 1);
8106 		pkt = scsi_init_pkt(ROUTE, NULL, bp,
8107 		    CDB_GROUP0, stat_size, 0, 0, func, (caddr_t)un);
8108 		if (pkt == NULL) {
8109 			goto exit;
8110 		}
8111 		SET_BP_PKT(bp, pkt);
8112 		if (un->un_bsize == 0) {
8113 			count = bp->b_bcount;
8114 			fixbit = 0;
8115 		} else {
8116 			count = bp->b_bcount / un->un_bsize;
8117 			fixbit = 1;
8118 		}
8119 		if (bp->b_flags & B_READ) {
8120 			com = SCMD_READ;
8121 			un->un_lastop = ST_OP_READ;
8122 			if ((un->un_bsize == 0) && /* Not Fixed Block */
8123 			    (un->un_dp->options & ST_READ_IGNORE_ILI)) {
8124 				fixbit = 2;
8125 			}
8126 		} else {
8127 			com = SCMD_WRITE;
8128 			un->un_lastop = ST_OP_WRITE;
8129 		}
8130 
8131 		tval = un->un_dp->io_timeout;
8132 
8133 		/*
8134 		 * For really large xfers, increase timeout
8135 		 */
8136 		if (bp->b_bcount > (10 * ONE_MEG))
8137 			tval *= bp->b_bcount/(10 * ONE_MEG);
8138 
8139 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8140 		    "%s %d amt 0x%lx\n", (com == SCMD_WRITE) ?
8141 		    wr_str: rd_str, un->un_pos.blkno, bp->b_bcount);
8142 
8143 	} else if ((ucmd = BP_UCMD(bp)) != NULL) {
8144 		/*
8145 		 * uscsi - build command, allocate scsi resources
8146 		 */
8147 		st_make_uscsi_cmd(un, ucmd, bp, func);
8148 		goto exit;
8149 
8150 	} else {				/* special I/O */
8151 		int stat_size = (un->un_arq_enabled ?
8152 		    sizeof (struct scsi_arq_status) : 1);
8153 		struct buf *allocbp = NULL;
8154 		com = (uchar_t)(uintptr_t)bp->b_forw;
8155 		count = bp->b_bcount;
8156 
8157 		switch (com) {
8158 		case SCMD_READ:
8159 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8160 			    "special read %d\n", count);
8161 			if (un->un_bsize == 0) {
8162 				fixbit = 2;	/* suppress SILI */
8163 			} else {
8164 				fixbit = 1;	/* Fixed Block Mode */
8165 				count /= un->un_bsize;
8166 			}
8167 			allocbp = bp;
8168 			un->un_lastop = ST_OP_READ;
8169 			tval = un->un_dp->io_timeout;
8170 			break;
8171 
8172 		case SCMD_WRITE:
8173 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8174 			    "special write %d\n", count);
8175 			if (un->un_bsize != 0) {
8176 				fixbit = 1;	/* Fixed Block Mode */
8177 				count /= un->un_bsize;
8178 			} else {
8179 				fixbit = 0;
8180 			}
8181 			allocbp = bp;
8182 			un->un_lastop = ST_OP_WRITE;
8183 			tval = un->un_dp->io_timeout;
8184 			break;
8185 
8186 		case SCMD_WRITE_FILE_MARK:
8187 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8188 			    "write %d file marks\n", count);
8189 			un->un_lastop = ST_OP_WEOF;
8190 			fixbit = 0;
8191 			tval = un->un_dp->io_timeout;
8192 			break;
8193 
8194 		case SCMD_REWIND:
8195 			if (bp->b_flags & B_ASYNC) {
8196 				fixbit = 1;
8197 			} else {
8198 				fixbit = 0;
8199 			}
8200 			count = 0;
8201 			un->un_lastop = ST_OP_CTL;
8202 			tval = un->un_dp->rewind_timeout;
8203 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8204 			    "rewind\n");
8205 			break;
8206 
8207 		case SCMD_SPACE:
8208 			fixbit = SPACE_TYPE(count);
8209 			count = (int)SPACE_CNT(count);
8210 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8211 			    "space %s %d from file %d blk %d\n",
8212 			    space_strs[fixbit & 7], count,
8213 			    un->un_pos.fileno, un->un_pos.blkno);
8214 			un->un_lastop = ST_OP_CTL;
8215 			tval = un->un_dp->space_timeout;
8216 			break;
8217 
8218 		case SCMD_LOAD:
8219 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8220 			    "%s tape\n", (count & LD_LOAD) ? "load" : "unload");
8221 			fixbit = 0;
8222 
8223 			/* Loading or Unloading */
8224 			if (count & LD_LOAD) {
8225 				tval = un->un_dp->load_timeout;
8226 			} else {
8227 				tval = un->un_dp->unload_timeout;
8228 			}
8229 			/* Is Retension requested */
8230 			if (count & LD_RETEN) {
8231 				tval += un->un_dp->rewind_timeout;
8232 			}
8233 			un->un_lastop = ST_OP_CTL;
8234 			break;
8235 
8236 		case SCMD_ERASE:
8237 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8238 			    "erase tape\n");
8239 			count = 0;
8240 			/*
8241 			 * We support long erase only
8242 			 */
8243 			fixbit = 1;
8244 			tval = un->un_dp->erase_timeout;
8245 			un->un_lastop = ST_OP_CTL;
8246 			break;
8247 
8248 		case SCMD_MODE_SENSE:
8249 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8250 			    "mode sense\n");
8251 			allocbp = bp;
8252 			fixbit = 0;
8253 			tval = un->un_dp->non_motion_timeout;
8254 			un->un_lastop = ST_OP_CTL;
8255 			break;
8256 
8257 		case SCMD_MODE_SELECT:
8258 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8259 			    "mode select\n");
8260 			allocbp = bp;
8261 			fixbit = 0;
8262 			tval = un->un_dp->non_motion_timeout;
8263 			un->un_lastop = ST_OP_CTL;
8264 			break;
8265 
8266 		case SCMD_RESERVE:
8267 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8268 			    "reserve\n");
8269 			fixbit = 0;
8270 			tval = un->un_dp->non_motion_timeout;
8271 			un->un_lastop = ST_OP_CTL;
8272 			break;
8273 
8274 		case SCMD_RELEASE:
8275 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8276 			    "release\n");
8277 			fixbit = 0;
8278 			tval = un->un_dp->non_motion_timeout;
8279 			un->un_lastop = ST_OP_CTL;
8280 			break;
8281 
8282 		case SCMD_READ_BLKLIM:
8283 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8284 			    "read block limits\n");
8285 			allocbp = bp;
8286 			fixbit = count = 0;
8287 			tval = un->un_dp->non_motion_timeout;
8288 			un->un_lastop = ST_OP_CTL;
8289 			break;
8290 
8291 		case SCMD_TEST_UNIT_READY:
8292 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8293 			    "test unit ready\n");
8294 			fixbit = 0;
8295 			tval = un->un_dp->non_motion_timeout;
8296 			un->un_lastop = ST_OP_CTL;
8297 			break;
8298 
8299 		case SCMD_DOORLOCK:
8300 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8301 			    "prevent/allow media removal\n");
8302 			fixbit = 0;
8303 			tval = un->un_dp->non_motion_timeout;
8304 			un->un_lastop = ST_OP_CTL;
8305 			break;
8306 
8307 		case SCMD_READ_POSITION:
8308 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8309 			    "read position\n");
8310 			fixbit = un->un_read_pos_type;
8311 			cdb_len = CDB_GROUP1;
8312 			tval = un->un_dp->non_motion_timeout;
8313 			allocbp = bp;
8314 			un->un_lastop = ST_OP_CTL;
8315 			switch (un->un_read_pos_type) {
8316 			case LONG_POS:
8317 				count = 0;
8318 				break;
8319 			case EXT_POS:
8320 				count = sizeof (tape_position_ext_t);
8321 				break;
8322 			case SHORT_POS:
8323 				count = 0;
8324 				break;
8325 			default:
8326 				ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
8327 				    "Unknown read position type 0x%x in "
8328 				    " st_make_cmd()\n", un->un_read_pos_type);
8329 			}
8330 			break;
8331 
8332 		default:
8333 			ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
8334 			    "Unhandled scsi command 0x%x in st_make_cmd()\n",
8335 			    com);
8336 		}
8337 		pkt = scsi_init_pkt(ROUTE, NULL, allocbp, cdb_len, stat_size,
8338 		    0, 0, func, (caddr_t)un);
8339 		if (pkt == NULL) {
8340 			goto exit;
8341 		}
8342 		if (allocbp) {
8343 			ASSERT(geterror(allocbp) == 0);
8344 		}
8345 
8346 	}
8347 
8348 
8349 	(void) scsi_setup_cdb((union scsi_cdb *)pkt->pkt_cdbp,
8350 	    com, addr, (uint_t)count, 0);
8351 	FILL_SCSI1_LUN(un->un_sd, pkt);
8352 	/*
8353 	 * Initialize the SILI/Fixed bits of the byte 1 of cdb.
8354 	 */
8355 	((union scsi_cdb *)(pkt->pkt_cdbp))->t_code = fixbit;
8356 	pkt->pkt_flags = flags;
8357 
8358 #ifdef STDEBUG
8359 	if ((st_debug & 0xf) >= 6) {
8360 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
8361 		    "cmd cdb", (char *)pkt->pkt_cdbp, cdb_len);
8362 	}
8363 #endif
8364 
8365 	/*
8366 	 * If ST_SHORT_FILEMARKS bit is ON for EXABYTE
8367 	 * device, set the Vendor Unique bit to
8368 	 * write Short File Mark.
8369 	 */
8370 	if (com == SCMD_WRITE_FILE_MARK &&
8371 	    un->un_dp->options & ST_SHORT_FILEMARKS) {
8372 		switch (un->un_dp->type) {
8373 		case ST_TYPE_EXB8500:
8374 		case ST_TYPE_EXABYTE:
8375 			/*
8376 			 * Now the Vendor Unique bit 7 in Byte 5 of CDB
8377 			 * is set to to write Short File Mark
8378 			 */
8379 			((union scsi_cdb *)pkt->pkt_cdbp)->g0_vu_1 = 1;
8380 			break;
8381 
8382 		default:
8383 			/*
8384 			 * Well, if ST_SHORT_FILEMARKS is set for other
8385 			 * tape drives, it is just ignored
8386 			 */
8387 			break;
8388 		}
8389 	}
8390 	ASSERT(tval);
8391 	pkt->pkt_time = tval;
8392 	pkt->pkt_comp = st_intr;
8393 	pkt->pkt_private = (opaque_t)bp;
8394 
8395 	SET_BP_PKT(bp, pkt);
8396 
8397 exit:
8398 	ASSERT(mutex_owned(ST_MUTEX));
8399 }
8400 
8401 
8402 /*
8403  * Build a command based on a uscsi command;
8404  */
8405 static void
8406 st_make_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd,
8407     struct buf *bp, int (*func)(caddr_t))
8408 {
8409 	struct scsi_pkt *pkt;
8410 	caddr_t cdb;
8411 	int	cdblen;
8412 	int stat_size;
8413 
8414 	ST_FUNC(ST_DEVINFO, st_make_uscsi_cmd);
8415 
8416 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8417 	    "st_make_uscsi_cmd(): dev = 0x%lx\n", un->un_dev);
8418 
8419 	if (ucmd->uscsi_flags & USCSI_RQENABLE) {
8420 		stat_size = (un->un_arq_enabled ?
8421 		    sizeof (struct scsi_arq_status) : 1);
8422 	} else {
8423 		stat_size = 1;
8424 	}
8425 
8426 	ASSERT(mutex_owned(ST_MUTEX));
8427 
8428 	cdb = ucmd->uscsi_cdb;
8429 	cdblen = ucmd->uscsi_cdblen;
8430 
8431 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8432 	    "st_make_uscsi_cmd: buflen=%ld bcount=%ld\n",
8433 	    ucmd->uscsi_buflen, bp->b_bcount);
8434 	pkt = scsi_init_pkt(ROUTE, NULL,
8435 	    (bp->b_bcount > 0) ? bp : NULL,
8436 	    cdblen, stat_size, 0, 0, func, (caddr_t)un);
8437 	if (pkt == NULL) {
8438 		goto exit;
8439 	}
8440 
8441 	bcopy(cdb, pkt->pkt_cdbp, (uint_t)cdblen);
8442 
8443 #ifdef STDEBUG
8444 	if ((st_debug & 0xf) >= 6) {
8445 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
8446 		    "pkt_cdbp", (char *)cdb, cdblen);
8447 	}
8448 #endif
8449 
8450 	if (ucmd->uscsi_flags & USCSI_SILENT) {
8451 		pkt->pkt_flags |= FLAG_SILENT;
8452 	}
8453 
8454 	pkt->pkt_time = ucmd->uscsi_timeout;
8455 	pkt->pkt_comp = st_intr;
8456 	pkt->pkt_private = (opaque_t)bp;
8457 
8458 	SET_BP_PKT(bp, pkt);
8459 exit:
8460 	ASSERT(mutex_owned(ST_MUTEX));
8461 }
8462 
8463 
8464 /*
8465  * restart cmd currently at the head of the runq
8466  *
8467  * If scsi_transport() succeeds or the retries
8468  * count exhausted, restore the throttle that was
8469  * zeroed out in st_handle_intr_busy().
8470  *
8471  */
8472 static void
8473 st_intr_restart(void *arg)
8474 {
8475 	struct scsi_tape *un = arg;
8476 	struct buf *bp;
8477 	int status = TRAN_ACCEPT;
8478 
8479 	mutex_enter(ST_MUTEX);
8480 
8481 	ST_FUNC(ST_DEVINFO, st_intr_restart);
8482 
8483 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8484 	    "st_intr_restart(), un = 0x%p\n", (void *)un);
8485 
8486 	un->un_hib_tid = 0;
8487 
8488 	/*
8489 	 * move from waitq to runq, if there is anything on the waitq
8490 	 */
8491 	if ((bp = un->un_quef) == NULL) {
8492 		mutex_exit(ST_MUTEX);
8493 		return;
8494 	}
8495 
8496 	/*
8497 	 * Here we know :
8498 	 *	throttle = 0, via st_handle_intr_busy
8499 	 */
8500 
8501 	if (un->un_quel == bp) {
8502 		un->un_quel = NULL;
8503 		un->un_quef = NULL;	/* we know it's the first one */
8504 	} else {
8505 		un->un_quef = bp->b_actf;
8506 	}
8507 	bp->b_actf = NULL;
8508 
8509 	if (un->un_runqf) {
8510 		/*
8511 		 * not good, we don't want to requeue something after
8512 		 * another.
8513 		 */
8514 		mutex_exit(ST_MUTEX);
8515 		goto done_error;
8516 	} else {
8517 		un->un_runqf = bp;
8518 		un->un_runql = bp;
8519 	}
8520 
8521 	ST_DO_KSTATS(bp, kstat_waitq_to_runq);
8522 
8523 	mutex_exit(ST_MUTEX);
8524 
8525 	status = scsi_transport(BP_PKT(bp));
8526 
8527 	mutex_enter(ST_MUTEX);
8528 
8529 	if (status != TRAN_ACCEPT) {
8530 		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
8531 		mutex_exit(ST_MUTEX);
8532 
8533 		if (status == TRAN_BUSY) {
8534 			if (st_handle_intr_busy(un, bp,
8535 			    ST_TRAN_BUSY_TIMEOUT) == 0)
8536 				return;	/* timeout is setup again */
8537 		}
8538 
8539 	} else {
8540 		un->un_tran_retry_ct = 0;
8541 		if (un->un_last_throttle) {
8542 			un->un_throttle = un->un_last_throttle;
8543 		}
8544 		mutex_exit(ST_MUTEX);
8545 		return;
8546 	}
8547 
8548 done_error:
8549 	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
8550 	    "restart transport rejected\n");
8551 	bp->b_resid = bp->b_bcount;
8552 
8553 #ifndef __lock_lint
8554 	/*
8555 	 * warlock doesn't understand this potential
8556 	 * recursion?
8557 	 */
8558 	mutex_enter(ST_MUTEX);
8559 	if (un->un_last_throttle) {
8560 		un->un_throttle = un->un_last_throttle;
8561 	}
8562 	if (status != TRAN_ACCEPT)
8563 		ST_DO_ERRSTATS(un, st_transerrs);
8564 	ST_DO_KSTATS(bp, kstat_waitq_exit);
8565 	SET_PE_FLAG(un);
8566 	st_bioerror(bp, EIO);
8567 	st_done_and_mutex_exit(un, bp);
8568 #endif
8569 	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
8570 	    "busy restart aborted\n");
8571 }
8572 
8573 /*
8574  * st_check_media():
8575  * Periodically check the media state using scsi_watch service;
8576  * this service calls back after TUR and possibly request sense
8577  * the callback handler (st_media_watch_cb()) decodes the request sense
8578  * data (if any)
8579  */
8580 
8581 static int
8582 st_check_media(dev_t dev, enum mtio_state state)
8583 {
8584 	int rval = 0;
8585 	enum mtio_state	prev_state;
8586 	opaque_t token = NULL;
8587 
8588 	GET_SOFT_STATE(dev);
8589 
8590 	ST_FUNC(ST_DEVINFO, st_check_media);
8591 
8592 	mutex_enter(ST_MUTEX);
8593 
8594 	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8595 	    "st_check_media:state=%x, mediastate=%x\n",
8596 	    state, un->un_mediastate);
8597 
8598 	prev_state = un->un_mediastate;
8599 
8600 	/*
8601 	 * is there anything to do?
8602 	 */
8603 retry:
8604 	if (state == un->un_mediastate || un->un_mediastate == MTIO_NONE) {
8605 		/*
8606 		 * submit the request to the scsi_watch service;
8607 		 * scsi_media_watch_cb() does the real work
8608 		 */
8609 		mutex_exit(ST_MUTEX);
8610 		token = scsi_watch_request_submit(ST_SCSI_DEVP,
8611 		    st_check_media_time, SENSE_LENGTH,
8612 		    st_media_watch_cb, (caddr_t)dev);
8613 		if (token == NULL) {
8614 			rval = EAGAIN;
8615 			goto done;
8616 		}
8617 		mutex_enter(ST_MUTEX);
8618 
8619 		un->un_swr_token = token;
8620 		un->un_specified_mediastate = state;
8621 
8622 		/*
8623 		 * now wait for media change
8624 		 * we will not be signalled unless mediastate == state but it
8625 		 * still better to test for this condition, since there
8626 		 * is a 5 sec cv_broadcast delay when
8627 		 *  mediastate == MTIO_INSERTED
8628 		 */
8629 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8630 		    "st_check_media:waiting for media state change\n");
8631 		while (un->un_mediastate == state) {
8632 			if (cv_wait_sig(&un->un_state_cv, ST_MUTEX) == 0) {
8633 				mutex_exit(ST_MUTEX);
8634 				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8635 				    "st_check_media:waiting for media state "
8636 				    "was interrupted\n");
8637 				rval = EINTR;
8638 				goto done;
8639 			}
8640 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8641 			    "st_check_media:received signal, state=%x\n",
8642 			    un->un_mediastate);
8643 		}
8644 	}
8645 
8646 	/*
8647 	 * if we transitioned to MTIO_INSERTED, media has really been
8648 	 * inserted.  If TUR fails, it is probably a exabyte slow spin up.
8649 	 * Reset and retry the state change.  If everything is ok, replay
8650 	 * the open() logic.
8651 	 */
8652 	if ((un->un_mediastate == MTIO_INSERTED) &&
8653 	    (un->un_state == ST_STATE_OFFLINE)) {
8654 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8655 		    "st_check_media: calling st_cmd to confirm inserted\n");
8656 
8657 		/*
8658 		 * set this early so that TUR will make it through strategy
8659 		 * without triggering a st_tape_init().  We needed it set
8660 		 * before calling st_tape_init() ourselves anyway.  If TUR
8661 		 * fails, set it back
8662 		 */
8663 		un->un_state = ST_STATE_INITIALIZING;
8664 
8665 		/*
8666 		 * If not reserved fail as getting reservation conflict
8667 		 * will make this hang forever.
8668 		 */
8669 		if ((un->un_rsvd_status &
8670 		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
8671 			mutex_exit(ST_MUTEX);
8672 			rval = EACCES;
8673 			goto done;
8674 		}
8675 		rval = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
8676 		if (rval == EACCES) {
8677 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8678 			    "st_check_media: TUR got Reservation Conflict\n");
8679 			mutex_exit(ST_MUTEX);
8680 			goto done;
8681 		}
8682 		if (rval) {
8683 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8684 			    "st_check_media: TUR failed, going to retry\n");
8685 			un->un_mediastate = prev_state;
8686 			un->un_state = ST_STATE_OFFLINE;
8687 			goto retry;
8688 		}
8689 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8690 		    "st_check_media: media inserted\n");
8691 
8692 		/* this also rewinds the tape */
8693 		rval = st_tape_init(dev);
8694 		if (rval != 0) {
8695 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8696 			    "st_check_media : OFFLINE init failure ");
8697 			un->un_state = ST_STATE_OFFLINE;
8698 			un->un_pos.pmode = invalid;
8699 		} else {
8700 			un->un_state = ST_STATE_OPEN_PENDING_IO;
8701 			un->un_pos.fileno = 0;
8702 			un->un_pos.blkno = 0;
8703 			un->un_pos.lgclblkno = 0;
8704 		}
8705 	} else if ((un->un_mediastate == MTIO_EJECTED) &&
8706 	    (un->un_state != ST_STATE_OFFLINE)) {
8707 		/*
8708 		 * supported devices must be rewound before ejection
8709 		 * rewind resets fileno & blkno
8710 		 */
8711 		un->un_laststate = un->un_state;
8712 		un->un_state = ST_STATE_OFFLINE;
8713 	}
8714 	mutex_exit(ST_MUTEX);
8715 done:
8716 	if (token) {
8717 		(void) scsi_watch_request_terminate(token,
8718 		    SCSI_WATCH_TERMINATE_WAIT);
8719 		mutex_enter(ST_MUTEX);
8720 		un->un_swr_token = (opaque_t)NULL;
8721 		mutex_exit(ST_MUTEX);
8722 	}
8723 
8724 	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_media: done\n");
8725 
8726 	return (rval);
8727 }
8728 
8729 /*
8730  * st_media_watch_cb() is called by scsi_watch_thread for
8731  * verifying the request sense data (if any)
8732  */
8733 static int
8734 st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
8735 {
8736 	struct scsi_status *statusp = resultp->statusp;
8737 	struct scsi_extended_sense *sensep = resultp->sensep;
8738 	uchar_t actual_sense_length = resultp->actual_sense_length;
8739 	struct scsi_tape *un;
8740 	enum mtio_state state = MTIO_NONE;
8741 	int instance;
8742 	dev_t dev = (dev_t)arg;
8743 
8744 	instance = MTUNIT(dev);
8745 	if ((un = ddi_get_soft_state(st_state, instance)) == NULL) {
8746 		return (-1);
8747 	}
8748 
8749 	mutex_enter(ST_MUTEX);
8750 	ST_FUNC(ST_DEVINFO, st_media_watch_cb);
8751 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8752 	    "st_media_watch_cb: status=%x, sensep=%p, len=%x\n",
8753 	    *((char *)statusp), (void *)sensep,
8754 	    actual_sense_length);
8755 
8756 
8757 	/*
8758 	 * if there was a check condition then sensep points to valid
8759 	 * sense data
8760 	 * if status was not a check condition but a reservation or busy
8761 	 * status then the new state is MTIO_NONE
8762 	 */
8763 	if (sensep) {
8764 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8765 		    "st_media_watch_cb: KEY=%x, ASC=%x, ASCQ=%x\n",
8766 		    sensep->es_key, sensep->es_add_code, sensep->es_qual_code);
8767 
8768 		switch (un->un_dp->type) {
8769 		default:
8770 			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8771 			    "st_media_watch_cb: unknown drive type %d, "
8772 			    "default to ST_TYPE_HP\n", un->un_dp->type);
8773 		/* FALLTHROUGH */
8774 
8775 		case ST_TYPE_STC3490:	/* STK 4220 1/2" cartridge */
8776 		case ST_TYPE_FUJI:	/* 1/2" cartridge */
8777 		case ST_TYPE_HP:	/* HP 88780 1/2" reel */
8778 			if (un->un_dp->type == ST_TYPE_FUJI) {
8779 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8780 				    "st_media_watch_cb: ST_TYPE_FUJI\n");
8781 			} else {
8782 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8783 				    "st_media_watch_cb: ST_TYPE_HP\n");
8784 			}
8785 			switch (sensep->es_key) {
8786 			case KEY_UNIT_ATTENTION:
8787 				/* not ready to ready transition */
8788 				/* hp/es_qual_code == 80 on>off>on */
8789 				/* hp/es_qual_code == 0 on>off>unld>ld>on */
8790 				if (sensep->es_add_code == 0x28) {
8791 					state = MTIO_INSERTED;
8792 				}
8793 				break;
8794 			case KEY_NOT_READY:
8795 				/* in process, rewinding or loading */
8796 				if ((sensep->es_add_code == 0x04) &&
8797 				    (sensep->es_qual_code == 0x00)) {
8798 					state = MTIO_EJECTED;
8799 				}
8800 				break;
8801 			}
8802 			break;
8803 
8804 		case ST_TYPE_EXB8500:	/* Exabyte 8500 */
8805 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8806 			    "st_media_watch_cb: ST_TYPE_EXB8500\n");
8807 			switch (sensep->es_key) {
8808 			case KEY_UNIT_ATTENTION:
8809 				/* operator medium removal request */
8810 				if ((sensep->es_add_code == 0x5a) &&
8811 				    (sensep->es_qual_code == 0x01)) {
8812 					state = MTIO_EJECTED;
8813 				/* not ready to ready transition */
8814 				} else if ((sensep->es_add_code == 0x28) &&
8815 				    (sensep->es_qual_code == 0x00)) {
8816 					state = MTIO_INSERTED;
8817 				}
8818 				break;
8819 			case KEY_NOT_READY:
8820 				/* medium not present */
8821 				if (sensep->es_add_code == 0x3a) {
8822 					state = MTIO_EJECTED;
8823 				}
8824 				break;
8825 			}
8826 			break;
8827 		case ST_TYPE_EXABYTE:	/* Exabyte 8200 */
8828 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8829 			    "st_media_watch_cb: ST_TYPE_EXABYTE\n");
8830 			switch (sensep->es_key) {
8831 			case KEY_NOT_READY:
8832 				if ((sensep->es_add_code == 0x04) &&
8833 				    (sensep->es_qual_code == 0x00)) {
8834 					/* volume not mounted? */
8835 					state = MTIO_EJECTED;
8836 				} else if (sensep->es_add_code == 0x3a) {
8837 					state = MTIO_EJECTED;
8838 				}
8839 				break;
8840 			case KEY_UNIT_ATTENTION:
8841 				state = MTIO_EJECTED;
8842 				break;
8843 			}
8844 			break;
8845 
8846 		case ST_TYPE_DLT:		/* quantum DLT4xxx */
8847 			switch (sensep->es_key) {
8848 			case KEY_UNIT_ATTENTION:
8849 				if (sensep->es_add_code == 0x28) {
8850 					state = MTIO_INSERTED;
8851 				}
8852 				break;
8853 			case KEY_NOT_READY:
8854 				if (sensep->es_add_code == 0x04) {
8855 					/* in transition but could be either */
8856 					state = un->un_specified_mediastate;
8857 				} else if ((sensep->es_add_code == 0x3a) &&
8858 				    (sensep->es_qual_code == 0x00)) {
8859 					state = MTIO_EJECTED;
8860 				}
8861 				break;
8862 			}
8863 			break;
8864 		}
8865 	} else if (*((char *)statusp) == STATUS_GOOD) {
8866 		state = MTIO_INSERTED;
8867 	}
8868 
8869 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8870 	    "st_media_watch_cb:state=%x, specified=%x\n",
8871 	    state, un->un_specified_mediastate);
8872 
8873 	/*
8874 	 * now signal the waiting thread if this is *not* the specified state;
8875 	 * delay the signal if the state is MTIO_INSERTED
8876 	 * to allow the target to recover
8877 	 */
8878 	if (state != un->un_specified_mediastate) {
8879 		un->un_mediastate = state;
8880 		if (state == MTIO_INSERTED) {
8881 			/*
8882 			 * delay the signal to give the drive a chance
8883 			 * to do what it apparently needs to do
8884 			 */
8885 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8886 			    "st_media_watch_cb:delayed cv_broadcast\n");
8887 			un->un_delay_tid = timeout(st_delayed_cv_broadcast,
8888 			    un, drv_usectohz((clock_t)MEDIA_ACCESS_DELAY));
8889 		} else {
8890 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8891 			    "st_media_watch_cb:immediate cv_broadcast\n");
8892 			cv_broadcast(&un->un_state_cv);
8893 		}
8894 	}
8895 	mutex_exit(ST_MUTEX);
8896 	return (0);
8897 }
8898 
8899 /*
8900  * delayed cv_broadcast to allow for target to recover
8901  * from media insertion
8902  */
8903 static void
8904 st_delayed_cv_broadcast(void *arg)
8905 {
8906 	struct scsi_tape *un = arg;
8907 
8908 	ST_FUNC(ST_DEVINFO, st_delayed_cv_broadcast);
8909 
8910 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8911 	    "st_delayed_cv_broadcast:delayed cv_broadcast\n");
8912 
8913 	mutex_enter(ST_MUTEX);
8914 	cv_broadcast(&un->un_state_cv);
8915 	mutex_exit(ST_MUTEX);
8916 }
8917 
8918 /*
8919  * restart cmd currently at the start of the waitq
8920  */
8921 static void
8922 st_start_restart(void *arg)
8923 {
8924 	struct scsi_tape *un = arg;
8925 
8926 	ST_FUNC(ST_DEVINFO, st_start_restart);
8927 
8928 	ASSERT(un != NULL);
8929 
8930 	mutex_enter(ST_MUTEX);
8931 
8932 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8933 	    "st_tran_restart()\n");
8934 
8935 	if (un->un_quef) {
8936 		st_start(un);
8937 	}
8938 
8939 	mutex_exit(ST_MUTEX);
8940 }
8941 
8942 
8943 /*
8944  * Command completion processing
8945  *
8946  */
8947 static void
8948 st_intr(struct scsi_pkt *pkt)
8949 {
8950 	struct scsi_tape *un;
8951 	struct buf *last_runqf;
8952 	struct buf *bp;
8953 	int action = COMMAND_DONE;
8954 	clock_t	timout;
8955 	int	status;
8956 
8957 
8958 	bp = pkt->pkt_private;
8959 
8960 	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
8961 
8962 	ST_FUNC(ST_DEVINFO, st_intr);
8963 
8964 	mutex_enter(ST_MUTEX);
8965 
8966 	un->un_rqs_state &= ~(ST_RQS_ERROR);
8967 
8968 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_intr()\n");
8969 
8970 	if (pkt->pkt_reason != CMD_CMPLT) {
8971 
8972 		/* If device has gone away not much else to do */
8973 		if (pkt->pkt_reason == CMD_DEV_GONE) {
8974 			action = COMMAND_DONE_ERROR;
8975 		} else if (un->un_state == ST_STATE_SENSING) {
8976 			ST_DO_ERRSTATS(un, st_transerrs);
8977 			action = COMMAND_DONE_ERROR;
8978 		} else {
8979 			action = st_handle_incomplete(un, bp);
8980 		}
8981 	/*
8982 	 * At this point we know that the command was successfully
8983 	 * completed. Now what?
8984 	 */
8985 	} else if (un->un_arq_enabled &&
8986 	    (pkt->pkt_state & STATE_ARQ_DONE)) {
8987 		/*
8988 		 * the transport layer successfully completed an autorqsense
8989 		 */
8990 		action = st_handle_autosense(un, bp);
8991 
8992 	} else if (un->un_state == ST_STATE_SENSING) {
8993 		/*
8994 		 * okay. We were running a REQUEST SENSE. Find
8995 		 * out what to do next.
8996 		 * some actions are based on un_state, hence
8997 		 * restore the state st was in before ST_STATE_SENSING.
8998 		 */
8999 		un->un_state = un->un_laststate;
9000 		action = st_handle_sense(un, bp);
9001 		/*
9002 		 * set pkt back to original packet in case we will have
9003 		 * to requeue it
9004 		 */
9005 		pkt = BP_PKT(bp);
9006 	} else  if ((SCBP(pkt)->sts_busy) || (SCBP(pkt)->sts_chk)) {
9007 		/*
9008 		 * Okay, we weren't running a REQUEST SENSE. Call a routine
9009 		 * to see if the status bits we're okay. If a request sense
9010 		 * is to be run, that will happen.
9011 		 */
9012 		action = st_check_error(un, pkt);
9013 	}
9014 
9015 	if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
9016 		switch (action) {
9017 			case QUE_COMMAND:
9018 				/*
9019 				 * return cmd to head to the queue
9020 				 * since we are suspending so that
9021 				 * it gets restarted during resume
9022 				 */
9023 				if (un->un_runqf) {
9024 					last_runqf = un->un_runqf;
9025 					un->un_runqf = bp;
9026 					bp->b_actf = last_runqf;
9027 				} else {
9028 					bp->b_actf = NULL;
9029 					un->un_runqf = bp;
9030 					un->un_runql = bp;
9031 				}
9032 				action = JUST_RETURN;
9033 				break;
9034 
9035 			case QUE_SENSE:
9036 				action = COMMAND_DONE_ERROR;
9037 				break;
9038 
9039 			default:
9040 				break;
9041 		}
9042 	}
9043 
9044 	/*
9045 	 * Restore old state if we were sensing.
9046 	 */
9047 	if (un->un_state == ST_STATE_SENSING && action != QUE_SENSE) {
9048 		un->un_state = un->un_laststate;
9049 	}
9050 
9051 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9052 	    "st_intr: pkt=%p, bp=%p, action=%x, status=%x\n",
9053 	    (void *)pkt, (void *)bp, action, SCBP_C(pkt));
9054 
9055 
9056 	switch (action) {
9057 	case COMMAND_DONE_EACCES:
9058 		/* this is to report a reservation conflict */
9059 		st_bioerror(bp, EACCES);
9060 		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
9061 		    "Reservation Conflict \n");
9062 		un->un_pos.pmode = invalid;
9063 
9064 		/*FALLTHROUGH*/
9065 	case COMMAND_DONE_ERROR:
9066 		if (un->un_pos.eof < ST_EOT_PENDING &&
9067 		    un->un_state >= ST_STATE_OPEN) {
9068 			/*
9069 			 * all errors set state of the tape to 'unknown'
9070 			 * unless we're at EOT or are doing append testing.
9071 			 * If sense key was illegal request, preserve state.
9072 			 */
9073 			if (un->un_status != KEY_ILLEGAL_REQUEST) {
9074 				un->un_pos.pmode = invalid;
9075 			}
9076 		}
9077 
9078 		un->un_err_resid = bp->b_resid = bp->b_bcount;
9079 		/*
9080 		 * since we have an error (COMMAND_DONE_ERROR), we want to
9081 		 * make sure an error ocurrs, so make sure at least EIO is
9082 		 * returned
9083 		 */
9084 		if (geterror(bp) == 0)
9085 			st_bioerror(bp, EIO);
9086 
9087 		SET_PE_FLAG(un);
9088 		if (!(un->un_rqs_state & ST_RQS_ERROR) &&
9089 		    (un->un_errno == EIO)) {
9090 			un->un_rqs_state &= ~(ST_RQS_VALID);
9091 		}
9092 		goto done;
9093 
9094 	case COMMAND_DONE_ERROR_RECOVERED:
9095 		un->un_err_resid = bp->b_resid = bp->b_bcount;
9096 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
9097 		    "st_intr(): COMMAND_DONE_ERROR_RECOVERED");
9098 		if (geterror(bp) == 0) {
9099 			st_bioerror(bp, EIO);
9100 		}
9101 		SET_PE_FLAG(un);
9102 		if (!(un->un_rqs_state & ST_RQS_ERROR) &&
9103 		    (un->un_errno == EIO)) {
9104 			un->un_rqs_state &= ~(ST_RQS_VALID);
9105 		}
9106 		/*FALLTHROUGH*/
9107 	case COMMAND_DONE:
9108 		st_set_state(un);
9109 done:
9110 		ST_DO_KSTATS(bp, kstat_runq_exit);
9111 		st_done_and_mutex_exit(un, bp);
9112 		return;
9113 
9114 	case QUE_SENSE:
9115 		if ((un->un_ncmds > 1) && !un->un_flush_on_errors)
9116 			goto sense_error;
9117 
9118 		if (un->un_state != ST_STATE_SENSING) {
9119 			un->un_laststate = un->un_state;
9120 			un->un_state = ST_STATE_SENSING;
9121 		}
9122 
9123 		un->un_rqs->pkt_private = (opaque_t)bp;
9124 		bzero(ST_RQSENSE, SENSE_LENGTH);
9125 
9126 		if (un->un_throttle) {
9127 			un->un_last_throttle = un->un_throttle;
9128 			un->un_throttle = 0;
9129 		}
9130 
9131 		mutex_exit(ST_MUTEX);
9132 
9133 		/*
9134 		 * never retry this, some other command will have nuked the
9135 		 * sense, anyway
9136 		 */
9137 		status = scsi_transport(un->un_rqs);
9138 
9139 		mutex_enter(ST_MUTEX);
9140 
9141 		if (un->un_last_throttle) {
9142 			un->un_throttle = un->un_last_throttle;
9143 		}
9144 
9145 		if (status == TRAN_ACCEPT) {
9146 			mutex_exit(ST_MUTEX);
9147 			return;
9148 		}
9149 		if (status != TRAN_BUSY)
9150 			ST_DO_ERRSTATS(un, st_transerrs);
9151 sense_error:
9152 		un->un_pos.pmode = invalid;
9153 		st_bioerror(bp, EIO);
9154 		SET_PE_FLAG(un);
9155 		goto done;
9156 
9157 	case QUE_BUSY_COMMAND:
9158 		/* longish timeout */
9159 		timout = ST_STATUS_BUSY_TIMEOUT;
9160 		goto que_it_up;
9161 
9162 	case QUE_COMMAND:
9163 		/* short timeout */
9164 		timout = ST_TRAN_BUSY_TIMEOUT;
9165 que_it_up:
9166 		/*
9167 		 * let st_handle_intr_busy put this bp back on waitq and make
9168 		 * checks to see if it is ok to requeue the command.
9169 		 */
9170 		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
9171 
9172 		/*
9173 		 * Save the throttle before setting up the timeout
9174 		 */
9175 		if (un->un_throttle) {
9176 			un->un_last_throttle = un->un_throttle;
9177 		}
9178 		mutex_exit(ST_MUTEX);
9179 		if (st_handle_intr_busy(un, bp, timout) == 0)
9180 			return;		/* timeout is setup again */
9181 
9182 		mutex_enter(ST_MUTEX);
9183 		un->un_pos.pmode = invalid;
9184 		un->un_err_resid = bp->b_resid = bp->b_bcount;
9185 		st_bioerror(bp, EIO);
9186 		SET_PE_FLAG(un);
9187 		goto done;
9188 
9189 	case QUE_LAST_COMMAND:
9190 
9191 		if ((un->un_ncmds > 1) && !un->un_flush_on_errors) {
9192 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
9193 			    "un_ncmds: %d can't retry cmd \n", un->un_ncmds);
9194 			goto last_command_error;
9195 		}
9196 		mutex_exit(ST_MUTEX);
9197 		if (st_handle_intr_retry_lcmd(un, bp) == 0)
9198 			return;
9199 		mutex_enter(ST_MUTEX);
9200 last_command_error:
9201 		un->un_err_resid = bp->b_resid = bp->b_bcount;
9202 		un->un_pos.pmode = invalid;
9203 		st_bioerror(bp, EIO);
9204 		SET_PE_FLAG(un);
9205 		goto done;
9206 
9207 	case JUST_RETURN:
9208 	default:
9209 		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
9210 		mutex_exit(ST_MUTEX);
9211 		return;
9212 	}
9213 	/*NOTREACHED*/
9214 }
9215 
9216 static int
9217 st_handle_incomplete(struct scsi_tape *un, struct buf *bp)
9218 {
9219 	static char *fail = "SCSI transport failed: reason '%s': %s\n";
9220 	int rval = COMMAND_DONE_ERROR;
9221 	struct scsi_pkt *pkt = (un->un_state == ST_STATE_SENSING) ?
9222 	    un->un_rqs : BP_PKT(bp);
9223 	int result;
9224 
9225 	ST_FUNC(ST_DEVINFO, st_handle_incomplete);
9226 
9227 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9228 	    "st_handle_incomplete(): dev = 0x%lx\n", un->un_dev);
9229 
9230 	ASSERT(mutex_owned(ST_MUTEX));
9231 
9232 	switch (pkt->pkt_reason) {
9233 	case CMD_INCOMPLETE:	/* tran stopped with not normal state */
9234 		/*
9235 		 * this occurs when accessing a powered down drive, no
9236 		 * need to complain; just fail the open
9237 		 */
9238 		ST_CDB(ST_DEVINFO, "Incomplete CDB", (char *)pkt->pkt_cdbp);
9239 
9240 		/*
9241 		 * if we have commands outstanding in HBA, and a command
9242 		 * comes back incomplete, we're hosed, so reset target
9243 		 * If we have the bus, but cmd_incomplete, we probably just
9244 		 * have a failed selection, so don't reset the target, just
9245 		 * requeue the command and try again
9246 		 */
9247 		if ((un->un_ncmds > 1) || (pkt->pkt_state != STATE_GOT_BUS)) {
9248 			goto reset_target;
9249 		}
9250 
9251 		/*
9252 		 * Retry selection a couple more times if we're
9253 		 * open.  If opening, we only try just once to
9254 		 * reduce probe time for nonexistant devices.
9255 		 */
9256 		if ((un->un_laststate > ST_STATE_OPENING) &&
9257 		    ((int)un->un_retry_ct < st_selection_retry_count)) {
9258 			rval = QUE_COMMAND;
9259 		}
9260 		ST_DO_ERRSTATS(un, st_transerrs);
9261 		break;
9262 
9263 	case CMD_ABORTED:
9264 		/*
9265 		 * most likely this is caused by flush-on-error support. If
9266 		 * it was not there, the we're in trouble.
9267 		 */
9268 		if (!un->un_flush_on_errors) {
9269 			un->un_status = SUN_KEY_FATAL;
9270 			goto reset_target;
9271 		}
9272 
9273 		st_set_pe_errno(un);
9274 		bioerror(bp, un->un_errno);
9275 		if (un->un_errno)
9276 			return (COMMAND_DONE_ERROR);
9277 		else
9278 			return (COMMAND_DONE);
9279 
9280 	case CMD_TIMEOUT:	/* Command timed out */
9281 		un->un_status = SUN_KEY_TIMEOUT;
9282 
9283 		/*FALLTHROUGH*/
9284 	default:
9285 reset_target:
9286 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9287 		    "transport completed with %s\n",
9288 		    scsi_rname(pkt->pkt_reason));
9289 		ST_DO_ERRSTATS(un, st_transerrs);
9290 		if ((pkt->pkt_state & STATE_GOT_TARGET) &&
9291 		    ((pkt->pkt_statistics & (STAT_BUS_RESET | STAT_DEV_RESET |
9292 		    STAT_ABORTED)) == 0)) {
9293 
9294 			/*
9295 			 * If we haven't reserved the drive don't reset it.
9296 			 */
9297 			if ((un->un_rsvd_status &
9298 			    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
9299 				return (rval);
9300 			}
9301 
9302 			/*
9303 			 * if we aren't lost yet we will be soon.
9304 			 */
9305 			un->un_pos.pmode = invalid;
9306 
9307 			mutex_exit(ST_MUTEX);
9308 
9309 			result = scsi_reset(ROUTE, RESET_TARGET);
9310 			/*
9311 			 * if target reset fails, then pull the chain
9312 			 */
9313 			if (result == 0) {
9314 				result = scsi_reset(ROUTE, RESET_ALL);
9315 			}
9316 			mutex_enter(ST_MUTEX);
9317 
9318 			if ((result == 0) && (un->un_state >= ST_STATE_OPEN)) {
9319 				/* no hope left to recover */
9320 				scsi_log(ST_DEVINFO, st_label, CE_WARN,
9321 				    "recovery by resets failed\n");
9322 				return (rval);
9323 			}
9324 		}
9325 	}
9326 
9327 	if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics &
9328 	    (STAT_BUS_RESET | STAT_DEV_RESET))) {
9329 		if ((un->un_rsvd_status & ST_RESERVE)) {
9330 			un->un_rsvd_status |= ST_LOST_RESERVE;
9331 			ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
9332 			    "Lost Reservation\n");
9333 		}
9334 	}
9335 
9336 	if ((int)un->un_retry_ct++ < st_retry_count) {
9337 		if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
9338 			rval = QUE_COMMAND;
9339 		} else if (bp == un->un_sbufp) {
9340 			switch ((uchar_t)(uintptr_t)bp->b_forw) {
9341 			case SCMD_MODE_SENSE:
9342 			case SCMD_MODE_SELECT:
9343 			case SCMD_READ_BLKLIM:
9344 			case SCMD_REWIND:
9345 			case SCMD_LOAD:
9346 			case SCMD_TEST_UNIT_READY:
9347 				/*
9348 				 * These commands can be rerun with impunity
9349 				 */
9350 				rval = QUE_COMMAND;
9351 				break;
9352 
9353 			default:
9354 				break;
9355 			}
9356 		}
9357 	} else {
9358 		rval = COMMAND_DONE_ERROR;
9359 	}
9360 
9361 	if (un->un_state >= ST_STATE_OPEN) {
9362 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
9363 		    fail, scsi_rname(pkt->pkt_reason),
9364 		    (rval == COMMAND_DONE_ERROR)?
9365 		    "giving up" : "retrying command");
9366 	}
9367 	return (rval);
9368 }
9369 
9370 /*
9371  * if the device is busy, then put this bp back on the waitq, on the
9372  * interrupt thread, where we want the head of the queue and not the
9373  * end
9374  *
9375  * The callers of this routine should take measures to save the
9376  * un_throttle in un_last_throttle which will be restored in
9377  * st_intr_restart(). The only exception should be st_intr_restart()
9378  * calling this routine for which the saving is already done.
9379  */
9380 static int
9381 st_handle_intr_busy(struct scsi_tape *un, struct buf *bp,
9382 	clock_t timeout_interval)
9383 {
9384 	struct buf *last_quef;
9385 	int rval = 0;
9386 
9387 	mutex_enter(ST_MUTEX);
9388 
9389 	ST_FUNC(ST_DEVINFO, st_handle_intr_busy);
9390 
9391 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9392 	    "st_handle_intr_busy(), un = 0x%p\n", (void *)un);
9393 
9394 	/*
9395 	 * Check to see if we hit the retry timeout. We check to make sure
9396 	 * this is the first one on the runq and make sure we have not
9397 	 * queued up any more, so this one has to be the last on the list
9398 	 * also. If it is not, we have to fail.  If it is not the first, but
9399 	 * is the last we are in trouble anyway, as we are in the interrupt
9400 	 * context here.
9401 	 */
9402 	if (((int)un->un_tran_retry_ct++ > st_retry_count) ||
9403 	    ((un->un_runqf != bp) && (un->un_runql != bp))) {
9404 		rval = -1;
9405 		goto exit;
9406 	}
9407 
9408 	/* put the bp back on the waitq */
9409 	if (un->un_quef) {
9410 		last_quef = un->un_quef;
9411 		un->un_quef = bp;
9412 		bp->b_actf = last_quef;
9413 	} else  {
9414 		bp->b_actf = NULL;
9415 		un->un_quef = bp;
9416 		un->un_quel = bp;
9417 	}
9418 
9419 	/*
9420 	 * We know that this is the first and last on the runq at this time,
9421 	 * so we just nullify those two queues
9422 	 */
9423 	un->un_runqf = NULL;
9424 	un->un_runql = NULL;
9425 
9426 	/*
9427 	 * We don't want any other commands being started in the mean time.
9428 	 * If start had just released mutex after putting something on the
9429 	 * runq, we won't even get here.
9430 	 */
9431 	un->un_throttle = 0;
9432 
9433 	/*
9434 	 * send a marker pkt, if appropriate
9435 	 */
9436 	st_hba_unflush(un);
9437 
9438 	/*
9439 	 * all queues are aligned, we are just waiting to
9440 	 * transport
9441 	 */
9442 	un->un_hib_tid = timeout(st_intr_restart, un, timeout_interval);
9443 
9444 exit:
9445 	mutex_exit(ST_MUTEX);
9446 	return (rval);
9447 }
9448 
9449 /*
9450  * To get one error entry from error stack
9451  */
9452 static int
9453 st_get_error_entry(struct scsi_tape *un, intptr_t arg, int flag)
9454 {
9455 #ifdef _MULTI_DATAMODEL
9456 	/*
9457 	 * For use when a 32 bit app makes a call into a
9458 	 * 64 bit ioctl
9459 	 */
9460 	struct mterror_entry32 err_entry32;
9461 #endif /* _MULTI_DATAMODEL */
9462 
9463 	int rval = 0;
9464 	struct mterror_entry err_entry;
9465 	struct mterror_entry_stack *err_link_entry_p;
9466 	size_t arq_status_len_in, arq_status_len_kr;
9467 
9468 	ST_FUNC(ST_DEVINFO, st_get_error_entry);
9469 
9470 	ASSERT(mutex_owned(ST_MUTEX));
9471 
9472 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9473 	    "st_get_error_entry()\n");
9474 
9475 	/*
9476 	 * if error record stack empty, return ENXIO
9477 	 */
9478 	if (un->un_error_entry_stk == NULL) {
9479 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9480 		    "st_get_error_entry: Error Entry Stack Empty!\n");
9481 		rval = ENXIO;
9482 		goto ret;
9483 	}
9484 
9485 	/*
9486 	 * get the top entry from stack
9487 	 */
9488 	err_link_entry_p = un->un_error_entry_stk;
9489 	arq_status_len_kr =
9490 	    err_link_entry_p->mtees_entry.mtee_arq_status_len;
9491 
9492 #ifdef _MULTI_DATAMODEL
9493 	switch (ddi_model_convert_from(flag & FMODELS)) {
9494 	case DDI_MODEL_ILP32:
9495 		if (ddi_copyin((void *)arg, &err_entry32,
9496 		    MTERROR_ENTRY_SIZE_32, flag)) {
9497 			rval = EFAULT;
9498 			goto ret;
9499 		}
9500 
9501 		arq_status_len_in =
9502 		    (size_t)err_entry32.mtee_arq_status_len;
9503 
9504 		err_entry32.mtee_cdb_len =
9505 		    (size32_t)err_link_entry_p->mtees_entry.mtee_cdb_len;
9506 
9507 		if (arq_status_len_in > arq_status_len_kr)
9508 			err_entry32.mtee_arq_status_len =
9509 			    (size32_t)arq_status_len_kr;
9510 
9511 		if (ddi_copyout(
9512 		    err_link_entry_p->mtees_entry.mtee_cdb_buf,
9513 		    (void *)(uintptr_t)err_entry32.mtee_cdb_buf,
9514 		    err_entry32.mtee_cdb_len, flag)) {
9515 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9516 			    "st_get_error_entry: Copy cdb buffer error!");
9517 			rval = EFAULT;
9518 		}
9519 
9520 		if (ddi_copyout(
9521 		    err_link_entry_p->mtees_entry.mtee_arq_status,
9522 		    (void *)(uintptr_t)err_entry32.mtee_arq_status,
9523 		    err_entry32.mtee_arq_status_len, flag)) {
9524 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9525 			    "st_get_error_entry: copy arq status error!");
9526 			rval = EFAULT;
9527 		}
9528 
9529 		if (ddi_copyout(&err_entry32, (void *)arg,
9530 		    MTERROR_ENTRY_SIZE_32, flag)) {
9531 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9532 			    "st_get_error_entry: copy arq status out error!");
9533 			rval = EFAULT;
9534 		}
9535 		break;
9536 
9537 	case DDI_MODEL_NONE:
9538 		if (ddi_copyin((void *)arg, &err_entry,
9539 		    MTERROR_ENTRY_SIZE_64, flag)) {
9540 			rval = EFAULT;
9541 			goto ret;
9542 		}
9543 		arq_status_len_in = err_entry.mtee_arq_status_len;
9544 
9545 		err_entry.mtee_cdb_len =
9546 		    err_link_entry_p->mtees_entry.mtee_cdb_len;
9547 
9548 		if (arq_status_len_in > arq_status_len_kr)
9549 			err_entry.mtee_arq_status_len =
9550 			    arq_status_len_kr;
9551 
9552 		if (ddi_copyout(
9553 		    err_link_entry_p->mtees_entry.mtee_cdb_buf,
9554 		    err_entry.mtee_cdb_buf,
9555 		    err_entry.mtee_cdb_len, flag)) {
9556 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9557 			    "st_get_error_entry: Copy cdb buffer error!");
9558 			rval = EFAULT;
9559 		}
9560 
9561 		if (ddi_copyout(
9562 		    err_link_entry_p->mtees_entry.mtee_arq_status,
9563 		    err_entry.mtee_arq_status,
9564 		    err_entry.mtee_arq_status_len, flag)) {
9565 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9566 			    "st_get_error_entry: copy arq status error!");
9567 			rval = EFAULT;
9568 		}
9569 
9570 		if (ddi_copyout(&err_entry, (void *)arg,
9571 		    MTERROR_ENTRY_SIZE_64, flag)) {
9572 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9573 			    "st_get_error_entry: copy arq status out error!");
9574 			rval = EFAULT;
9575 		}
9576 		break;
9577 	}
9578 #else /* _MULTI_DATAMODEL */
9579 	if (ddi_copyin((void *)arg, &err_entry,
9580 	    MTERROR_ENTRY_SIZE_64, flag)) {
9581 		rval = EFAULT;
9582 		goto ret;
9583 	}
9584 	arq_status_len_in = err_entry.mtee_arq_status_len;
9585 
9586 	err_entry.mtee_cdb_len =
9587 	    err_link_entry_p->mtees_entry.mtee_cdb_len;
9588 
9589 	if (arq_status_len_in > arq_status_len_kr)
9590 		err_entry.mtee_arq_status_len =
9591 		    arq_status_len_kr;
9592 
9593 	if (ddi_copyout(
9594 	    err_link_entry_p->mtees_entry.mtee_cdb_buf,
9595 	    err_entry.mtee_cdb_buf,
9596 	    err_entry.mtee_cdb_len, flag)) {
9597 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9598 		    "st_get_error_entry: Copy cdb buffer error!");
9599 		rval = EFAULT;
9600 	}
9601 
9602 	if (ddi_copyout(
9603 	    err_link_entry_p->mtees_entry.mtee_arq_status,
9604 	    err_entry.mtee_arq_status,
9605 	    err_entry.mtee_arq_status_len, flag)) {
9606 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9607 		    "st_get_error_entry: copy arq status buffer error!");
9608 		rval = EFAULT;
9609 	}
9610 
9611 	if (ddi_copyout(&err_entry, (void *)arg,
9612 	    MTERROR_ENTRY_SIZE_64, flag)) {
9613 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9614 		    "st_get_error_entry: copy arq status out error!");
9615 		rval = EFAULT;
9616 	}
9617 #endif /* _MULTI_DATAMODEL */
9618 
9619 	/*
9620 	 * update stack
9621 	 */
9622 	un->un_error_entry_stk = err_link_entry_p->mtees_nextp;
9623 
9624 	kmem_free(err_link_entry_p->mtees_entry.mtee_cdb_buf,
9625 	    err_link_entry_p->mtees_entry.mtee_cdb_len);
9626 	err_link_entry_p->mtees_entry.mtee_cdb_buf = NULL;
9627 
9628 	kmem_free(err_link_entry_p->mtees_entry.mtee_arq_status,
9629 	    SECMDS_STATUS_SIZE);
9630 	err_link_entry_p->mtees_entry.mtee_arq_status = NULL;
9631 
9632 	kmem_free(err_link_entry_p, MTERROR_LINK_ENTRY_SIZE);
9633 	err_link_entry_p = NULL;
9634 ret:
9635 	return (rval);
9636 }
9637 
9638 /*
9639  * MTIOCGETERROR ioctl needs to retrieve the current sense data along with
9640  * the scsi CDB command which causes the error and generates sense data and
9641  * the scsi status.
9642  *
9643  *      error-record stack
9644  *
9645  *
9646  *             TOP                                     BOTTOM
9647  *              ------------------------------------------
9648  *              |   0   |   1   |   2   |   ...  |   n   |
9649  *              ------------------------------------------
9650  *                  ^
9651  *                  |
9652  *       pointer to error entry
9653  *
9654  * when st driver generates one sense data record, it creates a error-entry
9655  * and pushes it onto the stack.
9656  *
9657  */
9658 
9659 static void
9660 st_update_error_stack(struct scsi_tape *un,
9661 			struct scsi_pkt *pkt,
9662 			struct scsi_arq_status *cmd)
9663 {
9664 	struct mterror_entry_stack *err_entry_tmp;
9665 	uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp;
9666 	size_t cdblen = scsi_cdb_size[CDB_GROUPID(cdbp[0])];
9667 
9668 	ST_FUNC(ST_DEVINFO, st_update_error_stack);
9669 
9670 	ASSERT(mutex_owned(ST_MUTEX));
9671 
9672 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9673 	    "st_update_error_stack()\n");
9674 
9675 	ASSERT(cmd);
9676 	ASSERT(cdbp);
9677 	if (cdblen == 0) {
9678 		ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9679 		    "st_update_error_stack: CDB length error!\n");
9680 		return;
9681 	}
9682 
9683 	err_entry_tmp = kmem_alloc(MTERROR_LINK_ENTRY_SIZE, KM_SLEEP);
9684 	ASSERT(err_entry_tmp != NULL);
9685 
9686 	err_entry_tmp->mtees_entry.mtee_cdb_buf =
9687 	    kmem_alloc(cdblen, KM_SLEEP);
9688 	ASSERT(err_entry_tmp->mtees_entry.mtee_cdb_buf != NULL);
9689 
9690 	err_entry_tmp->mtees_entry.mtee_arq_status =
9691 	    kmem_alloc(SECMDS_STATUS_SIZE, KM_SLEEP);
9692 	ASSERT(err_entry_tmp->mtees_entry.mtee_arq_status != NULL);
9693 
9694 	/*
9695 	 * copy cdb command & length to current error entry
9696 	 */
9697 	err_entry_tmp->mtees_entry.mtee_cdb_len = cdblen;
9698 	bcopy(cdbp, err_entry_tmp->mtees_entry.mtee_cdb_buf, cdblen);
9699 
9700 	/*
9701 	 * copy scsi status length to current error entry
9702 	 */
9703 	err_entry_tmp->mtees_entry.mtee_arq_status_len =
9704 	    SECMDS_STATUS_SIZE;
9705 
9706 	/*
9707 	 * copy sense data and scsi status to current error entry
9708 	 */
9709 	bcopy(cmd, err_entry_tmp->mtees_entry.mtee_arq_status,
9710 	    SECMDS_STATUS_SIZE);
9711 
9712 	err_entry_tmp->mtees_nextp = un->un_error_entry_stk;
9713 	un->un_error_entry_stk = err_entry_tmp;
9714 
9715 }
9716 
9717 /*
9718  * Empty all the error entry in stack
9719  */
9720 static void
9721 st_empty_error_stack(struct scsi_tape *un)
9722 {
9723 	struct mterror_entry_stack *linkp;
9724 
9725 	ST_FUNC(ST_DEVINFO, st_empty_error_stack);
9726 
9727 	ASSERT(mutex_owned(ST_MUTEX));
9728 
9729 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9730 	    "st_empty_entry_stack()\n");
9731 
9732 	while (un->un_error_entry_stk != NULL) {
9733 		linkp = un->un_error_entry_stk;
9734 		un->un_error_entry_stk =
9735 		    un->un_error_entry_stk->mtees_nextp;
9736 
9737 		if (linkp->mtees_entry.mtee_cdb_buf != NULL)
9738 			kmem_free(linkp->mtees_entry.mtee_cdb_buf,
9739 			    linkp->mtees_entry.mtee_cdb_len);
9740 
9741 		if (linkp->mtees_entry.mtee_arq_status != NULL)
9742 			kmem_free(linkp->mtees_entry.mtee_arq_status,
9743 			    linkp->mtees_entry.mtee_arq_status_len);
9744 
9745 		kmem_free(linkp, MTERROR_LINK_ENTRY_SIZE);
9746 		linkp = NULL;
9747 	}
9748 }
9749 
9750 static int
9751 st_handle_sense(struct scsi_tape *un, struct buf *bp)
9752 {
9753 	struct scsi_pkt *pkt = BP_PKT(bp);
9754 	struct scsi_pkt *rqpkt = un->un_rqs;
9755 	struct scsi_arq_status arqstat;
9756 
9757 	int rval = COMMAND_DONE_ERROR;
9758 	int amt;
9759 
9760 	ST_FUNC(ST_DEVINFO, st_handle_sense);
9761 
9762 	ASSERT(mutex_owned(ST_MUTEX));
9763 
9764 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9765 	    "st_handle_sense()\n");
9766 
9767 	if (SCBP(rqpkt)->sts_busy) {
9768 		ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN,
9769 		    "busy unit on request sense\n");
9770 		if ((int)un->un_retry_ct++ < st_retry_count) {
9771 			rval = QUE_BUSY_COMMAND;
9772 		}
9773 		return (rval);
9774 	} else if (SCBP(rqpkt)->sts_chk) {
9775 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9776 		    "Check Condition on REQUEST SENSE\n");
9777 		return (rval);
9778 	}
9779 
9780 	/* was there enough data? */
9781 	amt = (int)SENSE_LENGTH - rqpkt->pkt_resid;
9782 	if ((rqpkt->pkt_state & STATE_XFERRED_DATA) == 0 ||
9783 	    (amt < SUN_MIN_SENSE_LENGTH)) {
9784 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9785 		    "REQUEST SENSE couldn't get sense data\n");
9786 		return (rval);
9787 	}
9788 
9789 	bcopy(SCBP(pkt), &arqstat.sts_status,
9790 	    sizeof (struct scsi_status));
9791 	bcopy(SCBP(rqpkt), &arqstat.sts_rqpkt_status,
9792 	    sizeof (struct scsi_status));
9793 	arqstat.sts_rqpkt_reason = rqpkt->pkt_reason;
9794 	arqstat.sts_rqpkt_resid = rqpkt->pkt_resid;
9795 	arqstat.sts_rqpkt_state = rqpkt->pkt_state;
9796 	arqstat.sts_rqpkt_statistics = rqpkt->pkt_statistics;
9797 	bcopy(ST_RQSENSE, &arqstat.sts_sensedata, SENSE_LENGTH);
9798 
9799 	/*
9800 	 * copy one arqstat entry in the sense data buffer
9801 	 */
9802 	st_update_error_stack(un, pkt, &arqstat);
9803 	return (st_decode_sense(un, bp, amt, SCBP(rqpkt)));
9804 }
9805 
9806 static int
9807 st_handle_autosense(struct scsi_tape *un, struct buf *bp)
9808 {
9809 	struct scsi_pkt *pkt = BP_PKT(bp);
9810 	struct scsi_arq_status *arqstat =
9811 	    (struct scsi_arq_status *)pkt->pkt_scbp;
9812 	int rval = COMMAND_DONE_ERROR;
9813 	int amt;
9814 
9815 	ST_FUNC(ST_DEVINFO, st_handle_autosense);
9816 
9817 	ASSERT(mutex_owned(ST_MUTEX));
9818 
9819 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9820 	    "st_handle_autosense()\n");
9821 
9822 	if (arqstat->sts_rqpkt_status.sts_busy) {
9823 		ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN,
9824 		    "busy unit on request sense\n");
9825 		/*
9826 		 * we return QUE_SENSE so st_intr will setup the SENSE cmd.
9827 		 * the disadvantage is that we do not have any delay for the
9828 		 * second retry of rqsense and we have to keep a packet around
9829 		 */
9830 		return (QUE_SENSE);
9831 
9832 	} else if (arqstat->sts_rqpkt_reason != CMD_CMPLT) {
9833 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9834 		    "transport error on REQUEST SENSE\n");
9835 		if ((arqstat->sts_rqpkt_state & STATE_GOT_TARGET) &&
9836 		    ((arqstat->sts_rqpkt_statistics &
9837 		    (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) == 0)) {
9838 			mutex_exit(ST_MUTEX);
9839 			if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
9840 				/*
9841 				 * if target reset fails, then pull the chain
9842 				 */
9843 				if (scsi_reset(ROUTE, RESET_ALL) == 0) {
9844 					ST_DEBUG6(ST_DEVINFO, st_label,
9845 					    CE_WARN,
9846 					    "recovery by resets failed\n");
9847 				}
9848 			}
9849 			mutex_enter(ST_MUTEX);
9850 		}
9851 		return (rval);
9852 
9853 	} else if (arqstat->sts_rqpkt_status.sts_chk) {
9854 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9855 		    "Check Condition on REQUEST SENSE\n");
9856 		return (rval);
9857 	}
9858 
9859 
9860 	/* was there enough data? */
9861 	amt = (int)SENSE_LENGTH - arqstat->sts_rqpkt_resid;
9862 	if ((arqstat->sts_rqpkt_state & STATE_XFERRED_DATA) == 0 ||
9863 	    (amt < SUN_MIN_SENSE_LENGTH)) {
9864 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9865 		    "REQUEST SENSE couldn't get sense data\n");
9866 		return (rval);
9867 	}
9868 
9869 	/*
9870 	 * copy one arqstat entry in the sense data buffer
9871 	 */
9872 	st_update_error_stack(un, pkt, arqstat);
9873 
9874 	bcopy(&arqstat->sts_sensedata, ST_RQSENSE, SENSE_LENGTH);
9875 
9876 	return (st_decode_sense(un, bp, amt, &arqstat->sts_rqpkt_status));
9877 }
9878 
9879 static int
9880 st_decode_sense(struct scsi_tape *un, struct buf *bp,  int amt,
9881 	struct scsi_status *statusp)
9882 {
9883 	struct scsi_pkt *pkt = BP_PKT(bp);
9884 	int rval = COMMAND_DONE_ERROR;
9885 	long resid;
9886 	struct scsi_extended_sense *sensep = ST_RQSENSE;
9887 	int severity;
9888 	int get_error;
9889 
9890 	ST_FUNC(ST_DEVINFO, st_decode_sense);
9891 
9892 	ASSERT(mutex_owned(ST_MUTEX));
9893 
9894 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9895 	    "st_decode_sense()\n");
9896 
9897 	/*
9898 	 * For uscsi commands, squirrel away a copy of the
9899 	 * results of the Request Sense.
9900 	 */
9901 	if (USCSI_CMD(bp)) {
9902 		struct uscsi_cmd *ucmd = BP_UCMD(bp);
9903 		ucmd->uscsi_rqstatus = *(uchar_t *)statusp;
9904 		if (ucmd->uscsi_rqlen && un->un_srqbufp) {
9905 			uchar_t rqlen = min((uchar_t)amt, ucmd->uscsi_rqlen);
9906 			ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen;
9907 			bcopy(ST_RQSENSE, un->un_srqbufp, rqlen);
9908 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9909 			    "st_decode_sense: stat=0x%x resid=0x%x\n",
9910 			    ucmd->uscsi_rqstatus, ucmd->uscsi_rqresid);
9911 		}
9912 	}
9913 
9914 	/*
9915 	 * If the drive is an MT-02, reposition the
9916 	 * secondary error code into the proper place.
9917 	 *
9918 	 * XXX	MT-02 is non-CCS tape, so secondary error code
9919 	 * is in byte 8.  However, in SCSI-2, tape has CCS definition
9920 	 * so it's in byte 12.
9921 	 */
9922 	if (un->un_dp->type == ST_TYPE_EMULEX) {
9923 		sensep->es_code = sensep->es_add_info[0];
9924 	}
9925 
9926 	ST_CDB(ST_DEVINFO, "st_decode_sense failed CDB",
9927 	    (caddr_t)&CDBP(pkt)->scc_cmd);
9928 
9929 	ST_SENSE(ST_DEVINFO, "st_decode_sense sense data", (caddr_t)sensep,
9930 	    sizeof (*sensep));
9931 
9932 	/* for normal I/O check extract the resid values. */
9933 	if (bp != un->un_sbufp) {
9934 		if (sensep->es_valid) {
9935 			resid =
9936 			    (sensep->es_info_1 << 24) |
9937 			    (sensep->es_info_2 << 16) |
9938 			    (sensep->es_info_3 << 8)  |
9939 			    (sensep->es_info_4);
9940 			/* If fixed block */
9941 			if (un->un_bsize) {
9942 				resid *= un->un_bsize;
9943 			}
9944 		} else if (pkt->pkt_state & STATE_XFERRED_DATA) {
9945 			resid = pkt->pkt_resid;
9946 		} else {
9947 			resid = bp->b_bcount;
9948 		}
9949 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9950 		    "st_handle_sense (rw): xferred bit = %d, resid=%ld (%d), "
9951 		    "pkt_resid=%ld\n", pkt->pkt_state & STATE_XFERRED_DATA,
9952 		    resid,
9953 		    (sensep->es_info_1 << 24) |
9954 		    (sensep->es_info_2 << 16) |
9955 		    (sensep->es_info_3 << 8)  |
9956 		    (sensep->es_info_4),
9957 		    pkt->pkt_resid);
9958 		/*
9959 		 * The problem is, what should we believe?
9960 		 */
9961 		if (resid && (pkt->pkt_resid == 0)) {
9962 			pkt->pkt_resid = resid;
9963 		}
9964 	} else {
9965 		/*
9966 		 * If the command is SCMD_SPACE, we need to get the
9967 		 * residual as returned in the sense data, to adjust
9968 		 * our idea of current tape position correctly
9969 		 */
9970 		if ((CDBP(pkt)->scc_cmd == SCMD_LOCATE) ||
9971 		    (CDBP(pkt)->scc_cmd == SCMD_LOCATE_G4) ||
9972 		    (CDBP(pkt)->scc_cmd == SCMD_SPACE) ||
9973 		    (CDBP(pkt)->scc_cmd == SCMD_WRITE_FILE_MARK) &&
9974 		    (sensep->es_valid)) {
9975 			resid =
9976 			    (sensep->es_info_1 << 24) |
9977 			    (sensep->es_info_2 << 16) |
9978 			    (sensep->es_info_3 << 8)  |
9979 			    (sensep->es_info_4);
9980 			bp->b_resid = resid;
9981 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9982 			    "st_handle_sense(other):	resid=%ld\n", resid);
9983 		} else {
9984 			/*
9985 			 * If the special command is SCMD_READ,
9986 			 * the correct resid will be set later.
9987 			 */
9988 			resid = bp->b_bcount;
9989 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9990 			    "st_handle_sense(special read):  resid=%ld\n",
9991 			    resid);
9992 		}
9993 	}
9994 
9995 	if ((un->un_state >= ST_STATE_OPEN) &&
9996 	    (DEBUGGING || st_error_level == SCSI_ERR_ALL)) {
9997 		st_print_cdb(ST_DEVINFO, st_label, CE_NOTE,
9998 		    "Failed CDB", (char *)pkt->pkt_cdbp);
9999 		st_clean_print(ST_DEVINFO, st_label, CE_CONT,
10000 		    "sense data", (char *)sensep, amt);
10001 		scsi_log(ST_DEVINFO, st_label, CE_CONT,
10002 		    "count 0x%lx resid 0x%lx pktresid 0x%lx\n",
10003 		    bp->b_bcount, resid, pkt->pkt_resid);
10004 	}
10005 
10006 	switch (un->un_status = sensep->es_key) {
10007 	case KEY_NO_SENSE:
10008 		severity = SCSI_ERR_INFO;
10009 
10010 		/*
10011 		 * Erase, locate or rewind operation in progress, retry
10012 		 * ASC  ASCQ
10013 		 *  00   18    Erase operation in progress
10014 		 *  00   19    Locate operation in progress
10015 		 *  00   1A    Rewind operation in progress
10016 		 */
10017 		if (sensep->es_add_code == 0 &&
10018 		    ((sensep->es_qual_code == 0x18) ||
10019 		    (sensep->es_qual_code == 0x19) ||
10020 		    (sensep->es_qual_code == 0x1a))) {
10021 			rval = QUE_COMMAND;
10022 			break;
10023 		}
10024 
10025 		goto common;
10026 
10027 	case KEY_RECOVERABLE_ERROR:
10028 		severity = SCSI_ERR_RECOVERED;
10029 		if ((sensep->es_class == CLASS_EXTENDED_SENSE) &&
10030 		    (sensep->es_code == ST_DEFERRED_ERROR)) {
10031 			if (un->un_dp->options &
10032 			    ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) {
10033 				rval = QUE_LAST_COMMAND;
10034 				scsi_errmsg(ST_SCSI_DEVP, pkt, st_label,
10035 				    severity, un->un_pos.lgclblkno,
10036 				    un->un_err_pos.lgclblkno, scsi_cmds,
10037 				    sensep);
10038 				scsi_log(ST_DEVINFO, st_label, CE_CONT,
10039 				    "Command will be retried\n");
10040 			} else {
10041 				severity = SCSI_ERR_FATAL;
10042 				rval = COMMAND_DONE_ERROR_RECOVERED;
10043 				ST_DO_ERRSTATS(un, st_softerrs);
10044 				scsi_errmsg(ST_SCSI_DEVP, pkt, st_label,
10045 				    severity, un->un_pos.lgclblkno,
10046 				    un->un_err_pos.lgclblkno, scsi_cmds,
10047 				    sensep);
10048 			}
10049 			break;
10050 		}
10051 common:
10052 		/*
10053 		 * XXX only want reads to be stopped by filemarks.
10054 		 * Don't want them to be stopped by EOT.  EOT matters
10055 		 * only on write.
10056 		 */
10057 		if (sensep->es_filmk && !sensep->es_eom) {
10058 			rval = COMMAND_DONE;
10059 		} else if (sensep->es_eom) {
10060 			rval = COMMAND_DONE;
10061 		} else if (sensep->es_ili) {
10062 			/*
10063 			 * Fun with variable length record devices:
10064 			 * for specifying larger blocks sizes than the
10065 			 * actual physical record size.
10066 			 */
10067 			if (un->un_bsize == 0 && resid > 0) {
10068 				/*
10069 				 * XXX! Ugly.
10070 				 * The requested blocksize is > tape blocksize,
10071 				 * so this is ok, so we just return the
10072 				 * actual size xferred.
10073 				 */
10074 				pkt->pkt_resid = resid;
10075 				rval = COMMAND_DONE;
10076 			} else if (un->un_bsize == 0 && resid < 0) {
10077 				/*
10078 				 * The requested blocksize is < tape blocksize,
10079 				 * so this is not ok, so we err with ENOMEM
10080 				 */
10081 				rval = COMMAND_DONE_ERROR_RECOVERED;
10082 				st_bioerror(bp, ENOMEM);
10083 			} else {
10084 				ST_DO_ERRSTATS(un, st_softerrs);
10085 				severity = SCSI_ERR_FATAL;
10086 				rval = COMMAND_DONE_ERROR;
10087 				st_bioerror(bp, EINVAL);
10088 			}
10089 		} else {
10090 			/*
10091 			 * we hope and pray for this just being
10092 			 * something we can ignore (ie. a
10093 			 * truly recoverable soft error)
10094 			 */
10095 			rval = COMMAND_DONE;
10096 		}
10097 		if (sensep->es_filmk) {
10098 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10099 			    "filemark\n");
10100 			un->un_status = SUN_KEY_EOF;
10101 			un->un_pos.eof = ST_EOF_PENDING;
10102 			SET_PE_FLAG(un);
10103 		}
10104 
10105 		/*
10106 		 * ignore eom when reading, a fmk should terminate reading
10107 		 */
10108 		if ((sensep->es_eom) &&
10109 		    (CDBP(pkt)->scc_cmd != SCMD_READ)) {
10110 			if ((sensep->es_add_code == 0) &&
10111 			    (sensep->es_qual_code == 4)) {
10112 				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10113 				    "bot\n");
10114 				un->un_status = SUN_KEY_BOT;
10115 				un->un_pos.eof = ST_NO_EOF;
10116 				un->un_pos.lgclblkno = 0;
10117 				un->un_pos.fileno = 0;
10118 				un->un_pos.blkno = 0;
10119 				un->un_pos.pmode = legacy;
10120 			} else {
10121 				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10122 				    "eom\n");
10123 				un->un_status = SUN_KEY_EOT;
10124 				un->un_pos.eof = ST_EOM;
10125 			}
10126 			SET_PE_FLAG(un);
10127 		}
10128 
10129 		break;
10130 
10131 	case KEY_ILLEGAL_REQUEST:
10132 
10133 		if (un->un_laststate >= ST_STATE_OPEN) {
10134 			ST_DO_ERRSTATS(un, st_softerrs);
10135 			severity = SCSI_ERR_FATAL;
10136 		} else {
10137 			severity = SCSI_ERR_INFO;
10138 		}
10139 		break;
10140 
10141 	case KEY_MEDIUM_ERROR:
10142 		ST_DO_ERRSTATS(un, st_harderrs);
10143 		severity = SCSI_ERR_FATAL;
10144 
10145 		/*
10146 		 * for (buffered) writes, a medium error must be fatal
10147 		 */
10148 		if (CDBP(pkt)->scc_cmd != SCMD_WRITE) {
10149 			rval = COMMAND_DONE_ERROR_RECOVERED;
10150 		}
10151 
10152 check_keys:
10153 		/*
10154 		 * attempt to process the keys in the presence of
10155 		 * other errors
10156 		 */
10157 		if (sensep->es_ili && rval != COMMAND_DONE_ERROR) {
10158 			/*
10159 			 * Fun with variable length record devices:
10160 			 * for specifying larger blocks sizes than the
10161 			 * actual physical record size.
10162 			 */
10163 			if (un->un_bsize == 0 && resid > 0) {
10164 				/*
10165 				 * XXX! Ugly
10166 				 */
10167 				pkt->pkt_resid = resid;
10168 			} else if (un->un_bsize == 0 && resid < 0) {
10169 				st_bioerror(bp, EINVAL);
10170 			} else {
10171 				severity = SCSI_ERR_FATAL;
10172 				rval = COMMAND_DONE_ERROR;
10173 				st_bioerror(bp, EINVAL);
10174 			}
10175 		}
10176 		if (sensep->es_filmk) {
10177 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10178 			    "filemark\n");
10179 			un->un_status = SUN_KEY_EOF;
10180 			un->un_pos.eof = ST_EOF_PENDING;
10181 			SET_PE_FLAG(un);
10182 		}
10183 
10184 		/*
10185 		 * ignore eom when reading, a fmk should terminate reading
10186 		 */
10187 		if ((sensep->es_eom) &&
10188 		    (CDBP(pkt)->scc_cmd != SCMD_READ)) {
10189 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n");
10190 			un->un_status = SUN_KEY_EOT;
10191 			un->un_pos.eof = ST_EOM;
10192 			SET_PE_FLAG(un);
10193 		}
10194 
10195 		break;
10196 
10197 	case KEY_VOLUME_OVERFLOW:
10198 		ST_DO_ERRSTATS(un, st_softerrs);
10199 		un->un_pos.eof = ST_EOM;
10200 		severity = SCSI_ERR_FATAL;
10201 		rval = COMMAND_DONE_ERROR;
10202 		goto check_keys;
10203 
10204 	case KEY_HARDWARE_ERROR:
10205 		ST_DO_ERRSTATS(un, st_harderrs);
10206 		severity = SCSI_ERR_FATAL;
10207 		rval = COMMAND_DONE_ERROR;
10208 		if (un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE)
10209 			un->un_eject_tape_on_failure = st_check_asc_ascq(un);
10210 		break;
10211 
10212 	case KEY_BLANK_CHECK:
10213 		ST_DO_ERRSTATS(un, st_softerrs);
10214 		severity = SCSI_ERR_INFO;
10215 
10216 		/*
10217 		 * if not a special request and some data was xferred then it
10218 		 * it is not an error yet
10219 		 */
10220 		if (bp != un->un_sbufp && (bp->b_flags & B_READ)) {
10221 			/*
10222 			 * no error for read with or without data xferred
10223 			 */
10224 			un->un_status = SUN_KEY_EOT;
10225 			un->un_pos.eof = ST_EOT;
10226 			rval = COMMAND_DONE_ERROR;
10227 			SET_PE_FLAG(un);
10228 			goto check_keys;
10229 		} else if (bp != un->un_sbufp &&
10230 		    (pkt->pkt_state & STATE_XFERRED_DATA)) {
10231 			rval = COMMAND_DONE;
10232 		} else {
10233 			rval = COMMAND_DONE_ERROR_RECOVERED;
10234 		}
10235 
10236 		if (un->un_laststate >= ST_STATE_OPEN) {
10237 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10238 			    "blank check\n");
10239 			un->un_pos.eof = ST_EOM;
10240 		}
10241 		if ((CDBP(pkt)->scc_cmd == SCMD_LOCATE) ||
10242 		    (CDBP(pkt)->scc_cmd == SCMD_LOCATE_G4) ||
10243 		    (CDBP(pkt)->scc_cmd == SCMD_SPACE) &&
10244 		    (un->un_dp->options & ST_KNOWS_EOD)) {
10245 			/*
10246 			 * we were doing a fast forward by skipping
10247 			 * multiple fmk at the time
10248 			 */
10249 			st_bioerror(bp, EIO);
10250 			severity = SCSI_ERR_RECOVERED;
10251 			rval	 = COMMAND_DONE;
10252 		}
10253 		SET_PE_FLAG(un);
10254 		goto check_keys;
10255 
10256 	case KEY_WRITE_PROTECT:
10257 		if (st_wrongtapetype(un)) {
10258 			un->un_status = SUN_KEY_WRONGMEDIA;
10259 			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10260 		"wrong tape for writing- use DC6150 tape (or equivalent)\n");
10261 			severity = SCSI_ERR_UNKNOWN;
10262 		} else {
10263 			severity = SCSI_ERR_FATAL;
10264 		}
10265 		ST_DO_ERRSTATS(un, st_harderrs);
10266 		rval = COMMAND_DONE_ERROR;
10267 		st_bioerror(bp, EACCES);
10268 		break;
10269 
10270 	case KEY_UNIT_ATTENTION:
10271 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10272 		    "KEY_UNIT_ATTENTION : un_state = %d\n", un->un_state);
10273 
10274 		/*
10275 		 * If we have detected a Bus Reset and the tape
10276 		 * drive has been reserved.
10277 		 */
10278 		if (ST_RQSENSE->es_add_code == 0x29 &&
10279 		    (un->un_rsvd_status & ST_RESERVE)) {
10280 			un->un_rsvd_status |= ST_LOST_RESERVE;
10281 			ST_DEBUG(ST_DEVINFO, st_label, CE_WARN,
10282 			    "st_decode_sense: Lost Reservation\n");
10283 		}
10284 
10285 		if (un->un_state <= ST_STATE_OPENING) {
10286 			/*
10287 			 * Look, the tape isn't open yet, now determine
10288 			 * if the cause is a BUS RESET, Save the file and
10289 			 * Block positions for the callers to recover from
10290 			 * the loss of position.
10291 			 */
10292 			if (un->un_pos.pmode != invalid) {
10293 				if (ST_RQSENSE->es_add_code == 0x29) {
10294 					un->un_save_fileno = un->un_pos.fileno;
10295 					un->un_save_blkno = un->un_pos.blkno;
10296 					un->un_restore_pos = 1;
10297 				}
10298 			}
10299 
10300 			if ((int)un->un_retry_ct++ < st_retry_count) {
10301 				rval = QUE_COMMAND;
10302 			} else {
10303 				rval = COMMAND_DONE_ERROR;
10304 			}
10305 			severity = SCSI_ERR_INFO;
10306 
10307 		} else {
10308 			/*
10309 			 * Check if it is an Unexpected Unit Attention.
10310 			 * If state is >= ST_STATE_OPEN, we have
10311 			 * already done the initialization .
10312 			 * In this case it is Fatal Error
10313 			 * since no further reading/writing
10314 			 * can be done with fileno set to < 0.
10315 			 */
10316 			if (un->un_state >= ST_STATE_OPEN) {
10317 				ST_DO_ERRSTATS(un, st_harderrs);
10318 				severity = SCSI_ERR_FATAL;
10319 			} else {
10320 				severity = SCSI_ERR_INFO;
10321 			}
10322 			rval = COMMAND_DONE_ERROR;
10323 		}
10324 		un->un_pos.pmode = invalid;
10325 
10326 		break;
10327 
10328 	case KEY_NOT_READY:
10329 		/*
10330 		 * If in process of getting ready retry.
10331 		 */
10332 		if (sensep->es_add_code  == 0x04 &&
10333 		    sensep->es_qual_code == 0x01 &&
10334 		    un->un_retry_ct++ < st_retry_count) {
10335 			rval = QUE_COMMAND;
10336 			severity = SCSI_ERR_INFO;
10337 		} else {
10338 			/* give up */
10339 			rval = COMMAND_DONE_ERROR;
10340 			severity = SCSI_ERR_FATAL;
10341 		}
10342 
10343 		/*
10344 		 * If this was an error and after device opened
10345 		 * do error stats.
10346 		 */
10347 		if (rval == COMMAND_DONE_ERROR &&
10348 		    un->un_state > ST_STATE_OPENING) {
10349 			ST_DO_ERRSTATS(un, st_harderrs);
10350 		}
10351 
10352 		if (ST_RQSENSE->es_add_code == 0x3a) {
10353 			if (st_error_level >= SCSI_ERR_FATAL)
10354 				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
10355 				    "Tape not inserted in drive\n");
10356 			un->un_mediastate = MTIO_EJECTED;
10357 			cv_broadcast(&un->un_state_cv);
10358 		}
10359 		if ((un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) &&
10360 		    (rval != QUE_COMMAND))
10361 			un->un_eject_tape_on_failure = st_check_asc_ascq(un);
10362 		break;
10363 
10364 	case KEY_ABORTED_COMMAND:
10365 
10366 		/*
10367 		 * Probably a parity error...
10368 		 * if we retry here then this may cause data to be
10369 		 * written twice or data skipped during reading
10370 		 */
10371 		ST_DO_ERRSTATS(un, st_harderrs);
10372 		severity = SCSI_ERR_FATAL;
10373 		rval = COMMAND_DONE_ERROR;
10374 		goto check_keys;
10375 
10376 	default:
10377 		/*
10378 		 * Undecoded sense key.	 Try retries and hope
10379 		 * that will fix the problem.  Otherwise, we're
10380 		 * dead.
10381 		 */
10382 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10383 		    "Unhandled Sense Key '%s'\n",
10384 		    sense_keys[un->un_status]);
10385 		ST_DO_ERRSTATS(un, st_harderrs);
10386 		severity = SCSI_ERR_FATAL;
10387 		rval = COMMAND_DONE_ERROR;
10388 		goto check_keys;
10389 	}
10390 
10391 	if ((!(pkt->pkt_flags & FLAG_SILENT) &&
10392 	    un->un_state >= ST_STATE_OPEN) && (DEBUGGING ||
10393 	    (un->un_laststate > ST_STATE_OPENING) &&
10394 	    (severity >= st_error_level))) {
10395 
10396 		scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity,
10397 		    un->un_pos.lgclblkno, un->un_err_pos.lgclblkno,
10398 		    scsi_cmds, sensep);
10399 		if (sensep->es_filmk) {
10400 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10401 			    "File Mark Detected\n");
10402 		}
10403 		if (sensep->es_eom) {
10404 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10405 			    "End-of-Media Detected\n");
10406 		}
10407 		if (sensep->es_ili) {
10408 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10409 			    "Incorrect Length Indicator Set\n");
10410 		}
10411 	}
10412 	get_error = geterror(bp);
10413 	if (((rval == COMMAND_DONE_ERROR) ||
10414 	    (rval == COMMAND_DONE_ERROR_RECOVERED)) &&
10415 	    ((get_error == EIO) || (get_error == 0))) {
10416 		un->un_rqs_state |= (ST_RQS_ERROR | ST_RQS_VALID);
10417 		bcopy(ST_RQSENSE, un->un_uscsi_rqs_buf, SENSE_LENGTH);
10418 		if (un->un_rqs_state & ST_RQS_READ) {
10419 			un->un_rqs_state &= ~(ST_RQS_READ);
10420 		} else {
10421 			un->un_rqs_state |= ST_RQS_OVR;
10422 		}
10423 	}
10424 
10425 	return (rval);
10426 }
10427 
10428 
10429 static int
10430 st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp)
10431 {
10432 	int status = TRAN_ACCEPT;
10433 
10434 	mutex_enter(ST_MUTEX);
10435 
10436 	ST_FUNC(ST_DEVINFO, st_handle_intr_retry_lcmd);
10437 
10438 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10439 	    "st_handle_intr_rtr_lcmd(), un = 0x%p\n", (void *)un);
10440 
10441 	/*
10442 	 * Check to see if we hit the retry timeout. We check to make sure
10443 	 * this is the first one on the runq and make sure we have not
10444 	 * queued up any more, so this one has to be the last on the list
10445 	 * also. If it is not, we have to fail.  If it is not the first, but
10446 	 * is the last we are in trouble anyway, as we are in the interrupt
10447 	 * context here.
10448 	 */
10449 	if (((int)un->un_retry_ct > st_retry_count) ||
10450 	    ((un->un_runqf != bp) && (un->un_runql != bp))) {
10451 		goto exit;
10452 	}
10453 
10454 	if (un->un_throttle) {
10455 		un->un_last_throttle = un->un_throttle;
10456 		un->un_throttle = 0;
10457 	}
10458 
10459 	/*
10460 	 * Here we know : bp is the first and last one on the runq
10461 	 * it is not necessary to put it back on the head of the
10462 	 * waitq and then move from waitq to runq. Save this queuing
10463 	 * and call scsi_transport.
10464 	 */
10465 
10466 	mutex_exit(ST_MUTEX);
10467 
10468 	status = scsi_transport(BP_PKT(bp));
10469 
10470 	mutex_enter(ST_MUTEX);
10471 
10472 	if (status == TRAN_ACCEPT) {
10473 		un->un_tran_retry_ct = 0;
10474 		if (un->un_last_throttle) {
10475 			un->un_throttle = un->un_last_throttle;
10476 		}
10477 		mutex_exit(ST_MUTEX);
10478 
10479 		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10480 		    "restart transport \n");
10481 		return (0);
10482 	}
10483 
10484 	ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
10485 	mutex_exit(ST_MUTEX);
10486 
10487 	if (status == TRAN_BUSY) {
10488 		if (st_handle_intr_busy(un, bp, ST_TRAN_BUSY_TIMEOUT) == 0) {
10489 			return (0);
10490 		}
10491 	}
10492 	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10493 	    "restart transport rejected\n");
10494 	mutex_enter(ST_MUTEX);
10495 	ST_DO_ERRSTATS(un, st_transerrs);
10496 	if (un->un_last_throttle) {
10497 		un->un_throttle = un->un_last_throttle;
10498 	}
10499 exit:
10500 	mutex_exit(ST_MUTEX);
10501 	return (-1);
10502 }
10503 
10504 static int
10505 st_wrongtapetype(struct scsi_tape *un)
10506 {
10507 
10508 	ST_FUNC(ST_DEVINFO, st_wrongtapetype);
10509 
10510 	ASSERT(mutex_owned(ST_MUTEX));
10511 
10512 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_wrongtapetype()\n");
10513 
10514 	/*
10515 	 * Hack to handle  600A, 600XTD, 6150 && 660 vs. 300XL tapes...
10516 	 */
10517 	if (un->un_dp && (un->un_dp->options & ST_QIC) && un->un_mspl) {
10518 		switch (un->un_dp->type) {
10519 		case ST_TYPE_WANGTEK:
10520 		case ST_TYPE_ARCHIVE:
10521 			/*
10522 			 * If this really worked, we could go off of
10523 			 * the density codes set in the modesense
10524 			 * page. For this drive, 0x10 == QIC-120,
10525 			 * 0xf == QIC-150, and 0x5 should be for
10526 			 * both QIC-24 and, maybe, QIC-11. However,
10527 			 * the h/w doesn't do what the manual says
10528 			 * that it should, so we'll key off of
10529 			 * getting a WRITE PROTECT error AND wp *not*
10530 			 * set in the mode sense information.
10531 			 */
10532 			/*
10533 			 * XXX but we already know that status is
10534 			 * write protect, so don't check it again.
10535 			 */
10536 
10537 			if (un->un_status == KEY_WRITE_PROTECT &&
10538 			    un->un_mspl->wp == 0) {
10539 				return (1);
10540 			}
10541 			break;
10542 		default:
10543 			break;
10544 		}
10545 	}
10546 	return (0);
10547 }
10548 
10549 static int
10550 st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt)
10551 {
10552 	int action;
10553 
10554 	ST_FUNC(ST_DEVINFO, st_check_error);
10555 
10556 	ASSERT(mutex_owned(ST_MUTEX));
10557 
10558 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_error()\n");
10559 
10560 	if (SCBP_C(pkt) == STATUS_RESERVATION_CONFLICT) {
10561 		action = COMMAND_DONE_EACCES;
10562 		un->un_rsvd_status |= ST_RESERVATION_CONFLICT;
10563 	} else if (SCBP(pkt)->sts_busy) {
10564 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, "unit busy\n");
10565 		if ((int)un->un_retry_ct++ < st_retry_count) {
10566 			action = QUE_BUSY_COMMAND;
10567 		} else if ((un->un_rsvd_status &
10568 		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
10569 			/*
10570 			 * If this is a command done before reserve is done
10571 			 * don't reset.
10572 			 */
10573 			action = COMMAND_DONE_ERROR;
10574 		} else {
10575 			ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN,
10576 			    "unit busy too long\n");
10577 			mutex_exit(ST_MUTEX);
10578 			if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
10579 				(void) scsi_reset(ROUTE, RESET_ALL);
10580 			}
10581 			mutex_enter(ST_MUTEX);
10582 			action = COMMAND_DONE_ERROR;
10583 		}
10584 	} else if (SCBP(pkt)->sts_chk) {
10585 		/*
10586 		 * we should only get here if the auto rqsense failed
10587 		 * thru a uscsi cmd without autorequest sense
10588 		 * so we just try again
10589 		 */
10590 		action = QUE_SENSE;
10591 	} else {
10592 		action = COMMAND_DONE;
10593 	}
10594 	return (action);
10595 }
10596 
10597 static void
10598 st_calc_bnum(struct scsi_tape *un, struct buf *bp)
10599 {
10600 	int nblks;
10601 
10602 	ST_FUNC(ST_DEVINFO, st_calc_bnum);
10603 
10604 	ASSERT(mutex_owned(ST_MUTEX));
10605 
10606 	/* If variable block mode */
10607 	if (un->un_bsize == 0) {
10608 		nblks = ((bp->b_bcount - bp->b_resid  == 0) ? 0 : 1);
10609 		un->un_kbytes_xferred += (bp->b_bcount - bp->b_resid) / ONE_K;
10610 	} else {
10611 		nblks = ((bp->b_bcount - bp->b_resid) / un->un_bsize);
10612 		un->un_kbytes_xferred += (nblks * un->un_bsize) / ONE_K;
10613 	}
10614 	un->un_pos.blkno += nblks;
10615 	un->un_pos.lgclblkno += nblks;
10616 }
10617 
10618 static void
10619 st_set_state(struct scsi_tape *un)
10620 {
10621 	struct buf *bp = un->un_runqf;
10622 	struct scsi_pkt *sp = BP_PKT(bp);
10623 	struct uscsi_cmd *ucmd;
10624 
10625 	ST_FUNC(ST_DEVINFO, st_set_state);
10626 
10627 	ASSERT(mutex_owned(ST_MUTEX));
10628 
10629 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10630 	    "st_set_state(): eof=%x	fmneeded=%x  pkt_resid=0x%lx (%ld)\n",
10631 	    un->un_pos.eof, un->un_fmneeded, sp->pkt_resid, sp->pkt_resid);
10632 
10633 	if (bp != un->un_sbufp) {
10634 #ifdef STDEBUG
10635 		if (DEBUGGING && sp->pkt_resid) {
10636 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10637 			    "pkt_resid %ld bcount %ld\n",
10638 			    sp->pkt_resid, bp->b_bcount);
10639 		}
10640 #endif
10641 		bp->b_resid = sp->pkt_resid;
10642 		st_calc_bnum(un, bp);
10643 		if (bp->b_flags & B_READ) {
10644 			un->un_lastop = ST_OP_READ;
10645 			un->un_fmneeded = 0;
10646 		} else {
10647 			un->un_lastop = ST_OP_WRITE;
10648 			if (un->un_dp->options & ST_REEL) {
10649 				un->un_fmneeded = 2;
10650 			} else {
10651 				un->un_fmneeded = 1;
10652 			}
10653 		}
10654 		/*
10655 		 * all is honky dory at this point, so let's
10656 		 * readjust the throttle, to increase speed, if we
10657 		 * have not throttled down.
10658 		 */
10659 		if (un->un_throttle) {
10660 			un->un_throttle = un->un_max_throttle;
10661 		}
10662 	} else {
10663 		optype new_lastop;
10664 		uchar_t cmd = (uchar_t)(intptr_t)bp->b_forw;
10665 
10666 		un->un_lastop = ST_OP_CTL;
10667 
10668 		switch (cmd) {
10669 		case SCMD_WRITE:
10670 			bp->b_resid = sp->pkt_resid;
10671 			new_lastop = ST_OP_WRITE;
10672 			st_calc_bnum(un, bp);
10673 			if (un->un_dp->options & ST_REEL) {
10674 				un->un_fmneeded = 2;
10675 			} else {
10676 				un->un_fmneeded = 1;
10677 			}
10678 			break;
10679 		case SCMD_READ:
10680 			bp->b_resid = sp->pkt_resid;
10681 			new_lastop = ST_OP_READ;
10682 			st_calc_bnum(un, bp);
10683 			un->un_fmneeded = 0;
10684 			break;
10685 		case SCMD_WRITE_FILE_MARK:
10686 		{
10687 			int fmdone;
10688 
10689 			if (un->un_pos.eof != ST_EOM) {
10690 				un->un_pos.eof = ST_NO_EOF;
10691 			}
10692 			fmdone = (bp->b_bcount - bp->b_resid);
10693 			if (fmdone > 0) {
10694 				un->un_lastop = new_lastop = ST_OP_WEOF;
10695 				un->un_pos.lgclblkno += fmdone;
10696 				un->un_pos.fileno += fmdone;
10697 				un->un_pos.blkno = 0;
10698 			} else {
10699 				new_lastop = ST_OP_CTL;
10700 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
10701 				    "Flushed buffer\n");
10702 			}
10703 			if (fmdone > un->un_fmneeded) {
10704 				un->un_fmneeded = 0;
10705 			} else {
10706 				un->un_fmneeded -= fmdone;
10707 			}
10708 			break;
10709 		}
10710 		case SCMD_REWIND:
10711 			un->un_pos.eof = ST_NO_EOF;
10712 			un->un_pos.fileno = 0;
10713 			un->un_pos.blkno = 0;
10714 			un->un_pos.lgclblkno = 0;
10715 			un->un_pos.pmode = legacy;
10716 			new_lastop = ST_OP_CTL;
10717 			break;
10718 
10719 		case SCMD_SPACE:
10720 		{
10721 			int count;
10722 			long resid;
10723 			int done;
10724 
10725 			count = (int)SPACE_CNT(bp->b_bcount);
10726 			/* if was a uscsi space cmd b_bcount == 0 */
10727 			if (count == 0) {
10728 				count =
10729 				    (sp->pkt_cdbp[2] << 16) |
10730 				    (sp->pkt_cdbp[3] << 8)  |
10731 				    (sp->pkt_cdbp[4]);
10732 			}
10733 			resid = (long)SPACE_CNT(bp->b_resid);
10734 			if (count >= 0) {
10735 				done = (count - resid);
10736 			} else {
10737 				done = ((-count) - resid);
10738 			}
10739 			if (done > 0) {
10740 				un->un_lastop = new_lastop = ST_OP_CTL;
10741 			} else {
10742 				new_lastop = ST_OP_CTL;
10743 			}
10744 
10745 			ST_SPAC(ST_DEVINFO, st_label, SCSI_DEBUG,
10746 			    "space cmd: cdb[1] = %s\n"
10747 			    "space data:       = 0x%lx\n"
10748 			    "space count:      = %d\n"
10749 			    "space resid:      = %ld\n"
10750 			    "spaces done:      = %d\n"
10751 			    "fileno before     = %d\n"
10752 			    "blkno before      = %d\n",
10753 			    space_strs[sp->pkt_cdbp[1] & 7],
10754 			    bp->b_bcount,
10755 			    count, resid, done,
10756 			    un->un_pos.fileno, un->un_pos.blkno);
10757 
10758 			switch (sp->pkt_cdbp[1]) {
10759 			case SPACE_TYPE(SP_FLM):
10760 				/* Space file forward */
10761 				if (count >= 0) {
10762 					if (un->un_pos.eof <= ST_EOF) {
10763 						un->un_pos.eof = ST_NO_EOF;
10764 					}
10765 					un->un_pos.fileno += done;
10766 					un->un_pos.blkno = 0;
10767 					break;
10768 				}
10769 				/* Space file backward */
10770 				if (done > un->un_pos.fileno) {
10771 					un->un_pos.fileno = 0;
10772 					un->un_pos.blkno = 0;
10773 				} else {
10774 					un->un_pos.fileno -= done;
10775 					un->un_pos.blkno = INF;
10776 				}
10777 				break;
10778 			case SPACE_TYPE(SP_BLK):
10779 				/* Space block forward */
10780 				if (count >= 0) {
10781 					un->un_pos.blkno += done;
10782 					break;
10783 				}
10784 				/* Space block backward */
10785 				if (un->un_pos.eof >= ST_EOF_PENDING) {
10786 				/*
10787 				 * we stepped back into
10788 				 * a previous file; we are not
10789 				 * making an effort to pretend that
10790 				 * we are still in the current file
10791 				 * ie. logical == physical position
10792 				 * and leave it to st_ioctl to correct
10793 				 */
10794 					if (done > un->un_pos.blkno) {
10795 						un->un_pos.blkno = 0;
10796 					} else {
10797 						un->un_pos.fileno--;
10798 						un->un_pos.blkno = INF;
10799 					}
10800 				} else {
10801 					un->un_pos.blkno -= done;
10802 				}
10803 				break;
10804 			case SPACE_TYPE(SP_SQFLM):
10805 				un->un_pos.pmode = logical;
10806 				un->un_pos.blkno = 0;
10807 				un->un_lastop = new_lastop = ST_OP_CTL;
10808 				break;
10809 			case SPACE_TYPE(SP_EOD):
10810 				un->un_pos.pmode = logical;
10811 				un->un_pos.eof = ST_EOM;
10812 				un->un_status = KEY_BLANK_CHECK;
10813 				break;
10814 			default:
10815 				un->un_pos.pmode = invalid;
10816 				scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
10817 				    "Unsupported space cmd: %s\n",
10818 				    space_strs[sp->pkt_cdbp[1] & 7]);
10819 
10820 				un->un_lastop = new_lastop = ST_OP_CTL;
10821 			}
10822 
10823 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10824 			    "after_space rs %ld fil %d blk %d\n",
10825 			    resid, un->un_pos.fileno, un->un_pos.blkno);
10826 
10827 			break;
10828 		}
10829 		case SCMD_LOAD:
10830 			if ((bp->b_bcount & (LD_LOAD | LD_EOT)) == LD_LOAD) {
10831 				un->un_pos.fileno = 0;
10832 				un->un_pos.pmode = legacy;
10833 			} else {
10834 				un->un_state = ST_STATE_OFFLINE;
10835 				un->un_pos.pmode = invalid;
10836 			}
10837 			un->un_density_known = 0;
10838 			un->un_pos.eof = ST_NO_EOF;
10839 			un->un_pos.blkno = 0;
10840 			un->un_lastop = new_lastop = ST_OP_CTL;
10841 			break;
10842 		case SCMD_ERASE:
10843 			un->un_pos.eof = ST_NO_EOF;
10844 			un->un_pos.blkno = 0;
10845 			un->un_pos.fileno = 0;
10846 			un->un_pos.lgclblkno = 0;
10847 			un->un_pos.pmode = legacy;
10848 			new_lastop = ST_OP_CTL;
10849 			break;
10850 		case SCMD_RESERVE:
10851 			un->un_rsvd_status |= ST_RESERVE;
10852 			un->un_rsvd_status &=
10853 			    ~(ST_RELEASE | ST_LOST_RESERVE |
10854 			    ST_RESERVATION_CONFLICT);
10855 			new_lastop = un->un_lastop;
10856 			break;
10857 		case SCMD_RELEASE:
10858 			un->un_rsvd_status |= ST_RELEASE;
10859 			un->un_rsvd_status &=
10860 			    ~(ST_RESERVE | ST_LOST_RESERVE |
10861 			    ST_RESERVATION_CONFLICT);
10862 			new_lastop = ST_OP_CTL;
10863 			break;
10864 		case SCMD_PERSISTENT_RESERVE_IN:
10865 			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10866 			    "PGR_IN command\n");
10867 			break;
10868 		case SCMD_PERSISTENT_RESERVE_OUT:
10869 			switch (sp->pkt_cdbp[1] & ST_SA_MASK) {
10870 			case ST_SA_SCSI3_RESERVE:
10871 			case ST_SA_SCSI3_PREEMPT:
10872 			case ST_SA_SCSI3_PREEMPTANDABORT:
10873 				un->un_rsvd_status |=
10874 				    ST_APPLICATION_RESERVATIONS;
10875 				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10876 				    "PGR Reserve and set: entering"
10877 				    " ST_APPLICATION_RESERVATIONS mode");
10878 				break;
10879 			case ST_SA_SCSI3_RELEASE:
10880 			case ST_SA_SCSI3_CLEAR:
10881 				un->un_rsvd_status &=
10882 				    ~ST_APPLICATION_RESERVATIONS;
10883 				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10884 				    "PGR Release and reset: exiting"
10885 				    " ST_APPLICATION_RESERVATIONS mode");
10886 				break;
10887 			}
10888 			break;
10889 		case SCMD_TEST_UNIT_READY:
10890 		case SCMD_READ_BLKLIM:
10891 		case SCMD_REQUEST_SENSE:
10892 		case SCMD_INQUIRY:
10893 		case SCMD_RECOVER_BUF:
10894 		case SCMD_MODE_SELECT:
10895 		case SCMD_MODE_SENSE:
10896 		case SCMD_DOORLOCK:
10897 		case SCMD_READ_BUFFER:
10898 		case SCMD_REPORT_DENSITIES:
10899 		case SCMD_LOG_SELECT_G1:
10900 		case SCMD_LOG_SENSE_G1:
10901 		case SCMD_REPORT_LUNS:
10902 		case SCMD_READ_ATTRIBUTE:
10903 		case SCMD_READ_MEDIA_SERIAL:
10904 			new_lastop = ST_OP_CTL;
10905 			break;
10906 		case SCMD_READ_POSITION:
10907 			new_lastop = ST_OP_CTL;
10908 			if (USCSI_CMD(bp)) {
10909 				(void) st_get_read_pos(un, bp);
10910 			}
10911 			break;
10912 		case SCMD_LOCATE:
10913 		case SCMD_LOCATE_G4:
10914 			/* Locate makes position mode no longer legacy */
10915 			un->un_lastop = new_lastop = ST_OP_CTL;
10916 			break;
10917 		default:
10918 			/*
10919 			 * Unknown command, If was USCSI and USCSI_SILENT
10920 			 * flag was not set, set position to unknown.
10921 			 */
10922 			if ((((ucmd = BP_UCMD(bp)) != NULL) &&
10923 			    (ucmd->uscsi_flags & USCSI_SILENT) == 0)) {
10924 				ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN,
10925 				    "unknown cmd 0x%X caused loss of state\n",
10926 				    cmd);
10927 			} else {
10928 				break;
10929 			}
10930 			/* FALLTHROUGH */
10931 		case SCMD_WRITE_BUFFER: /* Writes new firmware to device */
10932 			un->un_pos.pmode = invalid;
10933 			un->un_lastop = new_lastop = ST_OP_CTL;
10934 			break;
10935 		}
10936 
10937 		/* new_lastop should have been changed */
10938 		ASSERT(new_lastop != ST_OP_NIL);
10939 
10940 		/* If un_lastop should copy new_lastop  */
10941 		if (((un->un_lastop == ST_OP_WRITE) ||
10942 		    (un->un_lastop == ST_OP_WEOF)) &&
10943 		    new_lastop != ST_OP_CTL) {
10944 			un->un_lastop = new_lastop;
10945 		}
10946 	}
10947 
10948 	/*
10949 	 * In the st driver we have a logical and physical file position.
10950 	 * Under BSD behavior, when you get a zero read, the logical position
10951 	 * is before the filemark but after the last record of the file.
10952 	 * The physical position is after the filemark. MTIOCGET should always
10953 	 * return the logical file position.
10954 	 *
10955 	 * The next read gives a silent skip to the next file.
10956 	 * Under SVR4, the logical file position remains before the filemark
10957 	 * until the file is closed or a space operation is performed.
10958 	 * Hence set err_resid and err_file before changing fileno if case
10959 	 * BSD Behaviour.
10960 	 */
10961 	un->un_err_resid = bp->b_resid;
10962 	COPY_POS(&un->un_err_pos, &un->un_pos);
10963 	un->un_retry_ct = 0;
10964 
10965 
10966 	/*
10967 	 * If we've seen a filemark via the last read operation
10968 	 * advance the file counter, but mark things such that
10969 	 * the next read operation gets a zero count. We have
10970 	 * to put this here to handle the case of sitting right
10971 	 * at the end of a tape file having seen the file mark,
10972 	 * but the tape is closed and then re-opened without
10973 	 * any further i/o. That is, the position information
10974 	 * must be updated before a close.
10975 	 */
10976 
10977 	if (un->un_lastop == ST_OP_READ && un->un_pos.eof == ST_EOF_PENDING) {
10978 		/*
10979 		 * If we're a 1/2" tape, and we get a filemark
10980 		 * right on block 0, *AND* we were not in the
10981 		 * first file on the tape, and we've hit logical EOM.
10982 		 * We'll mark the state so that later we do the
10983 		 * right thing (in st_close(), st_strategy() or
10984 		 * st_ioctl()).
10985 		 *
10986 		 */
10987 		if ((un->un_dp->options & ST_REEL) &&
10988 		    !(un->un_dp->options & ST_READ_IGNORE_EOFS) &&
10989 		    un->un_pos.blkno == 0 && un->un_pos.fileno > 0) {
10990 			un->un_pos.eof = ST_EOT_PENDING;
10991 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10992 			    "eot pending\n");
10993 			un->un_pos.fileno++;
10994 			un->un_pos.blkno = 0;
10995 		} else if (BSD_BEHAVIOR) {
10996 			/*
10997 			 * If the read of the filemark was a side effect
10998 			 * of reading some blocks (i.e., data was actually
10999 			 * read), then the EOF mark is pending and the
11000 			 * bump into the next file awaits the next read
11001 			 * operation (which will return a zero count), or
11002 			 * a close or a space operation, else the bump
11003 			 * into the next file occurs now.
11004 			 */
11005 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
11006 			    "resid=%lx, bcount=%lx\n",
11007 			    bp->b_resid, bp->b_bcount);
11008 
11009 			if (bp->b_resid != bp->b_bcount) {
11010 				un->un_pos.eof = ST_EOF;
11011 			} else {
11012 				un->un_silent_skip = 1;
11013 				un->un_pos.eof = ST_NO_EOF;
11014 				un->un_pos.fileno++;
11015 				un->un_pos.lgclblkno++;
11016 				un->un_save_blkno = un->un_pos.blkno;
11017 				un->un_pos.blkno = 0;
11018 			}
11019 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
11020 			    "eof of file %d, eof=%d\n",
11021 			    un->un_pos.fileno, un->un_pos.eof);
11022 		} else if (SVR4_BEHAVIOR) {
11023 			/*
11024 			 * If the read of the filemark was a side effect
11025 			 * of reading some blocks (i.e., data was actually
11026 			 * read), then the next read should return 0
11027 			 */
11028 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
11029 			    "resid=%lx, bcount=%lx\n",
11030 			    bp->b_resid, bp->b_bcount);
11031 			if (bp->b_resid == bp->b_bcount) {
11032 				un->un_pos.eof = ST_EOF;
11033 			}
11034 			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
11035 			    "eof of file=%d, eof=%d\n",
11036 			    un->un_pos.fileno, un->un_pos.eof);
11037 		}
11038 	}
11039 }
11040 
11041 /*
11042  * set the correct un_errno, to take corner cases into consideration
11043  */
11044 static void
11045 st_set_pe_errno(struct scsi_tape *un)
11046 {
11047 	ST_FUNC(ST_DEVINFO, st_set_pe_errno);
11048 
11049 	ASSERT(mutex_owned(ST_MUTEX));
11050 
11051 	/* if errno is already set, don't reset it */
11052 	if (un->un_errno)
11053 		return;
11054 
11055 	/* here un_errno == 0 */
11056 	/*
11057 	 * if the last transfer before flushing all the
11058 	 * waiting I/O's, was 0 (resid = count), then we
11059 	 * want to give the user an error on all the rest,
11060 	 * so here.  If there was a transfer, we set the
11061 	 * resid and counts to 0, and let it drop through,
11062 	 * giving a zero return.  the next I/O will then
11063 	 * give an error.
11064 	 */
11065 	if (un->un_last_resid == un->un_last_count) {
11066 		switch (un->un_pos.eof) {
11067 		case ST_EOM:
11068 			un->un_errno = ENOMEM;
11069 			break;
11070 		case ST_EOT:
11071 		case ST_EOF:
11072 			un->un_errno = EIO;
11073 			break;
11074 		}
11075 	} else {
11076 		/*
11077 		 * we know they did not have a zero, so make
11078 		 * sure they get one
11079 		 */
11080 		un->un_last_resid = un->un_last_count = 0;
11081 	}
11082 }
11083 
11084 
11085 /*
11086  * send in a marker pkt to terminate flushing of commands by BBA (via
11087  * flush-on-errors) property.  The HBA will always return TRAN_ACCEPT
11088  */
11089 static void
11090 st_hba_unflush(struct scsi_tape *un)
11091 {
11092 	ST_FUNC(ST_DEVINFO, st_hba_unflush);
11093 
11094 	ASSERT(mutex_owned(ST_MUTEX));
11095 
11096 	if (!un->un_flush_on_errors)
11097 		return;
11098 
11099 #ifdef FLUSH_ON_ERRORS
11100 
11101 	if (!un->un_mkr_pkt) {
11102 		un->un_mkr_pkt = scsi_init_pkt(ROUTE, NULL, (struct buf *)NULL,
11103 		    NULL, 0, 0, 0, SLEEP_FUNC, NULL);
11104 
11105 		/* we slept, so it must be there */
11106 		pkt->pkt_flags |= FLAG_FLUSH_MARKER;
11107 	}
11108 
11109 	mutex_exit(ST_MUTEX);
11110 	scsi_transport(un->un_mkr_pkt);
11111 	mutex_enter(ST_MUTEX);
11112 #endif
11113 }
11114 
11115 static char *
11116 st_print_scsi_cmd(char cmd)
11117 {
11118 	char tmp[64];
11119 	char *cpnt;
11120 
11121 	cpnt = scsi_cmd_name(cmd, scsi_cmds, tmp);
11122 	/* tmp goes out of scope on return and caller sees garbage */
11123 	if (cpnt == tmp) {
11124 		cpnt = "Unknown Command";
11125 	}
11126 	return (cpnt);
11127 }
11128 
11129 static void
11130 st_print_cdb(dev_info_t *dip, char *label, uint_t level,
11131     char *title, char *cdb)
11132 {
11133 	int len = scsi_cdb_size[CDB_GROUPID(cdb[0])];
11134 	char buf[256];
11135 	int instance = ddi_get_instance(dip);
11136 	struct scsi_tape *un;
11137 
11138 	un = ddi_get_soft_state(st_state, instance);
11139 
11140 	ST_FUNC(dip, st_print_cdb);
11141 
11142 #ifdef DEBUG
11143 	if ((st_debug & 0x180) == 0x100) {
11144 		scsi_log(dip, label, level, "node %s cmd %s\n",
11145 		    st_dev_name(un->un_dev), st_print_scsi_cmd(*cdb));
11146 		return;
11147 	}
11148 #endif
11149 	(void) sprintf(buf, "%s for cmd(%s)", title, st_print_scsi_cmd(*cdb));
11150 	st_clean_print(dip, label, level, buf, cdb, len);
11151 }
11152 
11153 static void
11154 st_clean_print(dev_info_t *dev, char *label, uint_t level,
11155     char *title, char *data, int len)
11156 {
11157 	int	i;
11158 	int 	c;
11159 	char	*format;
11160 	char	buf[256];
11161 	uchar_t	byte;
11162 
11163 	ST_FUNC(dev, st_clean_print);
11164 
11165 	(void) sprintf(buf, "%s:\n", title);
11166 	scsi_log(dev, label, level, "%s", buf);
11167 	level = CE_CONT;
11168 	for (i = 0; i < len; ) {
11169 		buf[0] = 0;
11170 		for (c = 0; c < 8 && i < len; c++, i++) {
11171 			byte = (uchar_t)data[i];
11172 			if (byte < 0x10)
11173 				format = "0x0%x ";
11174 			else
11175 				format = "0x%x ";
11176 			(void) sprintf(&buf[(int)strlen(buf)], format, byte);
11177 		}
11178 		(void) sprintf(&buf[(int)strlen(buf)], "\n");
11179 
11180 		scsi_log(dev, label, level, "%s\n", buf);
11181 	}
11182 }
11183 
11184 /*
11185  * Conditionally enabled debugging
11186  */
11187 #ifdef	STDEBUG
11188 static void
11189 st_debug_cmds(struct scsi_tape *un, int com, int count, int wait)
11190 {
11191 	char tmpbuf[64];
11192 
11193 	ST_FUNC(ST_DEVINFO, st_debug_cmds);
11194 
11195 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11196 	    "cmd=%s count=0x%x (%d)	 %ssync\n",
11197 	    scsi_cmd_name(com, scsi_cmds, tmpbuf),
11198 	    count, count,
11199 	    wait == ASYNC_CMD ? "a" : "");
11200 }
11201 
11202 /*
11203  * Returns pointer to name of minor node name of device 'dev'.
11204  */
11205 static char *
11206 st_dev_name(dev_t dev)
11207 {
11208 	struct scsi_tape *un;
11209 	const char density[] = { 'l', 'm', 'h', 'c' };
11210 	static char name[4];
11211 	minor_t minor;
11212 	int instance;
11213 	int nprt = 0;
11214 
11215 	minor = getminor(dev);
11216 	instance = ((minor & 0xff80) >> 5) | (minor & 3);
11217 	un = ddi_get_soft_state(st_state, instance);
11218 	if (un) {
11219 		ST_FUNC(ST_DEVINFO, st_dev_name);
11220 	}
11221 
11222 	name[nprt] = density[(minor & MT_DENSITY_MASK) >> 3];
11223 
11224 	if (minor & MT_BSD) {
11225 		name[++nprt] = 'b';
11226 	}
11227 
11228 	if (minor & MT_NOREWIND) {
11229 		name[++nprt] = 'n';
11230 	}
11231 
11232 	/* NULL terminator */
11233 	name[++nprt] = 0;
11234 
11235 	return (name);
11236 }
11237 #endif	/* STDEBUG */
11238 
11239 /*
11240  * Soft error reporting, so far unique to each drive
11241  *
11242  * Currently supported: exabyte and DAT soft error reporting
11243  */
11244 static int
11245 st_report_exabyte_soft_errors(dev_t dev, int flag)
11246 {
11247 	uchar_t *sensep;
11248 	int amt;
11249 	int rval = 0;
11250 	char cdb[CDB_GROUP0], *c = cdb;
11251 	struct uscsi_cmd *com;
11252 
11253 	GET_SOFT_STATE(dev);
11254 
11255 	ST_FUNC(ST_DEVINFO, st_report_exabyte_soft_errors);
11256 
11257 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11258 	    "st_report_exabyte_soft_errors(dev = 0x%lx, flag = %d)\n",
11259 	    dev, flag);
11260 
11261 	ASSERT(mutex_owned(ST_MUTEX));
11262 
11263 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
11264 	sensep = kmem_zalloc(TAPE_SENSE_LENGTH, KM_SLEEP);
11265 
11266 	*c++ = SCMD_REQUEST_SENSE;
11267 	*c++ = 0;
11268 	*c++ = 0;
11269 	*c++ = 0;
11270 	*c++ = TAPE_SENSE_LENGTH;
11271 	/*
11272 	 * set CLRCNT (byte 5, bit 7 which clears the error counts)
11273 	 */
11274 	*c   = (char)0x80;
11275 
11276 	com->uscsi_cdb = cdb;
11277 	com->uscsi_cdblen = CDB_GROUP0;
11278 	com->uscsi_bufaddr = (caddr_t)sensep;
11279 	com->uscsi_buflen = TAPE_SENSE_LENGTH;
11280 	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
11281 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11282 
11283 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
11284 	if (rval || com->uscsi_status) {
11285 		goto done;
11286 	}
11287 
11288 	/*
11289 	 * was there enough data?
11290 	 */
11291 	amt = (int)TAPE_SENSE_LENGTH - com->uscsi_resid;
11292 
11293 	if ((amt >= 19) && un->un_kbytes_xferred) {
11294 		uint_t count, error_rate;
11295 		uint_t rate;
11296 
11297 		if (sensep[21] & CLN) {
11298 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
11299 			    "Periodic head cleaning required");
11300 		}
11301 		if (un->un_kbytes_xferred < (EXABYTE_MIN_TRANSFER/ONE_K)) {
11302 			goto done;
11303 		}
11304 		/*
11305 		 * check if soft error reporting needs to be done.
11306 		 */
11307 		count = sensep[16] << 16 | sensep[17] << 8 | sensep[18];
11308 		count &= 0xffffff;
11309 		error_rate = (count * 100)/un->un_kbytes_xferred;
11310 
11311 #ifdef	STDEBUG
11312 		if (st_soft_error_report_debug) {
11313 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
11314 			    "Exabyte Soft Error Report:\n");
11315 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
11316 			    "read/write error counter: %d\n", count);
11317 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
11318 			    "number of bytes transferred: %dK\n",
11319 			    un->un_kbytes_xferred);
11320 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
11321 			    "error_rate: %d%%\n", error_rate);
11322 
11323 			if (amt >= 22) {
11324 				scsi_log(ST_DEVINFO, st_label, CE_CONT,
11325 				    "unit sense: 0x%b 0x%b 0x%b\n",
11326 				    sensep[19], SENSE_19_BITS,
11327 				    sensep[20], SENSE_20_BITS,
11328 				    sensep[21], SENSE_21_BITS);
11329 			}
11330 			if (amt >= 27) {
11331 				scsi_log(ST_DEVINFO, st_label, CE_CONT,
11332 				    "tracking retry counter: %d\n",
11333 				    sensep[26]);
11334 				scsi_log(ST_DEVINFO, st_label, CE_CONT,
11335 				    "read/write retry counter: %d\n",
11336 				    sensep[27]);
11337 			}
11338 		}
11339 #endif
11340 
11341 		if (flag & FWRITE) {
11342 			rate = EXABYTE_WRITE_ERROR_THRESHOLD;
11343 		} else {
11344 			rate = EXABYTE_READ_ERROR_THRESHOLD;
11345 		}
11346 		if (error_rate >= rate) {
11347 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
11348 			    "Soft error rate (%d%%) during %s was too high",
11349 			    error_rate,
11350 			    ((flag & FWRITE) ? wrg_str : rdg_str));
11351 			scsi_log(ST_DEVINFO, st_label, CE_CONT,
11352 			    "Please, replace tape cartridge\n");
11353 		}
11354 	}
11355 
11356 done:
11357 	kmem_free(com, sizeof (*com));
11358 	kmem_free(sensep, TAPE_SENSE_LENGTH);
11359 
11360 	if (rval != 0) {
11361 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
11362 		    "exabyte soft error reporting failed\n");
11363 	}
11364 	return (rval);
11365 }
11366 
11367 /*
11368  * this is very specific to Archive 4mm dat
11369  */
11370 #define	ONE_GIG	(ONE_K * ONE_K * ONE_K)
11371 
11372 static int
11373 st_report_dat_soft_errors(dev_t dev, int flag)
11374 {
11375 	uchar_t *sensep;
11376 	int amt, i;
11377 	int rval = 0;
11378 	char cdb[CDB_GROUP1], *c = cdb;
11379 	struct uscsi_cmd *com;
11380 
11381 	GET_SOFT_STATE(dev);
11382 
11383 	ST_FUNC(ST_DEVINFO, st_report_dat_soft_errors);
11384 
11385 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11386 	    "st_report_dat_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag);
11387 
11388 	ASSERT(mutex_owned(ST_MUTEX));
11389 
11390 	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
11391 	sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP);
11392 
11393 	*c++ = SCMD_LOG_SENSE_G1;
11394 	*c++ = 0;
11395 	*c++ = (flag & FWRITE) ? 0x42 : 0x43;
11396 	*c++ = 0;
11397 	*c++ = 0;
11398 	*c++ = 0;
11399 	*c++ = 2;
11400 	*c++ = 0;
11401 	*c++ = (char)LOG_SENSE_LENGTH;
11402 	*c   = 0;
11403 	com->uscsi_cdb    = cdb;
11404 	com->uscsi_cdblen  = CDB_GROUP1;
11405 	com->uscsi_bufaddr = (caddr_t)sensep;
11406 	com->uscsi_buflen  = LOG_SENSE_LENGTH;
11407 	com->uscsi_flags   =
11408 	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
11409 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11410 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
11411 	if (rval) {
11412 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
11413 		    "DAT soft error reporting failed\n");
11414 	}
11415 	if (rval || com->uscsi_status) {
11416 		goto done;
11417 	}
11418 
11419 	/*
11420 	 * was there enough data?
11421 	 */
11422 	amt = (int)LOG_SENSE_LENGTH - com->uscsi_resid;
11423 
11424 	if ((amt >= MIN_LOG_SENSE_LENGTH) && un->un_kbytes_xferred) {
11425 		int total, retries, param_code;
11426 
11427 		total = -1;
11428 		retries = -1;
11429 		amt = sensep[3] + 4;
11430 
11431 
11432 #ifdef STDEBUG
11433 		if (st_soft_error_report_debug) {
11434 			(void) printf("logsense:");
11435 			for (i = 0; i < MIN_LOG_SENSE_LENGTH; i++) {
11436 				if (i % 16 == 0) {
11437 					(void) printf("\t\n");
11438 				}
11439 				(void) printf(" %x", sensep[i]);
11440 			}
11441 			(void) printf("\n");
11442 		}
11443 #endif
11444 
11445 		/*
11446 		 * parse the param_codes
11447 		 */
11448 		if (sensep[0] == 2 || sensep[0] == 3) {
11449 			for (i = 4; i < amt; i++) {
11450 				param_code = (sensep[i++] << 8);
11451 				param_code += sensep[i++];
11452 				i++; /* skip control byte */
11453 				if (param_code == 5) {
11454 					if (sensep[i++] == 4) {
11455 						total = (sensep[i++] << 24);
11456 						total += (sensep[i++] << 16);
11457 						total += (sensep[i++] << 8);
11458 						total += sensep[i];
11459 					}
11460 				} else if (param_code == 0x8007) {
11461 					if (sensep[i++] == 2) {
11462 						retries = sensep[i++] << 8;
11463 						retries += sensep[i];
11464 					}
11465 				} else {
11466 					i += sensep[i];
11467 				}
11468 			}
11469 		}
11470 
11471 		/*
11472 		 * if the log sense returned valid numbers then determine
11473 		 * the read and write error thresholds based on the amount of
11474 		 * data transferred
11475 		 */
11476 
11477 		if (total > 0 && retries > 0) {
11478 			short normal_retries = 0;
11479 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
11480 			    "total xferred (%s) =%x, retries=%x\n",
11481 			    ((flag & FWRITE) ? wrg_str : rdg_str),
11482 			    total, retries);
11483 
11484 			if (flag & FWRITE) {
11485 				if (total <=
11486 				    WRITE_SOFT_ERROR_WARNING_THRESHOLD) {
11487 					normal_retries =
11488 					    DAT_SMALL_WRITE_ERROR_THRESHOLD;
11489 				} else {
11490 					normal_retries =
11491 					    DAT_LARGE_WRITE_ERROR_THRESHOLD;
11492 				}
11493 			} else {
11494 				if (total <=
11495 				    READ_SOFT_ERROR_WARNING_THRESHOLD) {
11496 					normal_retries =
11497 					    DAT_SMALL_READ_ERROR_THRESHOLD;
11498 				} else {
11499 					normal_retries =
11500 					    DAT_LARGE_READ_ERROR_THRESHOLD;
11501 				}
11502 			}
11503 
11504 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
11505 			"normal retries=%d\n", normal_retries);
11506 
11507 			if (retries >= normal_retries) {
11508 				scsi_log(ST_DEVINFO, st_label, CE_WARN,
11509 				    "Soft error rate (retries = %d) during "
11510 				    "%s was too high",  retries,
11511 				    ((flag & FWRITE) ? wrg_str : rdg_str));
11512 				scsi_log(ST_DEVINFO, st_label, CE_CONT,
11513 				    "Periodic head cleaning required "
11514 				    "and/or replace tape cartridge\n");
11515 			}
11516 
11517 		} else if (total == -1 || retries == -1) {
11518 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
11519 			    "log sense parameter code does not make sense\n");
11520 		}
11521 	}
11522 
11523 	/*
11524 	 * reset all values
11525 	 */
11526 	c = cdb;
11527 	*c++ = SCMD_LOG_SELECT_G1;
11528 	*c++ = 2;	/* this resets all values */
11529 	*c++ = (char)0xc0;
11530 	*c++ = 0;
11531 	*c++ = 0;
11532 	*c++ = 0;
11533 	*c++ = 0;
11534 	*c++ = 0;
11535 	*c++ = 0;
11536 	*c   = 0;
11537 	com->uscsi_bufaddr = NULL;
11538 	com->uscsi_buflen  = 0;
11539 	com->uscsi_flags   = USCSI_DIAGNOSE | USCSI_SILENT;
11540 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
11541 	if (rval) {
11542 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
11543 		    "DAT soft error reset failed\n");
11544 	}
11545 done:
11546 	kmem_free(com, sizeof (*com));
11547 	kmem_free(sensep, LOG_SENSE_LENGTH);
11548 	return (rval);
11549 }
11550 
11551 static int
11552 st_report_soft_errors(dev_t dev, int flag)
11553 {
11554 	GET_SOFT_STATE(dev);
11555 
11556 	ST_FUNC(ST_DEVINFO, st_report_soft_errors);
11557 
11558 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11559 	    "st_report_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag);
11560 
11561 	ASSERT(mutex_owned(ST_MUTEX));
11562 
11563 	switch (un->un_dp->type) {
11564 	case ST_TYPE_EXB8500:
11565 	case ST_TYPE_EXABYTE:
11566 		return (st_report_exabyte_soft_errors(dev, flag));
11567 		/*NOTREACHED*/
11568 	case ST_TYPE_PYTHON:
11569 		return (st_report_dat_soft_errors(dev, flag));
11570 		/*NOTREACHED*/
11571 	default:
11572 		un->un_dp->options &= ~ST_SOFT_ERROR_REPORTING;
11573 		return (-1);
11574 	}
11575 }
11576 
11577 /*
11578  * persistent error routines
11579  */
11580 
11581 /*
11582  * enable persistent errors, and set the throttle appropriately, checking
11583  * for flush-on-errors capability
11584  */
11585 static void
11586 st_turn_pe_on(struct scsi_tape *un)
11587 {
11588 	ST_FUNC(ST_DEVINFO, st_turn_pe_on);
11589 
11590 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_on\n");
11591 	ASSERT(mutex_owned(ST_MUTEX));
11592 
11593 	un->un_persistence = 1;
11594 
11595 	/*
11596 	 * only use flush-on-errors if auto-request-sense and untagged-qing are
11597 	 * enabled.  This will simplify the error handling for request senses
11598 	 */
11599 
11600 	if (un->un_arq_enabled && un->un_untagged_qing) {
11601 		uchar_t f_o_e;
11602 
11603 		mutex_exit(ST_MUTEX);
11604 		f_o_e = (scsi_ifsetcap(ROUTE, "flush-on-errors", 1, 1) == 1) ?
11605 		    1 : 0;
11606 		mutex_enter(ST_MUTEX);
11607 
11608 		un->un_flush_on_errors = f_o_e;
11609 	} else {
11610 		un->un_flush_on_errors = 0;
11611 	}
11612 
11613 	if (un->un_flush_on_errors)
11614 		un->un_max_throttle = (uchar_t)st_max_throttle;
11615 	else
11616 		un->un_max_throttle = 1;
11617 
11618 	if (un->un_dp->options & ST_RETRY_ON_RECOVERED_DEFERRED_ERROR)
11619 		un->un_max_throttle = 1;
11620 
11621 	/* this will send a marker pkt */
11622 	CLEAR_PE(un);
11623 }
11624 
11625 /*
11626  * This turns persistent errors permanently off
11627  */
11628 static void
11629 st_turn_pe_off(struct scsi_tape *un)
11630 {
11631 	ST_FUNC(ST_DEVINFO, st_turn_pe_off);
11632 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_off\n");
11633 	ASSERT(mutex_owned(ST_MUTEX));
11634 
11635 	/* turn it off for good */
11636 	un->un_persistence = 0;
11637 
11638 	/* this will send a marker pkt */
11639 	CLEAR_PE(un);
11640 
11641 	/* turn off flush on error capability, if enabled */
11642 	if (un->un_flush_on_errors) {
11643 		mutex_exit(ST_MUTEX);
11644 		(void) scsi_ifsetcap(ROUTE, "flush-on-errors", 0, 1);
11645 		mutex_enter(ST_MUTEX);
11646 	}
11647 
11648 
11649 	un->un_flush_on_errors = 0;
11650 }
11651 
11652 /*
11653  * This clear persistent errors, allowing more commands through, and also
11654  * sending a marker packet.
11655  */
11656 static void
11657 st_clear_pe(struct scsi_tape *un)
11658 {
11659 	ST_FUNC(ST_DEVINFO, st_clear_pe);
11660 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_clear\n");
11661 	ASSERT(mutex_owned(ST_MUTEX));
11662 
11663 	un->un_persist_errors = 0;
11664 	un->un_throttle = un->un_last_throttle = 1;
11665 	un->un_errno = 0;
11666 	st_hba_unflush(un);
11667 }
11668 
11669 /*
11670  * This will flag persistent errors, shutting everything down, if the
11671  * application had enabled persistent errors via MTIOCPERSISTENT
11672  */
11673 static void
11674 st_set_pe_flag(struct scsi_tape *un)
11675 {
11676 	ST_FUNC(ST_DEVINFO, st_set_pe_flag);
11677 	ASSERT(mutex_owned(ST_MUTEX));
11678 
11679 	if (un->un_persistence) {
11680 		ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_flag\n");
11681 		un->un_persist_errors = 1;
11682 		un->un_throttle = un->un_last_throttle = 0;
11683 	}
11684 }
11685 
11686 /*
11687  * List of commands that are allowed to be done while another host holds
11688  * the reservation.
11689  */
11690 struct {
11691 	uchar_t cmd;
11692 	uchar_t byte;	/* byte to look for data */
11693 	uint32_t mask;	/* bits that matter in the above data */
11694 } rcmds[] = {
11695 	{ SCMD_TEST_UNIT_READY, 0, 0 }, /* may fail on older drives */
11696 	{ SCMD_REQUEST_SENSE, 0, 0 },
11697 	{ SCMD_READ_BLKLIM, 0, 0 },
11698 	{ SCMD_INQUIRY, 0, 0 },
11699 	{ SCMD_RESERVE, 0, 0 },
11700 	{ SCMD_RELEASE, 0, 0 },
11701 	{ SCMD_DOORLOCK, 4, 3 },	/* allow (unlock) media access only */
11702 	{ SCMD_REPORT_DENSITIES, 0, 0 },
11703 	{ SCMD_LOG_SENSE_G1, 0, 0 },
11704 	{ SCMD_PERSISTENT_RESERVE_IN, 0, 0 },
11705 	{ SCMD_PERSISTENT_RESERVE_OUT, 0, 0 },
11706 	{ SCMD_REPORT_LUNS, 0, 0 }
11707 };
11708 
11709 static int
11710 st_do_reserve(struct scsi_tape *un)
11711 {
11712 	int rval;
11713 
11714 	ST_FUNC(ST_DEVINFO, st_do_reserve);
11715 
11716 	/*
11717 	 * Issue a Throw-Away reserve command to clear the
11718 	 * check condition.
11719 	 * If the current behaviour of reserve/release is to
11720 	 * hold reservation across opens , and if a Bus reset
11721 	 * has been issued between opens then this command
11722 	 * would set the ST_LOST_RESERVE flags in rsvd_status.
11723 	 * In this case return an EACCES so that user knows that
11724 	 * reservation has been lost in between opens.
11725 	 * If this error is not returned and we continue with
11726 	 * successful open , then user may think position of the
11727 	 * tape is still the same but inreality we would rewind the
11728 	 * tape and continue from BOT.
11729 	 */
11730 	rval = st_reserve_release(un, ST_RESERVE);
11731 	if (rval) {
11732 		if ((un->un_rsvd_status & ST_LOST_RESERVE_BETWEEN_OPENS) ==
11733 		    ST_LOST_RESERVE_BETWEEN_OPENS) {
11734 			un->un_rsvd_status &= ~(ST_LOST_RESERVE | ST_RESERVE);
11735 			un->un_errno = EACCES;
11736 			return (EACCES);
11737 		}
11738 		rval = st_reserve_release(un, ST_RESERVE);
11739 	}
11740 	if (rval == 0) {
11741 		un->un_rsvd_status |= ST_INIT_RESERVE;
11742 	}
11743 
11744 	return (rval);
11745 }
11746 
11747 static int
11748 st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb)
11749 {
11750 	int i;
11751 	int rval = 0;
11752 
11753 	ST_FUNC(ST_DEVINFO, st_check_cdb_for_need_to_reserve);
11754 
11755 	/*
11756 	 * If already reserved no need to do it again.
11757 	 * Also if Reserve and Release are disabled Just return.
11758 	 */
11759 	if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) ||
11760 	    (un->un_dp->options & ST_NO_RESERVE_RELEASE)) {
11761 		ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11762 		    "st_check_cdb_for_need_to_reserve() reserve unneeded %s",
11763 		    st_print_scsi_cmd((uchar_t)cdb[0]));
11764 		return (0);
11765 	}
11766 
11767 	/* See if command is on the list */
11768 	for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) {
11769 		if ((uchar_t)cdb[0] == rcmds[i].cmd) {
11770 			/*
11771 			 * cmd is on list.
11772 			 * if byte is zero always allowed.
11773 			 */
11774 			if (rcmds[i].byte == 0) {
11775 				return (rval);
11776 			}
11777 			if (((cdb[rcmds[i].byte]) & (rcmds[i].mask)) == 0) {
11778 				return (rval);
11779 			}
11780 			break;
11781 		}
11782 	}
11783 
11784 	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11785 	    "Command %s requires reservation", st_print_scsi_cmd(cdb[0]));
11786 
11787 	rval = st_do_reserve(un);
11788 
11789 	return (rval);
11790 }
11791 
11792 static int
11793 st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, int cnt)
11794 {
11795 	int i;
11796 	int rval = 0;
11797 
11798 	ST_FUNC(ST_DEVINFO, st_check_cmd_for_need_to_reserve);
11799 
11800 	if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) ||
11801 	    (un->un_dp->options & ST_NO_RESERVE_RELEASE)) {
11802 		ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11803 		    "st_check_cmd_for_need_to_reserve() reserve unneeded %s",
11804 		    st_print_scsi_cmd(cmd));
11805 		return (0);
11806 	}
11807 
11808 	/* See if command is on the list */
11809 	for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) {
11810 		if (cmd == rcmds[i].cmd) {
11811 			/*
11812 			 * cmd is on list.
11813 			 * if byte is zero always allowed.
11814 			 */
11815 			if (rcmds[i].byte == 0) {
11816 				return (rval);
11817 			}
11818 			if (((rcmds[i].mask) & cnt) == 0) {
11819 				return (rval);
11820 			}
11821 			break;
11822 		}
11823 	}
11824 
11825 	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11826 	    "Cmd %s requires reservation", st_print_scsi_cmd(cmd));
11827 
11828 	rval = st_do_reserve(un);
11829 
11830 	return (rval);
11831 }
11832 
11833 static int
11834 st_reserve_release(struct scsi_tape *un, int cmd)
11835 {
11836 	struct uscsi_cmd	uscsi_cmd;
11837 	struct uscsi_cmd	*com = &uscsi_cmd;
11838 	int			rval;
11839 	char			cdb[CDB_GROUP0];
11840 
11841 
11842 
11843 	ST_FUNC(ST_DEVINFO, st_reserve_release);
11844 
11845 	ASSERT(mutex_owned(ST_MUTEX));
11846 
11847 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11848 	    "st_reserve_release: %s \n",
11849 	    (cmd == ST_RELEASE)?  "Releasing":"Reserving");
11850 
11851 	bzero(cdb, CDB_GROUP0);
11852 	if (cmd == ST_RELEASE) {
11853 		cdb[0] = SCMD_RELEASE;
11854 	} else {
11855 		cdb[0] = SCMD_RESERVE;
11856 	}
11857 	bzero(com, sizeof (struct uscsi_cmd));
11858 	com->uscsi_flags = USCSI_WRITE;
11859 	com->uscsi_cdb = cdb;
11860 	com->uscsi_cdblen = CDB_GROUP0;
11861 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11862 
11863 	rval = st_ioctl_cmd(un->un_dev, com, FKIOCTL);
11864 
11865 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11866 	    "st_reserve_release: rval(1)=%d\n", rval);
11867 
11868 	if (rval) {
11869 		if (com->uscsi_status == STATUS_RESERVATION_CONFLICT) {
11870 			rval = EACCES;
11871 		}
11872 		/*
11873 		 * dynamically turn off reserve/release support
11874 		 * in case of drives which do not support
11875 		 * reserve/release command(ATAPI drives).
11876 		 */
11877 		if (un->un_status == KEY_ILLEGAL_REQUEST) {
11878 			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
11879 				un->un_dp->options |= ST_NO_RESERVE_RELEASE;
11880 				ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11881 				    "Tape unit does not support "
11882 				    "reserve/release \n");
11883 			}
11884 			rval = 0;
11885 		}
11886 	}
11887 	return (rval);
11888 }
11889 
11890 static int
11891 st_take_ownership(dev_t dev)
11892 {
11893 	int rval;
11894 
11895 	GET_SOFT_STATE(dev);
11896 
11897 	ST_FUNC(ST_DEVINFO, st_take_ownership);
11898 
11899 	ASSERT(mutex_owned(ST_MUTEX));
11900 
11901 	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11902 	    "st_take_ownership: Entering ...\n");
11903 
11904 
11905 	rval = st_reserve_release(un, ST_RESERVE);
11906 	/*
11907 	 * XXX -> Should reset be done only if we get EACCES.
11908 	 * .
11909 	 */
11910 	if (rval) {
11911 		mutex_exit(ST_MUTEX);
11912 		if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
11913 			if (scsi_reset(ROUTE, RESET_ALL) == 0) {
11914 				mutex_enter(ST_MUTEX);
11915 				return (EIO);
11916 			}
11917 		}
11918 		mutex_enter(ST_MUTEX);
11919 		un->un_rsvd_status &=
11920 		    ~(ST_LOST_RESERVE | ST_RESERVATION_CONFLICT);
11921 
11922 		mutex_exit(ST_MUTEX);
11923 		delay(drv_usectohz(ST_RESERVATION_DELAY));
11924 		mutex_enter(ST_MUTEX);
11925 		/*
11926 		 * remove the check condition.
11927 		 */
11928 		(void) st_reserve_release(un, ST_RESERVE);
11929 		if ((rval = st_reserve_release(un, ST_RESERVE)) != 0) {
11930 			if ((st_reserve_release(un, ST_RESERVE)) != 0) {
11931 				rval = (un->un_rsvd_status &
11932 				    ST_RESERVATION_CONFLICT) ? EACCES : EIO;
11933 				return (rval);
11934 			}
11935 		}
11936 		/*
11937 		 * Set tape state to ST_STATE_OFFLINE , in case if
11938 		 * the user wants to continue and start using
11939 		 * the tape.
11940 		 */
11941 		un->un_state = ST_STATE_OFFLINE;
11942 		un->un_rsvd_status |= ST_INIT_RESERVE;
11943 	}
11944 	return (rval);
11945 }
11946 
11947 static int
11948 st_create_errstats(struct scsi_tape *un, int instance)
11949 {
11950 	char	kstatname[KSTAT_STRLEN];
11951 
11952 	ST_FUNC(ST_DEVINFO, st_create_errstats);
11953 
11954 	/*
11955 	 * Create device error kstats
11956 	 */
11957 
11958 	if (un->un_errstats == (kstat_t *)0) {
11959 		(void) sprintf(kstatname, "st%d,err", instance);
11960 		un->un_errstats = kstat_create("sterr", instance, kstatname,
11961 		    "device_error", KSTAT_TYPE_NAMED,
11962 		    sizeof (struct st_errstats) / sizeof (kstat_named_t),
11963 		    KSTAT_FLAG_PERSISTENT);
11964 
11965 		if (un->un_errstats) {
11966 			struct st_errstats	*stp;
11967 
11968 			stp = (struct st_errstats *)un->un_errstats->ks_data;
11969 			kstat_named_init(&stp->st_softerrs, "Soft Errors",
11970 			    KSTAT_DATA_ULONG);
11971 			kstat_named_init(&stp->st_harderrs, "Hard Errors",
11972 			    KSTAT_DATA_ULONG);
11973 			kstat_named_init(&stp->st_transerrs, "Transport Errors",
11974 			    KSTAT_DATA_ULONG);
11975 			kstat_named_init(&stp->st_vid, "Vendor",
11976 			    KSTAT_DATA_CHAR);
11977 			kstat_named_init(&stp->st_pid, "Product",
11978 			    KSTAT_DATA_CHAR);
11979 			kstat_named_init(&stp->st_revision, "Revision",
11980 			    KSTAT_DATA_CHAR);
11981 			kstat_named_init(&stp->st_serial, "Serial No",
11982 			    KSTAT_DATA_CHAR);
11983 			un->un_errstats->ks_private = un;
11984 			un->un_errstats->ks_update = nulldev;
11985 			kstat_install(un->un_errstats);
11986 			/*
11987 			 * Fill in the static data
11988 			 */
11989 			(void) strncpy(&stp->st_vid.value.c[0],
11990 			    ST_INQUIRY->inq_vid, 8);
11991 			/*
11992 			 * XXX:  Emulex MT-02 (and emulators) predates
11993 			 *	 SCSI-1 and has no vid & pid inquiry data.
11994 			 */
11995 			if (ST_INQUIRY->inq_len != 0) {
11996 				(void) strncpy(&stp->st_pid.value.c[0],
11997 				    ST_INQUIRY->inq_pid, 16);
11998 				(void) strncpy(&stp->st_revision.value.c[0],
11999 				    ST_INQUIRY->inq_revision, 4);
12000 				(void) strncpy(&stp->st_serial.value.c[0],
12001 				    ST_INQUIRY->inq_serial, 12);
12002 			}
12003 		}
12004 	}
12005 	return (0);
12006 }
12007 
12008 static int
12009 st_validate_tapemarks(struct scsi_tape *un, tapepos_t *pos)
12010 {
12011 	dev_t dev;
12012 	int rval;
12013 
12014 	ST_FUNC(ST_DEVINFO, st_validate_tapemarks);
12015 
12016 	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
12017 	ASSERT(mutex_owned(ST_MUTEX));
12018 
12019 	/* Can't restore an invalid position */
12020 	if (pos->pmode == invalid) {
12021 		return (4);
12022 	}
12023 
12024 	/*
12025 	 * Assumtions:
12026 	 *	If a position was read and is in logical position mode.
12027 	 *	If a drive supports read position it supports locate.
12028 	 *	If the read position type is not NO_POS. even though
12029 	 *	   a read position make not have been attemped yet.
12030 	 *
12031 	 *	The drive can locate to the position.
12032 	 */
12033 	if (pos->pmode == logical || un->un_read_pos_type != NO_POS) {
12034 		/*
12035 		 * If position mode is logical or legacy mode try
12036 		 * to locate there as it is faster.
12037 		 * If it fails try the old way.
12038 		 */
12039 		scsi_log(ST_DEVINFO, st_label, CE_NOTE,
12040 		    "Restoring tape position to lgclblkbo=0x%"PRIx64"....",
12041 		    pos->lgclblkno);
12042 
12043 		if (st_logical_block_locate(un, pos->lgclblkno, pos->partition)
12044 		    == 0) {
12045 			/* Assume we are there copy rest of position back */
12046 			if (un->un_pos.lgclblkno == pos->lgclblkno) {
12047 				COPY_POS(&un->un_pos, pos);
12048 			}
12049 			return (0);
12050 		}
12051 
12052 		/*
12053 		 * If logical block locate failed to restore a logical
12054 		 * position, can't recover.
12055 		 */
12056 		if (pos->pmode == logical) {
12057 			return (-1);
12058 		}
12059 	}
12060 
12061 	dev = un->un_dev;
12062 
12063 	scsi_log(ST_DEVINFO, st_label, CE_NOTE,
12064 	    "Restoring tape position at fileno=%x, blkno=%x....",
12065 	    pos->fileno, pos->blkno);
12066 
12067 	/*
12068 	 * Rewind ? Oh yeah, Fidelity has got the STK F/W changed
12069 	 * so as not to rewind tape on RESETS: Gee, Has life ever
12070 	 * been simple in tape land ?
12071 	 */
12072 	rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
12073 	if (rval) {
12074 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
12075 		"Failed to restore the last file and block position: In"
12076 		" this state, Tape will be loaded at BOT during next open");
12077 		un->un_pos.pmode = invalid;
12078 		return (rval);
12079 	}
12080 
12081 	/* If the position was as the result of back space file */
12082 	if (pos->blkno > (INF / 2)) {
12083 		/* Go one extra file forward */
12084 		pos->fileno++;
12085 		/* Figure how many blocks to back into the previous file */
12086 		pos->blkno = -(INF - pos->blkno);
12087 	}
12088 
12089 	/* Go to requested fileno */
12090 	if (pos->fileno) {
12091 		rval = st_cmd(dev, SCMD_SPACE, Fmk(pos->fileno), SYNC_CMD);
12092 		if (rval) {
12093 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
12094 			    "Failed to restore the last file position: In this "
12095 			    " state, Tape will be loaded at BOT during next"
12096 			    " open %d", __LINE__);
12097 			un->un_pos.pmode = invalid;
12098 			pos->pmode = invalid;
12099 			return (rval);
12100 		}
12101 	}
12102 
12103 	/*
12104 	 * If backing into a file we already did an extra file forward.
12105 	 * Now we have to back over the filemark to get to the end of
12106 	 * the previous file. The blkno has been ajusted to a negative
12107 	 * value so we will get to the expected location.
12108 	 */
12109 	if (pos->blkno) {
12110 		rval = st_cmd(dev, SCMD_SPACE, Fmk(-1), SYNC_CMD);
12111 		if (rval) {
12112 			scsi_log(ST_DEVINFO, st_label, CE_WARN,
12113 			    "Failed to restore the last file position: In this "
12114 			    " state, Tape will be loaded at BOT during next"
12115 			    " open %d", __LINE__);
12116 			un->un_pos.pmode = invalid;
12117 			pos->pmode = invalid;
12118 			return (rval);
12119 		}
12120 	}
12121 
12122 	/*
12123 	 * The position mode, block and fileno should be correct,
12124 	 * This updates eof and logical position information.
12125 	 */
12126 	un->un_pos.eof = pos->eof;
12127 	un->un_pos.lgclblkno = pos->lgclblkno;
12128 
12129 	return (0);
12130 }
12131 
12132 /*
12133  * check sense key, ASC, ASCQ in order to determine if the tape needs
12134  * to be ejected
12135  */
12136 
12137 static int
12138 st_check_asc_ascq(struct scsi_tape *un)
12139 {
12140 	struct scsi_extended_sense *sensep = ST_RQSENSE;
12141 	struct tape_failure_code   *code;
12142 
12143 	ST_FUNC(ST_DEVINFO, st_check_asc_ascq);
12144 
12145 	for (code = st_tape_failure_code; code->key != 0xff; code++) {
12146 		if ((code->key  == sensep->es_key) &&
12147 		    (code->add_code  == sensep->es_add_code) &&
12148 		    (code->qual_code == sensep->es_qual_code))
12149 			return (1);
12150 	}
12151 	return (0);
12152 }
12153 
12154 /*
12155  * st_logpage_supported() sends a Log Sense command with
12156  * page code = 0 = Supported Log Pages Page to the device,
12157  * to see whether the page 'page' is supported.
12158  * Return values are:
12159  * -1 if the Log Sense command fails
12160  * 0 if page is not supported
12161  * 1 if page is supported
12162  */
12163 
12164 static int
12165 st_logpage_supported(dev_t dev, uchar_t page)
12166 {
12167 	uchar_t *sp, *sensep;
12168 	unsigned length;
12169 	struct uscsi_cmd *com;
12170 	int rval;
12171 	char cdb[CDB_GROUP1] = {
12172 		SCMD_LOG_SENSE_G1,
12173 		0,
12174 		SUPPORTED_LOG_PAGES_PAGE,
12175 		0,
12176 		0,
12177 		0,
12178 		0,
12179 		0,
12180 		(char)LOG_SENSE_LENGTH,
12181 		0
12182 	};
12183 
12184 	GET_SOFT_STATE(dev);
12185 
12186 	ST_FUNC(ST_DEVINFO, st_logpage_supported);
12187 
12188 	ASSERT(mutex_owned(ST_MUTEX));
12189 
12190 	com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12191 	sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP);
12192 
12193 	com->uscsi_cdb = cdb;
12194 	com->uscsi_cdblen = CDB_GROUP1;
12195 	com->uscsi_bufaddr = (caddr_t)sensep;
12196 	com->uscsi_buflen = LOG_SENSE_LENGTH;
12197 	com->uscsi_flags =
12198 	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
12199 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
12200 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
12201 	if (rval || com->uscsi_status) {
12202 		/* uscsi-command failed */
12203 		rval = -1;
12204 	} else {
12205 
12206 		sp = sensep + 3;
12207 
12208 		for (length = *sp++; length > 0; length--, sp++) {
12209 
12210 			if (*sp == page) {
12211 				rval = 1;
12212 				break;
12213 			}
12214 		}
12215 	}
12216 	kmem_free(com, sizeof (struct uscsi_cmd));
12217 	kmem_free(sensep, LOG_SENSE_LENGTH);
12218 	return (rval);
12219 }
12220 
12221 
12222 /*
12223  * st_check_clean_bit() gets the status of the tape's cleaning bit.
12224  *
12225  * If the device does support the TapeAlert log page, then the cleaning bit
12226  * information will be read from this page. Otherwise we will see if one of
12227  * ST_CLN_TYPE_1, ST_CLN_TYPE_2 or ST_CLN_TYPE_3 is set in the properties of
12228  * the device, which means, that we can get the cleaning bit information via
12229  * a RequestSense command.
12230  * If both methods of getting cleaning bit information are not supported
12231  * st_check_clean_bit() will return with 0. Otherwise st_check_clean_bit()
12232  * returns with
12233  * - MTF_TAPE_CLN_SUPPORTED if cleaning bit is not set or
12234  * - MTF_TAPE_CLN_SUPPORTED | MTF_TAPE_HEAD_DIRTY if cleaning bit is set.
12235  * If the call to st_ioctl_cmd() to do the Log Sense or the Request Sense
12236  * command fails, or if the amount of Request Sense data is not enough, then
12237  *  st_check_clean_bit() returns with -1.
12238  */
12239 
12240 static int
12241 st_check_clean_bit(dev_t dev)
12242 {
12243 	int rval = 0;
12244 
12245 	GET_SOFT_STATE(dev);
12246 
12247 	ST_FUNC(ST_DEVINFO, st_check_clean_bit);
12248 
12249 	ASSERT(mutex_owned(ST_MUTEX));
12250 
12251 	if (un->un_HeadClean & TAPE_ALERT_NOT_SUPPORTED) {
12252 		return (rval);
12253 	}
12254 
12255 	if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) {
12256 
12257 		rval = st_logpage_supported(dev, TAPE_SEQUENTIAL_PAGE);
12258 		if (rval == 1) {
12259 
12260 			un->un_HeadClean |= TAPE_SEQUENTIAL_SUPPORTED;
12261 		}
12262 
12263 		rval = st_logpage_supported(dev, TAPE_ALERT_PAGE);
12264 		if (rval == 1) {
12265 
12266 			un->un_HeadClean |= TAPE_ALERT_SUPPORTED;
12267 		}
12268 
12269 		if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) {
12270 
12271 			un->un_HeadClean = TAPE_ALERT_NOT_SUPPORTED;
12272 		}
12273 	}
12274 
12275 	rval = 0;
12276 
12277 	if (un->un_HeadClean & TAPE_SEQUENTIAL_SUPPORTED) {
12278 
12279 		rval = st_check_sequential_clean_bit(dev);
12280 	}
12281 
12282 	if ((rval <= 0) && (un->un_HeadClean & TAPE_ALERT_SUPPORTED)) {
12283 
12284 		rval = st_check_alert_flags(dev);
12285 	}
12286 
12287 	if ((rval <= 0) && (un->un_dp->options & ST_CLN_MASK)) {
12288 
12289 		rval = st_check_sense_clean_bit(dev);
12290 	}
12291 
12292 	if (rval < 0) {
12293 		return (rval);
12294 	}
12295 
12296 	/*
12297 	 * If found a supported means to check need to clean.
12298 	 */
12299 	if (rval & MTF_TAPE_CLN_SUPPORTED) {
12300 
12301 		/*
12302 		 * head needs to be cleaned.
12303 		 */
12304 		if (rval & MTF_TAPE_HEAD_DIRTY) {
12305 
12306 			/*
12307 			 * Print log message only first time
12308 			 * found needing cleaned.
12309 			 */
12310 			if ((un->un_HeadClean & TAPE_PREVIOUSLY_DIRTY) == 0) {
12311 
12312 				scsi_log(ST_DEVINFO, st_label, CE_WARN,
12313 				    "Periodic head cleaning required");
12314 
12315 				un->un_HeadClean |= TAPE_PREVIOUSLY_DIRTY;
12316 			}
12317 
12318 		} else {
12319 
12320 			un->un_HeadClean &= ~TAPE_PREVIOUSLY_DIRTY;
12321 		}
12322 	}
12323 
12324 	return (rval);
12325 }
12326 
12327 
12328 static int
12329 st_check_sequential_clean_bit(dev_t dev)
12330 {
12331 	int rval;
12332 	int ix;
12333 	ushort_t parameter;
12334 	struct uscsi_cmd *cmd;
12335 	struct log_sequential_page *sp;
12336 	struct log_sequential_page_parameter *prm;
12337 	char cdb[CDB_GROUP1] = {
12338 		SCMD_LOG_SENSE_G1,
12339 		0,
12340 		TAPE_SEQUENTIAL_PAGE | CURRENT_CUMULATIVE_VALUES,
12341 		0,
12342 		0,
12343 		0,
12344 		0,
12345 		(char)(sizeof (struct log_sequential_page) >> 8),
12346 		(char)(sizeof (struct log_sequential_page)),
12347 		0
12348 	};
12349 
12350 	GET_SOFT_STATE(dev);
12351 
12352 	ST_FUNC(ST_DEVINFO, st_check_sequential_clean_bit);
12353 
12354 	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12355 	sp  = kmem_zalloc(sizeof (struct log_sequential_page), KM_SLEEP);
12356 
12357 	cmd->uscsi_flags   =
12358 	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
12359 	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
12360 	cmd->uscsi_cdb	   = cdb;
12361 	cmd->uscsi_cdblen  = CDB_GROUP1;
12362 	cmd->uscsi_bufaddr = (caddr_t)sp;
12363 	cmd->uscsi_buflen  = sizeof (struct log_sequential_page);
12364 
12365 	rval = st_ioctl_cmd(dev, cmd, FKIOCTL);
12366 
12367 	if (rval || cmd->uscsi_status || cmd->uscsi_resid) {
12368 
12369 		rval = -1;
12370 
12371 	} else if (sp->log_page.code != TAPE_SEQUENTIAL_PAGE) {
12372 
12373 		rval = -1;
12374 	}
12375 
12376 	prm = &sp->param[0];
12377 
12378 	for (ix = 0; rval == 0 && ix < TAPE_SEQUENTIAL_PAGE_PARA; ix++) {
12379 
12380 		if (prm->log_param.length == 0) {
12381 			break;
12382 		}
12383 
12384 		parameter = (((prm->log_param.pc_hi << 8) & 0xff00) +
12385 		    (prm->log_param.pc_lo & 0xff));
12386 
12387 		if (parameter == SEQUENTIAL_NEED_CLN) {
12388 
12389 			rval = MTF_TAPE_CLN_SUPPORTED;
12390 			if (prm->param_value[prm->log_param.length - 1]) {
12391 
12392 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12393 				    "sequential log says head dirty\n");
12394 				rval |= MTF_TAPE_HEAD_DIRTY;
12395 			}
12396 		}
12397 		prm = (struct log_sequential_page_parameter *)
12398 		    &prm->param_value[prm->log_param.length];
12399 	}
12400 
12401 	kmem_free(cmd, sizeof (struct uscsi_cmd));
12402 	kmem_free(sp,  sizeof (struct log_sequential_page));
12403 
12404 	return (rval);
12405 }
12406 
12407 
12408 static int
12409 st_check_alert_flags(dev_t dev)
12410 {
12411 	struct st_tape_alert *ta;
12412 	struct uscsi_cmd *com;
12413 	unsigned ix, length;
12414 	int rval;
12415 	tape_alert_flags flag;
12416 	char cdb[CDB_GROUP1] = {
12417 		SCMD_LOG_SENSE_G1,
12418 		0,
12419 		TAPE_ALERT_PAGE | CURRENT_THRESHOLD_VALUES,
12420 		0,
12421 		0,
12422 		0,
12423 		0,
12424 		(char)(sizeof (struct st_tape_alert) >> 8),
12425 		(char)(sizeof (struct st_tape_alert)),
12426 		0
12427 	};
12428 
12429 	GET_SOFT_STATE(dev);
12430 
12431 	ST_FUNC(ST_DEVINFO, st_check_alert_clean_bit);
12432 
12433 	com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12434 	ta  = kmem_zalloc(sizeof (struct st_tape_alert), KM_SLEEP);
12435 
12436 	com->uscsi_cdb = cdb;
12437 	com->uscsi_cdblen = CDB_GROUP1;
12438 	com->uscsi_bufaddr = (caddr_t)ta;
12439 	com->uscsi_buflen = sizeof (struct st_tape_alert);
12440 	com->uscsi_flags =
12441 	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
12442 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
12443 
12444 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
12445 
12446 	if (rval || com->uscsi_status || com->uscsi_resid) {
12447 
12448 		rval = -1; /* uscsi-command failed */
12449 
12450 	} else if (ta->log_page.code != TAPE_ALERT_PAGE) {
12451 
12452 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12453 		"Not Alert Log Page returned 0x%X\n", ta->log_page.code);
12454 		rval = -1;
12455 	}
12456 
12457 	length = (ta->log_page.length_hi << 8) + ta->log_page.length_lo;
12458 
12459 
12460 	if (length != TAPE_ALERT_PARAMETER_LENGTH) {
12461 
12462 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12463 		    "TapeAlert length %d\n", length);
12464 	}
12465 
12466 
12467 	for (ix = 0; ix < TAPE_ALERT_MAX_PARA; ix++) {
12468 
12469 		/*
12470 		 * if rval is bad before the first pass don't bother
12471 		 */
12472 		if (ix == 0 && rval != 0) {
12473 
12474 			break;
12475 		}
12476 
12477 		flag = ((ta->param[ix].log_param.pc_hi << 8) +
12478 		    ta->param[ix].log_param.pc_lo);
12479 
12480 		if ((ta->param[ix].param_value & 1) == 0) {
12481 			continue;
12482 		}
12483 		/*
12484 		 * check to see if current parameter is of interest.
12485 		 * CLEAN_FOR_ERRORS is vendor specific to 9840 9940 stk's.
12486 		 */
12487 		if ((flag == TAF_CLEAN_NOW) ||
12488 		    (flag == TAF_CLEAN_PERIODIC) ||
12489 		    ((flag == CLEAN_FOR_ERRORS) &&
12490 		    (un->un_dp->type == ST_TYPE_STK9840))) {
12491 
12492 			rval = MTF_TAPE_CLN_SUPPORTED;
12493 
12494 
12495 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12496 			    "alert_page drive needs clean %d\n", flag);
12497 			un->un_HeadClean |= TAPE_ALERT_STILL_DIRTY;
12498 			rval |= MTF_TAPE_HEAD_DIRTY;
12499 
12500 		} else if (flag == TAF_CLEANING_MEDIA) {
12501 
12502 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12503 			    "alert_page drive was cleaned\n");
12504 			un->un_HeadClean &= ~TAPE_ALERT_STILL_DIRTY;
12505 		}
12506 
12507 	}
12508 
12509 	/*
12510 	 * Report it as dirty till we see it cleaned
12511 	 */
12512 	if (un->un_HeadClean & TAPE_ALERT_STILL_DIRTY) {
12513 
12514 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12515 		    "alert_page still dirty\n");
12516 		rval |= MTF_TAPE_HEAD_DIRTY;
12517 	}
12518 
12519 	kmem_free(com, sizeof (struct uscsi_cmd));
12520 	kmem_free(ta,  sizeof (struct st_tape_alert));
12521 
12522 	return (rval);
12523 }
12524 
12525 
12526 static int
12527 st_check_sense_clean_bit(dev_t dev)
12528 {
12529 	uchar_t *sensep;
12530 	char cdb[CDB_GROUP0];
12531 	struct uscsi_cmd *com;
12532 	ushort_t byte_pos;
12533 	uchar_t bit_mask;
12534 	unsigned length;
12535 	int index;
12536 	int rval;
12537 
12538 	GET_SOFT_STATE(dev);
12539 
12540 	ST_FUNC(ST_DEVINFO, st_check_sense_clean_bit);
12541 
12542 	/*
12543 	 * Since this tape does not support Tape Alert,
12544 	 * we now try to get the cleanbit status via
12545 	 * Request Sense.
12546 	 */
12547 
12548 	if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_1) {
12549 
12550 		index = 0;
12551 
12552 	} else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_2) {
12553 
12554 		index = 1;
12555 
12556 	} else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_3) {
12557 
12558 		index = 2;
12559 
12560 	} else {
12561 
12562 		return (-1);
12563 	}
12564 
12565 	byte_pos  = st_cln_bit_position[index].cln_bit_byte;
12566 	bit_mask  = st_cln_bit_position[index].cln_bit_mask;
12567 	length = byte_pos + 1;
12568 
12569 	com    = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12570 	sensep = kmem_zalloc(length, KM_SLEEP);
12571 
12572 	cdb[0] = SCMD_REQUEST_SENSE;
12573 	cdb[1] = 0;
12574 	cdb[2] = 0;
12575 	cdb[3] = 0;
12576 	cdb[4] = (char)length;
12577 	cdb[5] = 0;
12578 
12579 	com->uscsi_cdb = cdb;
12580 	com->uscsi_cdblen = CDB_GROUP0;
12581 	com->uscsi_bufaddr = (caddr_t)sensep;
12582 	com->uscsi_buflen = length;
12583 	com->uscsi_flags =
12584 	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ;
12585 	com->uscsi_timeout = un->un_dp->non_motion_timeout;
12586 
12587 	rval = st_ioctl_cmd(dev, com, FKIOCTL);
12588 
12589 	if (rval || com->uscsi_status || com->uscsi_resid) {
12590 
12591 		rval = -1;
12592 
12593 	} else {
12594 
12595 		rval = MTF_TAPE_CLN_SUPPORTED;
12596 		if ((sensep[byte_pos] & bit_mask) == bit_mask) {
12597 
12598 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12599 			    "sense data says head dirty\n");
12600 			rval |= MTF_TAPE_HEAD_DIRTY;
12601 		}
12602 	}
12603 
12604 	kmem_free(com, sizeof (struct uscsi_cmd));
12605 	kmem_free(sensep, length);
12606 	return (rval);
12607 }
12608 
12609 /*
12610  * st_clear_unit_attention
12611  *
12612  *  	run test unit ready's to clear out outstanding
12613  * 	unit attentions.
12614  * 	returns zero for SUCCESS or the errno from st_cmd call
12615  */
12616 static int
12617 st_clear_unit_attentions(dev_t dev_instance, int max_trys)
12618 {
12619 	int	i    = 0;
12620 	int	rval;
12621 
12622 #ifdef DEBUG
12623 	GET_SOFT_STATE(dev_instance);
12624 	ST_FUNC(ST_DEVINFO, st_clear_unit_attentions);
12625 #endif
12626 
12627 	do {
12628 		rval = st_cmd(dev_instance, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
12629 	} while ((rval != 0) && (rval != ENXIO) && (++i < max_trys));
12630 	return (rval);
12631 }
12632 
12633 static void
12634 st_calculate_timeouts(struct scsi_tape *un)
12635 {
12636 	ST_FUNC(ST_DEVINFO, st_calculate_timeouts);
12637 
12638 	if (un->un_dp->non_motion_timeout == 0) {
12639 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12640 			un->un_dp->non_motion_timeout =
12641 			    st_io_time * st_long_timeout_x;
12642 		} else {
12643 			un->un_dp->non_motion_timeout = (ushort_t)st_io_time;
12644 		}
12645 	}
12646 
12647 	if (un->un_dp->io_timeout == 0) {
12648 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12649 			un->un_dp->io_timeout = st_io_time * st_long_timeout_x;
12650 		} else {
12651 			un->un_dp->io_timeout = (ushort_t)st_io_time;
12652 		}
12653 	}
12654 
12655 	if (un->un_dp->rewind_timeout == 0) {
12656 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12657 			un->un_dp->rewind_timeout =
12658 			    st_space_time * st_long_timeout_x;
12659 		} else {
12660 			un->un_dp->rewind_timeout = (ushort_t)st_space_time;
12661 		}
12662 	}
12663 
12664 	if (un->un_dp->space_timeout == 0) {
12665 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12666 			un->un_dp->space_timeout =
12667 			    st_space_time * st_long_timeout_x;
12668 		} else {
12669 			un->un_dp->space_timeout = (ushort_t)st_space_time;
12670 		}
12671 	}
12672 
12673 	if (un->un_dp->load_timeout == 0) {
12674 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12675 			un->un_dp->load_timeout =
12676 			    st_space_time * st_long_timeout_x;
12677 		} else {
12678 			un->un_dp->load_timeout = (ushort_t)st_space_time;
12679 		}
12680 	}
12681 
12682 	if (un->un_dp->unload_timeout == 0) {
12683 		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
12684 			un->un_dp->unload_timeout =
12685 			    st_space_time * st_long_timeout_x;
12686 		} else {
12687 			un->un_dp->unload_timeout = (ushort_t)st_space_time;
12688 		}
12689 	}
12690 
12691 	if (un->un_dp->erase_timeout == 0) {
12692 		if (un->un_dp->options & ST_LONG_ERASE) {
12693 			un->un_dp->erase_timeout =
12694 			    st_space_time * st_long_space_time_x;
12695 		} else {
12696 			un->un_dp->erase_timeout = (ushort_t)st_space_time;
12697 		}
12698 	}
12699 }
12700 
12701 
12702 static writablity
12703 st_is_not_wormable(struct scsi_tape *un)
12704 {
12705 	ST_FUNC(ST_DEVINFO, st_is_not_wormable);
12706 	return (RDWR);
12707 }
12708 
12709 static writablity
12710 st_is_hp_dat_tape_worm(struct scsi_tape *un)
12711 {
12712 	writablity wrt;
12713 
12714 	ST_FUNC(ST_DEVINFO, st_is_hp_dat_tape_worm);
12715 
12716 	/* Mode sense should be current */
12717 	if (un->un_mspl->media_type == 1) {
12718 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12719 		    "Drive has WORM media loaded\n");
12720 		wrt = WORM;
12721 	} else {
12722 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12723 		    "Drive has non WORM media loaded\n");
12724 		wrt = RDWR;
12725 	}
12726 	return (wrt);
12727 }
12728 
12729 #define	HP_DAT_INQUIRY 0x4A
12730 static writablity
12731 st_is_hp_dat_worm(struct scsi_tape *un)
12732 {
12733 	char *buf;
12734 	int result;
12735 	writablity wrt;
12736 
12737 	ST_FUNC(ST_DEVINFO, st_is_hp_dat_worm);
12738 
12739 	buf = kmem_zalloc(HP_DAT_INQUIRY, KM_SLEEP);
12740 
12741 	result = st_get_special_inquiry(un, HP_DAT_INQUIRY, buf, 0);
12742 
12743 	if (result != 0) {
12744 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12745 		    "Read Standard Inquiry for WORM support failed");
12746 		wrt = FAILED;
12747 	} else if ((buf[40] & 1) == 0) {
12748 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12749 		    "Drive is NOT WORMable\n");
12750 		/* This drive doesn't support it so don't check again */
12751 		un->un_dp->options &= ~ST_WORMABLE;
12752 		wrt = RDWR;
12753 		un->un_wormable = st_is_not_wormable;
12754 	} else {
12755 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12756 		    "Drive supports WORM version %d\n", buf[40] >> 1);
12757 		un->un_wormable = st_is_hp_dat_tape_worm;
12758 		wrt = un->un_wormable(un);
12759 	}
12760 
12761 	kmem_free(buf, HP_DAT_INQUIRY);
12762 
12763 	/*
12764 	 * If drive doesn't support it no point in checking further.
12765 	 */
12766 	return (wrt);
12767 }
12768 
12769 static writablity
12770 st_is_hp_lto_tape_worm(struct scsi_tape *un)
12771 {
12772 	writablity wrt;
12773 
12774 	ST_FUNC(ST_DEVINFO, st_is_hp_lto_tape_worm);
12775 
12776 	/* Mode sense should be current */
12777 	switch (un->un_mspl->media_type) {
12778 	case 0x00:
12779 		switch (un->un_mspl->density) {
12780 		case 0x40:
12781 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12782 			    "Drive has standard Gen I media loaded\n");
12783 			break;
12784 		case 0x42:
12785 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12786 			    "Drive has standard Gen II media loaded\n");
12787 			break;
12788 		case 0x44:
12789 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12790 			    "Drive has standard Gen III media loaded\n");
12791 			break;
12792 		case 0x46:
12793 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12794 			    "Drive has standard Gen IV media loaded\n");
12795 			break;
12796 		default:
12797 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12798 			    "Drive has standard unknown 0x%X media loaded\n",
12799 			    un->un_mspl->density);
12800 		}
12801 		wrt = RDWR;
12802 		break;
12803 	case 0x01:
12804 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12805 		    "Drive has WORM medium loaded\n");
12806 		wrt = WORM;
12807 		break;
12808 	case 0x80:
12809 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12810 		    "Drive has CD-ROM emulation medium loaded\n");
12811 		wrt = WORM;
12812 		break;
12813 	default:
12814 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12815 		    "Drive has an unexpected medium type 0x%X loaded\n",
12816 		    un->un_mspl->media_type);
12817 		wrt = RDWR;
12818 	}
12819 
12820 	return (wrt);
12821 }
12822 
12823 #define	LTO_REQ_INQUIRY 44
12824 static writablity
12825 st_is_hp_lto_worm(struct scsi_tape *un)
12826 {
12827 	char *buf;
12828 	int result;
12829 	writablity wrt;
12830 
12831 	ST_FUNC(ST_DEVINFO, st_is_hp_lto_worm);
12832 
12833 	buf = kmem_zalloc(LTO_REQ_INQUIRY, KM_SLEEP);
12834 
12835 	result = st_get_special_inquiry(un, LTO_REQ_INQUIRY, buf, 0);
12836 
12837 	if (result != 0) {
12838 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12839 		    "Read Standard Inquiry for WORM support failed");
12840 		wrt = FAILED;
12841 	} else if ((buf[40] & 1) == 0) {
12842 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12843 		    "Drive is NOT WORMable\n");
12844 		/* This drive doesn't support it so don't check again */
12845 		un->un_dp->options &= ~ST_WORMABLE;
12846 		wrt = RDWR;
12847 		un->un_wormable = st_is_not_wormable;
12848 	} else {
12849 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12850 		    "Drive supports WORM version %d\n", buf[40] >> 1);
12851 		un->un_wormable = st_is_hp_lto_tape_worm;
12852 		wrt = un->un_wormable(un);
12853 	}
12854 
12855 	kmem_free(buf, LTO_REQ_INQUIRY);
12856 
12857 	/*
12858 	 * If drive doesn't support it no point in checking further.
12859 	 */
12860 	return (wrt);
12861 }
12862 
12863 static writablity
12864 st_is_t10_worm_device(struct scsi_tape *un)
12865 {
12866 	writablity wrt;
12867 
12868 	ST_FUNC(ST_DEVINFO, st_is_t10_worm_device);
12869 
12870 	if (un->un_mspl->media_type == 0x3c) {
12871 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12872 		    "Drive has WORM media loaded\n");
12873 		wrt = WORM;
12874 	} else {
12875 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12876 		    "Drive has non WORM media loaded\n");
12877 		wrt = RDWR;
12878 	}
12879 	return (wrt);
12880 }
12881 
12882 #define	SEQ_CAP_PAGE	(char)0xb0
12883 static writablity
12884 st_is_t10_worm(struct scsi_tape *un)
12885 {
12886 	char *buf;
12887 	int result;
12888 	writablity wrt;
12889 
12890 	ST_FUNC(ST_DEVINFO, st_is_t10_worm);
12891 
12892 	buf = kmem_zalloc(6, KM_SLEEP);
12893 
12894 	result = st_get_special_inquiry(un, 6, buf, SEQ_CAP_PAGE);
12895 
12896 	if (result != 0) {
12897 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12898 		    "Read Vitial Inquiry for Sequental Capability"
12899 		    " WORM support failed %x", result);
12900 		wrt = FAILED;
12901 	} else if ((buf[4] & 1) == 0) {
12902 		ASSERT(buf[1] == SEQ_CAP_PAGE);
12903 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12904 		    "Drive is NOT WORMable\n");
12905 		/* This drive doesn't support it so don't check again */
12906 		un->un_dp->options &= ~ST_WORMABLE;
12907 		wrt = RDWR;
12908 		un->un_wormable = st_is_not_wormable;
12909 	} else {
12910 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12911 		    "Drive supports WORM\n");
12912 		un->un_wormable = st_is_t10_worm_device;
12913 		wrt = un->un_wormable(un);
12914 	}
12915 
12916 	kmem_free(buf, 6);
12917 
12918 	return (wrt);
12919 }
12920 
12921 
12922 #define	STK_REQ_SENSE 26
12923 
12924 static writablity
12925 st_is_stk_worm(struct scsi_tape *un)
12926 {
12927 	char cdb[CDB_GROUP0] = {SCMD_REQUEST_SENSE, 0, 0, 0, STK_REQ_SENSE, 0};
12928 	struct scsi_extended_sense *sense;
12929 	struct uscsi_cmd *cmd;
12930 	char *buf;
12931 	int result;
12932 	writablity wrt;
12933 
12934 	ST_FUNC(ST_DEVINFO, st_is_stk_worm);
12935 
12936 	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12937 	buf = kmem_alloc(STK_REQ_SENSE, KM_SLEEP);
12938 	sense = (struct scsi_extended_sense *)buf;
12939 
12940 	cmd->uscsi_flags = USCSI_READ;
12941 	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
12942 	cmd->uscsi_cdb = &cdb[0];
12943 	cmd->uscsi_bufaddr = buf;
12944 	cmd->uscsi_buflen = STK_REQ_SENSE;
12945 	cmd->uscsi_cdblen = CDB_GROUP0;
12946 	cmd->uscsi_rqlen = 0;
12947 	cmd->uscsi_rqbuf = NULL;
12948 
12949 	result = st_ioctl_cmd(un->un_dev, cmd, FKIOCTL);
12950 
12951 	if (result != 0 || cmd->uscsi_status != 0) {
12952 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12953 		    "Request Sense for WORM failed");
12954 		wrt = RDWR;
12955 	} else if (sense->es_add_len + 8 < 24) {
12956 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12957 		    "Drive didn't send enough sense data for WORM byte %d\n",
12958 		    sense->es_add_len + 8);
12959 		wrt = RDWR;
12960 		un->un_wormable = st_is_not_wormable;
12961 	} else if ((buf[24]) & 0x02) {
12962 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12963 		    "Drive has WORM tape loaded\n");
12964 		wrt = WORM;
12965 		un->un_wormable = st_is_stk_worm;
12966 	} else {
12967 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12968 		    "Drive has normal tape loaded\n");
12969 		wrt = RDWR;
12970 		un->un_wormable = st_is_stk_worm;
12971 	}
12972 
12973 	kmem_free(buf, STK_REQ_SENSE);
12974 	kmem_free(cmd, sizeof (struct uscsi_cmd));
12975 	return (wrt);
12976 }
12977 
12978 #define	DLT_INQ_SZ 44
12979 
12980 static writablity
12981 st_is_dlt_tape_worm(struct scsi_tape *un)
12982 {
12983 	caddr_t buf;
12984 	int result;
12985 	writablity wrt;
12986 
12987 	ST_FUNC(ST_DEVINFO, st_is_dlt_tape_worm);
12988 
12989 	buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP);
12990 
12991 	/* Read Attribute Media Type */
12992 
12993 	result = st_read_attributes(un, 0x0408, buf, 10);
12994 
12995 	/*
12996 	 * If this quantum drive is attached via an HBA that cannot
12997 	 * support thr read attributes command return error in the
12998 	 * hope that someday they will support the t10 method.
12999 	 */
13000 	if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) {
13001 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13002 		    "Read Attribute Command for WORM Media detection is not "
13003 		    "supported on the HBA that this drive is attached to.");
13004 		wrt = RDWR;
13005 		un->un_wormable = st_is_not_wormable;
13006 		goto out;
13007 	}
13008 
13009 	if (result != 0) {
13010 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13011 		    "Read Attribute Command for WORM Media returned 0x%x",
13012 		    result);
13013 		wrt = RDWR;
13014 		un->un_dp->options &= ~ST_WORMABLE;
13015 		goto out;
13016 	}
13017 
13018 	if ((uchar_t)buf[9] == 0x80) {
13019 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13020 		    "Drive media is WORM\n");
13021 		wrt = WORM;
13022 	} else {
13023 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13024 		    "Drive media is not WORM Media 0x%x\n", (uchar_t)buf[9]);
13025 		wrt = RDWR;
13026 	}
13027 
13028 out:
13029 	kmem_free(buf, DLT_INQ_SZ);
13030 	return (wrt);
13031 }
13032 
13033 static writablity
13034 st_is_dlt_worm(struct scsi_tape *un)
13035 {
13036 	caddr_t buf;
13037 	int result;
13038 	writablity wrt;
13039 
13040 	ST_FUNC(ST_DEVINFO, st_is_dlt_worm);
13041 
13042 	buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP);
13043 
13044 	result = st_get_special_inquiry(un, DLT_INQ_SZ, buf, 0xC0);
13045 
13046 	if (result != 0) {
13047 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13048 		    "Read Vendor Specific Inquiry for WORM support failed");
13049 		wrt = RDWR;
13050 		goto out;
13051 	}
13052 
13053 	if ((buf[2] & 1) == 0) {
13054 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13055 		    "Drive is not WORMable\n");
13056 		wrt = RDWR;
13057 		un->un_dp->options &= ~ST_WORMABLE;
13058 		un->un_wormable = st_is_not_wormable;
13059 		goto out;
13060 	} else {
13061 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13062 		    "Drive is WORMable\n");
13063 		un->un_wormable = st_is_dlt_tape_worm;
13064 		wrt = un->un_wormable(un);
13065 	}
13066 out:
13067 	kmem_free(buf, DLT_INQ_SZ);
13068 
13069 	return (wrt);
13070 }
13071 
13072 typedef struct {
13073 	struct modeheader_seq header;
13074 #if defined(_BIT_FIELDS_LTOH) /* X86 */
13075 	uchar_t pagecode	:6,
13076 				:2;
13077 	uchar_t page_len;
13078 	uchar_t syslogalive	:2,
13079 		device		:1,
13080 		abs		:1,
13081 		ulpbot		:1,
13082 		prth		:1,
13083 		ponej		:1,
13084 		ait		:1;
13085 	uchar_t span;
13086 
13087 	uchar_t			:6,
13088 		worm		:1,
13089 		mic		:1;
13090 	uchar_t worm_cap	:1,
13091 				:7;
13092 	uint32_t		:32;
13093 #else /* SPARC */
13094 	uchar_t			:2,
13095 		pagecode	:6;
13096 	uchar_t page_len;
13097 	uchar_t ait		:1,
13098 		device		:1,
13099 		abs		:1,
13100 		ulpbot		:1,
13101 		prth		:1,
13102 		ponej		:1,
13103 		syslogalive	:2;
13104 	uchar_t span;
13105 	uchar_t mic		:1,
13106 		worm		:1,
13107 				:6;
13108 	uchar_t			:7,
13109 		worm_cap	:1;
13110 	uint32_t		:32;
13111 #endif
13112 }ait_dev_con;
13113 
13114 #define	AIT_DEV_PAGE 0x31
13115 static writablity
13116 st_is_sony_worm(struct scsi_tape *un)
13117 {
13118 	int result;
13119 	writablity wrt;
13120 	ait_dev_con *ait_conf;
13121 
13122 	ST_FUNC(ST_DEVINFO, st_is_sony_worm);
13123 
13124 	ait_conf = kmem_zalloc(sizeof (ait_dev_con), KM_SLEEP);
13125 
13126 	result = st_gen_mode_sense(un, AIT_DEV_PAGE,
13127 	    (struct seq_mode *)ait_conf, sizeof (ait_dev_con));
13128 
13129 	if (result == 0) {
13130 
13131 		if (ait_conf->pagecode != AIT_DEV_PAGE) {
13132 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13133 			    "returned page 0x%x not 0x%x AIT_DEV_PAGE\n",
13134 			    ait_conf->pagecode, AIT_DEV_PAGE);
13135 			wrt = RDWR;
13136 			un->un_wormable = st_is_not_wormable;
13137 
13138 		} else if (ait_conf->worm_cap) {
13139 
13140 			un->un_wormable = st_is_sony_worm;
13141 
13142 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13143 			    "Drives is WORMable\n");
13144 			if (ait_conf->worm) {
13145 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13146 				    "Media is WORM\n");
13147 				wrt = WORM;
13148 			} else {
13149 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13150 				    "Media is not WORM\n");
13151 				wrt = RDWR;
13152 			}
13153 
13154 		} else {
13155 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13156 			    "Drives not is WORMable\n");
13157 			wrt = RDWR;
13158 			/* No further checking required */
13159 			un->un_dp->options &= ~ST_WORMABLE;
13160 		}
13161 
13162 	} else {
13163 
13164 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13165 		    "AIT device config mode sense page read command failed"
13166 		    " result = %d ", result);
13167 		wrt = FAILED;
13168 		un->un_wormable = st_is_not_wormable;
13169 	}
13170 
13171 	kmem_free(ait_conf, sizeof (ait_dev_con));
13172 	return (wrt);
13173 }
13174 
13175 static writablity
13176 st_is_drive_worm(struct scsi_tape *un)
13177 {
13178 	writablity wrt;
13179 
13180 	ST_FUNC(ST_DEVINFO, st_is_sony_worm);
13181 
13182 	switch (un->un_dp->type) {
13183 	case MT_ISDLT:
13184 		wrt = st_is_dlt_worm(un);
13185 		break;
13186 
13187 	case MT_ISSTK9840:
13188 		wrt = st_is_stk_worm(un);
13189 		break;
13190 
13191 	case MT_IS8MM:
13192 	case MT_ISAIT:
13193 		wrt = st_is_sony_worm(un);
13194 		break;
13195 
13196 	case MT_LTO:
13197 		if (strncmp("HP ", un->un_dp->vid, 3) == 0) {
13198 			wrt = st_is_hp_lto_worm(un);
13199 		} else {
13200 			wrt = st_is_t10_worm(un);
13201 		}
13202 		break;
13203 
13204 	case MT_ISDAT:
13205 		if (strncmp("HP ", un->un_dp->vid, 3) == 0) {
13206 			wrt = st_is_hp_dat_worm(un);
13207 		} else {
13208 			wrt = st_is_t10_worm(un);
13209 		}
13210 		break;
13211 
13212 	default:
13213 		wrt = FAILED;
13214 		break;
13215 	}
13216 
13217 	/*
13218 	 * If any of the above failed try the t10 standard method.
13219 	 */
13220 	if (wrt == FAILED) {
13221 		wrt = st_is_t10_worm(un);
13222 	}
13223 
13224 	/*
13225 	 * Unknown method for detecting WORM media.
13226 	 */
13227 	if (wrt == FAILED) {
13228 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13229 		    "Unknown method for WORM media detection\n");
13230 		wrt = RDWR;
13231 		un->un_dp->options &= ~ST_WORMABLE;
13232 	}
13233 
13234 	return (wrt);
13235 }
13236 
13237 static int
13238 st_read_attributes(struct scsi_tape *un, uint16_t attribute, caddr_t buf,
13239     size_t size)
13240 {
13241 	char cdb[CDB_GROUP4];
13242 	int result;
13243 	struct uscsi_cmd *cmd;
13244 
13245 	ST_FUNC(ST_DEVINFO, st_read_attributes);
13246 
13247 	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
13248 
13249 	cdb[0] = (char)SCMD_READ_ATTRIBUTE;
13250 	cdb[1] = 0;
13251 	cdb[2] = 0;
13252 	cdb[3] = 0;
13253 	cdb[4] = 0;
13254 	cdb[5] = 0;
13255 	cdb[6] = 0;
13256 	cdb[7] = 0;
13257 	cdb[8] = (char)(attribute >> 8);
13258 	cdb[9] = (char)(attribute);
13259 	cdb[10] = (char)(size >> 24);
13260 	cdb[11] = (char)(size >> 16);
13261 	cdb[12] = (char)(size >> 8);
13262 	cdb[13] = (char)(size);
13263 	cdb[14] = 0;
13264 	cdb[15] = 0;
13265 
13266 
13267 	cmd->uscsi_flags = USCSI_READ | USCSI_DIAGNOSE;
13268 	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
13269 	cmd->uscsi_cdb = &cdb[0];
13270 	cmd->uscsi_bufaddr = (caddr_t)buf;
13271 	cmd->uscsi_buflen = size;
13272 	cmd->uscsi_cdblen = sizeof (cdb);
13273 
13274 	result = st_ioctl_cmd(un->un_dev, cmd, FKIOCTL);
13275 
13276 	if (result != 0 || cmd->uscsi_status != 0) {
13277 		ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
13278 		    "st_read_attribute failed: result %d status %d\n",
13279 		    result, cmd->uscsi_status);
13280 		if (result == 0) {
13281 			result = EIO;
13282 		}
13283 		goto exit;
13284 	}
13285 
13286 	/*
13287 	 * The attribute retured should match the attribute requested.
13288 	 */
13289 	if (buf[4] != cdb[8] || buf[5] != cdb[9]) {
13290 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
13291 		    "bad? data", buf, size);
13292 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13293 		    "st_read_attribute got wrong data back expected 0x%x"
13294 		    " got 0x%x\n", attribute, buf[6] << 8 | buf[7]);
13295 		result = EIO;
13296 	}
13297 exit:
13298 	kmem_free(cmd, sizeof (struct uscsi_cmd));
13299 
13300 	return (result);
13301 }
13302 
13303 static int
13304 st_get_special_inquiry(struct scsi_tape *un, uchar_t size, caddr_t dest,
13305     uchar_t page)
13306 {
13307 	char cdb[CDB_GROUP0];
13308 	struct scsi_extended_sense *sense;
13309 	struct uscsi_cmd *cmd;
13310 	int result;
13311 
13312 	ST_FUNC(ST_DEVINFO, st_get_special_inquiry);
13313 
13314 	cdb[0] = SCMD_INQUIRY;
13315 	cdb[1] = page ? 1 : 0;
13316 	cdb[2] = page;
13317 	cdb[3] = 0;
13318 	cdb[4] = size;
13319 	cdb[5] = 0;
13320 
13321 	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
13322 	sense = kmem_alloc(sizeof (struct scsi_extended_sense), KM_SLEEP);
13323 
13324 	cmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE;
13325 	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
13326 	cmd->uscsi_cdb = &cdb[0];
13327 	cmd->uscsi_bufaddr = dest;
13328 	cmd->uscsi_buflen = size;
13329 	cmd->uscsi_cdblen = CDB_GROUP0;
13330 	cmd->uscsi_rqlen = sizeof (struct scsi_extended_sense);
13331 	cmd->uscsi_rqbuf = (caddr_t)sense;
13332 
13333 	result = st_ioctl_cmd(un->un_dev, cmd, FKIOCTL);
13334 
13335 	if (result != 0 || cmd->uscsi_status != 0) {
13336 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13337 		    "st_get_special_inquiry() failed for page %x", page);
13338 		if (result == 0) {
13339 			result = EIO;
13340 		}
13341 	}
13342 
13343 	kmem_free(sense, sizeof (struct scsi_extended_sense));
13344 	kmem_free(cmd, sizeof (struct uscsi_cmd));
13345 
13346 	return (result);
13347 }
13348 
13349 
13350 static int
13351 st_update_block_pos(struct scsi_tape *un)
13352 {
13353 	int rval = ENOTTY;
13354 
13355 	ST_FUNC(ST_DEVINFO, st_update_block_pos);
13356 
13357 	while (un->un_read_pos_type != NO_POS) {
13358 		rval = st_cmd(un->un_dev, SCMD_READ_POSITION, 32, SYNC_CMD);
13359 
13360 		if (rval == 0) {
13361 			rval = st_interpret_read_pos(un, un->un_read_pos_type,
13362 			    32, (caddr_t)un->un_read_pos_data);
13363 			break;
13364 		} else if (un->un_status == KEY_UNIT_ATTENTION) {
13365 			continue;
13366 		} else if (un->un_status != KEY_ILLEGAL_REQUEST) {
13367 			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
13368 			    "st_update_block_pos() read position cmd %x"
13369 			    " returned %x un_status = %d",
13370 			    un->un_read_pos_type, rval, un->un_status);
13371 			break;
13372 		} else {
13373 			ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE,
13374 			    "st_update_block_pos() read position cmd %x"
13375 			    " returned %x", un->un_read_pos_type, rval);
13376 		}
13377 
13378 		switch (un->un_read_pos_type) {
13379 		case SHORT_POS:
13380 			un->un_read_pos_type = NO_POS;
13381 			break;
13382 
13383 		case LONG_POS:
13384 			un->un_read_pos_type = EXT_POS;
13385 			break;
13386 
13387 		case EXT_POS:
13388 			un->un_read_pos_type = SHORT_POS;
13389 			break;
13390 
13391 		default:
13392 			ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
13393 			    "Unexpected read position type 0x%x",
13394 			    un->un_read_pos_type);
13395 		}
13396 	}
13397 
13398 	return (rval);
13399 }
13400 
13401 static int
13402 st_get_read_pos(struct scsi_tape *un, buf_t *bp)
13403 {
13404 	int result;
13405 	size_t d_sz;
13406 	caddr_t pos_info;
13407 	struct uscsi_cmd *cmd = (struct uscsi_cmd *)bp->b_back;
13408 
13409 	ST_FUNC(ST_DEVINFO, st_get_read_pos);
13410 
13411 	if (cmd->uscsi_bufaddr == NULL || cmd->uscsi_buflen <= 0) {
13412 		return (0);
13413 	}
13414 
13415 	if (bp_mapin_common(bp, VM_NOSLEEP) == NULL) {
13416 
13417 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13418 		    "bp_mapin_common() failed");
13419 
13420 		return (EIO);
13421 	}
13422 
13423 	pos_info = bp->b_un.b_addr;
13424 	d_sz = bp->b_bcount - bp->b_resid;
13425 
13426 #ifdef DEBUG
13427 	if ((st_debug & 0xf) > 2) {
13428 		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
13429 		    "st_get_read_pos() position info",
13430 		    pos_info, bp->b_bcount);
13431 	}
13432 #endif
13433 
13434 	result = st_interpret_read_pos(un, cmd->uscsi_cdb[1], d_sz, pos_info);
13435 
13436 	bp_mapout(bp);
13437 
13438 	return (result);
13439 }
13440 
13441 #if defined(_BIG_ENDIAN)
13442 
13443 #define	FIX_ENDIAN32(x)
13444 #define	FIX_ENDIAN64(x)
13445 
13446 #elif defined(_LITTLE_ENDIAN)
13447 
13448 static void
13449 st_swap32(uint32_t *val)
13450 {
13451 	uint32_t tmp;
13452 
13453 	tmp =  (*val >> 24) & 0xff;
13454 	tmp |= (*val >>  8) & 0xff00;
13455 	tmp |= (*val <<  8) & 0xff0000;
13456 	tmp |= (*val << 24) & 0xff000000;
13457 
13458 	*val = tmp;
13459 }
13460 
13461 static void
13462 st_swap64(uint64_t *val)
13463 {
13464 	uint32_t low;
13465 	uint32_t high;
13466 
13467 	low =  (uint32_t)(*val);
13468 	high = (uint32_t)(*val >> 32);
13469 
13470 	st_swap32(&low);
13471 	st_swap32(&high);
13472 
13473 	*val =  high;
13474 	*val |= ((uint64_t)low << 32);
13475 }
13476 
13477 #define	FIX_ENDIAN32(x) st_swap32(x)
13478 #define	FIX_ENDIAN64(x) st_swap64(x)
13479 #endif
13480 
13481 static int
13482 st_interpret_read_pos(struct scsi_tape *un, read_p_types type,
13483     size_t data_sz, caddr_t responce)
13484 {
13485 	int rval = 0;
13486 
13487 	ST_FUNC(ST_DEVINFO, st_interpret_read_pos);
13488 
13489 	/*
13490 	 * Look at byte 1 of cdb to see what kind of read position
13491 	 * was requested.
13492 	 */
13493 	switch (type) {
13494 
13495 	case SHORT_POS: /* Short data format */
13496 	{
13497 		tape_position_t *pos_info = (tape_position_t *)responce;
13498 		uint32_t value;
13499 
13500 		/* If reserved fields are non zero don't use the data */
13501 		if (pos_info->reserved0 || pos_info->reserved1 ||
13502 		    pos_info->reserved2[0] || pos_info->reserved2[1] ||
13503 		    pos_info->reserved3) {
13504 			rval = EIO;
13505 			break;
13506 		}
13507 		/*
13508 		 * Position is to large to use this type of read position.
13509 		 */
13510 		if (pos_info->posi_err == 1) {
13511 			rval = ERANGE;
13512 			break;
13513 		}
13514 
13515 		if (pos_info->blk_posi_unkwn == 0) {
13516 
13517 			if (un->un_pos.partition !=
13518 			    pos_info->partition_number) {
13519 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13520 				    "SHORT_POS current partition %d read %d\n",
13521 				    un->un_pos.partition,
13522 				    pos_info->partition_number);
13523 			}
13524 			un->un_pos.partition = pos_info->partition_number;
13525 			value = pos_info->host_block;
13526 			FIX_ENDIAN32(&value);
13527 
13528 			if (un->un_pos.lgclblkno != value) {
13529 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13530 				    "SHORT_POS current logical 0x%"PRIx64" read"
13531 				    " 0x%x\n", un->un_pos.lgclblkno, value);
13532 			}
13533 
13534 			un->un_pos.lgclblkno = (uint64_t)value;
13535 
13536 			if (pos_info->begin_of_part && pos_info->end_of_part) {
13537 				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
13538 				    "SHORT_POS returned begin and end of"
13539 				    " partition\n");
13540 				break;
13541 			}
13542 			/* Is drive rewound */
13543 			if ((pos_info->begin_of_part == 1) &&
13544 			    (pos_info->host_block == 0)) {
13545 				un->un_pos.blkno = 0;
13546 				un->un_pos.fileno = 0;
13547 				un->un_pos.pmode = legacy;
13548 			} else if (un->un_pos.pmode == invalid) {
13549 				/* If we were lost now were found */
13550 				un->un_pos.pmode = logical;
13551 			}
13552 		} else {
13553 			un->un_pos.pmode = invalid;
13554 		}
13555 		break;
13556 	}
13557 
13558 	case LONG_POS: /* Long data format */
13559 	{
13560 		uint64_t value;
13561 		tape_position_long_t *long_pos_info =
13562 		    (tape_position_long_t *)responce;
13563 
13564 		/* If reserved fields are non zero don't use the data */
13565 		if ((long_pos_info->reserved0) ||
13566 		    (long_pos_info->reserved1) ||
13567 		    (long_pos_info->reserved2)) {
13568 			rval = EIO;
13569 			break;
13570 		}
13571 
13572 		/* Is position Valid */
13573 		if (long_pos_info->blk_posi_unkwn == 0) {
13574 			uint32_t part;
13575 
13576 			part = long_pos_info->partition;
13577 			FIX_ENDIAN32(&part);
13578 			if (un->un_pos.partition != part) {
13579 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13580 				    "LONG_POS current partition %d"
13581 				    " read %d\n", un->un_pos.partition, part);
13582 			}
13583 			un->un_pos.partition = part;
13584 			value = long_pos_info->block_number;
13585 			FIX_ENDIAN64(&value);
13586 			if (un->un_pos.lgclblkno != value) {
13587 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13588 				    "LONG_POS current logical 0x%"PRIx64
13589 				    " read 0x%"PRIx64"\n",
13590 				    un->un_pos.lgclblkno, value);
13591 			}
13592 			un->un_pos.lgclblkno = value;
13593 
13594 			if (long_pos_info->begin_of_part &&
13595 			    long_pos_info->end_of_part) {
13596 				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
13597 				    "LONG_POS returned begin and end of"
13598 				    " partition\n");
13599 				break;
13600 			}
13601 			if ((long_pos_info->begin_of_part == 1) &&
13602 			    (long_pos_info->block_number == 0)) {
13603 				un->un_pos.blkno = 0;
13604 				un->un_pos.fileno = 0;
13605 				un->un_pos.pmode = legacy;
13606 			} else if (un->un_pos.pmode == invalid) {
13607 				un->un_pos.pmode = logical;
13608 			}
13609 		} else {
13610 			/*
13611 			 * If the drive doesn't know location,
13612 			 * we don't either.
13613 			 */
13614 			un->un_pos.pmode = invalid;
13615 		}
13616 
13617 		value = long_pos_info->file_number;
13618 		FIX_ENDIAN64(&value);
13619 		/* Is file position valid */
13620 		if (long_pos_info->mrk_posi_unkwn == 0) {
13621 			if (((un->un_pos.pmode == legacy) ||
13622 			    (un->un_pos.pmode == logical)) &&
13623 			    (un->un_pos.fileno != value)) {
13624 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13625 				    "LONG_POS fileno 0x%"PRIx64
13626 				    " not un_pos %x\n", value,
13627 				    un->un_pos.fileno);
13628 			} else if (un->un_pos.pmode == invalid) {
13629 				un->un_pos.pmode = logical;
13630 			}
13631 			un->un_pos.fileno = (int32_t)value;
13632 		} else {
13633 			/*
13634 			 * If the drive doesn't know its position,
13635 			 * we don't either.
13636 			 */
13637 			un->un_pos.pmode = invalid;
13638 		}
13639 		if (un->un_pos.pmode != invalid && long_pos_info->end_of_part) {
13640 			un->un_pos.eof = ST_EOT;
13641 		}
13642 
13643 		break;
13644 	}
13645 
13646 	case EXT_POS: /* Extended data format */
13647 	{
13648 		uint64_t value;
13649 		tape_position_ext_t *ext_pos_info =
13650 		    (tape_position_ext_t *)responce;
13651 
13652 		/* Make sure that there is enough data there */
13653 		if (data_sz < 16) {
13654 			break;
13655 		}
13656 
13657 		/* If reserved fields are non zero don't use the data */
13658 		if (ext_pos_info->reserved0 || ext_pos_info->reserved1) {
13659 			rval = EIO;
13660 			break;
13661 		}
13662 
13663 		/*
13664 		 * In the unlikely event of overflowing 64 bits of position.
13665 		 */
13666 		if (ext_pos_info->posi_err != 0) {
13667 			rval = ERANGE;
13668 			break;
13669 		}
13670 
13671 		/* Is block position information valid */
13672 		if (ext_pos_info->blk_posi_unkwn == 0) {
13673 
13674 			if (un->un_pos.partition != ext_pos_info->partition) {
13675 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13676 				    "EXT_POS current partition %d read %d\n",
13677 				    un->un_pos.partition,
13678 				    ext_pos_info->partition);
13679 			}
13680 			un->un_pos.partition = ext_pos_info->partition;
13681 
13682 			value = ext_pos_info->host_block;
13683 			FIX_ENDIAN64(&value);
13684 			if (un->un_pos.lgclblkno != value) {
13685 				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13686 				    "EXT_POS current logical 0x%"PRIx64
13687 				    " read 0x%"PRIx64"\n",
13688 				    un->un_pos.lgclblkno, value);
13689 			}
13690 			un->un_pos.lgclblkno = value;
13691 			if ((ext_pos_info->begin_of_part == 1) &&
13692 			    (ext_pos_info->host_block == 0)) {
13693 				un->un_pos.blkno = 0;
13694 				un->un_pos.fileno = 0;
13695 				un->un_pos.pmode = legacy;
13696 			} else if (un->un_pos.pmode == invalid) {
13697 				un->un_pos.pmode = logical;
13698 			}
13699 		} else {
13700 			un->un_pos.pmode = invalid;
13701 		}
13702 		break;
13703 	}
13704 
13705 	default:
13706 		ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
13707 		    "Got unexpected SCMD_READ_POSITION type %d\n", type);
13708 		rval = EIO;
13709 	}
13710 
13711 	return (rval);
13712 }
13713 
13714 static int
13715 st_logical_block_locate(struct scsi_tape *un, uint64_t lblk, uchar_t partition)
13716 {
13717 	int rval;
13718 	char cdb[CDB_GROUP4];
13719 	struct uscsi_cmd *cmd;
13720 	struct scsi_extended_sense sense;
13721 
13722 	ST_FUNC(ST_DEVINFO, st_logical_block_locate);
13723 
13724 	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
13725 
13726 	if (lblk <= INT32_MAX) {
13727 		cmd->uscsi_cdblen = CDB_GROUP1;
13728 		cdb[0] = SCMD_LOCATE;
13729 		cdb[1] = un->un_pos.partition == partition ? 0 : 2;
13730 		cdb[2] = 0;
13731 		cdb[3] = (char)(lblk >> 24);
13732 		cdb[4] = (char)(lblk >> 16);
13733 		cdb[5] = (char)(lblk >> 8);
13734 		cdb[6] = (char)(lblk);
13735 		cdb[7] = 0;
13736 		cdb[8] = partition;
13737 		cdb[9] = 0;
13738 	} else {
13739 		/*
13740 		 * If the drive doesn't give a 64 bit read position data
13741 		 * it is unlikely it will accept 64 bit locates.
13742 		 */
13743 		if (un->un_read_pos_type != LONG_POS) {
13744 			kmem_free(cmd, sizeof (struct uscsi_cmd));
13745 			return (ERANGE);
13746 		}
13747 		cmd->uscsi_cdblen = CDB_GROUP4;
13748 		cdb[0] = (char)SCMD_LOCATE_G4;
13749 		cdb[1] = un->un_pos.partition == partition ? 0 : 2;
13750 		cdb[2] = 0;
13751 		cdb[3] = partition;
13752 		cdb[4] = (char)(lblk >> 56);
13753 		cdb[5] = (char)(lblk >> 48);
13754 		cdb[6] = (char)(lblk >> 40);
13755 		cdb[7] = (char)(lblk >> 32);
13756 		cdb[8] = (char)(lblk >> 24);
13757 		cdb[9] = (char)(lblk >> 16);
13758 		cdb[10] = (char)(lblk >> 8);
13759 		cdb[11] = (char)(lblk);
13760 		cdb[12] = 0;
13761 		cdb[13] = 0;
13762 		cdb[14] = 0;
13763 		cdb[15] = 0;
13764 	}
13765 
13766 
13767 	cmd->uscsi_flags = USCSI_WRITE | USCSI_DIAGNOSE | USCSI_RQENABLE;
13768 	cmd->uscsi_rqbuf = (caddr_t)&sense;
13769 	cmd->uscsi_rqlen = sizeof (sense);
13770 	cmd->uscsi_timeout = un->un_dp->space_timeout;
13771 	cmd->uscsi_cdb = cdb;
13772 
13773 	rval = st_ioctl_cmd(un->un_dev, cmd, FKIOCTL);
13774 
13775 	un->un_pos.pmode = logical;
13776 	un->un_pos.eof = ST_NO_EOF;
13777 
13778 	if (lblk > INT32_MAX) {
13779 		/*
13780 		 * XXX This is a work around till we handle Descriptor format
13781 		 * sense data. Since we are sending a command where the standard
13782 		 * sense data can not correctly represent a correct residual in
13783 		 * 4 bytes.
13784 		 */
13785 		if (un->un_status == KEY_ILLEGAL_REQUEST) {
13786 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13787 			    "Big LOCATE ILLEGAL_REQUEST: rval = %d\n", rval);
13788 			/* Doesn't like big locate command */
13789 			un->un_status = 0;
13790 			rval = ERANGE;
13791 		} else if ((un->un_pos.pmode == invalid) || (rval != 0)) {
13792 			/* Aborted big locate command */
13793 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13794 			    "Big LOCATE resulted in invalid pos: rval = %d\n",
13795 			    rval);
13796 			un->un_status = 0;
13797 			rval = EIO;
13798 		} else if (st_update_block_pos(un)) {
13799 			/* read position failed */
13800 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13801 			    "Big LOCATE and read pos: rval = %d\n", rval);
13802 			rval = EIO;
13803 		} else if (lblk > un->un_pos.lgclblkno) {
13804 			/* read position worked but position was not expected */
13805 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13806 			    "Big LOCATE and recover read less then desired 0x%"
13807 			    PRIx64"\n", un->un_pos.lgclblkno);
13808 			un->un_err_resid = lblk - un->un_pos.lgclblkno;
13809 			un->un_status = KEY_BLANK_CHECK;
13810 			rval = ESPIPE;
13811 		} else if (lblk == un->un_pos.lgclblkno) {
13812 			/* read position was what was expected */
13813 			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13814 			    "Big LOCATE and recover seems to have worked\n");
13815 			un->un_err_resid = 0;
13816 			rval = 0;
13817 		} else {
13818 			ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
13819 			    "BIGLOCATE end up going backwards");
13820 			un->un_err_resid = lblk;
13821 			rval = EIO;
13822 		}
13823 
13824 	} else if (rval == 0) {
13825 		/* Worked as requested */
13826 		un->un_pos.lgclblkno = lblk;
13827 
13828 	} else if (((cmd->uscsi_status & STATUS_MASK) == STATUS_CHECK) &&
13829 	    (cmd->uscsi_resid != 0)) {
13830 		/* Got part way there but wasn't enough blocks on tape */
13831 		un->un_pos.lgclblkno = lblk - cmd->uscsi_resid;
13832 		un->un_err_resid = cmd->uscsi_resid;
13833 		un->un_status = KEY_BLANK_CHECK;
13834 		rval = ESPIPE;
13835 
13836 	} else if (st_update_block_pos(un) == 0) {
13837 		/* Got part way there but drive didn't tell what we missed by */
13838 		un->un_err_resid = lblk - un->un_pos.lgclblkno;
13839 		un->un_status = KEY_BLANK_CHECK;
13840 		rval = ESPIPE;
13841 
13842 	} else {
13843 		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
13844 		    "Failed LOCATE and recover pos: rval = %d status = %d\n",
13845 		    rval, cmd->uscsi_status);
13846 		un->un_err_resid = lblk;
13847 		un->un_status = KEY_ILLEGAL_REQUEST;
13848 		un->un_pos.pmode = invalid;
13849 		rval = EIO;
13850 	}
13851 
13852 	kmem_free(cmd, sizeof (struct uscsi_cmd));
13853 
13854 	return (rval);
13855 }
13856 
13857 static int
13858 st_mtfsf_ioctl(struct scsi_tape *un, int files)
13859 {
13860 	int rval;
13861 
13862 	ST_FUNC(ST_DEVINFO, st_mtfsf_ioctl);
13863 
13864 
13865 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13866 	    "st_mtfsf_ioctl: count=%x, eof=%x\n", files, un->un_pos.eof);
13867 
13868 	/* pmode == invalid already handled */
13869 	if (un->un_pos.pmode == legacy) {
13870 		/*
13871 		 * forward space over filemark
13872 		 *
13873 		 * For ASF we allow a count of 0 on fsf which means
13874 		 * we just want to go to beginning of current file.
13875 		 * Equivalent to "nbsf(0)" or "bsf(1) + fsf".
13876 		 * Allow stepping over double fmk with reel
13877 		 */
13878 		if ((un->un_pos.eof >= ST_EOT) &&
13879 		    (files > 0) &&
13880 		    ((un->un_dp->options & ST_REEL) == 0)) {
13881 			/* we're at EOM */
13882 			un->un_err_resid = files;
13883 			un->un_status = KEY_BLANK_CHECK;
13884 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13885 			    "st_mtfsf_ioctl: EIO : MTFSF at EOM");
13886 			return (EIO);
13887 		}
13888 
13889 		/*
13890 		 * physical tape position may not be what we've been
13891 		 * telling the user; adjust the request accordingly
13892 		 */
13893 		if (IN_EOF(un->un_pos)) {
13894 			un->un_pos.fileno++;
13895 			un->un_pos.blkno = 0;
13896 			/*
13897 			 * For positive direction case, we're now covered.
13898 			 * For zero or negative direction, we're covered
13899 			 * (almost)
13900 			 */
13901 			files--;
13902 		}
13903 
13904 	}
13905 
13906 	if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) {
13907 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
13908 		    "st_mtfsf_ioctl: EIO : MTFSF density/wfm failed");
13909 		return (EIO);
13910 	}
13911 
13912 
13913 	/*
13914 	 * Forward space file marks.
13915 	 * We leave ourselves at block zero
13916 	 * of the target file number.
13917 	 */
13918 	if (files < 0) {
13919 		rval = st_backward_space_files(un, -files, 0);
13920 	} else {
13921 		rval = st_forward_space_files(un, files);
13922 	}
13923 
13924 	return (rval);
13925 }
13926 
13927 static int
13928 st_forward_space_files(struct scsi_tape *un, int count)
13929 {
13930 	dev_t dev;
13931 	int rval;
13932 
13933 	ST_FUNC(ST_DEVINFO, st_forward_space_files);
13934 
13935 	dev = un->un_dev;
13936 
13937 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
13938 	    "fspace: count=%x, eof=%x\n", count, un->un_pos.eof);
13939 
13940 	ASSERT(count >= 0);
13941 	ASSERT(un->un_pos.pmode != invalid);
13942 
13943 	/*
13944 	 * A space with a count of zero means take me to the start of file.
13945 	 */
13946 	if (count == 0) {
13947 
13948 		/* Hay look were already there */
13949 		if (un->un_pos.pmode == legacy && un->un_pos.blkno == 0 &&
13950 		    un->un_pos.fileno == 0) {
13951 			un->un_err_resid = 0;
13952 			COPY_POS(&un->un_err_pos, &un->un_pos);
13953 			return (0);
13954 		}
13955 
13956 		/*
13957 		 * Well we are in the first file.
13958 		 * A rewind will get to the start.
13959 		 */
13960 		if (un->un_pos.pmode == legacy && un->un_pos.fileno == 0) {
13961 			rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
13962 
13963 		/*
13964 		 * Can we backspace to get there?
13965 		 * This should work in logical mode.
13966 		 */
13967 		} else if (un->un_dp->options & ST_BSF) {
13968 			rval = st_space_to_begining_of_file(un);
13969 
13970 		/*
13971 		 * Can't back space but current file number is known,
13972 		 * So rewind and space from the begining of the partition.
13973 		 */
13974 		} else if (un->un_pos.pmode == legacy) {
13975 			rval = st_scenic_route_to_begining_of_file(un,
13976 			    un->un_pos.fileno);
13977 
13978 		/*
13979 		 * pmode is logical and ST_BSF is not set.
13980 		 * The LONG_POS read position contains the fileno.
13981 		 * If the read position works, rewind and space.
13982 		 */
13983 		} else if (un->un_read_pos_type == LONG_POS) {
13984 			rval = st_cmd(dev, SCMD_READ_POSITION, 0, SYNC_CMD);
13985 			if (rval) {
13986 				/*
13987 				 * We didn't get the file position from the
13988 				 * read position command.
13989 				 * We are going to trust the drive to backspace
13990 				 * and then position after the filemark.
13991 				 */
13992 				rval = st_space_to_begining_of_file(un);
13993 			}
13994 			rval = st_interpret_read_pos(un, LONG_POS, 32,
13995 			    (caddr_t)un->un_read_pos_data);
13996 			if ((rval) && (un->un_pos.pmode == invalid)) {
13997 				rval = st_space_to_begining_of_file(un);
13998 			} else {
13999 				rval = st_scenic_route_to_begining_of_file(un,
14000 				    un->un_pos.fileno);
14001 			}
14002 		} else {
14003 			rval = EIO;
14004 		}
14005 		/*
14006 		 * If something didn't work we are lost
14007 		 */
14008 		if (rval != 0) {
14009 			un->un_pos.pmode = invalid;
14010 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14011 			    "st_mtioctop : EIO : fspace pmode invalid");
14012 
14013 			rval = EIO;
14014 		}
14015 
14016 	} else {
14017 		rval = st_space_fmks(dev, count);
14018 	}
14019 
14020 	if (rval != EIO && count < 0) {
14021 		/*
14022 		 * we came here with a count < 0; we now need
14023 		 * to skip back to end up before the filemark
14024 		 */
14025 		rval = st_backward_space_files(un, 1, 1);
14026 	}
14027 
14028 	return (rval);
14029 }
14030 
14031 static int
14032 st_scenic_route_to_begining_of_file(struct scsi_tape *un, int32_t fileno)
14033 {
14034 	int rval;
14035 
14036 	ST_FUNC(ST_DEVINFO, st_scenic_route_to_begining_of_file);
14037 
14038 	if (st_cmd(un->un_dev, SCMD_REWIND, 0, SYNC_CMD)) {
14039 		rval = EIO;
14040 	} else if (st_cmd(un->un_dev, SCMD_SPACE, Fmk(fileno), SYNC_CMD)) {
14041 		rval = EIO;
14042 	}
14043 
14044 	return (rval);
14045 }
14046 
14047 static int
14048 st_space_to_begining_of_file(struct scsi_tape *un)
14049 {
14050 	int rval;
14051 
14052 	ST_FUNC(ST_DEVINFO, st_space_to_begining_of_file);
14053 
14054 	/*
14055 	 * Back space of the file at the begining of the file.
14056 	 */
14057 	rval = st_cmd(un->un_dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD);
14058 	if (rval) {
14059 		rval = EIO;
14060 		return (rval);
14061 	}
14062 
14063 	/*
14064 	 * Other interesting answers might be crashed BOT which isn't bad.
14065 	 */
14066 	if (un->un_status == SUN_KEY_BOT) {
14067 		return (rval);
14068 	}
14069 
14070 	/*
14071 	 * Now we are on the BOP side of the filemark. Forward space to
14072 	 * the EOM side and we are at the begining of the file.
14073 	 */
14074 	rval = st_cmd(un->un_dev, SCMD_SPACE, Fmk(1), SYNC_CMD);
14075 	if (rval) {
14076 		rval = EIO;
14077 	}
14078 
14079 	return (rval);
14080 }
14081 
14082 static int
14083 st_mtfsr_ioctl(struct scsi_tape *un, int count)
14084 {
14085 
14086 	ST_FUNC(ST_DEVINFO, st_mtfsr_ioctl);
14087 
14088 	/*
14089 	 * forward space to inter-record gap
14090 	 *
14091 	 */
14092 
14093 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14094 	    "st_ioctl_fsr: count=%x, eof=%x\n", count, un->un_pos.eof);
14095 
14096 	if (un->un_pos.pmode == legacy) {
14097 		/*
14098 		 * If were are at end of tape and count is forward.
14099 		 * Return blank check.
14100 		 */
14101 		if ((un->un_pos.eof >= ST_EOT) && (count > 0)) {
14102 			/* we're at EOM */
14103 			un->un_err_resid = count;
14104 			un->un_status = KEY_BLANK_CHECK;
14105 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14106 			    "st_mtfsr_ioctl: EIO : MTFSR eof > ST_EOT");
14107 			return (EIO);
14108 		}
14109 
14110 		/*
14111 		 * If count is zero there is nothing to do.
14112 		 */
14113 		if (count == 0) {
14114 			un->un_err_pos.fileno = un->un_pos.fileno;
14115 			un->un_err_pos.blkno = un->un_pos.blkno;
14116 			un->un_err_resid = 0;
14117 			if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) {
14118 				un->un_status = SUN_KEY_EOF;
14119 			}
14120 			return (0);
14121 		}
14122 
14123 		/*
14124 		 * physical tape position may not be what we've been
14125 		 * telling the user; adjust the position accordingly
14126 		 */
14127 		if (IN_EOF(un->un_pos)) {
14128 			daddr_t blkno = un->un_pos.blkno;
14129 			int fileno = un->un_pos.fileno;
14130 
14131 			optype lastop = un->un_lastop;
14132 			if (st_cmd(un->un_dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)
14133 			    == -1) {
14134 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14135 				    "st_mtfsr_ioctl:EIO:MTFSR count && IN_EOF");
14136 				return (EIO);
14137 			}
14138 
14139 			un->un_pos.blkno = blkno;
14140 			un->un_pos.fileno = fileno;
14141 			un->un_lastop = lastop;
14142 		}
14143 	}
14144 
14145 	if (st_check_density_or_wfm(un->un_dev, 1, B_READ, STEPBACK)) {
14146 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14147 		    "st_mtfsr_ioctl: EIO : MTFSR st_check_den");
14148 		return (EIO);
14149 	}
14150 
14151 	return (st_space_records(un, count));
14152 }
14153 
14154 static int
14155 st_space_records(struct scsi_tape *un, int count)
14156 {
14157 	int dblk;
14158 	int rval = 0;
14159 
14160 	ST_FUNC(ST_DEVINFO, st_space_records);
14161 
14162 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14163 	    "st_space_records: count=%x, eof=%x\n", count, un->un_pos.eof);
14164 
14165 	if (un->un_pos.pmode == logical) {
14166 		rval = st_cmd(un->un_dev, SCMD_SPACE, Blk(count), SYNC_CMD);
14167 		if (rval != 0) {
14168 			rval = EIO;
14169 		}
14170 		return (rval);
14171 	}
14172 
14173 	dblk = un->un_pos.blkno + count;
14174 
14175 	/* Already there */
14176 	if (dblk == un->un_pos.blkno) {
14177 		un->un_err_resid = 0;
14178 		COPY_POS(&un->un_err_pos, &un->un_pos);
14179 		return (0);
14180 	}
14181 
14182 	/*
14183 	 * If the destination block is forward
14184 	 * or the drive will backspace records.
14185 	 */
14186 	if (un->un_pos.blkno < dblk || (un->un_dp->options & ST_BSR)) {
14187 		/*
14188 		 * If we're spacing forward, or the device can
14189 		 * backspace records, we can just use the SPACE
14190 		 * command.
14191 		 */
14192 		dblk -= un->un_pos.blkno;
14193 		if (st_cmd(un->un_dev, SCMD_SPACE, Blk(dblk), SYNC_CMD)) {
14194 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14195 			    "st_space_records:EIO:space_records can't spc");
14196 			rval = EIO;
14197 		} else if (un->un_pos.eof >= ST_EOF_PENDING) {
14198 			/*
14199 			 * check if we hit BOT/EOT
14200 			 */
14201 			if (dblk < 0 && un->un_pos.eof == ST_EOM) {
14202 				un->un_status = SUN_KEY_BOT;
14203 				un->un_pos.eof = ST_NO_EOF;
14204 			} else if (dblk < 0 &&
14205 			    un->un_pos.eof == ST_EOF_PENDING) {
14206 				int residue = un->un_err_resid;
14207 				/*
14208 				 * we skipped over a filemark
14209 				 * and need to go forward again
14210 				 */
14211 				if (st_cmd(un->un_dev, SCMD_SPACE, Fmk(1),
14212 				    SYNC_CMD)) {
14213 					ST_DEBUG2(ST_DEVINFO, st_label,
14214 					    SCSI_DEBUG, "st_space_records: EIO"
14215 					    " : can't space #2");
14216 					rval = EIO;
14217 				}
14218 				un->un_err_resid = residue;
14219 			}
14220 			if (rval == 0) {
14221 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14222 				    "st_space_records: EIO : space_rec rval"
14223 				    " == 0");
14224 				rval = EIO;
14225 			}
14226 		}
14227 	} else {
14228 		/*
14229 		 * else we rewind, space forward across filemarks to
14230 		 * the desired file, and then space records to the
14231 		 * desired block.
14232 		 */
14233 
14234 		int dfile = un->un_pos.fileno;	/* save current file */
14235 
14236 		if (dblk < 0) {
14237 			/*
14238 			 * Wups - we're backing up over a filemark
14239 			 */
14240 			if (un->un_pos.blkno != 0 &&
14241 			    (st_cmd(un->un_dev, SCMD_REWIND, 0, SYNC_CMD) ||
14242 			    st_cmd(un->un_dev, SCMD_SPACE, Fmk(dfile),
14243 			    SYNC_CMD))) {
14244 				un->un_pos.pmode = invalid;
14245 			}
14246 			un->un_err_resid = -dblk;
14247 			if (un->un_pos.fileno == 0 && un->un_pos.blkno == 0) {
14248 				un->un_status = SUN_KEY_BOT;
14249 				un->un_pos.eof = ST_NO_EOF;
14250 			} else if (un->un_pos.fileno > 0) {
14251 				un->un_status = SUN_KEY_EOF;
14252 				un->un_pos.eof = ST_NO_EOF;
14253 			}
14254 			COPY_POS(&un->un_err_pos, &un->un_pos);
14255 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14256 			    "st_space_records:EIO:space_records : dblk < 0");
14257 			rval = EIO;
14258 		} else if (st_cmd(un->un_dev, SCMD_REWIND, 0, SYNC_CMD) ||
14259 		    st_cmd(un->un_dev, SCMD_SPACE, Fmk(dfile), SYNC_CMD) ||
14260 		    st_cmd(un->un_dev, SCMD_SPACE, Blk(dblk), SYNC_CMD)) {
14261 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14262 			    "st_space_records: EIO :space_records : rewind "
14263 			    "and space failed");
14264 			un->un_pos.pmode = invalid;
14265 			rval = EIO;
14266 		}
14267 	}
14268 
14269 	return (rval);
14270 }
14271 
14272 static int
14273 st_mtbsf_ioctl(struct scsi_tape *un, int files)
14274 {
14275 	ST_FUNC(ST_DEVINFO, st_mtbsf_ioctl);
14276 
14277 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14278 	    "st_mtbsf_ioctl: count=%x, eof=%x\n", files, un->un_pos.eof);
14279 	/*
14280 	 * backward space of file filemark (1/2" and 8mm)
14281 	 * tape position will end on the beginning of tape side
14282 	 * of the desired file mark
14283 	 */
14284 	if ((un->un_dp->options & ST_BSF) == 0) {
14285 		return (ENOTTY);
14286 	}
14287 
14288 	if (un->un_pos.pmode == legacy) {
14289 
14290 		/*
14291 		 * If a negative count (which implies a forward space op)
14292 		 * is specified, and we're at logical or physical eot,
14293 		 * bounce the request.
14294 		 */
14295 
14296 		if (un->un_pos.eof >= ST_EOT && files < 0) {
14297 			un->un_err_resid = files;
14298 			un->un_status = SUN_KEY_EOT;
14299 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14300 			    "st_ioctl_mt_bsf : EIO : MTBSF : eof > ST_EOF");
14301 			return (EIO);
14302 		}
14303 		/*
14304 		 * physical tape position may not be what we've been
14305 		 * telling the user; adjust the request accordingly
14306 		 */
14307 		if (IN_EOF(un->un_pos)) {
14308 			un->un_pos.fileno++;
14309 			un->un_pos.blkno = 0;
14310 			files++;
14311 			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14312 			    "st_mtbsf_ioctl in eof: count=%d, op=%x\n",
14313 			    files, MTBSF);
14314 
14315 		}
14316 	}
14317 
14318 	if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) {
14319 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14320 		    "st_ioctl : EIO : MTBSF : check den wfm");
14321 		return (EIO);
14322 	}
14323 
14324 	if (files <= 0) {
14325 		/*
14326 		 * for a negative count, we need to step forward
14327 		 * first and then step back again
14328 		 */
14329 		files = -files + 1;
14330 		return (st_forward_space_files(un, files));
14331 	}
14332 	return (st_backward_space_files(un, files, 1));
14333 }
14334 
14335 static int
14336 st_backward_space_files(struct scsi_tape *un, int count, int infront)
14337 {
14338 	int end_fileno;
14339 	int skip_cnt;
14340 	int rval = 0;
14341 
14342 	ST_FUNC(ST_DEVINFO, st_backward_space_files);
14343 
14344 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14345 	    "st_backward_space_files: count=%x eof=%x\n",
14346 	    count, un->un_pos.eof);
14347 	/*
14348 	 * Backspace files (MTNBSF): infront == 0
14349 	 *
14350 	 *	For tapes that can backspace, backspace
14351 	 *	count+1 filemarks and then run forward over
14352 	 *	a filemark
14353 	 *
14354 	 *	For tapes that can't backspace,
14355 	 *		calculate desired filenumber
14356 	 *		(un->un_pos.fileno - count), rewind,
14357 	 *		and then space forward this amount
14358 	 *
14359 	 * Backspace filemarks (MTBSF) infront == 1
14360 	 *
14361 	 *	For tapes that can backspace, backspace count
14362 	 *	filemarks
14363 	 *
14364 	 *	For tapes that can't backspace, calculate
14365 	 *	desired filenumber (un->un_pos.fileno - count),
14366 	 *	add 1, rewind, space forward this amount,
14367 	 *	and mark state as ST_EOF_PENDING appropriately.
14368 	 */
14369 
14370 	if (un->un_pos.pmode == logical) {
14371 
14372 		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14373 		    "st_backward_space_files: mt_op=%x count=%x"
14374 		    "lgclblkno=%"PRIx64"\n", infront?MTBSF:MTNBSF, count,
14375 		    un->un_pos.lgclblkno);
14376 
14377 
14378 		/* In case a drive that won't back space gets in logical mode */
14379 		if ((un->un_dp->options & ST_BSF) == 0) {
14380 			rval = EIO;
14381 			return (rval);
14382 		}
14383 		if (st_cmd(un->un_dev, SCMD_SPACE, Fmk(-count), SYNC_CMD)) {
14384 			rval = EIO;
14385 			return (rval);
14386 		}
14387 		if ((infront != 0) &&
14388 		    (st_cmd(un->un_dev, SCMD_SPACE, Fmk(1), SYNC_CMD))) {
14389 			rval = EIO;
14390 			return (rval);
14391 		}
14392 		return (rval);
14393 	}
14394 
14395 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14396 	    "st_backward_space_files: mt_op=%x count=%x fileno=%x blkno=%x\n",
14397 	    infront?MTBSF:MTNBSF, count, un->un_pos.fileno, un->un_pos.blkno);
14398 
14399 
14400 
14401 	/*
14402 	 * Handle the simple case of BOT
14403 	 * playing a role in these cmds.
14404 	 * We do this by calculating the
14405 	 * ending file number. If the ending
14406 	 * file is < BOT, rewind and set an
14407 	 * error and mark resid appropriately.
14408 	 * If we're backspacing a file (not a
14409 	 * filemark) and the target file is
14410 	 * the first file on the tape, just
14411 	 * rewind.
14412 	 */
14413 
14414 	/* figure expected destination of this SPACE command */
14415 	end_fileno = un->un_pos.fileno - count;
14416 
14417 	/*
14418 	 * Would the end effect of this SPACE be the same as rewinding?
14419 	 * If so just rewind instead.
14420 	 */
14421 	if ((infront != 0) && (end_fileno < 0) ||
14422 	    (infront == 0) && (end_fileno <= 0)) {
14423 		if (st_cmd(un->un_dev, SCMD_REWIND, 0, SYNC_CMD)) {
14424 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14425 			    "st_backward_space_files: EIO : "
14426 			    "rewind in lou of BSF failed\n");
14427 			rval = EIO;
14428 		}
14429 		if (end_fileno < 0) {
14430 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14431 			    "st_backward_space_files: EIO : "
14432 			    "back space file greater then fileno\n");
14433 			rval = EIO;
14434 			un->un_err_resid = -end_fileno;
14435 			un->un_status = SUN_KEY_BOT;
14436 		}
14437 		return (rval);
14438 	}
14439 
14440 	if (un->un_dp->options & ST_BSF) {
14441 		skip_cnt = 1 - infront;
14442 		/*
14443 		 * If we are going to end up at the beginning
14444 		 * of the file, we have to space one extra file
14445 		 * first, and then space forward later.
14446 		 */
14447 		end_fileno = -(count + skip_cnt);
14448 		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
14449 		    "skip_cnt=%x, tmp=%x\n", skip_cnt, end_fileno);
14450 		if (st_cmd(un->un_dev, SCMD_SPACE, Fmk(end_fileno), SYNC_CMD)) {
14451 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14452 			    "st_backward_space_files:EIO:back space fm failed");
14453 			rval = EIO;
14454 		}
14455 	} else {
14456 		if (st_cmd(un->un_dev, SCMD_REWIND, 0, SYNC_CMD)) {
14457 			rval = EIO;
14458 		} else {
14459 			skip_cnt = end_fileno + infront;
14460 		}
14461 	}
14462 
14463 	/*
14464 	 * If we have to space forward, do so...
14465 	 */
14466 	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
14467 	    "space forward skip_cnt=%x, rval=%x\n", skip_cnt, rval);
14468 
14469 	if (rval == 0 && skip_cnt) {
14470 		if (st_cmd(un->un_dev, SCMD_SPACE, Fmk(skip_cnt), SYNC_CMD)) {
14471 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14472 			    "st_backward_space_files:EIO:space fm skip count");
14473 			rval = EIO;
14474 		} else if (infront) {
14475 			/*
14476 			 * If we had to space forward, and we're
14477 			 * not a tape that can backspace, mark state
14478 			 * as if we'd just seen a filemark during a
14479 			 * a read.
14480 			 */
14481 			if ((un->un_dp->options & ST_BSF) == 0) {
14482 				un->un_pos.eof = ST_EOF_PENDING;
14483 				un->un_pos.fileno -= 1;
14484 				un->un_pos.blkno = INF;
14485 			}
14486 		}
14487 	}
14488 
14489 	if (rval != 0) {
14490 		un->un_pos.pmode = invalid;
14491 	}
14492 
14493 	return (rval);
14494 }
14495 
14496 static int
14497 st_mtnbsf_ioctl(struct scsi_tape *un, int count)
14498 {
14499 	int rval;
14500 
14501 	ST_FUNC(ST_DEVINFO, st_mtnbsf_ioctl);
14502 
14503 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14504 	    "nbsf: count=%x, eof=%x\n", count, un->un_pos.eof);
14505 
14506 	if (un->un_pos.pmode == legacy) {
14507 		/*
14508 		 * backward space file to beginning of file
14509 		 *
14510 		 * If a negative count (which implies a forward space op)
14511 		 * is specified, and we're at logical or physical eot,
14512 		 * bounce the request.
14513 		 */
14514 
14515 		if (un->un_pos.eof >= ST_EOT && count < 0) {
14516 			un->un_err_resid = count;
14517 			un->un_status = SUN_KEY_EOT;
14518 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14519 			    "st_ioctl : EIO : > EOT and count < 0");
14520 			return (EIO);
14521 		}
14522 		/*
14523 		 * physical tape position may not be what we've been
14524 		 * telling the user; adjust the request accordingly
14525 		 */
14526 		if (IN_EOF(un->un_pos)) {
14527 			un->un_pos.fileno++;
14528 			un->un_pos.blkno = 0;
14529 			count++;
14530 		}
14531 	}
14532 
14533 	if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) {
14534 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14535 		    "st_ioctl : EIO : MTNBSF check den and wfm");
14536 		return (EIO);
14537 	}
14538 
14539 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14540 	    "mtnbsf: count=%x, eof=%x\n", count, un->un_pos.eof);
14541 
14542 	if (count <= 0) {
14543 		rval = st_forward_space_files(un, -count);
14544 	} else {
14545 		rval = st_backward_space_files(un, count, 0);
14546 	}
14547 	return (rval);
14548 }
14549 
14550 static int
14551 st_mtbsr_ioctl(struct scsi_tape *un, int num)
14552 {
14553 	ST_FUNC(ST_DEVINFO, st_mtbsr_ioctl);
14554 
14555 	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
14556 	    "bsr: count=%x, eof=%x\n", num, un->un_pos.eof);
14557 
14558 	if (un->un_pos.pmode == legacy) {
14559 		/*
14560 		 * backward space into inter-record gap
14561 		 *
14562 		 * If a negative count (which implies a forward space op)
14563 		 * is specified, and we're at logical or physical eot,
14564 		 * bounce the request.
14565 		 */
14566 		if (un->un_pos.eof >= ST_EOT && num < 0) {
14567 			un->un_err_resid = num;
14568 			un->un_status = SUN_KEY_EOT;
14569 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14570 			    "st_ioctl : EIO : MTBSR > EOT");
14571 			return (EIO);
14572 		}
14573 
14574 		if (num == 0) {
14575 			COPY_POS(&un->un_err_pos, &un->un_pos);
14576 			un->un_err_resid = 0;
14577 			if (IN_EOF(un->un_pos) && SVR4_BEHAVIOR) {
14578 				un->un_status = SUN_KEY_EOF;
14579 			}
14580 			return (0);
14581 		}
14582 
14583 		/*
14584 		 * physical tape position may not be what we've been
14585 		 * telling the user; adjust the position accordingly.
14586 		 * bsr can not skip filemarks and continue to skip records
14587 		 * therefore if we are logically before the filemark but
14588 		 * physically at the EOT side of the filemark, we need to step
14589 		 * back; this allows fsr N where N > number of blocks in file
14590 		 * followed by bsr 1 to position at the beginning of last block
14591 		 */
14592 		if (IN_EOF(un->un_pos)) {
14593 			tapepos_t save;
14594 			optype lastop = un->un_lastop;
14595 
14596 			COPY_POS(&save, &un->un_pos);
14597 			if (st_cmd(un->un_dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)
14598 			    == -1) {
14599 				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14600 				    "st_write_fm : EIO : MTBSR can't space");
14601 				return (EIO);
14602 			}
14603 
14604 			COPY_POS(&un->un_pos, &save);
14605 			un->un_lastop = lastop;
14606 		}
14607 	}
14608 
14609 	un->un_pos.eof = ST_NO_EOF;
14610 
14611 	if (st_check_density_or_wfm(un->un_dev, 1, 0, STEPBACK)) {
14612 		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14613 		    "st_ioctl : EIO : MTBSR : can't set density or wfm");
14614 		return (EIO);
14615 	}
14616 
14617 	num = -num;
14618 	return (st_space_records(un, num));
14619 }
14620 
14621 static int
14622 st_mtfsfm_ioctl(struct scsi_tape *un, int cnt)
14623 {
14624 	int rval;
14625 
14626 	ST_FUNC(ST_DEVINFO, st_mtfsfm_ioctl);
14627 
14628 	rval = st_cmd(un->un_dev, SCMD_SPACE, SPACE(SP_SQFLM, cnt), SYNC_CMD);
14629 	if (rval == 0) {
14630 		un->un_pos.pmode = logical;
14631 	} else if ((un->un_status == KEY_ILLEGAL_REQUEST) &&
14632 	    (un->un_sd->sd_sense->es_add_code == 0x24)) {
14633 		/*
14634 		 * Drive says invalid field in cdb.
14635 		 * Doesn't like space multiple. Position isn't lost.
14636 		 */
14637 		un->un_err_resid = cnt;
14638 		un->un_status = 0;
14639 		rval = ENOTTY;
14640 	} else {
14641 		un->un_err_resid = cnt;
14642 		un->un_pos.pmode = invalid;
14643 	}
14644 	return (rval);
14645 }
14646 
14647 static int
14648 st_mtbsfm_ioctl(struct scsi_tape *un, int cnt)
14649 {
14650 	int rval;
14651 
14652 	ST_FUNC(ST_DEVINFO, st_mtbsfm_ioctl);
14653 
14654 	rval = st_cmd(un->un_dev, SCMD_SPACE, SPACE(SP_SQFLM, -cnt), SYNC_CMD);
14655 	if (rval == 0) {
14656 		un->un_pos.pmode = logical;
14657 	} else if ((un->un_status == KEY_ILLEGAL_REQUEST) &&
14658 	    (un->un_sd->sd_sense->es_add_code == 0x24)) {
14659 		/*
14660 		 * Drive says invalid field in cdb.
14661 		 * Doesn't like space multiple. Position isn't lost.
14662 		 */
14663 		un->un_err_resid = cnt;
14664 		un->un_status = 0;
14665 		rval = ENOTTY;
14666 	} else {
14667 		un->un_err_resid = cnt;
14668 		un->un_pos.pmode = invalid;
14669 	}
14670 	return (rval);
14671 }
14672 
14673 #ifdef	__x86
14674 
14675 /*
14676  * release contig_mem and wake up waiting thread, if any
14677  */
14678 static void
14679 st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp)
14680 {
14681 	mutex_enter(ST_MUTEX);
14682 
14683 	ST_FUNC(ST_DEVINFO, st_release_contig_mem);
14684 
14685 	cp->cm_next = un->un_contig_mem;
14686 	un->un_contig_mem = cp;
14687 	un->un_contig_mem_available_num++;
14688 	cv_broadcast(&un->un_contig_mem_cv);
14689 
14690 	mutex_exit(ST_MUTEX);
14691 }
14692 
14693 /*
14694  * St_get_contig_mem will return a contig_mem if there is one available
14695  * in current system. Otherwise, it will try to alloc one, if the total
14696  * number of contig_mem is within st_max_contig_mem_num.
14697  * It will sleep, if allowed by caller or return NULL, if no contig_mem
14698  * is available for now.
14699  */
14700 static struct contig_mem *
14701 st_get_contig_mem(struct scsi_tape *un, size_t len, int alloc_flags)
14702 {
14703 	size_t rlen;
14704 	struct contig_mem *cp = NULL;
14705 	ddi_acc_handle_t acc_hdl;
14706 	caddr_t addr;
14707 	int big_enough = 0;
14708 	int (*dma_alloc_cb)() = (alloc_flags == KM_SLEEP) ?
14709 	    DDI_DMA_SLEEP : DDI_DMA_DONTWAIT;
14710 
14711 	/* Try to get one available contig_mem */
14712 	mutex_enter(ST_MUTEX);
14713 
14714 	ST_FUNC(ST_DEVINFO, st_get_contig_mem);
14715 
14716 	if (un->un_contig_mem_available_num > 0) {
14717 		ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
14718 	} else if (un->un_contig_mem_total_num < st_max_contig_mem_num) {
14719 		/*
14720 		 * we failed to get one. we're going to
14721 		 * alloc one more contig_mem for this I/O
14722 		 */
14723 		mutex_exit(ST_MUTEX);
14724 		cp = (struct contig_mem *)kmem_zalloc(
14725 		    sizeof (struct contig_mem) + biosize(),
14726 		    alloc_flags);
14727 		if (cp == NULL) {
14728 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14729 			    "alloc contig_mem failure\n");
14730 			return (NULL); /* cannot get one */
14731 		}
14732 		cp->cm_bp = (struct buf *)
14733 		    (((caddr_t)cp) + sizeof (struct contig_mem));
14734 		bioinit(cp->cm_bp);
14735 		mutex_enter(ST_MUTEX);
14736 		un->un_contig_mem_total_num++; /* one more available */
14737 	} else {
14738 		/*
14739 		 * we failed to get one and we're NOT allowed to
14740 		 * alloc more contig_mem
14741 		 */
14742 		if (alloc_flags == KM_SLEEP) {
14743 			while (un->un_contig_mem_available_num <= 0) {
14744 				cv_wait(&un->un_contig_mem_cv,
14745 				    ST_MUTEX);
14746 			}
14747 			ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
14748 		} else {
14749 			mutex_exit(ST_MUTEX);
14750 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14751 			    "alloc contig_mem failure\n");
14752 			return (NULL); /* cannot get one */
14753 		}
14754 	}
14755 	mutex_exit(ST_MUTEX);
14756 
14757 	/* We need to check if this block of mem is big enough for this I/O */
14758 	if (cp->cm_len < len) {
14759 		/* not big enough, need to alloc a new one */
14760 		if (ddi_dma_mem_alloc(un->un_contig_mem_hdl, len, &st_acc_attr,
14761 		    DDI_DMA_STREAMING, dma_alloc_cb, NULL,
14762 		    &addr, &rlen, &acc_hdl) != DDI_SUCCESS) {
14763 			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
14764 			    "alloc contig_mem failure: not enough mem\n");
14765 			st_release_contig_mem(un, cp);
14766 			cp = NULL;
14767 		} else {
14768 			if (cp->cm_addr) {
14769 				/* release previous one before attach new one */
14770 				ddi_dma_mem_free(&cp->cm_acc_hdl);
14771 			}
14772 			mutex_enter(ST_MUTEX);
14773 			un->un_max_contig_mem_len =
14774 			    un->un_max_contig_mem_len >= len ?
14775 			    un->un_max_contig_mem_len : len;
14776 			mutex_exit(ST_MUTEX);
14777 
14778 			/* attach new mem to this cp */
14779 			cp->cm_addr = addr;
14780 			cp->cm_acc_hdl = acc_hdl;
14781 			cp->cm_len = len;
14782 
14783 			goto alloc_ok; /* get one usable cp */
14784 		}
14785 	} else {
14786 		goto alloc_ok; /* get one usable cp */
14787 	}
14788 
14789 	/* cannot find/alloc a usable cp, when we get here */
14790 
14791 	mutex_enter(ST_MUTEX);
14792 	if ((un->un_max_contig_mem_len < len) ||
14793 	    (alloc_flags != KM_SLEEP)) {
14794 		mutex_exit(ST_MUTEX);
14795 		return (NULL);
14796 	}
14797 
14798 	/*
14799 	 * we're allowed to sleep, and there is one big enough
14800 	 * contig mem in the system, which is currently in use,
14801 	 * wait for it...
14802 	 */
14803 	big_enough = 1;
14804 	do {
14805 		cv_wait(&un->un_contig_mem_cv, ST_MUTEX);
14806 		ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
14807 	} while (cp == NULL);
14808 	mutex_exit(ST_MUTEX);
14809 
14810 	/* we get the big enough contig mem, finally */
14811 
14812 alloc_ok:
14813 	/* init bp attached to this cp */
14814 	bioreset(cp->cm_bp);
14815 	cp->cm_bp->b_un.b_addr = cp->cm_addr;
14816 	cp->cm_bp->b_private = (void *)cp;
14817 
14818 	return (cp);
14819 }
14820 
14821 /*
14822  * this is the biodone func for the bp used in big block I/O
14823  */
14824 static int
14825 st_bigblk_xfer_done(struct buf *bp)
14826 {
14827 	struct contig_mem *cp;
14828 	struct buf *orig_bp;
14829 	int ioerr;
14830 	struct scsi_tape *un;
14831 
14832 	/* sanity check */
14833 	if (bp == NULL) {
14834 		return (DDI_FAILURE);
14835 	}
14836 
14837 	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
14838 	if (un == NULL) {
14839 		return (DDI_FAILURE);
14840 	}
14841 
14842 	ST_FUNC(ST_DEVINFO, st_bigblk_xfer_done);
14843 
14844 	cp = (struct contig_mem *)bp->b_private;
14845 	orig_bp = cp->cm_bp; /* get back the bp we have replaced */
14846 	cp->cm_bp = bp;
14847 
14848 	/* special handling for special I/O */
14849 	if (cp->cm_use_sbuf) {
14850 #ifndef __lock_lint
14851 		ASSERT(un->un_sbuf_busy);
14852 #endif
14853 		un->un_sbufp = orig_bp;
14854 		cp->cm_use_sbuf = 0;
14855 	}
14856 
14857 	orig_bp->b_resid = bp->b_resid;
14858 	ioerr = geterror(bp);
14859 	if (ioerr != 0) {
14860 		bioerror(orig_bp, ioerr);
14861 	} else if (orig_bp->b_flags & B_READ) {
14862 		/* copy data back to original bp */
14863 		(void) bp_copyout(bp->b_un.b_addr, orig_bp, 0,
14864 		    bp->b_bcount - bp->b_resid);
14865 	}
14866 
14867 	st_release_contig_mem(un, cp);
14868 
14869 	biodone(orig_bp);
14870 
14871 	return (DDI_SUCCESS);
14872 }
14873 
14874 /*
14875  * We use this func to replace original bp that may not be able to do I/O
14876  * in big block size with one that can
14877  */
14878 static struct buf *
14879 st_get_bigblk_bp(struct buf *bp)
14880 {
14881 	struct contig_mem *cp;
14882 	struct scsi_tape *un;
14883 	struct buf *cont_bp;
14884 
14885 	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
14886 	if (un == NULL) {
14887 		return (bp);
14888 	}
14889 
14890 	ST_FUNC(ST_DEVINFO, st_get_bigblk_bp);
14891 
14892 	/* try to get one contig_mem */
14893 	cp = st_get_contig_mem(un, bp->b_bcount, KM_SLEEP);
14894 	if (!cp) {
14895 		scsi_log(ST_DEVINFO, st_label, CE_WARN,
14896 		    "Cannot alloc contig buf for I/O for %lu blk size",
14897 		    bp->b_bcount);
14898 		return (bp);
14899 	}
14900 	cont_bp = cp->cm_bp;
14901 	cp->cm_bp = bp;
14902 
14903 	/* make sure that we "are" using un_sbufp for special I/O */
14904 	if (bp == un->un_sbufp) {
14905 #ifndef __lock_lint
14906 		ASSERT(un->un_sbuf_busy);
14907 #endif
14908 		un->un_sbufp = cont_bp;
14909 		cp->cm_use_sbuf = 1;
14910 	}
14911 
14912 	/* clone bp */
14913 	cont_bp->b_bcount = bp->b_bcount;
14914 	cont_bp->b_resid = bp->b_resid;
14915 	cont_bp->b_iodone = st_bigblk_xfer_done;
14916 	cont_bp->b_file = bp->b_file;
14917 	cont_bp->b_offset = bp->b_offset;
14918 	cont_bp->b_dip = bp->b_dip;
14919 	cont_bp->b_error = 0;
14920 	cont_bp->b_proc = NULL;
14921 	cont_bp->b_flags = bp->b_flags & ~(B_PAGEIO | B_PHYS | B_SHADOW);
14922 	cont_bp->b_shadow = NULL;
14923 	cont_bp->b_pages = NULL;
14924 	cont_bp->b_edev = bp->b_edev;
14925 	cont_bp->b_dev = bp->b_dev;
14926 	cont_bp->b_lblkno = bp->b_lblkno;
14927 	cont_bp->b_forw = bp->b_forw;
14928 	cont_bp->b_back = bp->b_back;
14929 	cont_bp->av_forw = bp->av_forw;
14930 	cont_bp->av_back = bp->av_back;
14931 	cont_bp->b_bufsize = bp->b_bufsize;
14932 
14933 	/* get data in original bp */
14934 	if (bp->b_flags & B_WRITE) {
14935 		(void) bp_copyin(bp, cont_bp->b_un.b_addr, 0, bp->b_bcount);
14936 	}
14937 
14938 	return (cont_bp);
14939 }
14940 #else
14941 #ifdef __lock_lint
14942 static int
14943 st_bigblk_xfer_done(struct buf *bp)
14944 {
14945 	return (0);
14946 }
14947 #endif
14948 #endif
14949 
14950 static const char *eof_status[] =
14951 {
14952 	"NO_EOF",
14953 	"EOF_PENDING",
14954 	"EOF",
14955 	"EOT_PENDING",
14956 	"EOT",
14957 	"EOM",
14958 	"AFTER_EOM"
14959 };
14960 static const char *mode[] = {
14961 	"invalid",
14962 	"legacy",
14963 	"logical"
14964 };
14965 
14966 static void
14967 st_print_position(struct scsi_tape *un, const char *comment, tapepos_t *pos)
14968 {
14969 	ST_FUNC(ST_DEVINFO, st_print_position);
14970 	scsi_log(ST_DEVINFO, st_label, CE_NOTE,
14971 	    "%s Position data:\n", comment);
14972 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14973 	    "Positioning mode = %s", mode[pos->pmode]);
14974 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14975 	    "End Of File/Tape = %s", eof_status[pos->eof]);
14976 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14977 	    "File Number      = 0x%x", pos->fileno);
14978 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14979 	    "Block Number     = 0x%x", pos->blkno);
14980 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14981 	    "Logical Block    = 0x%"PRIx64, pos->lgclblkno);
14982 	scsi_log(ST_DEVINFO, st_label, CE_CONT,
14983 	    "Partition Number = 0x%x", pos->partition);
14984 }
14985