st.c revision 3138:7bbdcbfa4cd5
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 2006 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/stat.h>
43#include <sys/kstat.h>
44#include <sys/ddidmareq.h>
45#include <sys/ddi.h>
46#include <sys/sunddi.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
107/*
108 * Global External Data Definitions
109 */
110extern struct scsi_key_strings scsi_cmds[];
111extern uchar_t	scsi_cdb_size[];
112
113/*
114 * Local Static Data
115 */
116static void *st_state;
117static char *st_label = "st";
118
119#if defined(__i386) || defined(__amd64)
120/*
121 * We need to use below DMA attr to alloc physically contiguous
122 * memory to do I/O in big block size
123 */
124static ddi_dma_attr_t st_contig_mem_dma_attr = {
125	DMA_ATTR_V0,    /* version number */
126	0x0,		/* lowest usable address */
127	0xFFFFFFFFull,  /* high DMA address range */
128	0xFFFFFFFFull,  /* DMA counter register */
129	1,		/* DMA address alignment */
130	1,		/* DMA burstsizes */
131	1,		/* min effective DMA size */
132	0xFFFFFFFFull,  /* max DMA xfer size */
133	0xFFFFFFFFull,  /* segment boundary */
134	1,		/* s/g list length */
135	1,		/* granularity of device */
136	0		/* DMA transfer flags */
137};
138
139static ddi_device_acc_attr_t st_acc_attr = {
140	DDI_DEVICE_ATTR_V0,
141	DDI_NEVERSWAP_ACC,
142	DDI_STRICTORDER_ACC
143};
144
145/* set limitation for the number of contig_mem */
146static int st_max_contig_mem_num = ST_MAX_CONTIG_MEM_NUM;
147#endif
148
149/*
150 * Tunable parameters
151 *
152 * DISCLAIMER
153 * ----------
154 * These parameters are intended for use only in system testing; if you use
155 * them in production systems, you do so at your own risk. Altering any
156 * variable not listed below may cause unpredictable system behavior.
157 *
158 * st_check_media_time
159 *
160 *   Three second state check
161 *
162 * st_allow_large_xfer
163 *
164 *   Gated with ST_NO_RECSIZE_LIMIT
165 *
166 *   0 - Transfers larger than 64KB will not be allowed
167 *       regardless of the setting of ST_NO_RECSIZE_LIMIT
168 *   1 - Transfers larger than 64KB will be allowed
169 *       if ST_NO_RECSIZE_LIMIT is TRUE for the drive
170 *
171 * st_report_soft_errors_on_close
172 *
173 *  Gated with ST_SOFT_ERROR_REPORTING
174 *
175 *  0 - Errors will not be reported on close regardless
176 *      of the setting of ST_SOFT_ERROR_REPORTING
177 *
178 *  1 - Errors will be reported on close if
179 *      ST_SOFT_ERROR_REPORTING is TRUE for the drive
180 */
181static int st_selection_retry_count = ST_SEL_RETRY_COUNT;
182static int st_retry_count	= ST_RETRY_COUNT;
183
184static int st_io_time		= ST_IO_TIME;
185static int st_long_timeout_x	= ST_LONG_TIMEOUT_X;
186
187static int st_space_time	= ST_SPACE_TIME;
188static int st_long_space_time_x	= ST_LONG_SPACE_TIME_X;
189
190static int st_error_level	= SCSI_ERR_RETRYABLE;
191static int st_check_media_time	= 3000000;	/* 3 Second State Check */
192
193static int st_max_throttle	= ST_MAX_THROTTLE;
194
195static clock_t st_wait_cmds_complete = ST_WAIT_CMDS_COMPLETE;
196
197static int st_allow_large_xfer = 1;
198static int st_report_soft_errors_on_close = 1;
199
200/*
201 * End of tunable parameters list
202 */
203
204
205
206/*
207 * Asynchronous I/O and persistent errors, refer to PSARC/1995/228
208 *
209 * Asynchronous I/O's main offering is that it is a non-blocking way to do
210 * reads and writes.  The driver will queue up all the requests it gets and
211 * have them ready to transport to the HBA.  Unfortunately, we cannot always
212 * just ship the I/O requests to the HBA, as there errors and exceptions
213 * that may happen when we don't want the HBA to continue.  Therein comes
214 * the flush-on-errors capability.  If the HBA supports it, then st will
215 * send in st_max_throttle I/O requests at the same time.
216 *
217 * Persistent errors : This was also reasonably simple.  In the interrupt
218 * routines, if there was an error or exception (FM, LEOT, media error,
219 * transport error), the persistent error bits are set and shuts everything
220 * down, but setting the throttle to zero.  If we hit and exception in the
221 * HBA, and flush-on-errors were set, we wait for all outstanding I/O's to
222 * come back (with CMD_ABORTED), then flush all bp's in the wait queue with
223 * the appropriate error, and this will preserve order. Of course, depending
224 * on the exception we have to show a zero read or write before we show
225 * errors back to the application.
226 */
227
228extern const int st_ndrivetypes;	/* defined in st_conf.c */
229extern const struct st_drivetype st_drivetypes[];
230
231#ifdef STDEBUG
232static int st_soft_error_report_debug = 0;
233volatile int st_debug = 0;
234#endif
235
236#define	ST_MT02_NAME	"Emulex  MT02 QIC-11/24  "
237
238static const struct driver_minor_data {
239	char	*name;
240	int	minor;
241} st_minor_data[] = {
242	/*
243	 * The top 4 entries are for the default densities,
244	 * don't alter their position.
245	 */
246	{"",	0},
247	{"n",	MT_NOREWIND},
248	{"b",	MT_BSD},
249	{"bn",	MT_NOREWIND | MT_BSD},
250	{"l",	MT_DENSITY1},
251	{"m",	MT_DENSITY2},
252	{"h",	MT_DENSITY3},
253	{"c",	MT_DENSITY4},
254	{"u",	MT_DENSITY4},
255	{"ln",	MT_DENSITY1 | MT_NOREWIND},
256	{"mn",	MT_DENSITY2 | MT_NOREWIND},
257	{"hn",	MT_DENSITY3 | MT_NOREWIND},
258	{"cn",	MT_DENSITY4 | MT_NOREWIND},
259	{"un",	MT_DENSITY4 | MT_NOREWIND},
260	{"lb",	MT_DENSITY1 | MT_BSD},
261	{"mb",	MT_DENSITY2 | MT_BSD},
262	{"hb",	MT_DENSITY3 | MT_BSD},
263	{"cb",	MT_DENSITY4 | MT_BSD},
264	{"ub",	MT_DENSITY4 | MT_BSD},
265	{"lbn",	MT_DENSITY1 | MT_NOREWIND | MT_BSD},
266	{"mbn",	MT_DENSITY2 | MT_NOREWIND | MT_BSD},
267	{"hbn",	MT_DENSITY3 | MT_NOREWIND | MT_BSD},
268	{"cbn",	MT_DENSITY4 | MT_NOREWIND | MT_BSD},
269	{"ubn",	MT_DENSITY4 | MT_NOREWIND | MT_BSD}
270};
271
272/* strings used in many debug and warning messages */
273static const char wr_str[]  = "write";
274static const char rd_str[]  = "read";
275static const char wrg_str[] = "writing";
276static const char rdg_str[] = "reading";
277
278/* default density offsets in the table above */
279#define	DEF_BLANK	0
280#define	DEF_NOREWIND	1
281#define	DEF_BSD		2
282#define	DEF_BSD_NR	3
283
284/* Sense Key, ASC/ASCQ for which tape ejection is needed */
285
286static struct tape_failure_code {
287	uchar_t key;
288	uchar_t add_code;
289	uchar_t qual_code;
290} st_tape_failure_code[] = {
291	{ KEY_HARDWARE_ERROR, 0x15, 0x01},
292	{ KEY_HARDWARE_ERROR, 0x44, 0x00},
293	{ KEY_HARDWARE_ERROR, 0x53, 0x00},
294	{ KEY_HARDWARE_ERROR, 0x53, 0x01},
295	{ KEY_NOT_READY, 0x53, 0x00},
296	{ 0xff}
297};
298
299/*  clean bit position and mask */
300
301static struct cln_bit_position {
302	ushort_t cln_bit_byte;
303	uchar_t cln_bit_mask;
304} st_cln_bit_position[] = {
305	{ 21, 0x08},
306	{ 70, 0xc0},
307	{ 18, 0x81}  /* 80 bit indicates in bit mode, 1 bit clean light is on */
308};
309
310/*
311 * architecture dependent allocation restrictions. For x86, we'll set
312 * dma_attr_addr_hi to st_max_phys_addr and dma_attr_sgllen to
313 * st_sgl_size during _init().
314 */
315#if defined(__sparc)
316static ddi_dma_attr_t st_alloc_attr = {
317	DMA_ATTR_V0,	/* version number */
318	0x0,		/* lowest usable address */
319	0xFFFFFFFFull,	/* high DMA address range */
320	0xFFFFFFFFull,	/* DMA counter register */
321	1,		/* DMA address alignment */
322	1,		/* DMA burstsizes */
323	1,		/* min effective DMA size */
324	0xFFFFFFFFull,	/* max DMA xfer size */
325	0xFFFFFFFFull,	/* segment boundary */
326	1,		/* s/g list length */
327	512,		/* granularity of device */
328	0		/* DMA transfer flags */
329};
330#elif defined(__x86)
331static ddi_dma_attr_t st_alloc_attr = {
332	DMA_ATTR_V0,	/* version number */
333	0x0,		/* lowest usable address */
334	0x0,		/* high DMA address range [set in _init()] */
335	0xFFFFull,	/* DMA counter register */
336	512,		/* DMA address alignment */
337	1,		/* DMA burstsizes */
338	1,		/* min effective DMA size */
339	0xFFFFFFFFull,	/* max DMA xfer size */
340	0xFFFFFFFFull,  /* segment boundary */
341	0,		/* s/g list length */
342	512,		/* granularity of device [set in _init()] */
343	0		/* DMA transfer flags */
344};
345uint64_t st_max_phys_addr = 0xFFFFFFFFull;
346int st_sgl_size = 0xF;
347
348#endif
349
350/*
351 * Configuration Data:
352 *
353 * Device driver ops vector
354 */
355static int st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p);
356static int st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p);
357static int st_read(dev_t  dev,  struct   uio   *uio_p,   cred_t *cred_p);
358static int st_write(dev_t  dev,  struct  uio   *uio_p,   cred_t *cred_p);
359static int st_open(dev_t  *devp,  int  flag,  int  otyp,  cred_t *cred_p);
360static int st_close(dev_t  dev,  int  flag,  int  otyp,  cred_t *cred_p);
361static int st_strategy(struct buf *bp);
362static int st_ioctl(dev_t dev, int cmd, intptr_t arg, int  flag,
363	cred_t *cred_p, int *rval_p);
364extern int nulldev(), nodev();
365
366static struct cb_ops st_cb_ops = {
367	st_open,			/* open */
368	st_close,		/* close */
369	st_strategy,		/* strategy */
370	nodev,			/* print */
371	nodev,			/* dump */
372	st_read,		/* read */
373	st_write,		/* write */
374	st_ioctl,		/* ioctl */
375	nodev,			/* devmap */
376	nodev,			/* mmap */
377	nodev,			/* segmap */
378	nochpoll,		/* poll */
379	ddi_prop_op,		/* cb_prop_op */
380	0,			/* streamtab  */
381	D_64BIT | D_MP | D_NEW | D_HOTPLUG,	/* Driver compatibility flag */
382	CB_REV,			/* cb_rev */
383	st_aread, 		/* async I/O read entry point */
384	st_awrite		/* async I/O write entry point */
385
386};
387
388static int stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg,
389		void **result);
390static int st_probe(dev_info_t *dev);
391static int st_attach(dev_info_t *dev, ddi_attach_cmd_t cmd);
392static int st_detach(dev_info_t *dev, ddi_detach_cmd_t cmd);
393
394static struct dev_ops st_ops = {
395	DEVO_REV,		/* devo_rev, */
396	0,			/* refcnt  */
397	stinfo,			/* info */
398	nulldev,		/* identify */
399	st_probe,		/* probe */
400	st_attach,		/* attach */
401	st_detach,		/* detach */
402	nodev,			/* reset */
403	&st_cb_ops,		/* driver operations */
404	(struct bus_ops *)0,	/* bus operations */
405	nulldev			/* power */
406};
407
408/*
409 * Local Function Declarations
410 */
411static void st_clean_print(dev_info_t *dev, char *label, uint_t level,
412	char *title, char *data, int len);
413static int st_doattach(struct scsi_device *devp, int (*canwait)());
414static void st_known_tape_type(struct scsi_tape *un);
415static int st_get_conf_from_st_dot_conf(struct scsi_tape *, char *,
416    struct st_drivetype *);
417static int st_get_conf_from_st_conf_dot_c(struct scsi_tape *, char *,
418    struct st_drivetype *);
419static int st_get_default_conf(struct scsi_tape *, char *,
420    struct st_drivetype *);
421static int st_rw(dev_t dev, struct uio *uio, int flag);
422static int st_arw(dev_t dev, struct aio_req *aio, int flag);
423static int st_find_eom(dev_t dev);
424static int st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag);
425static int st_ioctl_cmd(dev_t dev, struct uscsi_cmd *,
426	enum uio_seg, enum uio_seg, enum uio_seg);
427static int st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag);
428static void st_start(struct scsi_tape *un);
429static int st_handle_start_busy(struct scsi_tape *un, struct buf *bp,
430    clock_t timeout_interval);
431static int st_handle_intr_busy(struct scsi_tape *un, struct buf *bp,
432    clock_t timeout_interval);
433static int st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp);
434static void st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp);
435static void st_init(struct scsi_tape *un);
436static void st_make_cmd(struct scsi_tape *un, struct buf *bp,
437    int (*func)(caddr_t));
438static void st_make_uscsi_cmd(struct scsi_tape *, struct uscsi_cmd *,
439    struct buf *bp, int (*func)(caddr_t));
440static void st_intr(struct scsi_pkt *pkt);
441static void st_set_state(struct scsi_tape *un);
442static void st_test_append(struct buf *bp);
443static int st_runout(caddr_t);
444static int st_cmd(dev_t dev, int com, int count, int wait);
445static int st_set_compression(struct scsi_tape *un);
446static int st_write_fm(dev_t dev, int wfm);
447static int st_determine_generic(dev_t dev);
448static int st_determine_density(dev_t dev, int rw);
449static int st_get_density(dev_t dev);
450static int st_set_density(dev_t dev);
451static int st_loadtape(dev_t dev);
452static int st_modesense(struct scsi_tape *un);
453static int st_modeselect(struct scsi_tape *un);
454static int st_handle_incomplete(struct scsi_tape *un, struct buf *bp);
455static int st_wrongtapetype(struct scsi_tape *un);
456static int st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt);
457static int st_handle_sense(struct scsi_tape *un, struct buf *bp);
458static int st_handle_autosense(struct scsi_tape *un, struct buf *bp);
459static int st_decode_sense(struct scsi_tape *un, struct buf *bp, int amt,
460	struct scsi_status *);
461static int st_report_soft_errors(dev_t dev, int flag);
462static void st_delayed_cv_broadcast(void *arg);
463static int st_check_media(dev_t dev, enum mtio_state state);
464static int st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp);
465static void st_intr_restart(void *arg);
466static void st_start_restart(void *arg);
467static int st_gen_mode_sense(struct scsi_tape *un, int page,
468    struct seq_mode *page_data, int page_size);
469static int st_change_block_size(dev_t dev, uint32_t nblksz);
470static int st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data,
471    int page_size);
472static int st_tape_init(dev_t dev);
473static void st_flush(struct scsi_tape *un);
474static void st_set_pe_errno(struct scsi_tape *un);
475static void st_hba_unflush(struct scsi_tape *un);
476static void st_turn_pe_on(struct scsi_tape *un);
477static void st_turn_pe_off(struct scsi_tape *un);
478static void st_set_pe_flag(struct scsi_tape *un);
479static void st_clear_pe(struct scsi_tape *un);
480static void st_wait_for_io(struct scsi_tape *un);
481static int st_set_devconfig_page(struct scsi_tape *un, int compression_on);
482static int st_set_datacomp_page(struct scsi_tape *un, int compression_on);
483static int st_reserve_release(struct scsi_tape *un, int command);
484static int st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb);
485static int st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd,
486    int count);
487static int st_take_ownership(dev_t dev);
488static int st_check_asc_ascq(struct scsi_tape *un);
489static int st_check_clean_bit(dev_t dev);
490static int st_check_alert_flags(dev_t dev);
491static int st_check_sequential_clean_bit(dev_t dev);
492static int st_check_sense_clean_bit(dev_t dev);
493static int st_clear_unit_attentions(dev_t dev_instance, int max_trys);
494static void st_calculate_timeouts(struct scsi_tape *un);
495static writablity st_is_drive_worm(struct scsi_tape *un);
496static int st_read_attributes(struct scsi_tape *un, uint16_t attribute,
497    caddr_t buf, size_t size);
498static int st_get_special_inquiry(struct scsi_tape *un, uchar_t size,
499    caddr_t dest, uchar_t page);
500
501#if defined(__i386) || defined(__amd64)
502/*
503 * routines for I/O in big block size
504 */
505static void st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp);
506static struct contig_mem *st_get_contig_mem(struct scsi_tape *un, size_t len,
507    int alloc_flags);
508static int st_bigblk_xfer_done(struct buf *bp);
509static struct buf *st_get_bigblk_bp(struct buf *bp);
510#endif
511
512/*
513 * error statistics create/update functions
514 */
515static int st_create_errstats(struct scsi_tape *, int);
516static void st_uscsi_minphys(struct buf *bp);
517static int st_validate_tapemarks(struct scsi_tape *un, int fileno, daddr_t bn);
518
519#ifdef STDEBUG
520static void st_debug_cmds(struct scsi_tape *un, int com, int count, int wait);
521static char *st_dev_name(dev_t dev);
522#endif /* STDEBUG */
523
524#if !defined(lint)
525_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_pkt buf uio scsi_cdb))
526_NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_extended_sense scsi_status))
527_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_device))
528_NOTE(DATA_READABLE_WITHOUT_LOCK(st_drivetype scsi_address))
529#endif
530
531/*
532 * autoconfiguration routines.
533 */
534char _depends_on[] = "misc/scsi";
535
536static struct modldrv modldrv = {
537	&mod_driverops,		/* Type of module. This one is a driver */
538	"SCSI tape Driver %I%", /* Name of the module. */
539	&st_ops			/* driver ops */
540};
541
542static struct modlinkage modlinkage = {
543	MODREV_1, &modldrv, NULL
544};
545
546/*
547 * Notes on Post Reset Behavior in the tape driver:
548 *
549 * When the tape drive is opened, the driver  attempts  to make sure that
550 * the tape head is positioned exactly where it was left when it was last
551 * closed  provided  the  medium  is not  changed.  If the tape  drive is
552 * opened in O_NDELAY mode, the repositioning  (if necessary for any loss
553 * of position due to reset) will happen when the first tape operation or
554 * I/O occurs.  The repositioning (if required) may not be possible under
555 * certain situations such as when the device firmware not able to report
556 * the medium  change in the REQUEST  SENSE data  because of a reset or a
557 * misbehaving  bus  not  allowing  the  reposition  to  happen.  In such
558 * extraordinary  situations, where the driver fails to position the head
559 * at its  original  position,  it will fail the open the first  time, to
560 * save the applications from overwriting the data.  All further attempts
561 * to open the tape device will result in the driver  attempting  to load
562 * the  tape at BOT  (beginning  of  tape).  Also a  warning  message  to
563 * indicate  that further  attempts to open the tape device may result in
564 * the tape being  loaded at BOT will be printed on the  console.  If the
565 * tape  device is opened  in  O_NDELAY  mode,  failure  to  restore  the
566 * original tape head  position,  will result in the failure of the first
567 * tape  operation  or I/O,  Further,  the  driver  will  invalidate  its
568 * internal tape position  which will  necessitate  the  applications  to
569 * validate the position by using either a tape  positioning  ioctl (such
570 * as MTREW) or closing and reopening the tape device.
571 *
572 */
573
574int
575_init(void)
576{
577	int e;
578
579	if (((e = ddi_soft_state_init(&st_state,
580	    sizeof (struct scsi_tape), ST_MAXUNIT)) != 0)) {
581		return (e);
582	}
583
584	if ((e = mod_install(&modlinkage)) != 0) {
585		ddi_soft_state_fini(&st_state);
586	}
587
588#if defined(__x86)
589	/* set the max physical address for iob allocs on x86 */
590	st_alloc_attr.dma_attr_addr_hi = st_max_phys_addr;
591
592	/*
593	 * set the sgllen for iob allocs on x86. If this is set less than
594	 * the number of pages the buffer will take (taking into account
595	 * alignment), it would force the allocator to try and allocate
596	 * contiguous pages.
597	 */
598	st_alloc_attr.dma_attr_sgllen = st_sgl_size;
599#endif
600
601	return (e);
602}
603
604int
605_fini(void)
606{
607	int e;
608
609	if ((e = mod_remove(&modlinkage)) != 0) {
610		return (e);
611	}
612
613	ddi_soft_state_fini(&st_state);
614
615	return (e);
616}
617
618int
619_info(struct modinfo *modinfop)
620{
621	return (mod_info(&modlinkage, modinfop));
622}
623
624
625static int
626st_probe(dev_info_t *devi)
627{
628	int instance;
629	struct scsi_device *devp;
630	int rval;
631
632#if !defined(__sparc)
633	char    *tape_prop;
634	int	tape_prop_len;
635#endif
636
637	/* If self identifying device */
638	if (ddi_dev_is_sid(devi) == DDI_SUCCESS) {
639		return (DDI_PROBE_DONTCARE);
640	}
641
642#if !defined(__sparc)
643	/*
644	 * Since some x86 HBAs have devnodes that look like SCSI as
645	 * far as we can tell but aren't really SCSI (DADK, like mlx)
646	 * we check for the presence of the "tape" property.
647	 */
648	if (ddi_prop_op(DDI_DEV_T_NONE, devi, PROP_LEN_AND_VAL_ALLOC,
649	    DDI_PROP_CANSLEEP, "tape",
650	    (caddr_t)&tape_prop, &tape_prop_len) != DDI_PROP_SUCCESS) {
651		return (DDI_PROBE_FAILURE);
652	}
653	if (strncmp(tape_prop, "sctp", tape_prop_len) != 0) {
654		kmem_free(tape_prop, tape_prop_len);
655		return (DDI_PROBE_FAILURE);
656	}
657	kmem_free(tape_prop, tape_prop_len);
658#endif
659
660	devp = ddi_get_driver_private(devi);
661	instance = ddi_get_instance(devi);
662
663	if (ddi_get_soft_state(st_state, instance) != NULL) {
664		return (DDI_PROBE_PARTIAL);
665	}
666
667
668	/*
669	 * Turn around and call probe routine to see whether
670	 * we actually have a tape at this SCSI nexus.
671	 */
672	if (scsi_probe(devp, NULL_FUNC) == SCSIPROBE_EXISTS) {
673
674		/*
675		 * In checking the whole inq_dtype byte we are looking at both
676		 * the Peripheral Qualifier and the Peripheral Device Type.
677		 * For this driver we are only interested in sequential devices
678		 * that are connected or capable if connecting to this logical
679		 * unit.
680		 */
681		if (devp->sd_inq->inq_dtype ==
682		    (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) {
683			ST_DEBUG6(devi, st_label, SCSI_DEBUG,
684			    "probe exists\n");
685			rval = DDI_PROBE_SUCCESS;
686		} else {
687			rval = DDI_PROBE_FAILURE;
688		}
689	} else {
690		ST_DEBUG6(devi, st_label, SCSI_DEBUG,
691		    "probe failure: nothing there\n");
692		rval = DDI_PROBE_FAILURE;
693	}
694	scsi_unprobe(devp);
695	return (rval);
696}
697
698static int
699st_attach(dev_info_t *devi, ddi_attach_cmd_t cmd)
700{
701	int 	instance;
702	int	wide;
703	int 	dev_instance;
704	int	ret_status;
705	struct	scsi_device *devp;
706	int	node_ix;
707	struct	scsi_tape *un;
708
709	devp = ddi_get_driver_private(devi);
710	instance = ddi_get_instance(devi);
711
712	switch (cmd) {
713		case DDI_ATTACH:
714			if (st_doattach(devp, SLEEP_FUNC) == DDI_FAILURE) {
715				return (DDI_FAILURE);
716			}
717			break;
718		case DDI_RESUME:
719			/*
720			 * Suspend/Resume
721			 *
722			 * When the driver suspended, there might be
723			 * outstanding cmds and therefore we need to
724			 * reset the suspended flag and resume the scsi
725			 * watch thread and restart commands and timeouts
726			 */
727
728			if (!(un = ddi_get_soft_state(st_state, instance))) {
729				return (DDI_FAILURE);
730			}
731			dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) :
732			    un->un_dev);
733
734			mutex_enter(ST_MUTEX);
735
736			un->un_throttle = un->un_max_throttle;
737			un->un_tids_at_suspend = 0;
738			un->un_pwr_mgmt = ST_PWR_NORMAL;
739
740			if (un->un_swr_token) {
741				scsi_watch_resume(un->un_swr_token);
742			}
743
744			/*
745			 * Restart timeouts
746			 */
747			if ((un->un_tids_at_suspend & ST_DELAY_TID) != 0) {
748				mutex_exit(ST_MUTEX);
749				un->un_delay_tid =
750				    timeout(st_delayed_cv_broadcast, un,
751					drv_usectohz((clock_t)
752					MEDIA_ACCESS_DELAY));
753				mutex_enter(ST_MUTEX);
754			}
755
756			if (un->un_tids_at_suspend & ST_HIB_TID) {
757				mutex_exit(ST_MUTEX);
758				un->un_hib_tid = timeout(st_intr_restart, un,
759				    ST_STATUS_BUSY_TIMEOUT);
760				mutex_enter(ST_MUTEX);
761			}
762
763			ret_status = st_clear_unit_attentions(dev_instance, 5);
764
765			/*
766			 * now check if we need to restore the tape position
767			 */
768			if ((un->un_suspend_fileno > 0) ||
769			    (un->un_suspend_blkno > 0)) {
770				if (ret_status != 0) {
771					/*
772					 * tape didn't get good TUR
773					 * just print out error messages
774					 */
775					scsi_log(ST_DEVINFO, st_label, CE_WARN,
776					    "st_attach-RESUME: tape failure "
777					    " tape position will be lost");
778				} else {
779					/* this prints errors */
780					(void) st_validate_tapemarks(un,
781					    un->un_suspend_fileno,
782					    un->un_suspend_blkno);
783				}
784				/*
785				 * there are no retries, if there is an error
786				 * we don't know if the tape has changed
787				 */
788				un->un_suspend_fileno = 0;
789				un->un_suspend_blkno = 0;
790			}
791
792			/* now we are ready to start up any queued I/Os */
793			if (un->un_ncmds || un->un_quef) {
794				st_start(un);
795			}
796
797			cv_broadcast(&un->un_suspend_cv);
798			mutex_exit(ST_MUTEX);
799			return (DDI_SUCCESS);
800
801		default:
802			return (DDI_FAILURE);
803	}
804
805	un = ddi_get_soft_state(st_state, instance);
806
807	ST_DEBUG(devi, st_label, SCSI_DEBUG,
808	    "st_attach: instance=%x\n", instance);
809
810	/*
811	 * find the drive type for this target
812	 */
813	st_known_tape_type(un);
814
815	for (node_ix = 0; node_ix < ST_NUM_MEMBERS(st_minor_data); node_ix++) {
816		int minor;
817		char *name;
818
819		name  = st_minor_data[node_ix].name;
820		minor = st_minor_data[node_ix].minor;
821
822		/*
823		 * For default devices set the density to the
824		 * preferred default density for this device.
825		 */
826		if (node_ix <= DEF_BSD_NR) {
827			minor |= un->un_dp->default_density;
828		}
829		minor |= MTMINOR(instance);
830
831		if (ddi_create_minor_node(devi, name, S_IFCHR, minor,
832		    DDI_NT_TAPE, NULL) == DDI_SUCCESS) {
833			continue;
834		}
835
836		ddi_remove_minor_node(devi, NULL);
837		if (un) {
838			cv_destroy(&un->un_clscv);
839			cv_destroy(&un->un_sbuf_cv);
840			cv_destroy(&un->un_queue_cv);
841			cv_destroy(&un->un_state_cv);
842			cv_destroy(&un->un_suspend_cv);
843			cv_destroy(&un->un_tape_busy_cv);
844
845			if (un->un_sbufp) {
846				freerbuf(un->un_sbufp);
847			}
848			if (un->un_uscsi_rqs_buf) {
849				kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
850			}
851			if (un->un_mspl) {
852				i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
853			}
854			scsi_destroy_pkt(un->un_rqs);
855			scsi_free_consistent_buf(un->un_rqs_bp);
856			ddi_soft_state_free(st_state, instance);
857			devp->sd_private = NULL;
858			devp->sd_sense = NULL;
859
860		}
861		ddi_prop_remove_all(devi);
862		return (DDI_FAILURE);
863	}
864
865	/*
866	 * Add a zero-length attribute to tell the world we support
867	 * kernel ioctls (for layered drivers)
868	 */
869	(void) ddi_prop_create(DDI_DEV_T_NONE, devi, DDI_PROP_CANSLEEP,
870	    DDI_KERNEL_IOCTL, NULL, 0);
871
872	ddi_report_dev((dev_info_t *)devi);
873
874	/*
875	 * If it's a SCSI-2 tape drive which supports wide,
876	 * tell the host adapter to use wide.
877	 */
878	wide = ((devp->sd_inq->inq_rdf == RDF_SCSI2) &&
879	    (devp->sd_inq->inq_wbus16 || devp->sd_inq->inq_wbus32)) ?
880		1 : 0;
881
882	if (scsi_ifsetcap(ROUTE, "wide-xfer", wide, 1) == 1) {
883		ST_DEBUG(devi, st_label, SCSI_DEBUG,
884		    "Wide Transfer %s\n", wide ? "enabled" : "disabled");
885	}
886
887	/*
888	 * enable autorequest sense; keep the rq packet around in case
889	 * the autorequest sense fails because of a busy condition
890	 * do a getcap first in case the capability is not variable
891	 */
892	if (scsi_ifgetcap(ROUTE, "auto-rqsense", 1) == 1) {
893		un->un_arq_enabled = 1;
894	} else {
895		un->un_arq_enabled =
896		    ((scsi_ifsetcap(ROUTE, "auto-rqsense", 1, 1) == 1) ? 1 : 0);
897	}
898
899
900	ST_DEBUG(devi, st_label, SCSI_DEBUG, "auto request sense %s\n",
901		(un->un_arq_enabled ? "enabled" : "disabled"));
902
903	un->un_untagged_qing =
904	    (scsi_ifgetcap(ROUTE, "untagged-qing", 0) == 1);
905
906	/*
907	 * XXX - This is just for 2.6.  to tell users that write buffering
908	 *	has gone away.
909	 */
910	if (un->un_arq_enabled && un->un_untagged_qing) {
911		if (ddi_getprop(DDI_DEV_T_ANY, devi, DDI_PROP_DONTPASS,
912		    "tape-driver-buffering", 0) != 0) {
913			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
914			    "Write Data Buffering has been depricated. Your "
915			    "applications should continue to work normally.\n"
916			    " But, they should  ported to use Asynchronous "
917			    " I/O\n"
918			    " For more information, read about "
919			    " tape-driver-buffering "
920			    "property in the st(7d) man page\n");
921		}
922	}
923
924	un->un_max_throttle = un->un_throttle = un->un_last_throttle = 1;
925	un->un_flush_on_errors = 0;
926	un->un_mkr_pkt = (struct scsi_pkt *)NULL;
927
928	ST_DEBUG(devi, st_label, SCSI_DEBUG,
929	    "throttle=%x, max_throttle = %x\n",
930	    un->un_throttle, un->un_max_throttle);
931
932	/* initialize persistent errors to nil */
933	un->un_persistence = 0;
934	un->un_persist_errors = 0;
935
936	/*
937	 * Get dma-max from HBA driver. If it is not defined, use 64k
938	 */
939	un->un_maxdma	= scsi_ifgetcap(&devp->sd_address, "dma-max", 1);
940	if (un->un_maxdma == -1) {
941		ST_DEBUG(devi, st_label, SCSI_DEBUG,
942		    "Receaved a value that looked like -1. Using 64k maxdma");
943		un->un_maxdma = (64 * 1024);
944	}
945
946	/*
947	 * Get the max allowable cdb size
948	 */
949	un->un_max_cdb_sz =
950	    scsi_ifgetcap(&devp->sd_address, "max-cdb-length", 1);
951	if (un->un_max_cdb_sz < CDB_GROUP0) {
952		ST_DEBUG(devi, st_label, SCSI_DEBUG,
953		    "HBA reported max-cdb-length as %d\n", un->un_max_cdb_sz);
954		un->un_max_cdb_sz = CDB_GROUP4; /* optimistic default */
955	}
956
957	un->un_maxbsize = MAXBSIZE_UNKNOWN;
958
959	un->un_mediastate = MTIO_NONE;
960	un->un_HeadClean  = TAPE_ALERT_SUPPORT_UNKNOWN;
961
962	/*
963	 * initialize kstats
964	 */
965	un->un_stats = kstat_create("st", instance, NULL, "tape",
966			KSTAT_TYPE_IO, 1, KSTAT_FLAG_PERSISTENT);
967	if (un->un_stats) {
968		un->un_stats->ks_lock = ST_MUTEX;
969		kstat_install(un->un_stats);
970	}
971	(void) st_create_errstats(un, instance);
972
973	return (DDI_SUCCESS);
974}
975
976/*
977 * st_detach:
978 *
979 * we allow a detach if and only if:
980 *	- no tape is currently inserted
981 *	- tape position is at BOT or unknown
982 *		(if it is not at BOT then a no rewind
983 *		device was opened and we have to preserve state)
984 *	- it must be in a closed state : no timeouts or scsi_watch requests
985 *		will exist if it is closed, so we don't need to check for
986 *		them here.
987 */
988/*ARGSUSED*/
989static int
990st_detach(dev_info_t *devi, ddi_detach_cmd_t cmd)
991{
992	int 	instance;
993	int 	dev_instance;
994	struct scsi_device *devp;
995	struct scsi_tape *un;
996	clock_t wait_cmds_complete;
997
998	instance = ddi_get_instance(devi);
999
1000	if (!(un = ddi_get_soft_state(st_state, instance))) {
1001		return (DDI_FAILURE);
1002	}
1003
1004	switch (cmd) {
1005
1006	case DDI_DETACH:
1007		/*
1008		 * Undo what we did in st_attach & st_doattach,
1009		 * freeing resources and removing things we installed.
1010		 * The system framework guarantees we are not active
1011		 * with this devinfo node in any other entry points at
1012		 * this time.
1013		 */
1014
1015		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1016		    "st_detach: instance=%x, un=%p\n", instance,
1017		    (void *)un);
1018
1019		if (((un->un_dp->options & ST_UNLOADABLE) == 0) ||
1020		    (un->un_ncmds != 0) || (un->un_quef != NULL) ||
1021		    (un->un_state != ST_STATE_CLOSED)) {
1022			/*
1023			 * we cannot unload some targets because the
1024			 * inquiry returns junk unless immediately
1025			 * after a reset
1026			 */
1027			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
1028			    "cannot unload instance %x\n", instance);
1029			return (DDI_FAILURE);
1030		}
1031
1032		/*
1033		 * if the tape has been removed then we may unload;
1034		 * do a test unit ready and if it returns NOT READY
1035		 * then we assume that it is safe to unload.
1036		 * as a side effect, fileno may be set to -1 if the
1037		 * the test unit ready fails;
1038		 * also un_state may be set to non-closed, so reset it
1039		 */
1040		if ((un->un_dev) &&		/* Been opened since attach */
1041		    ((un->un_fileno > 0) ||	/* Known position not rewound */
1042		    (un->un_blkno != 0))) {	/* Or within first file */
1043			mutex_enter(ST_MUTEX);
1044			/*
1045			 * Send Test Unit Ready in the hopes that if
1046			 * the drive is not in the state we think it is.
1047			 * And the state will be changed so it can be detached.
1048			 * If the command fails to reach the device and
1049			 * the drive was not rewound or unloaded we want
1050			 * to fail the detach till a user command fails
1051			 * where after the detach will succead.
1052			 */
1053			(void) st_cmd(un->un_dev, SCMD_TEST_UNIT_READY,
1054			    0, SYNC_CMD);
1055			/*
1056			 * After TUR un_state may be set to non-closed,
1057			 * so reset it back.
1058			 */
1059			un->un_state = ST_STATE_CLOSED;
1060			mutex_exit(ST_MUTEX);
1061		}
1062		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1063		    "un_status=%x, fileno=%x, blkno=%lx\n",
1064		    un->un_status, un->un_fileno, un->un_blkno);
1065
1066		/*
1067		 * check again:
1068		 * if we are not at BOT then it is not safe to unload
1069		 */
1070		if ((un->un_dev) &&		/* Been opened since attach */
1071		    ((un->un_fileno > 0) ||	/* Known position not rewound */
1072		    (un->un_blkno != 0))) {	/* Or within first file */
1073			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1074			    "cannot detach: fileno=%x, blkno=%lx\n",
1075			    un->un_fileno, un->un_blkno);
1076			return (DDI_FAILURE);
1077		}
1078
1079		/*
1080		 * Just To make sure that we have released the
1081		 * tape unit .
1082		 */
1083		if (un->un_dev && (un->un_rsvd_status & ST_RESERVE) &&
1084		    !DEVI_IS_DEVICE_REMOVED(devi)) {
1085			mutex_enter(ST_MUTEX);
1086			(void) st_reserve_release(un, ST_RELEASE);
1087			mutex_exit(ST_MUTEX);
1088		}
1089
1090		/*
1091		 * now remove other data structures allocated in st_doattach()
1092		 */
1093		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1094		    "destroying/freeing\n");
1095		cv_destroy(&un->un_clscv);
1096		cv_destroy(&un->un_sbuf_cv);
1097		cv_destroy(&un->un_queue_cv);
1098		cv_destroy(&un->un_suspend_cv);
1099		cv_destroy(&un->un_tape_busy_cv);
1100
1101		if (un->un_hib_tid) {
1102			(void) untimeout(un->un_hib_tid);
1103			un->un_hib_tid = 0;
1104		}
1105
1106		if (un->un_delay_tid) {
1107			(void) untimeout(un->un_delay_tid);
1108			un->un_delay_tid = 0;
1109		}
1110		cv_destroy(&un->un_state_cv);
1111
1112#if defined(__i386) || defined(__amd64)
1113		if (un->un_contig_mem_hdl != NULL) {
1114			ddi_dma_free_handle(&un->un_contig_mem_hdl);
1115		}
1116#endif
1117		if (un->un_sbufp) {
1118			freerbuf(un->un_sbufp);
1119		}
1120		if (un->un_uscsi_rqs_buf) {
1121			kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
1122		}
1123		if (un->un_mspl) {
1124			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1125		}
1126		if (un->un_rqs) {
1127			scsi_destroy_pkt(un->un_rqs);
1128			scsi_free_consistent_buf(un->un_rqs_bp);
1129		}
1130		if (un->un_mkr_pkt) {
1131			scsi_destroy_pkt(un->un_mkr_pkt);
1132		}
1133		if (un->un_arq_enabled) {
1134			(void) scsi_ifsetcap(ROUTE, "auto-rqsense", 0, 1);
1135		}
1136		if (un->un_dp_size) {
1137			kmem_free(un->un_dp, un->un_dp_size);
1138		}
1139		if (un->un_stats) {
1140			kstat_delete(un->un_stats);
1141			un->un_stats = (kstat_t *)0;
1142		}
1143		if (un->un_errstats) {
1144			kstat_delete(un->un_errstats);
1145			un->un_errstats = (kstat_t *)0;
1146		}
1147		devp = ST_SCSI_DEVP;
1148		ddi_soft_state_free(st_state, instance);
1149		devp->sd_private = NULL;
1150		devp->sd_sense = NULL;
1151		scsi_unprobe(devp);
1152		ddi_prop_remove_all(devi);
1153		ddi_remove_minor_node(devi, NULL);
1154		ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach done\n");
1155		return (DDI_SUCCESS);
1156
1157	case DDI_SUSPEND:
1158
1159		/*
1160		 * Suspend/Resume
1161		 *
1162		 * To process DDI_SUSPEND, we must do the following:
1163		 *
1164		 *  - check ddi_removing_power to see if power will be turned
1165		 *    off. if so, return DDI_FAILURE
1166		 *  - check if we are already suspended,
1167		 *    if so, return DDI_FAILURE
1168		 *  - check if device state is CLOSED,
1169		 *    if not, return DDI_FAILURE.
1170		 *  - wait until outstanding operations complete
1171		 *  - save tape state
1172		 *  - block new operations
1173		 *  - cancel pending timeouts
1174		 *
1175		 */
1176
1177		if (ddi_removing_power(devi))
1178			return (DDI_FAILURE);
1179
1180		mutex_enter(ST_MUTEX);
1181
1182		/*
1183		 * Shouldn't already be suspended, if so return failure
1184		 */
1185		if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
1186			mutex_exit(ST_MUTEX);
1187			return (DDI_FAILURE);
1188		}
1189		if (un->un_state != ST_STATE_CLOSED) {
1190			mutex_exit(ST_MUTEX);
1191			return (DDI_FAILURE);
1192		}
1193
1194		/*
1195		 * Wait for all outstanding I/O's to complete
1196		 *
1197		 * we wait on both ncmds and the wait queue for times
1198		 * when we are flushing after persistent errors are
1199		 * flagged, which is when ncmds can be 0, and the
1200		 * queue can still have I/O's.  This way we preserve
1201		 * order of biodone's.
1202		 */
1203		wait_cmds_complete = ddi_get_lbolt();
1204		wait_cmds_complete +=
1205		    st_wait_cmds_complete * drv_usectohz(1000000);
1206		while (un->un_ncmds || un->un_quef ||
1207		    (un->un_state == ST_STATE_RESOURCE_WAIT)) {
1208
1209			if (cv_timedwait(&un->un_tape_busy_cv, ST_MUTEX,
1210			    wait_cmds_complete) == -1) {
1211				/*
1212				 * Time expired then cancel the command
1213				 */
1214				mutex_exit(ST_MUTEX);
1215				if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
1216					mutex_enter(ST_MUTEX);
1217					if (un->un_last_throttle) {
1218						un->un_throttle =
1219						    un->un_last_throttle;
1220					}
1221					mutex_exit(ST_MUTEX);
1222					return (DDI_FAILURE);
1223				} else {
1224					mutex_enter(ST_MUTEX);
1225					break;
1226				}
1227			}
1228		}
1229
1230		/*
1231		 * DDI_SUSPEND says that the system "may" power down, we
1232		 * remember the file and block number before rewinding.
1233		 * we also need to save state before issuing
1234		 * any WRITE_FILE_MARK command.
1235		 */
1236		if (un->un_fileno < 0) {
1237			un->un_suspend_fileno = 0;
1238			un->un_suspend_blkno  = 0;
1239		} else {
1240			un->un_suspend_fileno = un->un_fileno;
1241			un->un_suspend_blkno = un->un_blkno;
1242		}
1243		dev_instance = ((un->un_dev == 0) ? MTMINOR(instance) :
1244		    un->un_dev);
1245
1246		/*
1247		 * Issue a zero write file fmk command to tell the drive to
1248		 * flush any buffered tape marks
1249		 */
1250		(void) st_cmd(dev_instance, SCMD_WRITE_FILE_MARK, 0, SYNC_CMD);
1251
1252		/*
1253		 * Because not all tape drives correctly implement buffer
1254		 * flushing with the zero write file fmk command, issue a
1255		 * synchronous rewind command to force data flushing.
1256		 * st_validate_tapemarks() will do a rewind during DDI_RESUME
1257		 * anyway.
1258		 */
1259		(void) st_cmd(dev_instance, SCMD_REWIND, 0, SYNC_CMD);
1260
1261		/* stop any new operations */
1262		un->un_pwr_mgmt = ST_PWR_SUSPENDED;
1263		un->un_throttle = 0;
1264
1265		/*
1266		 * cancel any outstanding timeouts
1267		 */
1268		if (un->un_delay_tid) {
1269			timeout_id_t temp_id = un->un_delay_tid;
1270			un->un_delay_tid = 0;
1271			un->un_tids_at_suspend |= ST_DELAY_TID;
1272			mutex_exit(ST_MUTEX);
1273			(void) untimeout(temp_id);
1274			mutex_enter(ST_MUTEX);
1275		}
1276
1277		if (un->un_hib_tid) {
1278			timeout_id_t temp_id = un->un_hib_tid;
1279			un->un_hib_tid = 0;
1280			un->un_tids_at_suspend |= ST_HIB_TID;
1281			mutex_exit(ST_MUTEX);
1282			(void) untimeout(temp_id);
1283			mutex_enter(ST_MUTEX);
1284		}
1285
1286		/*
1287		 * Suspend the scsi_watch_thread
1288		 */
1289		if (un->un_swr_token) {
1290			opaque_t temp_token = un->un_swr_token;
1291			mutex_exit(ST_MUTEX);
1292			scsi_watch_suspend(temp_token);
1293		} else {
1294			mutex_exit(ST_MUTEX);
1295		}
1296
1297		return (DDI_SUCCESS);
1298
1299	default:
1300		ST_DEBUG(0, st_label, SCSI_DEBUG, "st_detach failed\n");
1301		return (DDI_FAILURE);
1302	}
1303}
1304
1305
1306/* ARGSUSED */
1307static int
1308stinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
1309{
1310	dev_t dev;
1311	struct scsi_tape *un;
1312	int instance, error;
1313	switch (infocmd) {
1314	case DDI_INFO_DEVT2DEVINFO:
1315		dev = (dev_t)arg;
1316		instance = MTUNIT(dev);
1317		if ((un = ddi_get_soft_state(st_state, instance)) == NULL)
1318			return (DDI_FAILURE);
1319		*result = (void *) ST_DEVINFO;
1320		error = DDI_SUCCESS;
1321		break;
1322	case DDI_INFO_DEVT2INSTANCE:
1323		dev = (dev_t)arg;
1324		instance = MTUNIT(dev);
1325		*result = (void *)(uintptr_t)instance;
1326		error = DDI_SUCCESS;
1327		break;
1328	default:
1329		error = DDI_FAILURE;
1330	}
1331	return (error);
1332}
1333
1334static int
1335st_doattach(struct scsi_device *devp, int (*canwait)())
1336{
1337	struct scsi_pkt *rqpkt = NULL;
1338	struct scsi_tape *un = NULL;
1339	int km_flags = (canwait != NULL_FUNC) ? KM_SLEEP : KM_NOSLEEP;
1340	int instance;
1341	struct buf *bp;
1342	size_t rlen;
1343
1344	/*
1345	 * Call the routine scsi_probe to do some of the dirty work.
1346	 * If the INQUIRY command succeeds, the field sd_inq in the
1347	 * device structure will be filled in.
1348	 */
1349	ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1350		"st_doattach(): probing\n");
1351
1352	if (scsi_probe(devp, canwait) == SCSIPROBE_EXISTS) {
1353
1354		/*
1355		 * In checking the whole inq_dtype byte we are looking at both
1356		 * the Peripheral Qualifier and the Peripheral Device Type.
1357		 * For this driver we are only interested in sequential devices
1358		 * that are connected or capable if connecting to this logical
1359		 * unit.
1360		 */
1361		if (devp->sd_inq->inq_dtype ==
1362		    (DTYPE_SEQUENTIAL | DPQ_POSSIBLE)) {
1363			ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1364			    "probe exists\n");
1365		} else {
1366			/* Something there but not a tape device */
1367			scsi_unprobe(devp);
1368			return (DDI_FAILURE);
1369		}
1370	} else {
1371		/* Nothing there */
1372		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1373		    "probe failure: nothing there\n");
1374		scsi_unprobe(devp);
1375		return (DDI_FAILURE);
1376	}
1377
1378	bp = scsi_alloc_consistent_buf(&devp->sd_address, (struct buf *)NULL,
1379	    SENSE_LENGTH, B_READ, canwait, NULL);
1380	if (!bp) {
1381		goto error;
1382	}
1383	rqpkt = scsi_init_pkt(&devp->sd_address,
1384	    (struct scsi_pkt *)NULL, bp, CDB_GROUP0, 1, 0,
1385	    PKT_CONSISTENT, canwait, NULL);
1386	if (!rqpkt) {
1387		goto error;
1388	}
1389	devp->sd_sense = (struct scsi_extended_sense *)bp->b_un.b_addr;
1390	ASSERT(geterror(bp) == NULL);
1391
1392	(void) scsi_setup_cdb((union scsi_cdb *)rqpkt->pkt_cdbp,
1393	    SCMD_REQUEST_SENSE, 0, SENSE_LENGTH, 0);
1394	FILL_SCSI1_LUN(devp, rqpkt);
1395
1396	/*
1397	 * The actual unit is present.
1398	 * Now is the time to fill in the rest of our info..
1399	 */
1400	instance = ddi_get_instance(devp->sd_dev);
1401
1402	if (ddi_soft_state_zalloc(st_state, instance) != DDI_SUCCESS) {
1403		goto error;
1404	}
1405	un = ddi_get_soft_state(st_state, instance);
1406
1407	ASSERT(un != NULL);
1408
1409	un->un_sbufp = getrbuf(km_flags);
1410
1411	un->un_uscsi_rqs_buf = kmem_alloc(SENSE_LENGTH, KM_SLEEP);
1412
1413	/*
1414	 * use i_ddi_mem_alloc() for now until we have an interface to allocate
1415	 * memory for DMA which doesn't require a DMA handle. ddi_iopb_alloc()
1416	 * is obsolete and we want more flexibility in controlling the DMA
1417	 * address constraints.
1418	 */
1419	(void) i_ddi_mem_alloc(devp->sd_dev, &st_alloc_attr,
1420	    sizeof (struct seq_mode), ((km_flags == KM_SLEEP) ? 1 : 0), 0,
1421	    NULL, (caddr_t *)&un->un_mspl, &rlen, NULL);
1422
1423	if (!un->un_sbufp || !un->un_mspl) {
1424		if (un->un_mspl) {
1425			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1426		}
1427		ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG,
1428		    "probe partial failure: no space\n");
1429		goto error;
1430	}
1431
1432	bzero(un->un_mspl, sizeof (struct seq_mode));
1433
1434	cv_init(&un->un_sbuf_cv, NULL, CV_DRIVER, NULL);
1435	cv_init(&un->un_queue_cv, NULL, CV_DRIVER, NULL);
1436	cv_init(&un->un_clscv, NULL, CV_DRIVER, NULL);
1437	cv_init(&un->un_state_cv, NULL, CV_DRIVER, NULL);
1438#if defined(__i386) || defined(__amd64)
1439	cv_init(&un->un_contig_mem_cv, NULL, CV_DRIVER, NULL);
1440#endif
1441
1442	/* Initialize power managemnet condition variable */
1443	cv_init(&un->un_suspend_cv, NULL, CV_DRIVER, NULL);
1444	cv_init(&un->un_tape_busy_cv, NULL, CV_DRIVER, NULL);
1445
1446	rqpkt->pkt_flags |= (FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON);
1447
1448	un->un_fileno	= -1;
1449	rqpkt->pkt_time = st_io_time;
1450	rqpkt->pkt_comp = st_intr;
1451	un->un_rqs	= rqpkt;
1452	un->un_sd	= devp;
1453	un->un_rqs_bp	= bp;
1454	un->un_swr_token = (opaque_t)NULL;
1455	un->un_comp_page = ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE;
1456	un->un_wormable = st_is_drive_worm;
1457
1458	un->un_suspend_fileno 	= 0;
1459	un->un_suspend_blkno 	= 0;
1460
1461#if defined(__i386) || defined(__amd64)
1462	if (ddi_dma_alloc_handle(ST_DEVINFO, &st_contig_mem_dma_attr,
1463		DDI_DMA_SLEEP, NULL, &un->un_contig_mem_hdl) != DDI_SUCCESS) {
1464		ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG,
1465		    "allocation of contiguous memory dma handle failed!");
1466		un->un_contig_mem_hdl = NULL;
1467		goto error;
1468	}
1469#endif
1470
1471	/*
1472	 * Since this driver manages devices with "remote" hardware,
1473	 * i.e. the devices themselves have no "reg" properties,
1474	 * the SUSPEND/RESUME commands in detach/attach will not be
1475	 * called by the power management framework unless we request
1476	 * it by creating a "pm-hardware-state" property and setting it
1477	 * to value "needs-suspend-resume".
1478	 */
1479	if (ddi_prop_update_string(DDI_DEV_T_NONE, devp->sd_dev,
1480	    "pm-hardware-state", "needs-suspend-resume") !=
1481	    DDI_PROP_SUCCESS) {
1482
1483		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1484		    "ddi_prop_update(\"pm-hardware-state\") failed\n");
1485		goto error;
1486	}
1487
1488	if (ddi_prop_create(DDI_DEV_T_NONE, devp->sd_dev, DDI_PROP_CANSLEEP,
1489	    "no-involuntary-power-cycles", NULL, 0) != DDI_PROP_SUCCESS) {
1490
1491		ST_DEBUG(devp->sd_dev, st_label, SCSI_DEBUG,
1492		    "ddi_prop_create(\"no-involuntary-power-cycles\") "
1493		    "failed\n");
1494		goto error;
1495	}
1496
1497	ST_DEBUG6(devp->sd_dev, st_label, SCSI_DEBUG, "probe success\n");
1498	return (DDI_SUCCESS);
1499
1500error:
1501	devp->sd_sense = NULL;
1502
1503	ddi_remove_minor_node(devp->sd_dev, NULL);
1504	if (un) {
1505		if (un->un_mspl) {
1506			i_ddi_mem_free((caddr_t)un->un_mspl, NULL);
1507		}
1508		if (un->un_sbufp) {
1509			freerbuf(un->un_sbufp);
1510		}
1511		if (un->un_uscsi_rqs_buf) {
1512			kmem_free(un->un_uscsi_rqs_buf, SENSE_LENGTH);
1513		}
1514#if defined(__i386) || defined(__amd64)
1515		if (un->un_contig_mem_hdl != NULL) {
1516			ddi_dma_free_handle(&un->un_contig_mem_hdl);
1517		}
1518#endif
1519		ddi_soft_state_free(st_state, instance);
1520		devp->sd_private = NULL;
1521	}
1522
1523	if (rqpkt) {
1524		scsi_destroy_pkt(rqpkt);
1525	}
1526
1527	if (bp) {
1528		scsi_free_consistent_buf(bp);
1529	}
1530
1531	if (devp->sd_inq) {
1532		scsi_unprobe(devp);
1533	}
1534	return (DDI_FAILURE);
1535}
1536
1537typedef int
1538(*cfg_functp)(struct scsi_tape *, char *vidpid, struct st_drivetype *);
1539
1540static cfg_functp config_functs[] = {
1541	st_get_conf_from_st_dot_conf,
1542	st_get_conf_from_st_conf_dot_c,
1543	st_get_default_conf
1544};
1545
1546
1547/*
1548 * determine tape type, using tape-config-list or built-in table or
1549 * use a generic tape config entry
1550 */
1551static void
1552st_known_tape_type(struct scsi_tape *un)
1553{
1554	struct st_drivetype *dp;
1555	cfg_functp *config_funct;
1556
1557	/*
1558	 * XXX:  Emulex MT-02 (and emulators) predates SCSI-1 and has
1559	 *	 no vid & pid inquiry data.  So, we provide one.
1560	 */
1561	if (ST_INQUIRY->inq_len == 0 ||
1562		(bcmp("\0\0\0\0\0\0\0\0", ST_INQUIRY->inq_vid, 8) == 0)) {
1563		(void) strcpy((char *)ST_INQUIRY->inq_vid, ST_MT02_NAME);
1564	}
1565
1566	un->un_dp_size = sizeof (struct st_drivetype);
1567	dp = kmem_zalloc((size_t)un->un_dp_size, KM_SLEEP);
1568	un->un_dp = dp;
1569
1570	/*
1571	 * Loop through the configuration methods till one works.
1572	 */
1573	for (config_funct = &config_functs[0]; ; config_funct++) {
1574		if ((*config_funct)(un, ST_INQUIRY->inq_vid, dp)) {
1575			break;
1576		}
1577	}
1578
1579	/*
1580	 * If we didn't just make up this configuration and
1581	 * all the density codes are the same..
1582	 * Set Auto Density over ride.
1583	 */
1584	if (*config_funct != st_get_default_conf) {
1585		/*
1586		 * If this device is one that is configured and all
1587		 * densities are the same, This saves doing gets and set
1588		 * that yield nothing.
1589		 */
1590		if ((dp->densities[0]) == (dp->densities[1]) &&
1591		    (dp->densities[0]) == (dp->densities[2]) &&
1592		    (dp->densities[0]) == (dp->densities[3])) {
1593
1594			dp->options |= ST_AUTODEN_OVERRIDE;
1595		}
1596	}
1597
1598
1599	/*
1600	 * Store tape drive characteristics.
1601	 */
1602	un->un_status = 0;
1603	un->un_attached = 1;
1604	un->un_init_options = dp->options;
1605
1606	/* setup operation time-outs based on options */
1607	st_calculate_timeouts(un);
1608
1609	/* make sure if we are supposed to be variable, make it variable */
1610	if (dp->options & ST_VARIABLE) {
1611		dp->bsize = 0;
1612	}
1613
1614	scsi_log(ST_DEVINFO, st_label, CE_NOTE, "?<%s>\n", dp->name);
1615}
1616
1617
1618typedef struct {
1619	int mask;
1620	int bottom;
1621	int top;
1622	char *name;
1623} conf_limit;
1624
1625static const conf_limit conf_limits[] = {
1626
1627	-1,		1,		2,		"conf version",
1628	-1,		MT_ISTS,	ST_LAST_TYPE,	"drive type",
1629	-1,		0,		0xffffff,	"block size",
1630	ST_VALID_OPTS,	0,		ST_VALID_OPTS,	"options",
1631	-1,		0,		4,		"number of densities",
1632	-1,		0,		UINT8_MAX,	"density code",
1633	-1,		0,		3,		"default density",
1634	-1,		0,		UINT16_MAX,	"non motion timeout",
1635	-1,		0,		UINT16_MAX,	"I/O timeout",
1636	-1,		0,		UINT16_MAX,	"space timeout",
1637	-1,		0,		UINT16_MAX,	"load timeout",
1638	-1,		0,		UINT16_MAX,	"unload timeout",
1639	-1,		0,		UINT16_MAX,	"erase timeout",
1640	0,		0,		0,		NULL
1641};
1642
1643static int
1644st_validate_conf_data(struct scsi_tape *un, int *list, int list_len,
1645    const char *conf_name)
1646{
1647	int dens;
1648	int ndens;
1649	int value;
1650	int type;
1651	int count;
1652	const conf_limit *limit = &conf_limits[0];
1653
1654	ST_DEBUG3(ST_DEVINFO, st_label, CE_NOTE,
1655	    "Checking %d entrys total with %d densities\n", list_len, list[4]);
1656
1657	count = list_len;
1658	type = *list;
1659	for (;  count && limit->name; count--, list++, limit++) {
1660
1661		value = *list;
1662		if (value & ~limit->mask) {
1663			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1664			    "%s %s value invalid bits set: 0x%X\n",
1665			    conf_name, limit->name, value & ~limit->mask);
1666			*list &= limit->mask;
1667		} else if (value < limit->bottom) {
1668			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1669			    "%s %s value too low: value = %d limit %d\n",
1670			    conf_name, limit->name, value, limit->bottom);
1671		} else if (value > limit->top) {
1672			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1673			    "%s %s value too high: value = %d limit %d\n",
1674			    conf_name, limit->name, value, limit->top);
1675		} else {
1676			ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT,
1677			    "%s %s value = 0x%X\n",
1678			    conf_name, limit->name, value);
1679		}
1680
1681		/* If not the number of densities continue */
1682		if (limit != &conf_limits[4]) {
1683			continue;
1684		}
1685
1686		/* If number of densities is not in range can't use config */
1687		if (value < limit->bottom || value > limit->top) {
1688			return (-1);
1689		}
1690
1691		ndens = min(value, NDENSITIES);
1692		if ((type == 1) && (list_len - ndens) != 6) {
1693			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1694			    "%s conf version 1 with %d densities has %d items"
1695			    " should have %d",
1696			    conf_name, ndens, list_len, 6 + ndens);
1697		} else if ((type == 2) && (list_len - ndens) != 13) {
1698			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1699			    "%s conf version 2 with %d densities has %d items"
1700			    " should have %d",
1701			    conf_name, ndens, list_len, 13 + ndens);
1702		}
1703
1704		limit++;
1705		for (dens = 0; dens < ndens && count; dens++) {
1706			count--;
1707			list++;
1708			value = *list;
1709			if (value < limit->bottom) {
1710				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1711				    "%s density[%d] value too low: value ="
1712				    " 0x%X limit 0x%X\n",
1713				    conf_name, dens, value, limit->bottom);
1714			} else if (value > limit->top) {
1715				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
1716				    "%s density[%d] value too high: value ="
1717				    " 0x%X limit 0x%X\n",
1718				    conf_name, dens, value, limit->top);
1719			} else {
1720				ST_DEBUG3(ST_DEVINFO, st_label, CE_CONT,
1721				    "%s density[%d] value = 0x%X\n",
1722				    conf_name, dens, value);
1723			}
1724		}
1725	}
1726
1727	return (0);
1728}
1729
1730static int
1731st_get_conf_from_st_dot_conf(struct scsi_tape *un, char *vidpid,
1732    struct st_drivetype *dp)
1733{
1734	caddr_t config_list = NULL;
1735	caddr_t data_list = NULL;
1736	int	*data_ptr;
1737	caddr_t vidptr, prettyptr, datanameptr;
1738	size_t	vidlen, prettylen, datanamelen, tripletlen = 0;
1739	int config_list_len, data_list_len, len, i;
1740	int version;
1741	int found = 0;
1742
1743
1744	/*
1745	 * Determine type of tape controller. Type is determined by
1746	 * checking the vendor ids of the earlier inquiry command and
1747	 * comparing those with vids in tape-config-list defined in st.conf
1748	 */
1749	if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, DDI_PROP_DONTPASS,
1750	    "tape-config-list", (caddr_t)&config_list, &config_list_len)
1751	    != DDI_PROP_SUCCESS) {
1752		return (found);
1753	}
1754
1755	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
1756	    "st_get_conf_from_st_dot_conf(): st.conf has tape-config-list\n");
1757
1758	/*
1759	 * Compare vids in each triplet - if it matches, get value for
1760	 * data_name and contruct a st_drivetype struct
1761	 * tripletlen is not set yet!
1762	 */
1763	for (len = config_list_len, vidptr = config_list;
1764	    len > 0;
1765	    vidptr += tripletlen, len -= tripletlen) {
1766
1767		vidlen = strlen(vidptr);
1768		prettyptr = vidptr + vidlen + 1;
1769		prettylen = strlen(prettyptr);
1770		datanameptr = prettyptr + prettylen + 1;
1771		datanamelen = strlen(datanameptr);
1772		tripletlen = vidlen + prettylen + datanamelen + 3;
1773
1774		if (vidlen == 0) {
1775			continue;
1776		}
1777
1778		/*
1779		 * If inquiry vid dosen't match this triplets vid,
1780		 * try the next.
1781		 */
1782		if (strncasecmp(vidpid, vidptr, vidlen)) {
1783			continue;
1784		}
1785
1786		/*
1787		 * if prettylen is zero then use the vid string
1788		 */
1789		if (prettylen == 0) {
1790			prettyptr = vidptr;
1791			prettylen = vidlen;
1792		}
1793
1794		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1795		    "vid = %s, pretty=%s, dataname = %s\n",
1796		    vidptr, prettyptr, datanameptr);
1797
1798		/*
1799		 * get the data list
1800		 */
1801		if (ddi_getlongprop(DDI_DEV_T_ANY, ST_DEVINFO, 0,
1802		    datanameptr, (caddr_t)&data_list,
1803		    &data_list_len) != DDI_PROP_SUCCESS) {
1804			/*
1805			 * Error in getting property value
1806			 * print warning!
1807			 */
1808			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1809			    "data property (%s) has no value\n",
1810			    datanameptr);
1811			continue;
1812		}
1813
1814		/*
1815		 * now initialize the st_drivetype struct
1816		 */
1817		(void) strncpy(dp->name, prettyptr, ST_NAMESIZE - 1);
1818		dp->length = (int)min(vidlen, (VIDPIDLEN - 1));
1819		(void) strncpy(dp->vid, vidptr, dp->length);
1820		data_ptr = (int *)data_list;
1821		/*
1822		 * check if data is enough for version, type,
1823		 * bsize, options, # of densities, density1,
1824		 * density2, ..., default_density
1825		 */
1826		if ((data_list_len < 5 * sizeof (int)) ||
1827		    (data_list_len < 6 * sizeof (int) +
1828		    *(data_ptr + 4) * sizeof (int))) {
1829			/*
1830			 * print warning and skip to next triplet.
1831			 */
1832			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1833			    "data property (%s) incomplete\n",
1834			    datanameptr);
1835			kmem_free(data_list, data_list_len);
1836			continue;
1837		}
1838
1839		if (st_validate_conf_data(un, data_ptr,
1840		    data_list_len / sizeof (int), datanameptr)) {
1841			kmem_free(data_list, data_list_len);
1842			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1843			    "data property (%s) rejected\n",
1844			    datanameptr);
1845			continue;
1846		}
1847
1848		/*
1849		 * check version
1850		 */
1851		version = *data_ptr++;
1852		if (version != 1 && version != 2) {
1853			/* print warning but accept it */
1854			scsi_log(ST_DEVINFO, st_label, CE_WARN,
1855			    "Version # for data property (%s) "
1856			    "not set to 1 or 2\n", datanameptr);
1857		}
1858
1859		dp->type    = *data_ptr++;
1860		dp->bsize   = *data_ptr++;
1861		dp->options = *data_ptr++;
1862		dp->options |= ST_DYNAMIC;
1863		len = *data_ptr++;
1864		for (i = 0; i < NDENSITIES; i++) {
1865			if (i < len) {
1866				dp->densities[i] = *data_ptr++;
1867			}
1868		}
1869		dp->default_density = *data_ptr << 3;
1870		if (version == 2 &&
1871		    data_list_len >= (13 + len) * sizeof (int)) {
1872			data_ptr++;
1873			dp->non_motion_timeout	= *data_ptr++;
1874			dp->io_timeout		= *data_ptr++;
1875			dp->rewind_timeout	= *data_ptr++;
1876			dp->space_timeout	= *data_ptr++;
1877			dp->load_timeout	= *data_ptr++;
1878			dp->unload_timeout	= *data_ptr++;
1879			dp->erase_timeout	= *data_ptr++;
1880		}
1881		kmem_free(data_list, data_list_len);
1882		found = 1;
1883		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
1884		    "found in st.conf: vid = %s, pretty=%s\n",
1885		    dp->vid, dp->name);
1886		break;
1887	}
1888
1889	/*
1890	 * free up the memory allocated by ddi_getlongprop
1891	 */
1892	if (config_list) {
1893		kmem_free(config_list, config_list_len);
1894	}
1895	return (found);
1896}
1897
1898static int
1899st_get_conf_from_st_conf_dot_c(struct scsi_tape *un, char *vidpid,
1900    struct st_drivetype *dp)
1901{
1902	int i;
1903
1904	/*
1905	 * Determine type of tape controller.  Type is determined by
1906	 * checking the result of the earlier inquiry command and
1907	 * comparing vendor ids with strings in a table declared in st_conf.c.
1908	 */
1909	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
1910	    "st_get_conf_from_st_conf_dot_c(): looking at st_drivetypes\n");
1911
1912	for (i = 0; i < st_ndrivetypes; i++) {
1913		if (st_drivetypes[i].length == 0) {
1914			continue;
1915		}
1916		if (strncasecmp(vidpid, st_drivetypes[i].vid,
1917		    st_drivetypes[i].length)) {
1918			continue;
1919		}
1920		bcopy(&st_drivetypes[i], dp, sizeof (st_drivetypes[i]));
1921		return (1);
1922	}
1923	return (0);
1924}
1925
1926static int
1927st_get_default_conf(struct scsi_tape *un, char *vidpid, struct st_drivetype *dp)
1928{
1929	int i;
1930
1931	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
1932	    "st_get_default_conf(): making drivetype from INQ cmd\n");
1933
1934
1935	/*
1936	 * Make up a name
1937	 */
1938	bcopy("Vendor '", dp->name, 8);
1939	bcopy(vidpid, &dp->name[8], VIDLEN);
1940	bcopy("' Product '", &dp->name[16], 11);
1941	bcopy(&vidpid[8], &dp->name[27], PIDLEN);
1942	dp->name[ST_NAMESIZE - 2] = '\'';
1943	dp->name[ST_NAMESIZE - 1] = '\0';
1944	dp->length = min(strlen(ST_INQUIRY->inq_vid), (VIDPIDLEN - 1));
1945	(void) strncpy(dp->vid, ST_INQUIRY->inq_vid, dp->length);
1946	/*
1947	 * 'clean' vendor and product strings of non-printing chars
1948	 */
1949	for (i = 0; i < ST_NAMESIZE - 2; i++) {
1950		if (dp->name[i] < ' ' || dp->name[i] > '~') {
1951			dp->name[i] = '.';
1952		}
1953	}
1954	dp->type = ST_TYPE_INVALID;
1955	dp->options |= (ST_DYNAMIC | ST_UNLOADABLE | ST_MODE_SEL_COMP);
1956
1957	return (1); /* Can Not Fail */
1958}
1959
1960/*
1961 * Regular Unix Entry points
1962 */
1963
1964
1965
1966/* ARGSUSED */
1967static int
1968st_open(dev_t *dev_p, int flag, int otyp, cred_t *cred_p)
1969{
1970	dev_t dev = *dev_p;
1971	int rval = 0;
1972
1973	GET_SOFT_STATE(dev);
1974
1975	/*
1976	 * validate that we are addressing a sensible unit
1977	 */
1978	mutex_enter(ST_MUTEX);
1979
1980#ifdef	STDEBUG
1981	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
1982	    "st_open(node = %s dev = 0x%lx, flag = %d, otyp = %d)\n",
1983	    st_dev_name(dev), *dev_p, flag, otyp);
1984#endif
1985
1986	/*
1987	 * All device accesss go thru st_strategy() where we check
1988	 * suspend status
1989	 */
1990
1991	if (!un->un_attached) {
1992		st_known_tape_type(un);
1993		if (!un->un_attached) {
1994			rval = ENXIO;
1995			goto exit;
1996		}
1997
1998	}
1999
2000	/*
2001	 * Check for the case of the tape in the middle of closing.
2002	 * This isn't simply a check of the current state, because
2003	 * we could be in state of sensing with the previous state
2004	 * that of closing.
2005	 *
2006	 * And don't allow multiple opens.
2007	 */
2008	if (!(flag & (FNDELAY | FNONBLOCK)) && IS_CLOSING(un)) {
2009		un->un_laststate = un->un_state;
2010		un->un_state = ST_STATE_CLOSE_PENDING_OPEN;
2011		while (IS_CLOSING(un) ||
2012		    un->un_state == ST_STATE_CLOSE_PENDING_OPEN) {
2013			if (cv_wait_sig(&un->un_clscv, ST_MUTEX) == 0) {
2014				rval = EINTR;
2015				un->un_state = un->un_laststate;
2016				goto exit;
2017			}
2018		}
2019	} else if (un->un_state != ST_STATE_CLOSED) {
2020		rval = EBUSY;
2021		goto busy;
2022	}
2023
2024	/*
2025	 * record current dev
2026	 */
2027	un->un_dev = dev;
2028	un->un_oflags = flag;	/* save for use in st_tape_init() */
2029	un->un_errno = 0;	/* no errors yet */
2030	un->un_restore_pos = 0;
2031	un->un_rqs_state = 0;
2032
2033	/*
2034	 * If we are opening O_NDELAY, or O_NONBLOCK, we don't check for
2035	 * anything, leave internal states alone, if fileno >= 0
2036	 */
2037	if (flag & (FNDELAY | FNONBLOCK)) {
2038		if (un->un_fileno < 0 || (un->un_fileno == 0 &&
2039		    un->un_blkno == 0)) {
2040			un->un_state = ST_STATE_OFFLINE;
2041		} else if (un->un_fileno > 0 ||
2042		    (un->un_fileno == 0 && un->un_blkno != 0)) {
2043			/*
2044			 * set un_read_only/write-protect status.
2045			 *
2046			 * If the tape is not bot we can assume
2047			 * that mspl->wp_status is set properly.
2048			 * else
2049			 * we need to do a mode sense/Tur once
2050			 * again to get the actual tape status.(since
2051			 * user might have replaced the tape)
2052			 * Hence make the st state OFFLINE so that
2053			 * we re-intialize the tape once again.
2054			 */
2055			un->un_read_only =
2056			    (un->un_oflags & FWRITE) ? RDWR : RDONLY;
2057			un->un_state = ST_STATE_OPEN_PENDING_IO;
2058		} else {
2059			un->un_state = ST_STATE_OFFLINE;
2060		}
2061		rval = 0;
2062	} else {
2063		/*
2064		 * Not opening O_NDELAY.
2065		 */
2066		un->un_state = ST_STATE_OPENING;
2067
2068		rval = st_tape_init(dev);
2069		if ((rval == EACCES) && (un->un_read_only & WORM)) {
2070			un->un_state = ST_STATE_OPEN_PENDING_IO;
2071			rval = 0; /* so open doesn't fail */
2072		} else if (rval) {
2073			/*
2074			 * Release the tape unit, if reserved and not
2075			 * preserve reserve.
2076			 */
2077			if ((un->un_rsvd_status &
2078			    (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) {
2079				(void) st_reserve_release(un, ST_RELEASE);
2080			}
2081		} else {
2082			un->un_state = ST_STATE_OPEN_PENDING_IO;
2083		}
2084	}
2085
2086exit:
2087	/*
2088	 * we don't want any uninvited guests scrogging our data when we're
2089	 * busy with something, so for successful opens or failed opens
2090	 * (except for EBUSY), reset these counters and state appropriately.
2091	 */
2092	if (rval != EBUSY) {
2093		if (rval) {
2094			un->un_state = ST_STATE_CLOSED;
2095		}
2096		un->un_err_resid = 0;
2097		un->un_retry_ct = 0;
2098		un->un_tran_retry_ct = 0;
2099	}
2100busy:
2101	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2102	    "st_open: return val = %x, state = %d\n", rval, un->un_state);
2103	mutex_exit(ST_MUTEX);
2104	return (rval);
2105
2106}
2107
2108static int
2109st_tape_init(dev_t dev)
2110{
2111	int err;
2112	int rval = 0;
2113
2114	GET_SOFT_STATE(dev);
2115
2116	ASSERT(mutex_owned(ST_MUTEX));
2117
2118	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2119	    "st_tape_init(dev = 0x%lx, oflags = %d)\n", dev, un->un_oflags);
2120
2121	/*
2122	 * Clean up after any errors left by 'last' close.
2123	 * This also handles the case of the initial open.
2124	 */
2125	if (un->un_state != ST_STATE_INITIALIZING) {
2126		un->un_laststate = un->un_state;
2127		un->un_state = ST_STATE_OPENING;
2128	}
2129
2130	un->un_kbytes_xferred = 0;
2131
2132	/*
2133	 * do a throw away TUR to clear check condition
2134	 */
2135	err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
2136
2137	/*
2138	 * If test unit ready fails because the drive is reserved
2139	 * by another host fail the open for no access.
2140	 */
2141	if (err) {
2142		if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) {
2143			un->un_state = ST_STATE_CLOSED;
2144			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
2145			    "st_tape_init: RESERVATION CONFLICT\n");
2146			rval = EACCES;
2147			goto exit;
2148		}
2149	}
2150
2151	/*
2152	 * See whether this is a generic device that we haven't figured
2153	 * anything out about yet.
2154	 */
2155	if (un->un_dp->type == ST_TYPE_INVALID) {
2156		rval = st_determine_generic(dev);
2157		if (rval) {
2158			if (rval != EACCES) {
2159				rval = EIO;
2160			}
2161			un->un_state = ST_STATE_CLOSED;
2162			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2163			    "st_tape_init: %s invalid type\n",
2164			    rval == EACCES ? "EACCES" : "EIO");
2165			goto exit;
2166		}
2167		/*
2168		 * If this is a Unknown Type drive,
2169		 * Use the READ BLOCK LIMITS to determine if
2170		 * allow large xfer is approprate if not globally
2171		 * disabled with st_allow_large_xfer.
2172		 */
2173		un->un_allow_large_xfer = (uchar_t)st_allow_large_xfer;
2174	} else {
2175
2176		/*
2177		 * If we allow_large_xfer (ie >64k) and have not yet found out
2178		 * the max block size supported by the drive,
2179		 * find it by issueing a READ_BLKLIM command.
2180		 * if READ_BLKLIM cmd fails, assume drive doesn't
2181		 * allow_large_xfer and min/max block sizes as 1 byte and 63k.
2182		 */
2183		un->un_allow_large_xfer = st_allow_large_xfer &&
2184		    (un->un_dp->options & ST_NO_RECSIZE_LIMIT);
2185	}
2186	/*
2187	 * if maxbsize is unknown, set the maximum block size.
2188	 */
2189	if (un->un_maxbsize == MAXBSIZE_UNKNOWN) {
2190
2191		/*
2192		 * Get the Block limits of the tape drive.
2193		 * if un->un_allow_large_xfer = 0 , then make sure
2194		 * that maxbsize is <= ST_MAXRECSIZE_FIXED.
2195		 */
2196		un->un_rbl = kmem_zalloc(RBLSIZE, KM_SLEEP);
2197
2198		err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD);
2199		if (err) {
2200			/* Retry */
2201			err = st_cmd(dev, SCMD_READ_BLKLIM, RBLSIZE, SYNC_CMD);
2202		}
2203		if (!err) {
2204
2205			/*
2206			 * if cmd successful, use limit returned
2207			 */
2208			un->un_maxbsize = (un->un_rbl->max_hi << 16) +
2209					(un->un_rbl->max_mid << 8) +
2210					un->un_rbl->max_lo;
2211			un->un_minbsize = (un->un_rbl->min_hi << 8) +
2212					un->un_rbl->min_lo;
2213			un->un_data_mod = 1 << un->un_rbl->granularity;
2214			if ((un->un_maxbsize == 0) ||
2215			    (un->un_allow_large_xfer == 0 &&
2216			    un->un_maxbsize > ST_MAXRECSIZE_FIXED)) {
2217				un->un_maxbsize = ST_MAXRECSIZE_FIXED;
2218
2219			} else if (un->un_dp->type == ST_TYPE_DEFAULT) {
2220				/*
2221				 * Drive is not one that is configured, But the
2222				 * READ BLOCK LIMITS tells us it can do large
2223				 * xfers.
2224				 */
2225				if (un->un_maxbsize > ST_MAXRECSIZE_FIXED) {
2226					un->un_dp->options |=
2227					    ST_NO_RECSIZE_LIMIT;
2228				}
2229				/*
2230				 * If max and mimimum block limits are the
2231				 * same this is a fixed block size device.
2232				 */
2233				if (un->un_maxbsize == un->un_minbsize) {
2234					un->un_dp->options &= ~ST_VARIABLE;
2235				}
2236			}
2237
2238			if (un->un_minbsize == 0) {
2239				un->un_minbsize = 1;
2240			}
2241
2242		} else { /* error on read block limits */
2243
2244			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
2245				"!st_tape_init: Error on READ BLOCK LIMITS,"
2246				" errno = %d un_rsvd_status = 0x%X\n",
2247				err, un->un_rsvd_status);
2248
2249			/*
2250			 * since read block limits cmd failed,
2251			 * do not allow large xfers.
2252			 * use old values in st_minphys
2253			 */
2254			if (un->un_rsvd_status & ST_RESERVATION_CONFLICT) {
2255				rval = EACCES;
2256			} else {
2257				un->un_allow_large_xfer = 0;
2258				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
2259					"!Disabling large transfers\n");
2260
2261				/*
2262				 * we guess maxbsize and minbsize
2263				 */
2264				if (un->un_bsize) {
2265					un->un_maxbsize = un->un_minbsize =
2266						un->un_bsize;
2267				} else {
2268					un->un_maxbsize = ST_MAXRECSIZE_FIXED;
2269					un->un_minbsize = 1;
2270				}
2271				/*
2272				 * Data Mod must be set,
2273				 * Even if read block limits fails.
2274				 * Prevents Divide By Zero in st_rw().
2275				 */
2276				un->un_data_mod = 1;
2277			}
2278		}
2279		if (un->un_rbl) {
2280			kmem_free(un->un_rbl, RBLSIZE);
2281			un->un_rbl = NULL;
2282		}
2283
2284		if (rval) {
2285			goto exit;
2286		}
2287	}
2288
2289	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
2290	    "maxdma = %d, maxbsize = %d, minbsize = %d, %s large xfer\n",
2291	    un->un_maxdma, un->un_maxbsize, un->un_minbsize,
2292	    (un->un_allow_large_xfer ? "ALLOW": "DON'T ALLOW"));
2293
2294	err = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
2295
2296	if (err != 0) {
2297		if (err == EINTR) {
2298			un->un_laststate = un->un_state;
2299			un->un_state = ST_STATE_CLOSED;
2300			rval = EINTR;
2301			goto exit;
2302		}
2303		/*
2304		 * Make sure the tape is ready
2305		 */
2306		un->un_fileno = -1;
2307		if (un->un_status != KEY_UNIT_ATTENTION) {
2308			/*
2309			 * allow open no media.  Subsequent MTIOCSTATE
2310			 * with media present will complete the open
2311			 * logic.
2312			 */
2313			un->un_laststate = un->un_state;
2314			if (un->un_oflags & (FNONBLOCK|FNDELAY)) {
2315				un->un_mediastate = MTIO_EJECTED;
2316				un->un_state = ST_STATE_OFFLINE;
2317				rval = 0;
2318				goto exit;
2319			} else {
2320				un->un_state = ST_STATE_CLOSED;
2321				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2322				    "st_tape_init EIO no media, not opened "
2323				    "O_NONBLOCK|O_EXCL\n");
2324				rval = EIO;
2325				goto exit;
2326			}
2327		}
2328	}
2329
2330	/*
2331	 * On each open, initialize block size from drivetype struct,
2332	 * as it could have been changed by MTSRSZ ioctl.
2333	 * Now, ST_VARIABLE simply means drive is capable of variable
2334	 * mode. All drives are assumed to support fixed records.
2335	 * Hence, un_bsize tells what mode the drive is in.
2336	 *	un_bsize	= 0	- variable record length
2337	 *			= x	- fixed record length is x
2338	 */
2339	un->un_bsize = un->un_dp->bsize;
2340
2341	if (un->un_restore_pos) {
2342		rval = st_validate_tapemarks(un, un->un_save_fileno,
2343		    un->un_save_blkno);
2344		if (rval != 0) {
2345			if (rval != EACCES) {
2346				rval = EIO;
2347			}
2348			un->un_restore_pos = 0;
2349			un->un_laststate = un->un_state;
2350			un->un_state = ST_STATE_CLOSED;
2351			goto exit;
2352		}
2353		un->un_restore_pos = 0;
2354	}
2355
2356	if (un->un_fileno < 0) {
2357		rval = st_loadtape(dev);
2358		if (rval) {
2359			if (rval != EACCES) {
2360				rval = EIO;
2361			}
2362			un->un_laststate = un->un_state;
2363			un->un_state = ST_STATE_CLOSED;
2364			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2365			    "st_tape_init: %s can't open tape\n",
2366			    rval == EACCES ? "EACCES" : "EIO");
2367			goto exit;
2368		}
2369	}
2370
2371	/*
2372	 * do a mode sense to pick up state of current write-protect,
2373	 * Could cause reserve and fail due to conflict.
2374	 */
2375	rval = st_modesense(un);
2376	if (rval == EACCES) {
2377		goto exit;
2378	}
2379
2380	/*
2381	 * If we are opening the tape for writing, check
2382	 * to make sure that the tape can be written.
2383	 */
2384	if (un->un_oflags & FWRITE) {
2385		err = 0;
2386		if (un->un_mspl->wp) {
2387			un->un_status = KEY_WRITE_PROTECT;
2388			un->un_laststate = un->un_state;
2389			un->un_state = ST_STATE_CLOSED;
2390			rval = EACCES;
2391			/*
2392			 * STK sets the wp bit if volsafe tape is loaded.
2393			 */
2394			if ((un->un_dp->type == MT_ISSTK9840) &&
2395			    (un->un_dp->options & ST_WORMABLE)) {
2396				un->un_read_only = RDONLY;
2397			} else {
2398				goto exit;
2399			}
2400		} else {
2401			un->un_read_only = RDWR;
2402		}
2403	} else {
2404		un->un_read_only = RDONLY;
2405	}
2406
2407	if (un->un_dp->options & ST_WORMABLE) {
2408		un->un_read_only |= un->un_wormable(un);
2409
2410		if (((un->un_read_only == WORM) ||
2411		    (un->un_read_only == RDWORM)) &&
2412		    ((un->un_oflags & FWRITE) == FWRITE)) {
2413			un->un_status = KEY_DATA_PROTECT;
2414			rval = EACCES;
2415			ST_DEBUG4(ST_DEVINFO, st_label, CE_NOTE,
2416			    "read_only = %d eof = %d oflag = %d\n",
2417			    un->un_read_only, un->un_eof, un->un_oflags);
2418		}
2419	}
2420
2421	/*
2422	 * If we're opening the tape write-only, we need to
2423	 * write 2 filemarks on the HP 1/2 inch drive, to
2424	 * create a null file.
2425	 */
2426	if ((un->un_read_only == RDWR) ||
2427	    (un->un_read_only == WORM) && (un->un_oflags & FWRITE)) {
2428		if (un->un_dp->options & ST_REEL) {
2429			un->un_fmneeded = 2;
2430		} else {
2431			un->un_fmneeded = 1;
2432		}
2433	} else {
2434		un->un_fmneeded = 0;
2435	}
2436
2437	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
2438	    "fmneeded = %x\n", un->un_fmneeded);
2439
2440	/*
2441	 * Make sure the density can be selected correctly.
2442	 * If WORM can only write at the append point which in most cases
2443	 * isn't BOP. st_determine_density() with a B_WRITE only attempts
2444	 * to set and try densities if a BOP.
2445	 */
2446	if (st_determine_density(dev,
2447	    un->un_read_only == RDWR ? B_WRITE : B_READ)) {
2448		un->un_status = KEY_ILLEGAL_REQUEST;
2449		un->un_laststate = un->un_state;
2450		un->un_state = ST_STATE_CLOSED;
2451		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
2452		    "st_tape_init: EIO can't determine density\n");
2453		rval = EIO;
2454		goto exit;
2455	}
2456
2457	/*
2458	 * Destroy the knowledge that we have 'determined'
2459	 * density so that a later read at BOT comes along
2460	 * does the right density determination.
2461	 */
2462
2463	un->un_density_known = 0;
2464
2465
2466	/*
2467	 * Okay, the tape is loaded and either at BOT or somewhere past.
2468	 * Mark the state such that any I/O or tape space operations
2469	 * will get/set the right density, etc..
2470	 */
2471	un->un_laststate = un->un_state;
2472	un->un_lastop = ST_OP_NIL;
2473	un->un_mediastate = MTIO_INSERTED;
2474	cv_broadcast(&un->un_state_cv);
2475
2476	/*
2477	 *  Set test append flag if writing.
2478	 *  First write must check that tape is positioned correctly.
2479	 */
2480	un->un_test_append = (un->un_oflags & FWRITE);
2481
2482exit:
2483	un->un_err_resid = 0;
2484	un->un_last_resid = 0;
2485	un->un_last_count = 0;
2486
2487	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
2488	    "st_tape_init: return val = %x\n", rval);
2489	return (rval);
2490
2491}
2492
2493
2494
2495/* ARGSUSED */
2496static int
2497st_close(dev_t dev, int flag, int otyp, cred_t *cred_p)
2498{
2499	int err = 0;
2500	int norew, count, last_state;
2501#if defined(__i386) || defined(__amd64)
2502	struct contig_mem *cp, *cp_temp;
2503#endif
2504
2505	GET_SOFT_STATE(dev);
2506
2507	/*
2508	 * wait till all cmds in the pipeline have been completed
2509	 */
2510	mutex_enter(ST_MUTEX);
2511
2512	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2513	    "st_close(dev = 0x%lx, flag = %d, otyp = %d)\n", dev, flag, otyp);
2514
2515	st_wait_for_io(un);
2516
2517	/* turn off persistent errors on close, as we want close to succeed */
2518	TURN_PE_OFF(un);
2519
2520	/*
2521	 * set state to indicate that we are in process of closing
2522	 */
2523	last_state = un->un_laststate = un->un_state;
2524	un->un_state = ST_STATE_CLOSING;
2525
2526	/*
2527	 * BSD behavior:
2528	 * a close always causes a silent span to the next file if we've hit
2529	 * an EOF (but not yet read across it).
2530	 */
2531	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
2532	    "st_close1: fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno,
2533	    un->un_blkno, un->un_eof);
2534
2535
2536	if (BSD_BEHAVIOR && (un->un_eof == ST_EOF)) {
2537		if (un->un_fileno >= 0) {
2538			un->un_fileno++;
2539			un->un_blkno = 0;
2540		}
2541		un->un_eof = ST_NO_EOF;
2542	}
2543
2544	/*
2545	 * rewinding?
2546	 */
2547	norew = (getminor(dev) & MT_NOREWIND);
2548
2549	/*
2550	 * SVR4 behavior for skipping to next file:
2551	 *
2552	 * If we have not seen a filemark, space to the next file
2553	 *
2554	 * If we have already seen the filemark we are physically in the next
2555	 * file and we only increment the filenumber
2556	 */
2557
2558	if (norew && SVR4_BEHAVIOR && (flag & FREAD) && (un->un_blkno != 0) &&
2559	    (un->un_lastop != ST_OP_WRITE)) {
2560		switch (un->un_eof) {
2561		case ST_NO_EOF:
2562			/*
2563			 * if we were reading and did not read the complete file
2564			 * skip to the next file, leaving the tape correctly
2565			 * positioned to read the first record of the next file
2566			 * Check first for REEL if we are at EOT by trying to
2567			 * read a block
2568			 */
2569			if ((un->un_dp->options & ST_REEL) &&
2570				(!(un->un_dp->options & ST_READ_IGNORE_EOFS)) &&
2571			    (un->un_blkno == 0)) {
2572				if (st_cmd(dev, SCMD_SPACE, Blk(1), SYNC_CMD)) {
2573					ST_DEBUG2(ST_DEVINFO, st_label,
2574					    SCSI_DEBUG,
2575					    "st_close : EIO can't space\n");
2576					err = EIO;
2577					break;
2578				}
2579				if (un->un_eof >= ST_EOF_PENDING) {
2580					un->un_eof = ST_EOT_PENDING;
2581					un->un_fileno += 1;
2582					un->un_blkno   = 0;
2583					break;
2584				}
2585			}
2586			if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) {
2587				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2588				    "st_close: EIO can't space #2\n");
2589				err = EIO;
2590			} else {
2591				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
2592				    "st_close2: fileno=%x,blkno=%lx,"
2593				    "un_eof=%x\n",
2594				    un->un_fileno, un->un_blkno, un->un_eof);
2595				un->un_eof = ST_NO_EOF;
2596			}
2597			break;
2598
2599		case ST_EOF_PENDING:
2600		case ST_EOF:
2601			un->un_fileno += 1;
2602			un->un_blkno   = 0;
2603			un->un_eof = ST_NO_EOF;
2604			break;
2605
2606		case ST_EOT:
2607		case ST_EOT_PENDING:
2608			/* nothing to do */
2609			break;
2610		default:
2611			scsi_log(ST_DEVINFO, st_label, CE_PANIC,
2612			    "Undefined state 0x%x", un->un_eof);
2613
2614		}
2615	}
2616
2617
2618	/*
2619	 * For performance reasons (HP 88780), the driver should
2620	 * postpone writing the second tape mark until just before a file
2621	 * positioning ioctl is issued (e.g., rewind).	This means that
2622	 * the user must not manually rewind the tape because the tape will
2623	 * be missing the second tape mark which marks EOM.
2624	 * However, this small performance improvement is not worth the risk.
2625	 */
2626
2627	/*
2628	 * We need to back up over the filemark we inadvertently popped
2629	 * over doing a read in between the two filemarks that constitute
2630	 * logical eot for 1/2" tapes. Note that ST_EOT_PENDING is only
2631	 * set while reading.
2632	 *
2633	 * If we happen to be at physical eot (ST_EOM) (writing case),
2634	 * the writing of filemark(s) will clear the ST_EOM state, which
2635	 * we don't want, so we save this state and restore it later.
2636	 */
2637
2638	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
2639	    "flag=%x, fmneeded=%x, lastop=%x, eof=%x\n",
2640		flag, un->un_fmneeded, un->un_lastop, un->un_eof);
2641
2642	if (un->un_eof == ST_EOT_PENDING) {
2643		if (norew) {
2644			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
2645				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2646				    "st_close: EIO can't space #3\n");
2647				err = EIO;
2648			} else {
2649				un->un_blkno = 0;
2650				un->un_eof = ST_EOT;
2651			}
2652		} else {
2653			un->un_eof = ST_NO_EOF;
2654		}
2655
2656	/*
2657	 * Do we need to write a file mark?
2658	 *
2659	 * only write filemarks if there are fmks to be written and
2660	 *   - open for write (possibly read/write)
2661	 *   - the last operation was a write
2662	 * or:
2663	 *   -	opened for wronly
2664	 *   -	no data was written
2665	 */
2666	} else if ((un->un_fileno >= 0) && (un->un_fmneeded > 0) &&
2667	    (((flag & FWRITE) && (un->un_lastop == ST_OP_WRITE)) ||
2668	    ((flag & FWRITE) && (un->un_lastop == ST_OP_WEOF)) ||
2669	    ((flag == FWRITE) && (un->un_lastop == ST_OP_NIL)))) {
2670
2671		/* save ST_EOM state */
2672		int was_at_eom = (un->un_eof == ST_EOM) ? 1 : 0;
2673
2674		/*
2675		 * Note that we will write a filemark if we had opened
2676		 * the tape write only and no data was written, thus
2677		 * creating a null file.
2678		 *
2679		 * If the user already wrote one, we only have to write 1 more.
2680		 * If they wrote two, we don't have to write any.
2681		 */
2682
2683		count = un->un_fmneeded;
2684		if (count > 0) {
2685			if (st_cmd(dev, SCMD_WRITE_FILE_MARK,
2686			    count, SYNC_CMD)) {
2687				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2688				    "st_close : EIO can't wfm\n");
2689				err = EIO;
2690			}
2691			if ((un->un_dp->options & ST_REEL) && norew) {
2692				if (st_cmd(dev, SCMD_SPACE, Fmk((-1)),
2693				    SYNC_CMD)) {
2694					ST_DEBUG2(ST_DEVINFO, st_label,
2695					    SCSI_DEBUG,
2696					    "st_close : EIO space fmk(-1)\n");
2697					err = EIO;
2698				}
2699				un->un_eof = ST_NO_EOF;
2700				/* fix up block number */
2701				un->un_blkno = 0;
2702			}
2703		}
2704
2705		/*
2706		 * If we aren't going to be rewinding, and we were at
2707		 * physical eot, restore the state that indicates we
2708		 * are at physical eot. Once you have reached physical
2709		 * eot, and you close the tape, the only thing you can
2710		 * do on the next open is to rewind. Access to trailer
2711		 * records is only allowed without closing the device.
2712		 */
2713		if (norew == 0 && was_at_eom)
2714			un->un_eof = ST_EOM;
2715	}
2716
2717	/*
2718	 * report soft errors if enabled and available, if we never accessed
2719	 * the drive, don't get errors. This will prevent some DAT error
2720	 * messages upon LOG SENSE.
2721	 */
2722	if (st_report_soft_errors_on_close &&
2723	    (un->un_dp->options & ST_SOFT_ERROR_REPORTING) &&
2724	    (last_state != ST_STATE_OFFLINE)) {
2725		(void) st_report_soft_errors(dev, flag);
2726	}
2727
2728
2729	/*
2730	 * Do we need to rewind? Can we rewind?
2731	 */
2732	if (norew == 0 && un->un_fileno >= 0 && err == 0) {
2733		/*
2734		 * We'd like to rewind with the
2735		 * 'immediate' bit set, but this
2736		 * causes problems on some drives
2737		 * where subsequent opens get a
2738		 * 'NOT READY' error condition
2739		 * back while the tape is rewinding,
2740		 * which is impossible to distinguish
2741		 * from the condition of 'no tape loaded'.
2742		 *
2743		 * Also, for some targets, if you disconnect
2744		 * with the 'immediate' bit set, you don't
2745		 * actually return right away, i.e., the
2746		 * target ignores your request for immediate
2747		 * return.
2748		 *
2749		 * Instead, we'll fire off an async rewind
2750		 * command. We'll mark the device as closed,
2751		 * and any subsequent open will stall on
2752		 * the first TEST_UNIT_READY until the rewind
2753		 * completes.
2754		 */
2755
2756		/*
2757		 * Used to be if reserve was not supported we'd send an
2758		 * asynchronious rewind. Comments above may be slightly invalid
2759		 * as the immediate bit was never set. Doing an immedate rewind
2760		 * makes sense, I think fixes to not ready status might handle
2761		 * the problems described above.
2762		 */
2763		if (un->un_sd->sd_inq->inq_ansi < 2) {
2764			(void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
2765		} else {
2766			(void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD);
2767		}
2768	}
2769
2770	/*
2771	 * eject tape if necessary
2772	 */
2773	if (un->un_eject_tape_on_failure) {
2774		un->un_eject_tape_on_failure = 0;
2775		if (st_cmd(dev, SCMD_LOAD, 0, SYNC_CMD)) {
2776			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2777			    "st_close : can't unload tape\n");
2778		} else {
2779			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
2780			    "st_close : tape unloaded \n");
2781			un->un_eof = ST_NO_EOF;
2782			un->un_mediastate = MTIO_EJECTED;
2783		}
2784	}
2785	/*
2786	 * Release the tape unit, if default reserve/release
2787	 * behaviour.
2788	 */
2789	if ((un->un_rsvd_status &
2790	    (ST_RESERVE | ST_PRESERVE_RESERVE)) == ST_RESERVE) {
2791		(void) st_reserve_release(un, ST_RELEASE);
2792	}
2793
2794	/*
2795	 * clear up state
2796	 */
2797	un->un_laststate = un->un_state;
2798	un->un_state = ST_STATE_CLOSED;
2799	un->un_lastop = ST_OP_NIL;
2800	un->un_throttle = 1;	/* assume one request at time, for now */
2801	un->un_retry_ct = 0;
2802	un->un_tran_retry_ct = 0;
2803	un->un_errno = 0;
2804	un->un_swr_token = (opaque_t)NULL;
2805	un->un_rsvd_status &= ~(ST_INIT_RESERVE);
2806
2807	/* Restore the options to the init time settings */
2808	if (un->un_init_options & ST_READ_IGNORE_ILI) {
2809		un->un_dp->options |= ST_READ_IGNORE_ILI;
2810	} else {
2811		un->un_dp->options &= ~ST_READ_IGNORE_ILI;
2812	}
2813
2814	if (un->un_init_options & ST_READ_IGNORE_EOFS) {
2815		un->un_dp->options |= ST_READ_IGNORE_EOFS;
2816	} else {
2817		un->un_dp->options &= ~ST_READ_IGNORE_EOFS;
2818	}
2819
2820	if (un->un_init_options & ST_SHORT_FILEMARKS) {
2821		un->un_dp->options |= ST_SHORT_FILEMARKS;
2822	} else {
2823		un->un_dp->options &= ~ST_SHORT_FILEMARKS;
2824	}
2825
2826	ASSERT(mutex_owned(ST_MUTEX));
2827
2828	/*
2829	 * Signal anyone awaiting a close operation to complete.
2830	 */
2831	cv_signal(&un->un_clscv);
2832
2833	/*
2834	 * any kind of error on closing causes all state to be tossed
2835	 */
2836	if (err && un->un_status != KEY_ILLEGAL_REQUEST) {
2837		un->un_density_known = 0;
2838		/*
2839		 * note that st_intr has already set un_fileno to -1
2840		 */
2841	}
2842
2843#if defined(__i386) || defined(__amd64)
2844	/*
2845	 * free any contiguous mem alloc'ed for big block I/O
2846	 */
2847	cp = un->un_contig_mem;
2848	while (cp) {
2849		if (cp->cm_addr) {
2850			ddi_dma_mem_free(&cp->cm_acc_hdl);
2851		}
2852		cp_temp = cp;
2853		cp = cp->cm_next;
2854		kmem_free(cp_temp,
2855		    sizeof (struct contig_mem) + biosize());
2856	}
2857	un->un_contig_mem_total_num = 0;
2858	un->un_contig_mem_available_num = 0;
2859	un->un_contig_mem = NULL;
2860	un->un_max_contig_mem_len = 0;
2861#endif
2862
2863	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
2864	    "st_close3: return val = %x, fileno=%x, blkno=%lx, un_eof=%x\n",
2865			    err, un->un_fileno, un->un_blkno, un->un_eof);
2866
2867	mutex_exit(ST_MUTEX);
2868	return (err);
2869}
2870
2871/*
2872 * These routines perform raw i/o operations.
2873 */
2874
2875/* ARGSUSED2 */
2876static int
2877st_aread(dev_t dev, struct aio_req *aio, cred_t *cred_p)
2878{
2879	return (st_arw(dev, aio, B_READ));
2880}
2881
2882
2883/* ARGSUSED2 */
2884static int
2885st_awrite(dev_t dev, struct aio_req *aio, cred_t *cred_p)
2886{
2887	return (st_arw(dev, aio, B_WRITE));
2888}
2889
2890
2891
2892/* ARGSUSED */
2893static int
2894st_read(dev_t dev, struct uio *uiop, cred_t *cred_p)
2895{
2896	return (st_rw(dev, uiop, B_READ));
2897}
2898
2899/* ARGSUSED */
2900static int
2901st_write(dev_t dev, struct uio *uiop, cred_t *cred_p)
2902{
2903	return (st_rw(dev, uiop, B_WRITE));
2904}
2905
2906/*
2907 * Due to historical reasons, old limits are: For variable-length devices:
2908 * if greater than 64KB - 1 (ST_MAXRECSIZE_VARIABLE), block into 64 KB - 2
2909 * ST_MAXRECSIZE_VARIABLE_LIMIT) requests; otherwise,
2910 * (let it through unmodified. For fixed-length record devices:
2911 * 63K (ST_MAXRECSIZE_FIXED) is max (default minphys).
2912 *
2913 * The new limits used are un_maxdma (retrieved using scsi_ifgetcap()
2914 * from the HBA) and un_maxbsize (retrieved by sending SCMD_READ_BLKLIM
2915 * command to the drive).
2916 *
2917 */
2918static void
2919st_minphys(struct buf *bp)
2920{
2921	struct scsi_tape *un;
2922
2923	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
2924
2925	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2926	    "st_minphys(bp = 0x%p): b_bcount = 0x%lx\n", (void *)bp,
2927	    bp->b_bcount);
2928
2929	if (un->un_allow_large_xfer) {
2930
2931		/*
2932		 * check un_maxbsize for variable length devices only
2933		 */
2934		if (un->un_bsize == 0 && bp->b_bcount > un->un_maxbsize) {
2935			bp->b_bcount = un->un_maxbsize;
2936		}
2937		/*
2938		 * can't go more that HBA maxdma limit in either fixed-length
2939		 * or variable-length tape drives.
2940		 */
2941		if (bp->b_bcount > un->un_maxdma) {
2942			bp->b_bcount = un->un_maxdma;
2943		}
2944	} else {
2945
2946		/*
2947		 *  use old fixed limits
2948		 */
2949		if (un->un_bsize == 0) {
2950			if (bp->b_bcount > ST_MAXRECSIZE_VARIABLE) {
2951				bp->b_bcount = ST_MAXRECSIZE_VARIABLE_LIMIT;
2952			}
2953		} else {
2954			if (bp->b_bcount > ST_MAXRECSIZE_FIXED) {
2955				bp->b_bcount = ST_MAXRECSIZE_FIXED;
2956			}
2957		}
2958	}
2959
2960	/*
2961	 * For regular raw I/O and Fixed Block length devices, make sure
2962	 * the adjusted block count is a whole multiple of the device
2963	 * block size.
2964	 */
2965	if (bp != un->un_sbufp && un->un_bsize) {
2966		bp->b_bcount -= (bp->b_bcount % un->un_bsize);
2967	}
2968}
2969
2970/*ARGSUSED*/
2971static void
2972st_uscsi_minphys(struct buf *bp)
2973{
2974	/*
2975	 * do not break up because the CDB count would then be
2976	 * incorrect and create spurious data underrun errors.
2977	 */
2978}
2979
2980static int
2981st_rw(dev_t dev, struct uio *uio, int flag)
2982{
2983	int rval = 0;
2984	long len;
2985
2986	GET_SOFT_STATE(dev);
2987
2988	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
2989	    "st_rw(dev = 0x%lx, flag = %s)\n", dev,
2990	    (flag == B_READ ? rd_str: wr_str));
2991
2992	/* get local copy of transfer length */
2993	len = uio->uio_iov->iov_len;
2994
2995	mutex_enter(ST_MUTEX);
2996
2997	/*
2998	 * If in fixed block size mode and requested read or write
2999	 * is not an even multiple of that block size.
3000	 */
3001	if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) {
3002		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3003		    "%s: not modulo %d block size\n",
3004		    (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize);
3005		rval = EINVAL;
3006	}
3007
3008	/* If device has set granularity in the READ_BLKLIM we honor it. */
3009	if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) {
3010		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3011		    "%s: not modulo %d device granularity\n",
3012		    (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod);
3013		rval = EINVAL;
3014	}
3015
3016	if (rval != 0) {
3017		un->un_errno = rval;
3018		mutex_exit(ST_MUTEX);
3019		return (rval);
3020	}
3021
3022	un->un_silent_skip = 0;
3023	mutex_exit(ST_MUTEX);
3024
3025	len = uio->uio_resid;
3026
3027	rval = physio(st_strategy, (struct buf *)NULL,
3028		dev, flag, st_minphys, uio);
3029	/*
3030	 * if we have hit logical EOT during this xfer and there is not a
3031	 * full residue, then set un_eof back  to ST_EOM to make sure that
3032	 * the user will see at least one zero write
3033	 * after this short write
3034	 */
3035	mutex_enter(ST_MUTEX);
3036	if (un->un_eof > ST_NO_EOF) {
3037		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3038		"un_eof=%d resid=%lx\n", un->un_eof, uio->uio_resid);
3039	}
3040	if (un->un_eof >= ST_EOM && (flag == B_WRITE)) {
3041		if ((uio->uio_resid != len) && (uio->uio_resid != 0)) {
3042			un->un_eof = ST_EOM;
3043		} else if (uio->uio_resid == len) {
3044			un->un_eof = ST_NO_EOF;
3045		}
3046	}
3047
3048	if (un->un_silent_skip && uio->uio_resid != len) {
3049		un->un_eof = ST_EOF;
3050		un->un_blkno = un->un_save_blkno;
3051		un->un_fileno--;
3052	}
3053
3054	un->un_errno = rval;
3055
3056	mutex_exit(ST_MUTEX);
3057
3058	return (rval);
3059}
3060
3061static int
3062st_arw(dev_t dev, struct aio_req *aio, int flag)
3063{
3064	struct uio *uio = aio->aio_uio;
3065	int rval = 0;
3066	long len;
3067
3068	GET_SOFT_STATE(dev);
3069
3070	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3071	    "st_rw(dev = 0x%lx, flag = %s)\n", dev,
3072	    (flag == B_READ ? rd_str: wr_str));
3073
3074	/* get local copy of transfer length */
3075	len = uio->uio_iov->iov_len;
3076
3077	mutex_enter(ST_MUTEX);
3078
3079	/*
3080	 * If in fixed block size mode and requested read or write
3081	 * is not an even multiple of that block size.
3082	 */
3083	if ((un->un_bsize != 0) && (len % un->un_bsize != 0)) {
3084		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3085		    "%s: not modulo %d block size\n",
3086		    (flag == B_WRITE) ? wr_str : rd_str, un->un_bsize);
3087		rval = EINVAL;
3088	}
3089
3090	/* If device has set granularity in the READ_BLKLIM we honor it. */
3091	if ((un->un_data_mod != 0) && (len % un->un_data_mod != 0)) {
3092		scsi_log(ST_DEVINFO, st_label, CE_WARN,
3093		    "%s: not modulo %d device granularity\n",
3094		    (flag == B_WRITE) ? wr_str : rd_str, un->un_data_mod);
3095		rval = EINVAL;
3096	}
3097
3098	if (rval != 0) {
3099		un->un_errno = rval;
3100		mutex_exit(ST_MUTEX);
3101		return (rval);
3102	}
3103
3104	mutex_exit(ST_MUTEX);
3105
3106	len = uio->uio_resid;
3107
3108	rval = aphysio(st_strategy, anocancel, dev, flag, st_minphys, aio);
3109
3110	/*
3111	 * if we have hit logical EOT during this xfer and there is not a
3112	 * full residue, then set un_eof back  to ST_EOM to make sure that
3113	 * the user will see at least one zero write
3114	 * after this short write
3115	 *
3116	 * we keep this here just in case the application is not using
3117	 * persistent errors
3118	 */
3119	mutex_enter(ST_MUTEX);
3120	if (un->un_eof > ST_NO_EOF) {
3121		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3122		    "un_eof=%d resid=%lx\n", un->un_eof, uio->uio_resid);
3123	}
3124	if (un->un_eof >= ST_EOM && (flag == B_WRITE)) {
3125		if ((uio->uio_resid != len) && (uio->uio_resid != 0)) {
3126			un->un_eof = ST_EOM;
3127		} else if (uio->uio_resid == len && !IS_PE_FLAG_SET(un)) {
3128			un->un_eof = ST_NO_EOF;
3129		}
3130	}
3131	un->un_errno = rval;
3132	mutex_exit(ST_MUTEX);
3133
3134	return (rval);
3135}
3136
3137
3138
3139static int
3140st_strategy(struct buf *bp)
3141{
3142	struct scsi_tape *un;
3143	dev_t dev = bp->b_edev;
3144
3145	/*
3146	 * validate arguments
3147	 */
3148	if ((un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev))) == NULL) {
3149		bp->b_resid = bp->b_bcount;
3150		mutex_enter(ST_MUTEX);
3151		st_bioerror(bp, ENXIO);
3152		mutex_exit(ST_MUTEX);
3153		goto error;
3154	}
3155
3156	mutex_enter(ST_MUTEX);
3157
3158	while (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
3159		cv_wait(&un->un_suspend_cv, ST_MUTEX);
3160	}
3161
3162	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3163	    "st_strategy(): bcount=0x%lx, fileno=%d, blkno=%lx, eof=%d\n",
3164	    bp->b_bcount, un->un_fileno, un->un_blkno, un->un_eof);
3165
3166	/*
3167	 * If persistent errors have been flagged, just nix this one. We wait
3168	 * for any outstanding I/O's below, so we will be in order.
3169	 */
3170	if (IS_PE_FLAG_SET(un))
3171		goto exit;
3172
3173	if (bp != un->un_sbufp) {
3174		char reading = bp->b_flags & B_READ;
3175		int wasopening = 0;
3176
3177		/*
3178		 * If we haven't done/checked reservation on the tape unit
3179		 * do it now.
3180		 */
3181		if ((un->un_rsvd_status &
3182		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
3183			if ((un->un_dp->options & ST_NO_RESERVE_RELEASE) == 0) {
3184				if (st_reserve_release(un, ST_RESERVE)) {
3185					st_bioerror(bp, un->un_errno);
3186					goto exit;
3187				}
3188			} else if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3189				/*
3190				 * Enter here to restore position for possible
3191				 * resets when the device was closed and opened
3192				 * in O_NDELAY mode subsequently
3193				 */
3194				un->un_state = ST_STATE_INITIALIZING;
3195				(void) st_cmd(dev, SCMD_TEST_UNIT_READY,
3196				    0, SYNC_CMD);
3197				un->un_state = ST_STATE_OPEN_PENDING_IO;
3198			}
3199			un->un_rsvd_status |= ST_INIT_RESERVE;
3200		}
3201
3202		/*
3203		 * If we are offline, we have to initialize everything first.
3204		 * This is to handle either when opened with O_NDELAY, or
3205		 * we just got a new tape in the drive, after an offline.
3206		 * We don't observe O_NDELAY past the open,
3207		 * as it will not make sense for tapes.
3208		 */
3209		if (un->un_state == ST_STATE_OFFLINE || un->un_restore_pos) {
3210			/* reset state to avoid recursion */
3211			un->un_state = ST_STATE_INITIALIZING;
3212			if (st_tape_init(dev)) {
3213				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3214				    "stioctl : OFFLINE init failure ");
3215				un->un_state = ST_STATE_OFFLINE;
3216				un->un_fileno = -1;
3217				goto b_done_err;
3218			}
3219			un->un_state = ST_STATE_OPEN_PENDING_IO;
3220		}
3221		/*
3222		 * Check for legal operations
3223		 */
3224		if (un->un_fileno < 0) {
3225			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3226			    "strategy with un->un_fileno < 0\n");
3227			goto b_done_err;
3228		}
3229
3230		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3231		    "st_strategy(): regular io\n");
3232
3233		/*
3234		 * Process this first. If we were reading, and we're pending
3235		 * logical eot, that means we've bumped one file mark too far.
3236		 */
3237
3238		/*
3239		 * Recursion warning: st_cmd will route back through here.
3240		 */
3241		if (un->un_eof == ST_EOT_PENDING) {
3242			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
3243				un->un_fileno = -1;
3244				un->un_density_known = 0;
3245				goto b_done_err;
3246			}
3247			un->un_blkno = 0; /* fix up block number.. */
3248			un->un_eof = ST_EOT;
3249		}
3250
3251		/*
3252		 * If we are in the process of opening, we may have to
3253		 * determine/set the correct density. We also may have
3254		 * to do a test_append (if QIC) to see whether we are
3255		 * in a position to append to the end of the tape.
3256		 *
3257		 * If we're already at logical eot, we transition
3258		 * to ST_NO_EOF. If we're at physical eot, we punt
3259		 * to the switch statement below to handle.
3260		 */
3261		if ((un->un_state == ST_STATE_OPEN_PENDING_IO) ||
3262		    (un->un_test_append && (un->un_dp->options & ST_QIC))) {
3263
3264			if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3265				if (st_determine_density(dev, (int)reading)) {
3266					goto b_done_err;
3267				}
3268			}
3269
3270			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3271			    "pending_io@fileno %d rw %d qic %d eof %d\n",
3272			    un->un_fileno, (int)reading,
3273			    (un->un_dp->options & ST_QIC) ? 1 : 0,
3274			    un->un_eof);
3275
3276			if (!reading && un->un_eof != ST_EOM) {
3277				if (un->un_eof == ST_EOT) {
3278					un->un_eof = ST_NO_EOF;
3279				} else if (un->un_fileno > 0 &&
3280				    (un->un_dp->options & ST_QIC)) {
3281					/*
3282					 * st_test_append() will do it all
3283					 */
3284					st_test_append(bp);
3285					goto done;
3286				}
3287			}
3288			if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3289				wasopening = 1;
3290			}
3291			un->un_laststate = un->un_state;
3292			un->un_state = ST_STATE_OPEN;
3293		}
3294
3295
3296		/*
3297		 * Process rest of END OF FILE and END OF TAPE conditions
3298		 */
3299
3300		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3301		    "un_eof=%x, wasopening=%x\n",
3302		    un->un_eof, wasopening);
3303
3304		switch (un->un_eof) {
3305		case ST_EOM:
3306			/*
3307			 * This allows writes to proceed past physical
3308			 * eot. We'll *really* be in trouble if the
3309			 * user continues blindly writing data too
3310			 * much past this point (unwind the tape).
3311			 * Physical eot really means 'early warning
3312			 * eot' in this context.
3313			 *
3314			 * Every other write from now on will succeed
3315			 * (if sufficient  tape left).
3316			 * This write will return with resid == count
3317			 * but the next one should be successful
3318			 *
3319			 * Note that we only transition to logical EOT
3320			 * if the last state wasn't the OPENING state.
3321			 * We explicitly prohibit running up to physical
3322			 * eot, closing the device, and then re-opening
3323			 * to proceed. Trailer records may only be gotten
3324			 * at by keeping the tape open after hitting eot.
3325			 *
3326			 * Also note that ST_EOM cannot be set by reading-
3327			 * this can only be set during writing. Reading
3328			 * up to the end of the tape gets a blank check
3329			 * or a double-filemark indication (ST_EOT_PENDING),
3330			 * and we prohibit reading after that point.
3331			 *
3332			 */
3333			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOM\n");
3334			if (wasopening == 0) {
3335				/*
3336				 * this allows st_rw() to reset it back to
3337				 * ST_EOM to make sure that the application
3338				 * will see a zero write
3339				 */
3340				un->un_eof = ST_WRITE_AFTER_EOM;
3341			}
3342			un->un_status = SUN_KEY_EOT;
3343			goto b_done;
3344
3345		case ST_WRITE_AFTER_EOM:
3346		case ST_EOT:
3347			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOT\n");
3348			un->un_status = SUN_KEY_EOT;
3349			if (SVR4_BEHAVIOR && reading) {
3350				goto b_done_err;
3351			}
3352
3353			if (reading) {
3354				goto b_done;
3355			}
3356			un->un_eof = ST_NO_EOF;
3357			break;
3358
3359		case ST_EOF_PENDING:
3360			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3361			    "EOF PENDING\n");
3362			un->un_status = SUN_KEY_EOF;
3363			if (SVR4_BEHAVIOR) {
3364				un->un_eof = ST_EOF;
3365				goto b_done;
3366			}
3367			/* FALLTHROUGH */
3368		case ST_EOF:
3369			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "EOF\n");
3370			un->un_status = SUN_KEY_EOF;
3371			if (SVR4_BEHAVIOR) {
3372				goto b_done_err;
3373			}
3374
3375			if (BSD_BEHAVIOR) {
3376				un->un_eof = ST_NO_EOF;
3377				un->un_fileno += 1;
3378				un->un_blkno   = 0;
3379			}
3380
3381			if (reading) {
3382				ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3383				    "now file %d (read)\n",
3384				    un->un_fileno);
3385				goto b_done;
3386			}
3387			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3388			    "now file %d (write)\n", un->un_fileno);
3389			break;
3390		default:
3391			un->un_status = 0;
3392			break;
3393		}
3394	}
3395
3396	bp->b_flags &= ~(B_DONE);
3397	st_bioerror(bp, 0);
3398	bp->av_forw = NULL;
3399	bp->b_resid = 0;
3400	SET_BP_PKT(bp, 0);
3401
3402
3403	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3404	    "st_strategy: cmd=0x%p  count=%ld  resid=%ld flags=0x%x"
3405	    " pkt=0x%p\n",
3406	    (void *)bp->b_forw, bp->b_bcount,
3407	    bp->b_resid, bp->b_flags, (void *)BP_PKT(bp));
3408
3409#if defined(__i386) || defined(__amd64)
3410	/*
3411	 * We will replace bp with a new bp that can do big blk xfer
3412	 * if the requested xfer size is bigger than ST_BIGBLK_XFER
3413	 *
3414	 * Also, we need to make sure that we're handling real I/O
3415	 * by checking group 0/1 SCSI I/O commands, if needed
3416	 */
3417	if (bp->b_bcount > ST_BIGBLK_XFER &&
3418	    (bp != un->un_sbufp					||
3419	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ		||
3420	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_READ_G1	||
3421	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE	||
3422	    (uchar_t)(uintptr_t)bp->b_forw == SCMD_WRITE_G1)) {
3423		mutex_exit(ST_MUTEX);
3424		bp = st_get_bigblk_bp(bp);
3425		mutex_enter(ST_MUTEX);
3426	}
3427#endif
3428
3429	/* put on wait queue */
3430	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3431	    "st_strategy: un->un_quef = 0x%p, bp = 0x%p\n",
3432	    (void *)un->un_quef, (void *)bp);
3433
3434	if (un->un_quef) {
3435		un->un_quel->b_actf = bp;
3436	} else {
3437		un->un_quef = bp;
3438	}
3439	un->un_quel = bp;
3440
3441	ST_DO_KSTATS(bp, kstat_waitq_enter);
3442
3443	st_start(un);
3444
3445done:
3446	mutex_exit(ST_MUTEX);
3447	return (0);
3448
3449
3450error:
3451	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3452	    "st_strategy: error exit\n");
3453
3454	biodone(bp);
3455	return (0);
3456
3457b_done_err:
3458	st_bioerror(bp, EIO);
3459	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3460	    "st_strategy : EIO b_done_err\n");
3461
3462b_done:
3463	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3464	    "st_strategy: b_done\n");
3465
3466exit:
3467	/*
3468	 * make sure no commands are outstanding or waiting before closing,
3469	 * so we can guarantee order
3470	 */
3471	st_wait_for_io(un);
3472	un->un_err_resid = bp->b_resid = bp->b_bcount;
3473
3474	/* override errno here, if persistent errors were flagged */
3475	if (IS_PE_FLAG_SET(un))
3476		bioerror(bp, un->un_errno);
3477
3478	mutex_exit(ST_MUTEX);
3479
3480	biodone(bp);
3481	ASSERT(mutex_owned(ST_MUTEX) == 0);
3482	return (0);
3483}
3484
3485
3486
3487/*
3488 * this routine spaces forward over filemarks
3489 */
3490static int
3491st_space_fmks(dev_t dev, int count)
3492{
3493	int rval = 0;
3494
3495	GET_SOFT_STATE(dev);
3496
3497	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3498	    "st_space_fmks(dev = 0x%lx, count = %d)\n", dev, count);
3499
3500	ASSERT(mutex_owned(ST_MUTEX));
3501
3502	/*
3503	 * the risk with doing only one space operation is that we
3504	 * may accidentily jump in old data
3505	 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD
3506	 * because the 8200 does not append a marker; in order not to
3507	 * sacrifice the fast file skip, we do a slow skip if the low
3508	 * density device has been opened
3509	 */
3510
3511	if ((un->un_dp->options & ST_KNOWS_EOD) &&
3512	    !((un->un_dp->type == ST_TYPE_EXB8500 && MT_DENSITY(dev) == 0))) {
3513		if (st_cmd(dev, SCMD_SPACE, Fmk(count), SYNC_CMD)) {
3514			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3515			    "space_fmks : EIO can't do space cmd #1\n");
3516			rval = EIO;
3517		}
3518	} else {
3519		while (count > 0) {
3520			if (st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD)) {
3521				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3522				    "space_fmks : EIO can't do space cmd #2\n");
3523				rval = EIO;
3524				break;
3525			}
3526			count -= 1;
3527			/*
3528			 * read a block to see if we have reached
3529			 * end of medium (double filemark for reel or
3530			 * medium error for others)
3531			 */
3532			if (count > 0) {
3533				if (st_cmd(dev, SCMD_SPACE, Blk(1),
3534				    SYNC_CMD)) {
3535					ST_DEBUG2(ST_DEVINFO, st_label,
3536					    SCSI_DEBUG,
3537					    "space_fmks : EIO can't do "
3538					    "space cmd #3\n");
3539					rval = EIO;
3540					break;
3541				}
3542				if ((un->un_eof >= ST_EOF_PENDING) &&
3543				    (un->un_dp->options & ST_REEL)) {
3544					un->un_status = SUN_KEY_EOT;
3545					ST_DEBUG2(ST_DEVINFO, st_label,
3546					    SCSI_DEBUG,
3547					    "space_fmks : EIO ST_REEL\n");
3548					rval = EIO;
3549					break;
3550				} else if (IN_EOF(un)) {
3551					un->un_eof = ST_NO_EOF;
3552					un->un_fileno++;
3553					un->un_blkno = 0;
3554					count--;
3555				} else if (un->un_eof > ST_EOF) {
3556					ST_DEBUG2(ST_DEVINFO, st_label,
3557					    SCSI_DEBUG,
3558					    "space_fmks, EIO > ST_EOF\n");
3559					rval = EIO;
3560					break;
3561				}
3562
3563			}
3564		}
3565		un->un_err_resid = count;
3566		un->un_err_fileno = un->un_fileno;
3567		un->un_err_blkno = un->un_blkno;
3568	}
3569	ASSERT(mutex_owned(ST_MUTEX));
3570	return (rval);
3571}
3572
3573/*
3574 * this routine spaces to EOM
3575 *
3576 * it keeps track of the current filenumber and returns the filenumber after
3577 * the last successful space operation, we keep the number high because as
3578 * tapes are getting larger, the possibility of more and more files exist,
3579 * 0x100000 (1 Meg of files) probably will never have to be changed any time
3580 * soon
3581 */
3582#define	MAX_SKIP	0x100000 /* somewhat arbitrary */
3583
3584static int
3585st_find_eom(dev_t dev)
3586{
3587	int count, savefile;
3588	struct scsi_tape *un;
3589	int instance;
3590
3591	instance = MTUNIT(dev);
3592	if ((un = ddi_get_soft_state(st_state, instance)) == NULL)
3593		return (-1);
3594
3595	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3596	    "st_find_eom(dev = 0x%lx): fileno = %d\n", dev, un->un_fileno);
3597
3598	ASSERT(mutex_owned(ST_MUTEX));
3599
3600	savefile = un->un_fileno;
3601
3602	/*
3603	 * see if the drive is smart enough to do the skips in
3604	 * one operation; 1/2" use two filemarks
3605	 * the exabyte 8500 reading 8200 tapes cannot use KNOWS_EOD
3606	 * because the 8200 does not append a marker; in order not to
3607	 * sacrifice the fast file skip, we do a slow skip if the low
3608	 * density device has been opened
3609	 */
3610	if ((un->un_dp->options & ST_KNOWS_EOD) &&
3611	    !((un->un_dp->type == ST_TYPE_EXB8500 && MT_DENSITY(dev) == 0))) {
3612		count = MAX_SKIP;
3613	} else {
3614		count = 1;
3615	}
3616
3617	while (st_cmd(dev, SCMD_SPACE, Fmk(count), SYNC_CMD) == 0) {
3618
3619		savefile = un->un_fileno;
3620		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3621			"count=%x, eof=%x, status=%x\n", count,  un->un_eof,
3622			un->un_status);
3623
3624		/*
3625		 * If we're not EOM smart,  space a record
3626		 * to see whether we're now in the slot between
3627		 * the two sequential filemarks that logical
3628		 * EOM consists of (REEL) or hit nowhere land
3629		 * (8mm).
3630		 */
3631		if (count == 1) {
3632			/*
3633			 * no fast skipping, check a record
3634			 */
3635			if (st_cmd(dev, SCMD_SPACE, Blk((1)), SYNC_CMD))
3636				break;
3637			else if ((un->un_eof >= ST_EOF_PENDING) &&
3638			    (un->un_dp->options & ST_REEL)) {
3639				un->un_status = KEY_BLANK_CHECK;
3640				un->un_fileno++;
3641				un->un_blkno = 0;
3642				break;
3643			} else if (IN_EOF(un)) {
3644				un->un_eof = ST_NO_EOF;
3645				un->un_fileno++;
3646				un->un_blkno = 0;
3647			} else if (un->un_eof > ST_EOF) {
3648				break;
3649			}
3650		} else {
3651			if (un->un_eof >  ST_EOF) {
3652				break;
3653			}
3654		}
3655	}
3656
3657	if (un->un_dp->options & ST_KNOWS_EOD) {
3658		savefile = un->un_fileno;
3659	}
3660	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
3661	    "st_find_eom: %x\n", savefile);
3662	ASSERT(mutex_owned(ST_MUTEX));
3663	return (savefile);
3664}
3665
3666
3667/*
3668 * this routine is frequently used in ioctls below;
3669 * it determines whether we know the density and if not will
3670 * determine it
3671 * if we have written the tape before, one or more filemarks are written
3672 *
3673 * depending on the stepflag, the head is repositioned to where it was before
3674 * the filemarks were written in order not to confuse step counts
3675 */
3676#define	STEPBACK    0
3677#define	NO_STEPBACK 1
3678
3679static int
3680st_check_density_or_wfm(dev_t dev, int wfm, int mode, int stepflag)
3681{
3682
3683	GET_SOFT_STATE(dev);
3684
3685	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3686	"st_check_density_or_wfm(dev= 0x%lx, wfm= %d, mode= %d, stpflg= %d)\n",
3687	dev, wfm, mode, stepflag);
3688
3689	ASSERT(mutex_owned(ST_MUTEX));
3690
3691	/*
3692	 * If we don't yet know the density of the tape we have inserted,
3693	 * we have to either unconditionally set it (if we're 'writing'),
3694	 * or we have to determine it. As side effects, check for any
3695	 * write-protect errors, and for the need to put out any file-marks
3696	 * before positioning a tape.
3697	 *
3698	 * If we are going to be spacing forward, and we haven't determined
3699	 * the tape density yet, we have to do so now...
3700	 */
3701	if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
3702		if (st_determine_density(dev, mode)) {
3703			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3704			    "check_density_or_wfm : EIO can't determine "
3705			    "density\n");
3706			un->un_errno = EIO;
3707			return (EIO);
3708		}
3709		/*
3710		 * Presumably we are at BOT. If we attempt to write, it will
3711		 * either work okay, or bomb. We don't do a st_test_append
3712		 * unless we're past BOT.
3713		 */
3714		un->un_laststate = un->un_state;
3715		un->un_state = ST_STATE_OPEN;
3716
3717	} else if (un->un_fileno >= 0 && un->un_fmneeded > 0 &&
3718	    ((un->un_lastop == ST_OP_WEOF && wfm) ||
3719	    (un->un_lastop == ST_OP_WRITE && wfm))) {
3720
3721		daddr_t blkno = un->un_blkno;
3722		int fileno = un->un_fileno;
3723
3724		/*
3725		 * We need to write one or two filemarks.
3726		 * In the case of the HP, we need to
3727		 * position the head between the two
3728		 * marks.
3729		 */
3730		if ((un->un_fmneeded > 0) || (un->un_lastop == ST_OP_WEOF)) {
3731			wfm = un->un_fmneeded;
3732			un->un_fmneeded = 0;
3733		}
3734
3735		if (st_write_fm(dev, wfm)) {
3736			un->un_fileno = -1;
3737			un->un_density_known = 0;
3738			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3739			    "check_density_or_wfm : EIO can't write fm\n");
3740			un->un_errno = EIO;
3741			return (EIO);
3742		}
3743
3744		if (stepflag == STEPBACK) {
3745			if (st_cmd(dev, SCMD_SPACE, Fmk((-wfm)), SYNC_CMD)) {
3746				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3747				    "check_density_or_wfm : EIO can't space "
3748				    "(-wfm)\n");
3749				un->un_errno = EIO;
3750				return (EIO);
3751			}
3752			un->un_blkno = blkno;
3753			un->un_fileno = fileno;
3754		}
3755	}
3756
3757	/*
3758	 * Whatever we do at this point clears the state of the eof flag.
3759	 */
3760
3761	un->un_eof = ST_NO_EOF;
3762
3763	/*
3764	 * If writing, let's check that we're positioned correctly
3765	 * at the end of tape before issuing the next write.
3766	 */
3767	if (un->un_read_only == RDWR) {
3768		un->un_test_append = 1;
3769	}
3770
3771	ASSERT(mutex_owned(ST_MUTEX));
3772	return (0);
3773}
3774
3775
3776/*
3777 * Wait for all outstaning I/O's to complete
3778 *
3779 * we wait on both ncmds and the wait queue for times when we are flushing
3780 * after persistent errors are flagged, which is when ncmds can be 0, and the
3781 * queue can still have I/O's.  This way we preserve order of biodone's.
3782 */
3783static void
3784st_wait_for_io(struct scsi_tape *un)
3785{
3786	ASSERT(mutex_owned(ST_MUTEX));
3787	while (un->un_ncmds || un->un_quef) {
3788		cv_wait(&un->un_queue_cv, ST_MUTEX);
3789	}
3790}
3791
3792/*
3793 * This routine implements the ioctl calls.  It is called
3794 * from the device switch at normal priority.
3795 */
3796/*ARGSUSED*/
3797static int
3798st_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cred_p,
3799    int *rval_p)
3800{
3801	int tmp, rval = 0;
3802
3803	GET_SOFT_STATE(dev);
3804
3805	mutex_enter(ST_MUTEX);
3806
3807	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
3808	    "st_ioctl(): fileno=%x, blkno=%lx, un_eof=%x, state = %d, "
3809	    "pe_flag = %d\n",
3810	    un->un_fileno, un->un_blkno, un->un_eof, un->un_state,
3811	    IS_PE_FLAG_SET(un));
3812
3813	/*
3814	 * We don't want to block on these, so let them through
3815	 * and we don't care about setting driver states here.
3816	 */
3817	if ((cmd == MTIOCGETDRIVETYPE) ||
3818	    (cmd == MTIOCGUARANTEEDORDER) ||
3819	    (cmd == MTIOCPERSISTENTSTATUS)) {
3820		goto check_commands;
3821	}
3822
3823	/*
3824	 * wait for all outstanding commands to complete, or be dequeued.
3825	 * And because ioctl's are synchronous commands, any return value
3826	 * after this,  will be in order
3827	 */
3828	st_wait_for_io(un);
3829
3830	/*
3831	 * allow only a through clear errors and persistent status, and
3832	 * status
3833	 */
3834	if (IS_PE_FLAG_SET(un)) {
3835		if ((cmd == MTIOCLRERR) ||
3836		    (cmd == MTIOCPERSISTENT) ||
3837		    (cmd == MTIOCGET) ||
3838		    (cmd == USCSIGETRQS)) {
3839			goto check_commands;
3840		} else {
3841			rval = un->un_errno;
3842			goto exit;
3843		}
3844	}
3845
3846	un->un_throttle = 1;	/* > 1 will never happen here */
3847	un->un_errno = 0;	/* start clean from here */
3848
3849	/*
3850	 * first and foremost, handle any ST_EOT_PENDING cases.
3851	 * That is, if a logical eot is pending notice, notice it.
3852	 */
3853	if (un->un_eof == ST_EOT_PENDING) {
3854		int resid = un->un_err_resid;
3855		uchar_t status = un->un_status;
3856		uchar_t lastop = un->un_lastop;
3857
3858		if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)) {
3859			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
3860			    "stioctl : EIO can't space fmk(-1)\n");
3861			rval = EIO;
3862			goto exit;
3863		}
3864		un->un_lastop = lastop; /* restore last operation */
3865		if (status == SUN_KEY_EOF) {
3866			un->un_status = SUN_KEY_EOT;
3867		} else {
3868			un->un_status = status;
3869		}
3870		un->un_err_resid  = resid;
3871		un->un_err_blkno = un->un_blkno = 0; /* fix up block number */
3872		un->un_eof = ST_EOT;	/* now we're at logical eot */
3873	}
3874
3875	/*
3876	 * now, handle the rest of the situations
3877	 */
3878check_commands:
3879	switch (cmd) {
3880	case MTIOCGET:
3881		{
3882#ifdef _MULTI_DATAMODEL
3883			/*
3884			 * For use when a 32 bit app makes a call into a
3885			 * 64 bit ioctl
3886			 */
3887			struct mtget32		mtg_local32;
3888			struct mtget32 		*mtget_32 = &mtg_local32;
3889#endif /* _MULTI_DATAMODEL */
3890
3891			/* Get tape status */
3892			struct mtget mtg_local;
3893			struct mtget *mtget = &mtg_local;
3894			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
3895				"st_ioctl: MTIOCGET\n");
3896
3897			bzero(mtget, sizeof (struct mtget));
3898			mtget->mt_erreg = un->un_status;
3899			mtget->mt_resid = un->un_err_resid;
3900			mtget->mt_dsreg = un->un_retry_ct;
3901			mtget->mt_fileno = un->un_err_fileno;
3902			mtget->mt_blkno = un->un_err_blkno;
3903			mtget->mt_type = un->un_dp->type;
3904			mtget->mt_flags = MTF_SCSI | MTF_ASF;
3905			if (un->un_dp->options & ST_REEL) {
3906				mtget->mt_flags |= MTF_REEL;
3907				mtget->mt_bf = 20;
3908			} else {		/* 1/4" cartridges */
3909				switch (mtget->mt_type) {
3910				/* Emulex cartridge tape */
3911				case MT_ISMT02:
3912					mtget->mt_bf = 40;
3913					break;
3914				default:
3915					mtget->mt_bf = 126;
3916					break;
3917				}
3918			}
3919
3920			/*
3921			 * If large transfers are allowed and drive options
3922			 * has no record size limit set. Calculate blocking
3923			 * factor from the lesser of maxbsize and maxdma.
3924			 */
3925			if ((un->un_allow_large_xfer) &&
3926			    (un->un_dp->options & ST_NO_RECSIZE_LIMIT)) {
3927				mtget->mt_bf = min(un->un_maxbsize,
3928				    un->un_maxdma) / SECSIZE;
3929			}
3930
3931			if (un->un_read_only == WORM ||
3932			    un->un_read_only == RDWORM) {
3933				mtget->mt_flags |= MTF_WORM_MEDIA;
3934			}
3935
3936			rval = st_check_clean_bit(dev);
3937			if (rval == -1) {
3938				rval = EIO;
3939				goto exit;
3940			} else {
3941				mtget->mt_flags |= (ushort_t)rval;
3942				rval = 0;
3943			}
3944
3945			un->un_status = 0;		/* Reset status */
3946			un->un_err_resid = 0;
3947			tmp = sizeof (struct mtget);
3948
3949#ifdef _MULTI_DATAMODEL
3950
3951		switch (ddi_model_convert_from(flag & FMODELS)) {
3952		case DDI_MODEL_ILP32:
3953			/*
3954			 * Convert 64 bit back to 32 bit before doing
3955			 * copyout. This is what the ILP32 app expects.
3956			 */
3957			mtget_32->mt_erreg = 	mtget->mt_erreg;
3958			mtget_32->mt_resid = 	mtget->mt_resid;
3959			mtget_32->mt_dsreg = 	mtget->mt_dsreg;
3960			mtget_32->mt_fileno = 	(daddr32_t)mtget->mt_fileno;
3961			mtget_32->mt_blkno = 	(daddr32_t)mtget->mt_blkno;
3962			mtget_32->mt_type =  	mtget->mt_type;
3963			mtget_32->mt_flags = 	mtget->mt_flags;
3964			mtget_32->mt_bf = 	mtget->mt_bf;
3965
3966			if (ddi_copyout(mtget_32, (void *)arg,
3967			    sizeof (struct mtget32), flag)) {
3968				rval = EFAULT;
3969			}
3970			break;
3971
3972		case DDI_MODEL_NONE:
3973			if (ddi_copyout(mtget, (void *)arg, tmp, flag)) {
3974				rval = EFAULT;
3975			}
3976			break;
3977		}
3978#else /* ! _MULTI_DATAMODE */
3979		if (ddi_copyout(mtget, (void *)arg, tmp, flag)) {
3980			rval = EFAULT;
3981		}
3982#endif /* _MULTI_DATAMODE */
3983
3984			break;
3985		}
3986	case MTIOCSTATE:
3987		{
3988			/*
3989			 * return when media presence matches state
3990			 */
3991			enum mtio_state state;
3992
3993			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
3994				"st_ioctl: MTIOCSTATE\n");
3995
3996			if (ddi_copyin((void *)arg, &state, sizeof (int), flag))
3997				rval = EFAULT;
3998
3999			mutex_exit(ST_MUTEX);
4000
4001			rval = st_check_media(dev, state);
4002
4003			mutex_enter(ST_MUTEX);
4004
4005			if (rval != 0) {
4006				break;
4007			}
4008
4009			if (ddi_copyout(&un->un_mediastate, (void *)arg,
4010			    sizeof (int), flag))
4011				rval = EFAULT;
4012			break;
4013
4014		}
4015
4016	case MTIOCGETDRIVETYPE:
4017		{
4018#ifdef _MULTI_DATAMODEL
4019		/*
4020		 * For use when a 32 bit app makes a call into a
4021		 * 64 bit ioctl
4022		 */
4023		struct mtdrivetype_request32	mtdtrq32;
4024#endif /* _MULTI_DATAMODEL */
4025
4026			/*
4027			 * return mtdrivetype
4028			 */
4029			struct mtdrivetype_request mtdtrq;
4030			struct mtdrivetype mtdrtyp;
4031			struct mtdrivetype *mtdt = &mtdrtyp;
4032			struct st_drivetype *stdt = un->un_dp;
4033
4034			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4035				"st_ioctl: MTIOCGETDRIVETYPE\n");
4036
4037#ifdef _MULTI_DATAMODEL
4038		switch (ddi_model_convert_from(flag & FMODELS)) {
4039		case DDI_MODEL_ILP32:
4040		{
4041			if (ddi_copyin((void *)arg, &mtdtrq32,
4042			    sizeof (struct mtdrivetype_request32), flag)) {
4043				rval = EFAULT;
4044				break;
4045			}
4046			mtdtrq.size = mtdtrq32.size;
4047			mtdtrq.mtdtp =
4048			    (struct  mtdrivetype *)(uintptr_t)mtdtrq32.mtdtp;
4049			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4050				"st_ioctl: size 0x%x\n", mtdtrq.size);
4051			break;
4052		}
4053		case DDI_MODEL_NONE:
4054			if (ddi_copyin((void *)arg, &mtdtrq,
4055			    sizeof (struct mtdrivetype_request), flag)) {
4056				rval = EFAULT;
4057				break;
4058			}
4059			break;
4060		}
4061
4062#else /* ! _MULTI_DATAMODEL */
4063		if (ddi_copyin((void *)arg, &mtdtrq,
4064		    sizeof (struct mtdrivetype_request), flag)) {
4065			rval = EFAULT;
4066			break;
4067		}
4068#endif /* _MULTI_DATAMODEL */
4069
4070			/*
4071			 * if requested size is < 0 then return
4072			 * error.
4073			 */
4074			if (mtdtrq.size < 0) {
4075				rval = EINVAL;
4076				break;
4077			}
4078			bzero(mtdt, sizeof (struct mtdrivetype));
4079			(void) strncpy(mtdt->name, stdt->name, ST_NAMESIZE);
4080			(void) strncpy(mtdt->vid, stdt->vid, VIDPIDLEN - 1);
4081			mtdt->type = stdt->type;
4082			mtdt->bsize = stdt->bsize;
4083			mtdt->options = stdt->options;
4084			mtdt->max_rretries = stdt->max_rretries;
4085			mtdt->max_wretries = stdt->max_wretries;
4086			for (tmp = 0; tmp < NDENSITIES; tmp++)
4087				mtdt->densities[tmp] = stdt->densities[tmp];
4088			mtdt->default_density = stdt->default_density;
4089			/*
4090			 * Speed hasn't been used since the hayday of reel tape.
4091			 * For all drives not setting the option ST_KNOWS_MEDIA
4092			 * the speed member renamed to mediatype are zeros.
4093			 * Those drives that have ST_KNOWS_MEDIA set use the
4094			 * new mediatype member which is used to figure the
4095			 * type of media loaded.
4096			 *
4097			 * So as to not break applications speed in the
4098			 * mtdrivetype structure is not renamed.
4099			 */
4100			for (tmp = 0; tmp < NDENSITIES; tmp++) {
4101				mtdt->speeds[tmp] = stdt->mediatype[tmp];
4102			}
4103			mtdt->non_motion_timeout = stdt->non_motion_timeout;
4104			mtdt->io_timeout = stdt->io_timeout;
4105			mtdt->rewind_timeout = stdt->rewind_timeout;
4106			mtdt->space_timeout = stdt->space_timeout;
4107			mtdt->load_timeout = stdt->load_timeout;
4108			mtdt->unload_timeout = stdt->unload_timeout;
4109			mtdt->erase_timeout = stdt->erase_timeout;
4110
4111			/*
4112			 * Limit the maximum length of the result to
4113			 * sizeof (struct mtdrivetype).
4114			 */
4115			tmp = sizeof (struct mtdrivetype);
4116			if (mtdtrq.size < tmp)
4117				tmp = mtdtrq.size;
4118			if (ddi_copyout(mtdt, mtdtrq.mtdtp, tmp, flag)) {
4119				rval = EFAULT;
4120			}
4121			break;
4122		}
4123	case MTIOCPERSISTENT:
4124		{
4125			int persistence = 0;
4126
4127			if (ddi_copyin((void *)arg, &persistence,
4128			    sizeof (int), flag)) {
4129				rval = EFAULT;
4130				break;
4131			}
4132
4133			/* non zero sets it, only 0 turns it off */
4134			un->un_persistence = (uchar_t)persistence ? 1 : 0;
4135
4136			if (un->un_persistence)
4137				TURN_PE_ON(un);
4138			else
4139				TURN_PE_OFF(un);
4140
4141			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4142			    "st_ioctl: MTIOCPERSISTENT : persistence = %d\n",
4143			    un->un_persistence);
4144
4145			break;
4146		}
4147	case MTIOCPERSISTENTSTATUS:
4148		{
4149			int persistence = (int)un->un_persistence;
4150
4151			if (ddi_copyout(&persistence, (void *)arg,
4152			    sizeof (int), flag)) {
4153				rval = EFAULT;
4154			}
4155			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4156			    "st_ioctl: MTIOCPERSISTENTSTATUS:persistece = %d\n",
4157			    un->un_persistence);
4158
4159			break;
4160		}
4161
4162
4163	case MTIOCLRERR:
4164		{
4165			/* clear persistent errors */
4166
4167			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4168			    "st_ioctl: MTIOCLRERR\n");
4169
4170			CLEAR_PE(un);
4171
4172			break;
4173		}
4174
4175	case MTIOCGUARANTEEDORDER:
4176		{
4177			/*
4178			 * this is just a holder to make a valid ioctl and
4179			 * it won't be in any earlier release
4180			 */
4181			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4182			    "st_ioctl: MTIOCGUARANTEEDORDER\n");
4183
4184			break;
4185		}
4186
4187	case MTIOCRESERVE:
4188		{
4189			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4190			    "st_ioctl: MTIOCRESERVE\n");
4191
4192			/*
4193			 * Check if Reserve/Release is supported.
4194			 */
4195			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4196				rval = ENOTTY;
4197				break;
4198			}
4199
4200			rval = st_reserve_release(un, ST_RESERVE);
4201
4202			if (rval == 0) {
4203				un->un_rsvd_status |= ST_PRESERVE_RESERVE;
4204			}
4205			break;
4206		}
4207
4208	case MTIOCRELEASE:
4209		{
4210			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4211			    "st_ioctl: MTIOCRELEASE\n");
4212
4213			/*
4214			 * Check if Reserve/Release is supported.
4215			 */
4216			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4217				rval = ENOTTY;
4218				break;
4219			}
4220
4221			/*
4222			 * Used to just clear ST_PRESERVE_RESERVE which
4223			 * made the reservation release at next close.
4224			 * As the user may have opened and then done a
4225			 * persistant reservation we now need to drop
4226			 * the reservation without closing if the user
4227			 * attempts to do this.
4228			 */
4229			rval = st_reserve_release(un, ST_RELEASE);
4230
4231			un->un_rsvd_status &= ~ST_PRESERVE_RESERVE;
4232
4233			break;
4234		}
4235
4236	case MTIOCFORCERESERVE:
4237		{
4238			ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4239			    "st_ioctl: MTIOCFORCERESERVE\n");
4240
4241			/*
4242			 * Check if Reserve/Release is supported.
4243			 */
4244			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
4245				rval = ENOTTY;
4246				break;
4247			}
4248			/*
4249			 * allow only super user to run this.
4250			 */
4251			if (drv_priv(cred_p) != 0) {
4252				rval = EPERM;
4253				break;
4254			}
4255			/*
4256			 * Throw away reserve,
4257			 * not using test-unit-ready
4258			 * since reserve can succeed without tape being
4259			 * present in the drive.
4260			 */
4261			(void) st_reserve_release(un, ST_RESERVE);
4262
4263			rval = st_take_ownership(dev);
4264
4265			break;
4266		}
4267	case USCSIGETRQS:
4268		{
4269#ifdef _MULTI_DATAMODEL
4270		/*
4271		 * For use when a 32 bit app makes a call into a
4272		 * 64 bit ioctl
4273		 */
4274		struct uscsi_rqs32	urqs_32;
4275		struct uscsi_rqs32	*urqs_32_ptr = &urqs_32;
4276#endif /* _MULTI_DATAMODEL */
4277			struct uscsi_rqs	urqs;
4278			struct uscsi_rqs	*urqs_ptr = &urqs;
4279			ushort_t		len;
4280#ifdef _MULTI_DATAMODEL
4281		switch (ddi_model_convert_from(flag & FMODELS)) {
4282		case DDI_MODEL_ILP32:
4283		{
4284			if (ddi_copyin((void *)arg, urqs_32_ptr,
4285			    sizeof (struct uscsi_rqs32), flag)) {
4286				rval = EFAULT;
4287				break;
4288			}
4289			urqs_ptr->rqs_buflen = urqs_32_ptr->rqs_buflen;
4290			urqs_ptr->rqs_bufaddr =
4291			    (caddr_t)(uintptr_t)urqs_32_ptr->rqs_bufaddr;
4292			break;
4293		}
4294		case DDI_MODEL_NONE:
4295			if (ddi_copyin((void *)arg, urqs_ptr,
4296			    sizeof (struct uscsi_rqs), flag)) {
4297				rval = EFAULT;
4298				break;
4299			}
4300		}
4301#else /* ! _MULTI_DATAMODEL */
4302		if (ddi_copyin((void *)arg, urqs_ptr, sizeof (urqs), flag)) {
4303			rval = EFAULT;
4304			break;
4305		}
4306#endif /* _MULTI_DATAMODEL */
4307
4308			urqs_ptr->rqs_flags = (int)un->un_rqs_state &
4309			    (ST_RQS_OVR | ST_RQS_VALID);
4310			if (urqs_ptr->rqs_buflen <= SENSE_LENGTH) {
4311			    len = urqs_ptr->rqs_buflen;
4312			    urqs_ptr->rqs_resid = 0;
4313			} else {
4314			    len = SENSE_LENGTH;
4315			    urqs_ptr->rqs_resid = urqs_ptr->rqs_buflen
4316				    - SENSE_LENGTH;
4317			}
4318			if (!(un->un_rqs_state & ST_RQS_VALID)) {
4319			    urqs_ptr->rqs_resid = urqs_ptr->rqs_buflen;
4320			}
4321			un->un_rqs_state |= ST_RQS_READ;
4322			un->un_rqs_state &= ~(ST_RQS_OVR);
4323
4324#ifdef _MULTI_DATAMODEL
4325		switch (ddi_model_convert_from(flag & FMODELS)) {
4326		case DDI_MODEL_ILP32:
4327			urqs_32_ptr->rqs_flags = urqs_ptr->rqs_flags;
4328			urqs_32_ptr->rqs_resid = urqs_ptr->rqs_resid;
4329			if (ddi_copyout(&urqs_32, (void *)arg,
4330			    sizeof (urqs_32), flag)) {
4331				rval = EFAULT;
4332			}
4333			break;
4334		case DDI_MODEL_NONE:
4335			if (ddi_copyout(&urqs, (void *)arg, sizeof (urqs),
4336			    flag)) {
4337				rval = EFAULT;
4338			}
4339			break;
4340		}
4341
4342		if (un->un_rqs_state & ST_RQS_VALID) {
4343			if (ddi_copyout(un->un_uscsi_rqs_buf,
4344			    urqs_ptr->rqs_bufaddr, len, flag)) {
4345				rval = EFAULT;
4346		    }
4347		}
4348#else /* ! _MULTI_DATAMODEL */
4349		if (ddi_copyout(&urqs, (void *)arg, sizeof (urqs), flag)) {
4350			rval = EFAULT;
4351		}
4352		if (un->un_rqs_state & ST_RQS_VALID) {
4353			if (ddi_copyout(un->un_uscsi_rqs_buf,
4354			    urqs_ptr->rqs_bufaddr, len, flag)) {
4355				rval = EFAULT;
4356		    }
4357		}
4358#endif /* _MULTI_DATAMODEL */
4359			break;
4360		}
4361
4362	case USCSICMD:
4363	{
4364		cred_t	*cr;
4365#ifdef _MULTI_DATAMODEL
4366		/*
4367		 * For use when a 32 bit app makes a call into a
4368		 * 64 bit ioctl
4369		 */
4370		struct uscsi_cmd32	ucmd_32;
4371		struct uscsi_cmd32	*ucmd_32_ptr = &ucmd_32;
4372#endif /* _MULTI_DATAMODEL */
4373
4374		/*
4375		 * Run a generic USCSI command
4376		 */
4377		struct uscsi_cmd ucmd;
4378		struct uscsi_cmd *ucmd_ptr = &ucmd;
4379		enum uio_seg uioseg;
4380
4381		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4382			"st_ioctl: USCSICMD\n");
4383
4384		cr = ddi_get_cred();
4385		if ((drv_priv(cred_p) != 0) && (drv_priv(cr) != 0)) {
4386			rval = EPERM;
4387			break;
4388		}
4389
4390#ifdef _MULTI_DATAMODEL
4391		switch (ddi_model_convert_from(flag & FMODELS)) {
4392		case DDI_MODEL_ILP32:
4393		{
4394			if (ddi_copyin((void *)arg, ucmd_32_ptr,
4395			    sizeof (struct uscsi_cmd32), flag)) {
4396				rval = EFAULT;
4397				break;
4398			}
4399			uscsi_cmd32touscsi_cmd(ucmd_32_ptr, ucmd_ptr);
4400			break;
4401		}
4402		case DDI_MODEL_NONE:
4403			if (ddi_copyin((void *)arg, ucmd_ptr, sizeof (ucmd),
4404			    flag)) {
4405				rval = EFAULT;
4406				break;
4407			}
4408		}
4409
4410#else /* ! _MULTI_DATAMODEL */
4411		if (ddi_copyin((void *)arg, ucmd_ptr, sizeof (ucmd), flag)) {
4412			rval = EFAULT;
4413			break;
4414		}
4415#endif /* _MULTI_DATAMODEL */
4416
4417
4418		/*
4419		 * although st_ioctl_cmd() never makes use of these
4420		 * now, we are just being safe and consistent
4421		 */
4422		ucmd.uscsi_flags &= ~(USCSI_NOINTR | USCSI_NOPARITY |
4423		    USCSI_OTAG | USCSI_HTAG | USCSI_HEAD);
4424
4425
4426		uioseg = (flag & FKIOCTL) ?  UIO_SYSSPACE : UIO_USERSPACE;
4427
4428		rval = st_ioctl_cmd(dev, &ucmd, uioseg, uioseg, uioseg);
4429
4430
4431#ifdef _MULTI_DATAMODEL
4432		switch (ddi_model_convert_from(flag & FMODELS)) {
4433		case DDI_MODEL_ILP32:
4434			/*
4435			 * Convert 64 bit back to 32 bit before doing
4436			 * copyout. This is what the ILP32 app expects.
4437			 */
4438			uscsi_cmdtouscsi_cmd32(ucmd_ptr, ucmd_32_ptr);
4439
4440			if (ddi_copyout(&ucmd_32, (void *)arg,
4441			    sizeof (ucmd_32), flag)) {
4442				if (rval != 0)
4443					rval = EFAULT;
4444				}
4445			break;
4446
4447		case DDI_MODEL_NONE:
4448			if (ddi_copyout(&ucmd, (void *)arg,
4449			    sizeof (ucmd), flag)) {
4450				if (rval != 0)
4451					rval = EFAULT;
4452				}
4453			break;
4454		}
4455#else /* ! _MULTI_DATAMODEL */
4456		if (ddi_copyout(&ucmd, (void *)arg, sizeof (ucmd), flag)) {
4457			if (rval != 0)
4458				rval = EFAULT;
4459		}
4460#endif /* _MULTI_DATAMODEL */
4461
4462		break;
4463	}
4464
4465	case MTIOCTOP:
4466		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4467			"st_ioctl: MTIOCTOP\n");
4468		rval = st_mtioctop(un, arg, flag);
4469		break;
4470
4471	case MTIOCREADIGNOREILI:
4472		{
4473			int set_ili;
4474
4475			if (ddi_copyin((void *)arg, &set_ili,
4476			    sizeof (set_ili), flag)) {
4477				rval = EFAULT;
4478				break;
4479			}
4480
4481			if (un->un_bsize) {
4482				rval = ENOTTY;
4483				break;
4484			}
4485
4486			switch (set_ili) {
4487			case 0:
4488				un->un_dp->options &= ~ST_READ_IGNORE_ILI;
4489				break;
4490
4491			case 1:
4492				un->un_dp->options |= ST_READ_IGNORE_ILI;
4493				break;
4494
4495			default:
4496				rval = EINVAL;
4497				break;
4498			}
4499			break;
4500		}
4501
4502	case MTIOCREADIGNOREEOFS:
4503		{
4504			int ignore_eof;
4505
4506			if (ddi_copyin((void *)arg, &ignore_eof,
4507			    sizeof (ignore_eof), flag)) {
4508				rval = EFAULT;
4509				break;
4510			}
4511
4512			if (!(un->un_dp->options & ST_REEL)) {
4513				rval = ENOTTY;
4514				break;
4515			}
4516
4517			switch (ignore_eof) {
4518			case 0:
4519				un->un_dp->options &= ~ST_READ_IGNORE_EOFS;
4520				break;
4521
4522			case 1:
4523				un->un_dp->options |= ST_READ_IGNORE_EOFS;
4524				break;
4525
4526			default:
4527				rval = EINVAL;
4528				break;
4529			}
4530			break;
4531		}
4532
4533	case MTIOCSHORTFMK:
4534		{
4535			int short_fmk;
4536
4537			if (ddi_copyin((void *)arg, &short_fmk,
4538			    sizeof (short_fmk), flag)) {
4539				rval = EFAULT;
4540				break;
4541			}
4542
4543			switch (un->un_dp->type) {
4544			case ST_TYPE_EXB8500:
4545			case ST_TYPE_EXABYTE:
4546				if (!short_fmk) {
4547					un->un_dp->options &=
4548						~ST_SHORT_FILEMARKS;
4549				} else if (short_fmk == 1) {
4550					un->un_dp->options |=
4551						ST_SHORT_FILEMARKS;
4552				} else {
4553					rval = EINVAL;
4554				}
4555				break;
4556
4557			default:
4558				rval = ENOTTY;
4559				break;
4560			}
4561			break;
4562		}
4563
4564	default:
4565		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4566			"st_ioctl: unknown ioctl\n");
4567		rval = ENOTTY;
4568	}
4569
4570exit:
4571	if (!IS_PE_FLAG_SET(un))
4572		un->un_errno = rval;
4573
4574	mutex_exit(ST_MUTEX);
4575
4576	return (rval);
4577}
4578
4579
4580/*
4581 * do some MTIOCTOP tape operations
4582 */
4583static int
4584st_mtioctop(struct scsi_tape *un, intptr_t arg, int flag)
4585{
4586	struct mtop *mtop, local;
4587	int savefile, tmp, rval = 0;
4588	dev_t dev = un->un_dev;
4589#ifdef _MULTI_DATAMODEL
4590	/*
4591	 * For use when a 32 bit app makes a call into a
4592	 * 64 bit ioctl
4593	 */
4594	struct mtop32	mtop_32_for_64;
4595#endif /* _MULTI_DATAMODEL */
4596
4597
4598	ASSERT(mutex_owned(ST_MUTEX));
4599
4600	mtop = &local;
4601#ifdef _MULTI_DATAMODEL
4602		switch (ddi_model_convert_from(flag & FMODELS)) {
4603		case DDI_MODEL_ILP32:
4604		{
4605			if (ddi_copyin((void *)arg, &mtop_32_for_64,
4606			    sizeof (struct mtop32), flag)) {
4607				return (EFAULT);
4608			}
4609			mtop->mt_op = mtop_32_for_64.mt_op;
4610			mtop->mt_count =  (daddr_t)mtop_32_for_64.mt_count;
4611			break;
4612		}
4613		case DDI_MODEL_NONE:
4614			if (ddi_copyin((void *)arg, mtop,
4615			    sizeof (struct mtop), flag)) {
4616				return (EFAULT);
4617			}
4618			break;
4619		}
4620
4621#else /* ! _MULTI_DATAMODEL */
4622		if (ddi_copyin((void *)arg, mtop, sizeof (struct mtop), flag)) {
4623			return (EFAULT);
4624		}
4625#endif /* _MULTI_DATAMODEL */
4626
4627	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4628	    "st_mtioctop(): mt_op=%x\n", mtop->mt_op);
4629	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
4630	    "fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno, un->un_blkno,
4631	    un->un_eof);
4632
4633	rval = 0;
4634	un->un_status = 0;
4635
4636	/*
4637	 * if we are going to mess with a tape, we have to make sure we have
4638	 * one and are not offline (i.e. no tape is initialized).  We let
4639	 * commands pass here that don't actually touch the tape, except for
4640	 * loading and initialization (rewinding).
4641	 */
4642	if (un->un_state == ST_STATE_OFFLINE) {
4643		switch (mtop->mt_op) {
4644		case MTLOAD:
4645		case MTNOP:
4646			/*
4647			 * We don't want strategy calling st_tape_init here,
4648			 * so, change state
4649			 */
4650			un->un_state = ST_STATE_INITIALIZING;
4651			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4652			    "st_mtioctop : OFFLINE state = %d\n",
4653			    un->un_state);
4654			break;
4655		default:
4656			/*
4657			 * reinitialize by normal means
4658			 */
4659			rval = st_tape_init(dev);
4660			if (rval) {
4661				un->un_state = ST_STATE_INITIALIZING;
4662				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4663				    "st_mtioctop : OFFLINE init failure ");
4664				un->un_state = ST_STATE_OFFLINE;
4665				un->un_fileno = -1;
4666				if (rval != EACCES) {
4667					rval = EIO;
4668				}
4669				return (rval);
4670			}
4671			un->un_state = ST_STATE_OPEN_PENDING_IO;
4672			break;
4673		}
4674	}
4675
4676	/*
4677	 * If the file position is invalid, allow only those
4678	 * commands that properly position the tape and fail
4679	 * the rest with EIO
4680	 */
4681	if (un->un_fileno < 0) {
4682		switch (mtop->mt_op) {
4683		case MTWEOF:
4684		case MTRETEN:
4685		case MTERASE:
4686		case MTEOM:
4687		case MTFSF:
4688		case MTFSR:
4689		case MTBSF:
4690		case MTNBSF:
4691		case MTBSR:
4692		case MTSRSZ:
4693		case MTGRSZ:
4694			return (EIO);
4695			/* NOTREACHED */
4696		case MTREW:
4697		case MTLOAD:
4698		case MTOFFL:
4699		case MTNOP:
4700			break;
4701
4702		default:
4703			return (ENOTTY);
4704			/* NOTREACHED */
4705		}
4706	}
4707
4708	switch (mtop->mt_op) {
4709	case MTERASE:
4710		/*
4711		 * MTERASE rewinds the tape, erase it completely, and returns
4712		 * to the beginning of the tape
4713		 */
4714		if (un->un_mspl->wp || un->un_read_only & WORM) {
4715			un->un_status = KEY_WRITE_PROTECT;
4716			un->un_err_resid = mtop->mt_count;
4717			un->un_err_fileno = un->un_fileno;
4718			un->un_err_blkno = un->un_blkno;
4719			return (EACCES);
4720		}
4721		if (un->un_dp->options & ST_REEL) {
4722			un->un_fmneeded = 2;
4723		} else {
4724			un->un_fmneeded = 1;
4725		}
4726		if (st_check_density_or_wfm(dev, 1, B_WRITE, NO_STEPBACK) ||
4727		    st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) ||
4728		    st_cmd(dev, SCMD_ERASE, 0, SYNC_CMD)) {
4729			un->un_fileno = -1;
4730			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4731			    "st_mtioctop : EIO space or erase or check den)\n");
4732			rval = EIO;
4733		} else {
4734			/* QIC and helical scan rewind after erase */
4735			if (un->un_dp->options & ST_REEL) {
4736				(void) st_cmd(dev, SCMD_REWIND, 0, ASYNC_CMD);
4737			}
4738		}
4739		break;
4740
4741	case MTWEOF:
4742		/*
4743		 * write an end-of-file record
4744		 */
4745		if (un->un_mspl->wp || un->un_read_only & RDONLY) {
4746			un->un_status = KEY_WRITE_PROTECT;
4747			un->un_err_resid = mtop->mt_count;
4748			un->un_err_fileno = un->un_fileno;
4749			un->un_err_blkno = un->un_blkno;
4750			return (EACCES);
4751		}
4752
4753		/*
4754		 * zero count means just flush buffers
4755		 * negative count is not permitted
4756		 */
4757		if (mtop->mt_count < 0)
4758			return (EINVAL);
4759
4760		/* Not on worm */
4761		if (un->un_read_only == RDWR) {
4762			un->un_test_append = 1;
4763		}
4764
4765		if (un->un_state == ST_STATE_OPEN_PENDING_IO) {
4766			if (st_determine_density(dev, B_WRITE)) {
4767				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4768				    "st_mtioctop : EIO : MTWEOF can't determine"
4769				    "density");
4770				return (EIO);
4771			}
4772		}
4773
4774		rval = st_write_fm(dev, (int)mtop->mt_count);
4775		if ((rval != 0) && (rval != EACCES)) {
4776			/*
4777			 * Failure due to something other than illegal
4778			 * request results in loss of state (st_intr).
4779			 */
4780			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4781			    "st_mtioctop : EIO : MTWEOF can't write file mark");
4782			rval = EIO;
4783		}
4784		break;
4785
4786	case MTRETEN:
4787		/*
4788		 * retension the tape
4789		 */
4790		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK) ||
4791		    st_cmd(dev, SCMD_LOAD, 3, SYNC_CMD)) {
4792			un->un_fileno = -1;
4793			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4794			    "st_mtioctop : EIO : MTRETEN ");
4795			rval = EIO;
4796		}
4797		break;
4798
4799	case MTREW:
4800		/*
4801		 * rewind  the tape
4802		 */
4803		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) {
4804			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4805			    "st_mtioctop : EIO:MTREW check density/wfm failed");
4806			return (EIO);
4807		}
4808		if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
4809			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4810			    "st_mtioctop : EIO : MTREW ");
4811			rval = EIO;
4812		}
4813		break;
4814
4815	case MTOFFL:
4816		/*
4817		 * rewinds, and, if appropriate, takes the device offline by
4818		 * unloading the tape
4819		 */
4820		if (st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK)) {
4821			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4822			    "st_mtioctop :EIO:MTOFFL check density/wfm failed");
4823			return (EIO);
4824		}
4825		(void) st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
4826		if (st_cmd(dev, SCMD_LOAD, 0, SYNC_CMD)) {
4827			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4828			    "st_mtioctop : EIO : MTOFFL");
4829			return (EIO);
4830		}
4831		un->un_eof = ST_NO_EOF;
4832		un->un_laststate = un->un_state;
4833		un->un_state = ST_STATE_OFFLINE;
4834		un->un_mediastate = MTIO_EJECTED;
4835		break;
4836
4837	case MTLOAD:
4838		/*
4839		 * This is to load a tape into the drive
4840		 * Note that if the tape is not loaded, the device will have
4841		 * to be opened via O_NDELAY or O_NONBLOCK.
4842		 */
4843		/*
4844		 * Let's try and clean things up, if we are not
4845		 * initializing, and then send in the load command, no
4846		 * matter what.
4847		 *
4848		 * load after a media change by the user.
4849		 */
4850
4851		if (un->un_state > ST_STATE_INITIALIZING)
4852			(void) st_check_density_or_wfm(dev, 1, 0, NO_STEPBACK);
4853		rval = st_cmd(dev, SCMD_LOAD, 1, SYNC_CMD);
4854		if (rval) {
4855			if (rval != EACCES) {
4856				rval = EIO;
4857			}
4858			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4859			    "st_mtioctop : %s : MTLOAD\n",
4860			    rval == EACCES ? "EACCES" : "EIO");
4861			/*
4862			 * If load tape fails, who knows what happened...
4863			 */
4864			un->un_fileno = -1;
4865			break;
4866		}
4867
4868		/*
4869		 * reset all counters appropriately using rewind, as if LOAD
4870		 * succeeds, we are at BOT
4871		 */
4872		un->un_state = ST_STATE_INITIALIZING;
4873
4874		rval = st_tape_init(dev);
4875		if ((rval == EACCES) && (un->un_read_only & WORM)) {
4876			rval = 0;
4877			break;
4878		}
4879
4880		if (rval != 0) {
4881			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4882			    "st_mtioctop : EIO : MTLOAD calls st_tape_init\n");
4883			rval = EIO;
4884			un->un_state = ST_STATE_OFFLINE;
4885		}
4886
4887		break;
4888
4889	case MTNOP:
4890		un->un_status = 0;		/* Reset status */
4891		un->un_err_resid = 0;
4892		break;
4893
4894	case MTEOM:
4895		/*
4896		 * positions the tape at a location just after the last file
4897		 * written on the tape. For cartridge and 8 mm, this after
4898		 * the last file mark; for reel, this is inbetween the two
4899		 * last 2 file marks
4900		 */
4901		if ((un->un_eof >= ST_EOT) ||
4902		    (un->un_lastop == ST_OP_WRITE) ||
4903		    (un->un_lastop == ST_OP_WEOF)) {
4904			/*
4905			 * If the command wants to move to logical end
4906			 * of media, and we're already there, we're done.
4907			 * If we were at logical eot, we reset the state
4908			 * to be *not* at logical eot.
4909			 *
4910			 * If we're at physical or logical eot, we prohibit
4911			 * forward space operations (unconditionally).
4912			 *
4913			 * Also if the last operation was a write of any
4914			 * kind the tape is at EOD.
4915			 */
4916			return (0);
4917		}
4918		/*
4919		 * physical tape position may not be what we've been
4920		 * telling the user; adjust the request accordingly
4921		 */
4922		if (IN_EOF(un)) {
4923			un->un_fileno++;
4924			un->un_blkno = 0;
4925		}
4926
4927		if (st_check_density_or_wfm(dev, 1, B_READ, NO_STEPBACK)) {
4928			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4929			    "st_mtioctop : EIO:MTEOM check density/wfm failed");
4930			return (EIO);
4931		}
4932
4933		/*
4934		 * st_find_eom() returns the last fileno we knew about;
4935		 */
4936		savefile = st_find_eom(dev);
4937
4938		if ((un->un_status != KEY_BLANK_CHECK) &&
4939		    (un->un_status != SUN_KEY_EOT)) {
4940			un->un_fileno = -1;
4941			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4942			    "st_mtioctop : EIO : MTEOM status check failed");
4943			rval = EIO;
4944		} else {
4945			/*
4946			 * For 1/2" reel tapes assume logical EOT marked
4947			 * by two file marks or we don't care that we may
4948			 * be extending the last file on the tape.
4949			 */
4950			if (un->un_dp->options & ST_REEL) {
4951				if (st_cmd(dev, SCMD_SPACE, Fmk((-1)),
4952				    SYNC_CMD)) {
4953					un->un_fileno = -1;
4954					ST_DEBUG2(ST_DEVINFO, st_label,
4955					    SCSI_DEBUG,
4956					    "st_mtioctop : EIO : MTEOM space "
4957					    "cmd failed");
4958					rval = EIO;
4959					break;
4960				}
4961				/*
4962				 * Fix up the block number.
4963				 */
4964				un->un_blkno = 0;
4965				un->un_err_blkno = 0;
4966			}
4967			un->un_err_resid = 0;
4968			un->un_fileno = savefile;
4969			un->un_eof = ST_EOT;
4970		}
4971		un->un_status = 0;
4972		break;
4973
4974	case MTFSF:
4975		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
4976		    "fsf: count=%lx, eof=%x\n", mtop->mt_count,
4977			un->un_eof);
4978		/*
4979		 * forward space over filemark
4980		 *
4981		 * For ASF we allow a count of 0 on fsf which means
4982		 * we just want to go to beginning of current file.
4983		 * Equivalent to "nbsf(0)" or "bsf(1) + fsf".
4984		 * Allow stepping over double fmk with reel
4985		 */
4986		if ((un->un_eof >= ST_EOT) && (mtop->mt_count > 0) &&
4987		    ((un->un_dp->options & ST_REEL) == 0)) {
4988			/* we're at EOM */
4989			un->un_err_resid = mtop->mt_count;
4990			un->un_status = KEY_BLANK_CHECK;
4991			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
4992			    "st_mtioctop : EIO : MTFSF at EOM");
4993			return (EIO);
4994		}
4995
4996		/*
4997		 * physical tape position may not be what we've been
4998		 * telling the user; adjust the request accordingly
4999		 */
5000		if (IN_EOF(un)) {
5001			un->un_fileno++;
5002			un->un_blkno = 0;
5003			/*
5004			 * For positive direction case, we're now covered.
5005			 * For zero or negative direction, we're covered
5006			 * (almost)
5007			 */
5008			mtop->mt_count--;
5009		}
5010
5011		if (st_check_density_or_wfm(dev, 1, B_READ, STEPBACK)) {
5012			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5013			    "st_mtioctop : EIO : MTFSF density/wfm failed");
5014			return (EIO);
5015		}
5016
5017
5018		/*
5019		 * Forward space file marks.
5020		 * We leave ourselves at block zero
5021		 * of the target file number.
5022		 */
5023		if (mtop->mt_count < 0) {
5024			mtop->mt_count = -mtop->mt_count;
5025			mtop->mt_op = MTNBSF;
5026			goto bspace;
5027		}
5028fspace:
5029		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5030		    "fspace: count=%lx, eof=%x\n", mtop->mt_count,
5031			un->un_eof);
5032		if ((tmp = mtop->mt_count) == 0) {
5033			if (un->un_blkno == 0) {
5034				un->un_err_resid = 0;
5035				un->un_err_fileno = un->un_fileno;
5036				un->un_err_blkno = un->un_blkno;
5037				break;
5038			} else if (un->un_fileno == 0) {
5039				rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
5040			} else if (un->un_dp->options & ST_BSF) {
5041				rval = (st_cmd(dev, SCMD_SPACE, Fmk((-1)),
5042				    SYNC_CMD) ||
5043				    st_cmd(dev, SCMD_SPACE, Fmk(1), SYNC_CMD));
5044			} else {
5045				tmp = un->un_fileno;
5046				rval = (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) ||
5047				    st_cmd(dev, SCMD_SPACE, (int)Fmk(tmp),
5048				    SYNC_CMD));
5049			}
5050			if (rval != 0) {
5051				un->un_fileno = -1;
5052				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5053				    "st_mtioctop : EIO : fspace fileno = -1");
5054
5055				rval = EIO;
5056			}
5057		} else {
5058			rval = st_space_fmks(dev, tmp);
5059		}
5060
5061		if (mtop->mt_op == MTBSF && rval != EIO) {
5062			/*
5063			 * we came here with a count < 0; we now need
5064			 * to skip back to end up before the filemark
5065			 */
5066			mtop->mt_count = 1;
5067			goto bspace;
5068		}
5069		break;
5070
5071
5072	case MTFSR:
5073		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5074		    "fsr: count=%lx, eof=%x\n", mtop->mt_count,
5075			un->un_eof);
5076		/*
5077		 * forward space to inter-record gap
5078		 *
5079		 */
5080		if ((un->un_eof >= ST_EOT) && (mtop->mt_count > 0)) {
5081			/* we're at EOM */
5082			un->un_err_resid = mtop->mt_count;
5083			un->un_status = KEY_BLANK_CHECK;
5084			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5085			    "st_mtioctop : EIO : MTFSR un_eof > ST_EOT");
5086			return (EIO);
5087		}
5088
5089		if (mtop->mt_count == 0) {
5090			un->un_err_fileno = un->un_fileno;
5091			un->un_err_blkno = un->un_blkno;
5092			un->un_err_resid = 0;
5093			if (IN_EOF(un) && SVR4_BEHAVIOR) {
5094				un->un_status = SUN_KEY_EOF;
5095			}
5096			return (0);
5097		}
5098
5099		/*
5100		 * physical tape position may not be what we've been
5101		 * telling the user; adjust the position accordingly
5102		 */
5103		if (IN_EOF(un)) {
5104			daddr_t blkno = un->un_blkno;
5105			int fileno = un->un_fileno;
5106			uchar_t lastop = un->un_lastop;
5107			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)
5108			    == -1) {
5109				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5110				    "st_mtioctop : EIO :MTFSR count && IN_EOF");
5111				return (EIO);
5112			}
5113
5114			un->un_blkno = blkno;
5115			un->un_fileno = fileno;
5116			un->un_lastop = lastop;
5117		}
5118
5119		if (st_check_density_or_wfm(dev, 1, B_READ, STEPBACK)) {
5120			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5121			    "st_mtioctop : EIO : MTFSR st_check_den");
5122			return (EIO);
5123		}
5124
5125space_records:
5126		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5127		    "space_records: count=%lx, eof=%x\n", mtop->mt_count,
5128			un->un_eof);
5129		tmp = un->un_blkno + mtop->mt_count;
5130		if (tmp == un->un_blkno) {
5131			un->un_err_resid = 0;
5132			un->un_err_fileno = un->un_fileno;
5133			un->un_err_blkno = un->un_blkno;
5134			break;
5135		} else if (un->un_blkno < tmp ||
5136		    (un->un_dp->options & ST_BSR)) {
5137			/*
5138			 * If we're spacing forward, or the device can
5139			 * backspace records, we can just use the SPACE
5140			 * command.
5141			 */
5142			tmp = tmp - un->un_blkno;
5143			if (st_cmd(dev, SCMD_SPACE, Blk(tmp), SYNC_CMD)) {
5144				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5145				    "st_mtioctop :EIO:space_records can't spc");
5146				rval = EIO;
5147			} else if (un->un_eof >= ST_EOF_PENDING) {
5148				/*
5149				 * check if we hit BOT/EOT
5150				 */
5151				if (tmp < 0 && un->un_eof == ST_EOM) {
5152					un->un_status = SUN_KEY_BOT;
5153					un->un_eof = ST_NO_EOF;
5154				} else if (tmp < 0 && un->un_eof ==
5155				    ST_EOF_PENDING) {
5156					int residue = un->un_err_resid;
5157					/*
5158					 * we skipped over a filemark
5159					 * and need to go forward again
5160					 */
5161					if (st_cmd(dev, SCMD_SPACE, Fmk(1),
5162					    SYNC_CMD)) {
5163						ST_DEBUG2(ST_DEVINFO,
5164						    st_label, SCSI_DEBUG,
5165						    "st_mtioctop : EIO : "
5166						    "space_records can't "
5167						    "space #2");
5168						rval = EIO;
5169					}
5170					un->un_err_resid = residue;
5171				}
5172				if (rval == 0) {
5173					ST_DEBUG2(ST_DEVINFO, st_label,
5174					    SCSI_DEBUG,
5175					    "st_mtioctop : EIO : space_rec rval"
5176					    " == 0");
5177					rval = EIO;
5178				}
5179			}
5180		} else {
5181			/*
5182			 * else we rewind, space forward across filemarks to
5183			 * the desired file, and then space records to the
5184			 * desired block.
5185			 */
5186
5187			int t = un->un_fileno;	/* save current file */
5188
5189			if (tmp < 0) {
5190				/*
5191				 * Wups - we're backing up over a filemark
5192				 */
5193				if (un->un_blkno != 0 &&
5194				    (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) ||
5195				    st_cmd(dev, SCMD_SPACE, Fmk(t), SYNC_CMD)))
5196					un->un_fileno = -1;
5197				un->un_err_resid = -tmp;
5198				if (un->un_fileno == 0 && un->un_blkno == 0) {
5199					un->un_status = SUN_KEY_BOT;
5200					un->un_eof = ST_NO_EOF;
5201				} else if (un->un_fileno > 0) {
5202					un->un_status = SUN_KEY_EOF;
5203					un->un_eof = ST_NO_EOF;
5204				}
5205				un->un_err_fileno = un->un_fileno;
5206				un->un_err_blkno = un->un_blkno;
5207				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5208				    "st_mtioctop :EIO:space_records : tmp < 0");
5209				rval = EIO;
5210			} else if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD) ||
5211				    st_cmd(dev, SCMD_SPACE, Fmk(t), SYNC_CMD) ||
5212				    st_cmd(dev, SCMD_SPACE, Blk(tmp),
5213					SYNC_CMD)) {
5214				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5215				    "st_mtioctop : EIO :space_records : rewind "
5216				    "and space failed");
5217				un->un_fileno = -1;
5218				rval = EIO;
5219			}
5220		}
5221		break;
5222
5223
5224	case MTBSF:
5225		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5226		    "bsf: count=%lx, eof=%x\n", mtop->mt_count,
5227			un->un_eof);
5228		/*
5229		 * backward space of file filemark (1/2" and 8mm)
5230		 * tape position will end on the beginning of tape side
5231		 * of the desired file mark
5232		 */
5233		if ((un->un_dp->options & ST_BSF) == 0) {
5234			return (ENOTTY);
5235		}
5236
5237		/*
5238		 * If a negative count (which implies a forward space op)
5239		 * is specified, and we're at logical or physical eot,
5240		 * bounce the request.
5241		 */
5242
5243		if (un->un_eof >= ST_EOT && mtop->mt_count < 0) {
5244			un->un_err_resid = mtop->mt_count;
5245			un->un_status = SUN_KEY_EOT;
5246			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5247			    "st_ioctl : EIO : MTBSF : un_eof > ST_EOF");
5248			return (EIO);
5249		}
5250		/*
5251		 * physical tape position may not be what we've been
5252		 * telling the user; adjust the request accordingly
5253		 */
5254		if (IN_EOF(un)) {
5255			un->un_fileno++;
5256			un->un_blkno = 0;
5257			mtop->mt_count++;
5258			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5259			"bsf in eof: count=%ld, op=%x\n",
5260			mtop->mt_count, mtop->mt_op);
5261
5262		}
5263
5264		if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) {
5265			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5266			    "st_ioctl : EIO : MTBSF : check den wfm");
5267			return (EIO);
5268		}
5269
5270		if (mtop->mt_count <= 0) {
5271			/*
5272			 * for a negative count, we need to step forward
5273			 * first and then step back again
5274			 */
5275			mtop->mt_count = -mtop->mt_count+1;
5276			goto fspace;
5277		}
5278
5279bspace:
5280	{
5281		int skip_cnt, end_at_eof;
5282
5283		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5284		    "bspace: count=%lx, eof=%x\n", mtop->mt_count,
5285			un->un_eof);
5286		/*
5287		 * Backspace files (MTNBSF):
5288		 *
5289		 *	For tapes that can backspace, backspace
5290		 *	count+1 filemarks and then run forward over
5291		 *	a filemark
5292		 *
5293		 *	For tapes that can't backspace,
5294		 *		calculate desired filenumber
5295		 *		(un->un_fileno - count), rewind,
5296		 *		and then space forward this amount
5297		 *
5298		 * Backspace filemarks (MTBSF)
5299		 *
5300		 *	For tapes that can backspace, backspace count
5301		 *	filemarks
5302		 *
5303		 *	For tapes that can't backspace, calculate
5304		 *	desired filenumber (un->un_fileno - count),
5305		 *	add 1, rewind, space forward this amount,
5306		 *	and mark state as ST_EOF_PENDING appropriately.
5307		 */
5308
5309		if (mtop->mt_op == MTBSF) {
5310			end_at_eof = 1;
5311		} else {
5312			end_at_eof = 0;
5313		}
5314
5315		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5316		    "bspace: mt_op=%x, count=%lx, fileno=%x, blkno=%lx\n",
5317		    mtop->mt_op, mtop->mt_count, un->un_fileno, un->un_blkno);
5318
5319		/*
5320		 * Handle the simple case of BOT
5321		 * playing a role in these cmds.
5322		 * We do this by calculating the
5323		 * ending file number. If the ending
5324		 * file is < BOT, rewind and set an
5325		 * error and mark resid appropriately.
5326		 * If we're backspacing a file (not a
5327		 * filemark) and the target file is
5328		 * the first file on the tape, just
5329		 * rewind.
5330		 */
5331
5332		tmp = un->un_fileno - mtop->mt_count;
5333		if ((end_at_eof && tmp < 0) || (end_at_eof == 0 && tmp <= 0)) {
5334			if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
5335				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5336				    "st_ioctl : EIO : bspace : end_at_eof && "
5337				    "tmp < 0");
5338				rval = EIO;
5339			}
5340			if (tmp < 0) {
5341				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5342				    "st_ioctl : EIO : bspace : tmp < 0");
5343				rval = EIO;
5344				un->un_err_resid = -tmp;
5345				un->un_status = SUN_KEY_BOT;
5346			}
5347			break;
5348		}
5349
5350		if (un->un_dp->options & ST_BSF) {
5351			skip_cnt = 1 - end_at_eof;
5352			/*
5353			 * If we are going to end up at the beginning
5354			 * of the file, we have to space one extra file
5355			 * first, and then space forward later.
5356			 */
5357			tmp = -(mtop->mt_count + skip_cnt);
5358			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5359			    "skip_cnt=%x, tmp=%x\n", skip_cnt, tmp);
5360			if (st_cmd(dev, SCMD_SPACE, Fmk(tmp), SYNC_CMD)) {
5361				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5362				    "st_ioctl : EIO : bspace : can't space "
5363				    "tmp");
5364				rval = EIO;
5365			}
5366		} else {
5367			if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
5368				rval = EIO;
5369			} else {
5370				skip_cnt = tmp + end_at_eof;
5371			}
5372		}
5373
5374		/*
5375		 * If we have to space forward, do so...
5376		 */
5377		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5378		    "space forward skip_cnt=%x, rval=%x\n", skip_cnt, rval);
5379		if (rval == 0 && skip_cnt) {
5380			if (st_cmd(dev, SCMD_SPACE, Fmk(skip_cnt), SYNC_CMD)) {
5381				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5382				    "st_ioctl : EIO : bspace : can't space "
5383				    "skip_cnt");
5384				rval = EIO;
5385			} else if (end_at_eof) {
5386				/*
5387				 * If we had to space forward, and we're
5388				 * not a tape that can backspace, mark state
5389				 * as if we'd just seen a filemark during a
5390				 * a read.
5391				 */
5392				if ((un->un_dp->options & ST_BSF) == 0) {
5393					un->un_eof = ST_EOF_PENDING;
5394					un->un_fileno -= 1;
5395					un->un_blkno = INF;
5396				}
5397			}
5398		}
5399
5400		if (rval != 0) {
5401			un->un_fileno = -1;
5402		}
5403		break;
5404	}
5405
5406	case MTNBSF:
5407		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5408		    "nbsf: count=%lx, eof=%x\n", mtop->mt_count,
5409			un->un_eof);
5410		/*
5411		 * backward space file to beginning of file
5412		 *
5413		 * If a negative count (which implies a forward space op)
5414		 * is specified, and we're at logical or physical eot,
5415		 * bounce the request.
5416		 */
5417
5418		if (un->un_eof >= ST_EOT && mtop->mt_count < 0) {
5419			un->un_err_resid = mtop->mt_count;
5420			un->un_status = SUN_KEY_EOT;
5421			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5422			    "st_ioctl : EIO : > EOT and count < 0");
5423			return (EIO);
5424		}
5425		/*
5426		 * physical tape position may not be what we've been
5427		 * telling the user; adjust the request accordingly
5428		 */
5429		if (IN_EOF(un)) {
5430			un->un_fileno++;
5431			un->un_blkno = 0;
5432			mtop->mt_count++;
5433		}
5434
5435		if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) {
5436			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5437			    "st_ioctl : EIO : MTNBSF check den and wfm");
5438			return (EIO);
5439		}
5440
5441mtnbsf:
5442		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5443		    "mtnbsf: count=%lx, eof=%x\n", mtop->mt_count,
5444			un->un_eof);
5445		if (mtop->mt_count <= 0) {
5446			mtop->mt_op = MTFSF;
5447			mtop->mt_count = -mtop->mt_count;
5448			goto fspace;
5449		}
5450		goto bspace;
5451
5452	case MTBSR:
5453		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5454		    "bsr: count=%lx, eof=%x\n", mtop->mt_count,
5455			un->un_eof);
5456		/*
5457		 * backward space into inter-record gap
5458		 *
5459		 * If a negative count (which implies a forward space op)
5460		 * is specified, and we're at logical or physical eot,
5461		 * bounce the request.
5462		 */
5463		if (un->un_eof >= ST_EOT && mtop->mt_count < 0) {
5464			un->un_err_resid = mtop->mt_count;
5465			un->un_status = SUN_KEY_EOT;
5466			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5467			    "st_ioctl : EIO : MTBSR > EOT");
5468			return (EIO);
5469		}
5470
5471		if (mtop->mt_count == 0) {
5472			un->un_err_fileno = un->un_fileno;
5473			un->un_err_blkno = un->un_blkno;
5474			un->un_err_resid = 0;
5475			if (IN_EOF(un) && SVR4_BEHAVIOR) {
5476				un->un_status = SUN_KEY_EOF;
5477			}
5478			return (0);
5479		}
5480
5481		/*
5482		 * physical tape position may not be what we've been
5483		 * telling the user; adjust the position accordingly.
5484		 * bsr can not skip filemarks and continue to skip records
5485		 * therefore if we are logically before the filemark but
5486		 * physically at the EOT side of the filemark, we need to step
5487		 * back; this allows fsr N where N > number of blocks in file
5488		 * followed by bsr 1 to position at the beginning of last block
5489		 */
5490		if (IN_EOF(un)) {
5491			int blkno = un->un_blkno;
5492			int fileno = un->un_fileno;
5493			uchar_t lastop = un->un_lastop;
5494			if (st_cmd(dev, SCMD_SPACE, Fmk((-1)), SYNC_CMD)
5495			    == -1) {
5496				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5497				    "st_write_fm : EIO : MTBSR can't space");
5498				return (EIO);
5499			}
5500
5501			un->un_blkno = blkno;
5502			un->un_fileno = fileno;
5503			un->un_lastop = lastop;
5504		}
5505
5506		un->un_eof = ST_NO_EOF;
5507
5508		if (st_check_density_or_wfm(dev, 1, 0, STEPBACK)) {
5509			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5510			    "st_ioctl : EIO : MTBSR : can't set density or "
5511			    "wfm");
5512			return (EIO);
5513		}
5514
5515		mtop->mt_count = -mtop->mt_count;
5516		goto space_records;
5517
5518	case MTSRSZ:
5519
5520		/*
5521		 * Set record-size to that sent by user
5522		 * Check to see if there is reason that the requested
5523		 * block size should not be set.
5524		 */
5525
5526		/* If requesting variable block size is it ok? */
5527		if ((mtop->mt_count == 0) &&
5528		    ((un->un_dp->options & ST_VARIABLE) == 0)) {
5529			return (ENOTTY);
5530		}
5531
5532		/*
5533		 * If requested block size is not variable "0",
5534		 * is it less then minimum.
5535		 */
5536		if ((mtop->mt_count != 0) &&
5537		    (mtop->mt_count < un->un_minbsize)) {
5538			return (EINVAL);
5539		}
5540
5541		/* Is the requested block size more then maximum */
5542		if ((mtop->mt_count > min(un->un_maxbsize, un->un_maxdma)) &&
5543		    (un->un_maxbsize != 0)) {
5544			return (EINVAL);
5545		}
5546
5547		/* Is requested block size a modulus the device likes */
5548		if ((mtop->mt_count % un->un_data_mod) != 0) {
5549			return (EINVAL);
5550		}
5551
5552		if (st_change_block_size(dev, (uint32_t)mtop->mt_count) != 0) {
5553			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5554			    "st_ioctl : MTSRSZ : EIO : cant set block size");
5555			return (EIO);
5556		}
5557
5558		return (0);
5559
5560	case MTGRSZ:
5561	{
5562#ifdef _MULTI_DATAMODEL
5563	/*
5564	 * For use when a 32 bit app makes a call into a
5565	 * 64 bit ioctl
5566	 */
5567	struct mtop32	mtop_32_for_64;
5568#endif /* _MULTI_DATAMODEL */
5569
5570
5571		/*
5572		 * Get record-size to the user
5573		 */
5574		mtop->mt_count = un->un_bsize;
5575
5576#ifdef _MULTI_DATAMODEL
5577		switch (ddi_model_convert_from(flag & FMODELS)) {
5578		case DDI_MODEL_ILP32:
5579			/*
5580			 * Convert 64 bit back to 32 bit before doing
5581			 * copyout. This is what the ILP32 app expects.
5582			 */
5583			mtop_32_for_64.mt_op = mtop->mt_op;
5584			mtop_32_for_64.mt_count = mtop->mt_count;
5585
5586			if (ddi_copyout(&mtop_32_for_64, (void *)arg,
5587			    sizeof (struct mtop32), flag)) {
5588				return (EFAULT);
5589			}
5590			break;
5591
5592		case DDI_MODEL_NONE:
5593			if (ddi_copyout(mtop, (void *)arg,
5594			    sizeof (struct mtop), flag)) {
5595				return (EFAULT);
5596			}
5597			break;
5598		}
5599#else /* ! _MULTI_DATAMODE */
5600		if (ddi_copyout(mtop, (void *)arg, sizeof (struct mtop), flag))
5601			return (EFAULT);
5602
5603#endif /* _MULTI_DATAMODE */
5604
5605		return (0);
5606	}
5607	default:
5608		rval = ENOTTY;
5609	}
5610
5611	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5612	    "st_ioctl: fileno=%x, blkno=%lx, un_eof=%x\n", un->un_fileno,
5613	    un->un_blkno, un->un_eof);
5614
5615	if (un->un_fileno < 0) {
5616		un->un_density_known = 0;
5617	}
5618
5619	ASSERT(mutex_owned(ST_MUTEX));
5620	return (rval);
5621}
5622
5623
5624/*
5625 * Run a command for uscsi ioctl.
5626 * cdbspace is address space of cdb.
5627 * dataspace is address space of the uscsi data buffer.
5628 */
5629static int
5630st_ioctl_cmd(dev_t dev, struct uscsi_cmd *ucmd,
5631	enum uio_seg cdbspace, enum uio_seg dataspace,
5632	enum uio_seg rqbufspace)
5633{
5634	struct buf *bp;
5635	struct uscsi_cmd *kcmd;
5636	caddr_t kcdb;
5637	int flag;
5638	int err;
5639	int rqlen;
5640	int offline_state = 0;
5641	char *krqbuf = NULL;
5642
5643	GET_SOFT_STATE(dev);
5644
5645	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5646	    "st_ioctl_cmd(dev = 0x%lx)\n", dev);
5647
5648	ASSERT(mutex_owned(ST_MUTEX));
5649
5650	/*
5651	 * We really don't know what commands are coming in here and
5652	 * we don't want to limit the commands coming in.
5653	 *
5654	 * If st_tape_init() gets called from st_strategy(), then we
5655	 * will hang the process waiting for un->un_sbuf_busy to be cleared,
5656	 * which it never will, as we set it below.  To prevent
5657	 * st_tape_init() from getting called, we have to set state to other
5658	 * than ST_STATE_OFFLINE, so we choose ST_STATE_INITIALIZING, which
5659	 * achieves this purpose already
5660	 *
5661	 * We use offline_state to preserve the OFFLINE state, if it exists,
5662	 * so other entry points to the driver might have the chance to call
5663	 * st_tape_init().
5664	 */
5665	if (un->un_state == ST_STATE_OFFLINE) {
5666		un->un_laststate = ST_STATE_OFFLINE;
5667		un->un_state = ST_STATE_INITIALIZING;
5668		offline_state = 1;
5669	}
5670	/*
5671	 * Is this a request to reset the bus?
5672	 * If so, we need go no further.
5673	 */
5674	if (ucmd->uscsi_flags & (USCSI_RESET|USCSI_RESET_ALL)) {
5675		flag = ((ucmd->uscsi_flags & USCSI_RESET_ALL)) ?
5676			RESET_ALL : RESET_TARGET;
5677
5678		mutex_exit(ST_MUTEX);
5679		err = (scsi_reset(ROUTE, flag)) ? 0 : EIO;
5680		mutex_enter(ST_MUTEX);
5681
5682		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
5683			"reset %s %s\n",
5684			(flag == RESET_ALL) ? "all" : "target",
5685			(err == 0) ? "ok" : "failed");
5686		/*
5687		 * If scsi reset successful, don't write any filemarks.
5688		 */
5689		if (err == 0) {
5690			un->un_fmneeded = 0;
5691		} else {
5692			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5693			    "st_ioctl_cmd : EIO : scsi_reset failed");
5694		}
5695		goto exit;
5696	}
5697
5698	/*
5699	 * First do some sanity checks for USCSI commands.
5700	 */
5701	if ((ucmd->uscsi_cdblen <= 0) ||
5702	    (ucmd->uscsi_cdblen > un->un_max_cdb_sz)) {
5703		if (cdbspace != UIO_SYSSPACE) {
5704			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5705			    "USCSICMD with cdb larger then transport supports");
5706		}
5707		return (EINVAL);
5708	}
5709
5710	/*
5711	 * In order to not worry about where the uscsi structure
5712	 * or cdb it points to came from, we kmem_alloc copies
5713	 * of them here.  This will allow reference to the data
5714	 * they contain long after this process has gone to
5715	 * sleep and its kernel stack has been unmapped, etc.
5716	 */
5717
5718	kcdb = kmem_alloc((size_t)ucmd->uscsi_cdblen, KM_SLEEP);
5719	if (cdbspace == UIO_SYSSPACE) {
5720		bcopy(ucmd->uscsi_cdb, kcdb, ucmd->uscsi_cdblen);
5721	} else {
5722		if (ddi_copyin(ucmd->uscsi_cdb, kcdb,
5723		    (size_t)ucmd->uscsi_cdblen, 0)) {
5724			kmem_free(kcdb, (size_t)ucmd->uscsi_cdblen);
5725			err = EFAULT;
5726			goto exit;
5727		}
5728	}
5729
5730	/*
5731	 * can't peek at the cdb till is copied into kernal space.
5732	 */
5733	if (scsi_cdb_size[CDB_GROUPID(kcdb[0])] > un->un_max_cdb_sz) {
5734		if (cdbspace != UIO_SYSSPACE) {
5735			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5736			    "USCSICMD with cdb larger then transport supports");
5737		}
5738		kmem_free(kcdb, ucmd->uscsi_cdblen);
5739		return (EINVAL);
5740	}
5741	kcmd = kmem_alloc(sizeof (struct uscsi_cmd), KM_SLEEP);
5742	bcopy(ucmd, kcmd, sizeof (struct uscsi_cmd));
5743	kcmd->uscsi_cdb = kcdb;
5744
5745	flag = (kcmd->uscsi_flags & USCSI_READ) ? B_READ : B_WRITE;
5746
5747	/* check to see if this command requires the drive to be reserved */
5748	err = st_check_cdb_for_need_to_reserve(un, &kcdb[0]);
5749
5750	if (err) {
5751		goto exit_free;
5752	}
5753
5754	/*
5755	 * Get buffer resources...
5756	 */
5757	while (un->un_sbuf_busy)
5758		cv_wait(&un->un_sbuf_cv, ST_MUTEX);
5759	un->un_sbuf_busy = 1;
5760
5761#ifdef STDEBUG
5762	if (st_debug > 6) {
5763		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
5764		    "uscsi cdb", kcdb, kcmd->uscsi_cdblen);
5765		if (kcmd->uscsi_buflen) {
5766			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5767			"uscsi %s of %ld bytes %s %s space\n",
5768			(flag == B_READ) ? rd_str : wr_str,
5769			kcmd->uscsi_buflen,
5770			(flag == B_READ) ? "to" : "from",
5771			(dataspace == UIO_SYSSPACE) ? "system" : "user");
5772		}
5773	}
5774#endif /* ST_DEBUG */
5775
5776	/*
5777	 * Initialize Request Sense buffering, if requested.
5778	 * For user processes, allocate a kernel copy of the sense buffer
5779	 */
5780	if ((kcmd->uscsi_flags & USCSI_RQENABLE) &&
5781			kcmd->uscsi_rqlen && kcmd->uscsi_rqbuf) {
5782		if (rqbufspace == UIO_USERSPACE) {
5783			krqbuf = kmem_alloc(SENSE_LENGTH, KM_SLEEP);
5784		}
5785		kcmd->uscsi_rqlen = SENSE_LENGTH;
5786		kcmd->uscsi_rqresid = SENSE_LENGTH;
5787	} else {
5788		kcmd->uscsi_rqlen = 0;
5789		kcmd->uscsi_rqresid = 0;
5790	}
5791
5792	un->un_srqbufp = krqbuf;
5793	bp = un->un_sbufp;
5794	bzero(bp, sizeof (buf_t));
5795
5796	/*
5797	 * Force asynchronous mode, if necessary.
5798	 */
5799	if (ucmd->uscsi_flags & USCSI_ASYNC) {
5800		mutex_exit(ST_MUTEX);
5801		if (scsi_ifgetcap(ROUTE, "synchronous", 1) == 1) {
5802			if (scsi_ifsetcap(ROUTE, "synchronous", 0, 1) == 1) {
5803				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
5804				    "forced async ok\n");
5805			} else {
5806				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
5807				    "forced async failed\n");
5808				err = EINVAL;
5809				mutex_enter(ST_MUTEX);
5810				goto done;
5811			}
5812		}
5813		mutex_enter(ST_MUTEX);
5814	}
5815
5816	/*
5817	 * Re-enable synchronous mode, if requested
5818	 */
5819	if (ucmd->uscsi_flags & USCSI_SYNC) {
5820		mutex_exit(ST_MUTEX);
5821		if (scsi_ifgetcap(ROUTE, "synchronous", 1) == 0) {
5822			int i = scsi_ifsetcap(ROUTE, "synchronous", 1, 1);
5823			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
5824				"re-enabled sync %s\n",
5825				(i == 1) ? "ok" : "failed");
5826		}
5827		mutex_enter(ST_MUTEX);
5828	}
5829
5830	if (kcmd->uscsi_buflen) {
5831		/*
5832		 * We're going to do actual I/O.
5833		 * Set things up for physio.
5834		 */
5835		struct iovec aiov;
5836		struct uio auio;
5837		struct uio *uio = &auio;
5838
5839		bzero(&auio, sizeof (struct uio));
5840		bzero(&aiov, sizeof (struct iovec));
5841		aiov.iov_base = kcmd->uscsi_bufaddr;
5842		aiov.iov_len = kcmd->uscsi_buflen;
5843
5844		uio->uio_iov = &aiov;
5845		uio->uio_iovcnt = 1;
5846		uio->uio_resid = aiov.iov_len;
5847		uio->uio_segflg = dataspace;
5848
5849		/*
5850		 * Let physio do the rest...
5851		 */
5852		bp->b_forw = (struct buf *)(uintptr_t)kcdb[0];
5853		bp->b_back = (struct buf *)kcmd;
5854
5855		mutex_exit(ST_MUTEX);
5856		err = physio(st_strategy, bp, dev, flag, st_uscsi_minphys, uio);
5857		mutex_enter(ST_MUTEX);
5858	} else {
5859		/*
5860		 * Mimic physio
5861		 */
5862		bp->b_forw = (struct buf *)(uintptr_t)kcdb[0];
5863		bp->b_back = (struct buf *)kcmd;
5864		bp->b_flags = B_BUSY | flag;
5865		bp->b_edev = dev;
5866		bp->b_dev = cmpdev(dev);
5867		bp->b_bcount = 0;
5868		bp->b_blkno = 0;
5869		bp->b_resid = 0;
5870		mutex_exit(ST_MUTEX);
5871		(void) st_strategy(bp);
5872
5873		/*
5874		 * BugTraq #4260046
5875		 * ----------------
5876		 * See comments in st_cmd.
5877		 */
5878
5879		err = biowait(bp);
5880		mutex_enter(ST_MUTEX);
5881		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5882		    "st_ioctl_cmd: biowait returns %d\n", err);
5883	}
5884
5885	/*
5886	 * Copy status from kernel copy of uscsi_cmd to user copy
5887	 * of uscsi_cmd - this was saved in st_done_and_mutex_exit()
5888	 */
5889	ucmd->uscsi_status = kcmd->uscsi_status;
5890
5891done:
5892	ucmd->uscsi_resid = bp->b_resid;
5893
5894	/*
5895	 * Update the Request Sense status and resid
5896	 */
5897	rqlen = kcmd->uscsi_rqlen - kcmd->uscsi_rqresid;
5898	rqlen = min(((int)ucmd->uscsi_rqlen), rqlen);
5899	ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen;
5900	ucmd->uscsi_rqstatus = kcmd->uscsi_rqstatus;
5901	/*
5902	 * Copy out the sense data for user processes
5903	 */
5904	if (ucmd->uscsi_rqbuf && rqlen && rqbufspace == UIO_USERSPACE) {
5905		if (copyout(krqbuf, ucmd->uscsi_rqbuf, rqlen)) {
5906			err = EFAULT;
5907		}
5908	}
5909
5910	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5911	    "st_ioctl_cmd status is 0x%x, resid is 0x%lx\n",
5912	    ucmd->uscsi_status, ucmd->uscsi_resid);
5913	if (DEBUGGING && (rqlen != 0)) {
5914		int i, n, len;
5915		char *data = krqbuf;
5916		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
5917			"rqstatus=0x%x	rqlen=0x%x  rqresid=0x%x\n",
5918			ucmd->uscsi_rqstatus, ucmd->uscsi_rqlen,
5919			ucmd->uscsi_rqresid);
5920		len = (int)ucmd->uscsi_rqlen - ucmd->uscsi_rqresid;
5921		for (i = 0; i < len; i += 16) {
5922			n = min(16, len-1);
5923			st_clean_print(ST_DEVINFO, st_label, CE_NOTE,
5924				"  ", &data[i], n);
5925		}
5926	}
5927
5928exit_free:
5929	/*
5930	 * Free resources
5931	 */
5932	un->un_sbuf_busy = 0;
5933	un->un_srqbufp = NULL;
5934	cv_signal(&un->un_sbuf_cv);
5935
5936	if (krqbuf) {
5937		kmem_free(krqbuf, SENSE_LENGTH);
5938	}
5939	kmem_free(kcdb, kcmd->uscsi_cdblen);
5940	kmem_free(kcmd, sizeof (struct uscsi_cmd));
5941
5942	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
5943	    "st_ioctl_cmd returns 0x%x\n", err);
5944
5945
5946exit:
5947	/* don't lose offline state */
5948	if (offline_state)
5949		un->un_state = ST_STATE_OFFLINE;
5950
5951	ASSERT(mutex_owned(ST_MUTEX));
5952	return (err);
5953}
5954
5955static int
5956st_write_fm(dev_t dev, int wfm)
5957{
5958	int i;
5959	int rval;
5960
5961	GET_SOFT_STATE(dev);
5962
5963	ASSERT(mutex_owned(ST_MUTEX));
5964
5965	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
5966	    "st_write_fm(dev = 0x%lx, wfm = %d)\n", dev, wfm);
5967
5968	/*
5969	 * write one filemark at the time after EOT
5970	 */
5971	if (un->un_eof >= ST_EOT) {
5972		for (i = 0; i < wfm; i++) {
5973			rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, 1, SYNC_CMD);
5974			if (rval == EACCES) {
5975				return (rval);
5976			}
5977			if (rval != 0) {
5978				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5979				    "st_write_fm : EIO : write EOT file mark");
5980				return (EIO);
5981			}
5982		}
5983	} else {
5984		rval = st_cmd(dev, SCMD_WRITE_FILE_MARK, wfm, SYNC_CMD);
5985		if (rval == EACCES) {
5986			return (rval);
5987		}
5988		if (rval) {
5989			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
5990			    "st_write_fm : EIO : write file mark");
5991			return (EIO);
5992		}
5993	}
5994
5995	ASSERT(mutex_owned(ST_MUTEX));
5996	return (0);
5997}
5998
5999#ifdef STDEBUG
6000static void
6001start_dump(struct scsi_tape *un, struct buf *bp)
6002{
6003	struct scsi_pkt *pkt = BP_PKT(bp);
6004	uchar_t *cdbp = (uchar_t *)pkt->pkt_cdbp;
6005
6006	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6007	    "st_start: cmd=0x%p count=%ld resid=%ld flags=0x%x pkt=0x%p\n",
6008	    (void *)bp->b_forw, bp->b_bcount,
6009	    bp->b_resid, bp->b_flags, (void *)BP_PKT(bp));
6010
6011	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6012	    "st_start: cdb %x %x %x %x %x %x, fileno=%d, blk=%ld\n",
6013	    cdbp[0], cdbp[1], cdbp[2],
6014	    cdbp[3], cdbp[4], cdbp[5], un->un_fileno,
6015	    un->un_blkno);
6016}
6017#endif
6018
6019
6020/*
6021 * Command start && done functions
6022 */
6023
6024/*
6025 * st_start()
6026 *
6027 * Called from:
6028 *  st_strategy() to start a command.
6029 *  st_runout() to retry when scsi_pkt allocation fails on previous attempt(s).
6030 *  st_attach() when resuming from power down state.
6031 *  st_start_restart() to retry transport when device was previously busy.
6032 *  st_done_and_mutex_exit() to start the next command when previous is done.
6033 *
6034 * On entry:
6035 *  scsi_pkt may or may not be allocated.
6036 *
6037 */
6038static void
6039st_start(struct scsi_tape *un)
6040{
6041	struct buf *bp;
6042	int status;
6043
6044	ASSERT(mutex_owned(ST_MUTEX));
6045
6046	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6047	    "st_start(): dev = 0x%lx\n", un->un_dev);
6048
6049	if ((bp = un->un_quef) == NULL) {
6050		return;
6051	}
6052
6053	ASSERT((bp->b_flags & B_DONE) == 0);
6054
6055	/*
6056	 * Don't send more than un_throttle commands to the HBA
6057	 */
6058	if ((un->un_throttle <= 0) || (un->un_ncmds >= un->un_throttle)) {
6059		return;
6060	}
6061
6062	/*
6063	 * If the buf has no scsi_pkt call st_make_cmd() to get one and
6064	 * build the command.
6065	 */
6066	if (BP_PKT(bp) == NULL) {
6067		ASSERT((bp->b_flags & B_DONE) == 0);
6068		st_make_cmd(un, bp, st_runout);
6069		ASSERT((bp->b_flags & B_DONE) == 0);
6070		status = geterror(bp);
6071
6072		/*
6073		 * Some HBA's don't call bioerror() to set an error.
6074		 * And geterror() returns zero if B_ERROR is not set.
6075		 * So if we get zero we must check b_error.
6076		 */
6077		if (status == 0 && bp->b_error != 0) {
6078			status = bp->b_error;
6079			bioerror(bp, status);
6080		}
6081
6082		/*
6083		 * Some HBA's convert DDI_DMA_NORESOURCES into ENOMEM.
6084		 * In tape ENOMEM has special meaning so we'll change it.
6085		 */
6086		if (status == ENOMEM) {
6087			status = 0;
6088			bioerror(bp, status);
6089		}
6090
6091		/*
6092		 * Did it fail and is it retryable?
6093		 * If so return and wait for the callback through st_runout.
6094		 * Also looks like scsi_init_pkt() will setup a callback even
6095		 * if it isn't retryable.
6096		 */
6097		if (BP_PKT(bp) == NULL) {
6098			if (status == 0) {
6099				/*
6100				 * If first attempt save state.
6101				 */
6102				if (un->un_state != ST_STATE_RESOURCE_WAIT) {
6103					un->un_laststate = un->un_state;
6104					un->un_state = ST_STATE_RESOURCE_WAIT;
6105				}
6106				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
6107				    "temp no resources for pkt\n");
6108			} else {
6109				/*
6110				 * Unlikely that it would be retryable then not.
6111				 */
6112				if (un->un_state == ST_STATE_RESOURCE_WAIT) {
6113					un->un_state = un->un_laststate;
6114				}
6115				scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
6116				    "perm no resources for pkt errno = 0x%x\n",
6117				    status);
6118			}
6119			return;
6120		}
6121		/*
6122		 * Worked this time set the state back.
6123		 */
6124		if (un->un_state == ST_STATE_RESOURCE_WAIT) {
6125			un->un_state = un->un_laststate;
6126		}
6127	}
6128
6129	/*
6130	 * move from waitq to runq
6131	 */
6132	un->un_quef = bp->b_actf;
6133	if (un->un_quel == bp) {
6134		/*
6135		 *  For the case of queue having one
6136		 *  element, set the tail pointer to
6137		 *  point to the element.
6138		 */
6139		un->un_quel = bp->b_actf;
6140	}
6141
6142	bp->b_actf = NULL;
6143
6144	if (un->un_runqf) {
6145		un->un_runql->b_actf = bp;
6146	} else {
6147		un->un_runqf = bp;
6148	}
6149	un->un_runql = bp;
6150
6151
6152#ifdef STDEBUG
6153	start_dump(un, bp);
6154#endif
6155
6156	/* could not get here if throttle was zero */
6157	un->un_last_throttle = un->un_throttle;
6158	un->un_throttle = 0;	/* so nothing else will come in here */
6159	un->un_ncmds++;
6160
6161	ST_DO_KSTATS(bp, kstat_waitq_to_runq);
6162
6163	mutex_exit(ST_MUTEX);
6164
6165	status = scsi_transport(BP_PKT(bp));
6166
6167	mutex_enter(ST_MUTEX);
6168
6169	if (un->un_last_throttle) {
6170		un->un_throttle = un->un_last_throttle;
6171	}
6172
6173	if (status != TRAN_ACCEPT) {
6174		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
6175		mutex_exit(ST_MUTEX);
6176
6177		if (status == TRAN_BUSY) {
6178			/* if too many retries, fail the transport */
6179			if (st_handle_start_busy(un, bp,
6180			    ST_TRAN_BUSY_TIMEOUT) == 0)
6181				goto done;
6182		}
6183		scsi_log(ST_DEVINFO, st_label, CE_WARN,
6184		    "transport rejected\n");
6185		bp->b_resid = bp->b_bcount;
6186
6187
6188#ifndef __lock_lint
6189		/*
6190		 * warlock doesn't understand this potential
6191		 * recursion?
6192		 */
6193		mutex_enter(ST_MUTEX);
6194		ST_DO_KSTATS(bp, kstat_waitq_exit);
6195		ST_DO_ERRSTATS(un, st_transerrs);
6196		st_bioerror(bp, EIO);
6197		SET_PE_FLAG(un);
6198		st_done_and_mutex_exit(un, bp);
6199#endif
6200	} else {
6201		un->un_tran_retry_ct = 0;
6202		mutex_exit(ST_MUTEX);
6203	}
6204
6205done:
6206
6207	mutex_enter(ST_MUTEX);
6208}
6209
6210/*
6211 * if the transport is busy, then put this bp back on the waitq
6212 */
6213static int
6214st_handle_start_busy(struct scsi_tape *un, struct buf *bp,
6215    clock_t timeout_interval)
6216{
6217	struct buf *last_quef, *runq_bp;
6218	int rval = 0;
6219
6220	mutex_enter(ST_MUTEX);
6221
6222	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6223	    "st_handle_start_busy()\n");
6224
6225	/*
6226	 * Check to see if we hit the retry timeout and one last check for
6227	 * making sure this is the last on the runq, if it is not, we have
6228	 * to fail
6229	 */
6230	if (((int)un->un_tran_retry_ct++ > st_retry_count) ||
6231	    (un->un_runql != bp)) {
6232		rval = -1;
6233		goto exit;
6234	}
6235
6236	/* put the bp back on the waitq */
6237	if (un->un_quef) {
6238		last_quef = un->un_quef;
6239		un->un_quef = bp;
6240		bp->b_actf = last_quef;
6241	} else  {
6242		bp->b_actf = NULL;
6243		un->un_quef = bp;
6244		un->un_quel = bp;
6245	}
6246
6247	/*
6248	 * Decrement un_ncmds so that this
6249	 * gets thru' st_start() again.
6250	 */
6251	un->un_ncmds--;
6252
6253	/*
6254	 * since this is an error case, we won't have to do
6255	 * this list walking much.  We've already made sure this bp was the
6256	 * last on the runq
6257	 */
6258	runq_bp = un->un_runqf;
6259
6260	if (un->un_runqf == bp) {
6261		un->un_runqf = NULL;
6262		un->un_runql = NULL;
6263	} else {
6264		while (runq_bp) {
6265			if (runq_bp->b_actf == bp) {
6266				runq_bp->b_actf = NULL;
6267				un->un_runql = runq_bp;
6268				break;
6269			}
6270			runq_bp = runq_bp->b_actf;
6271		}
6272	}
6273
6274
6275	/*
6276	 * send a marker pkt, if appropriate
6277	 */
6278	st_hba_unflush(un);
6279
6280	/*
6281	 * all queues are aligned, we are just waiting to
6282	 * transport, don't alloc any more buf p's, when
6283	 * st_start is reentered.
6284	 */
6285	(void) timeout(st_start_restart, un, timeout_interval);
6286
6287exit:
6288	mutex_exit(ST_MUTEX);
6289	return (rval);
6290}
6291
6292
6293/*
6294 * st_runout a callback that is called what a resource allocatation failed
6295 */
6296static int
6297st_runout(caddr_t arg)
6298{
6299	struct scsi_tape *un = (struct scsi_tape *)arg;
6300	struct buf *bp;
6301	ASSERT(un != NULL);
6302
6303	mutex_enter(ST_MUTEX);
6304
6305	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_runout()\n");
6306
6307	bp = un->un_quef;
6308
6309	/*
6310	 * failed scsi_init_pkt(). If errno is zero its retryable.
6311	 */
6312	if ((bp != NULL) && (geterror(bp) != 0)) {
6313
6314		scsi_log(ST_DEVINFO, st_label, CE_WARN,
6315		    "errors after pkt alloc (b_flags=0x%x, b_error=0x%x)\n",
6316		    bp->b_flags, geterror(bp));
6317		ASSERT((bp->b_flags & B_DONE) == 0);
6318
6319		un->un_quef = bp->b_actf;
6320		if (un->un_quel == bp) {
6321			/*
6322			 *  For the case of queue having one
6323			 *  element, set the tail pointer to
6324			 *  point to the element.
6325			 */
6326			un->un_quel = bp->b_actf;
6327		}
6328		mutex_exit(ST_MUTEX);
6329		bp->b_actf = NULL;
6330
6331		ASSERT((bp->b_flags & B_DONE) == 0);
6332
6333		/*
6334		 * Set resid, Error already set, then unblock calling thread.
6335		 */
6336		bp->b_resid = bp->b_bcount;
6337		biodone(bp);
6338	} else {
6339		/*
6340		 * Try Again
6341		 */
6342		st_start(un);
6343		mutex_exit(ST_MUTEX);
6344	}
6345
6346	/*
6347	 * Comments courtesy of sd.c
6348	 * The scsi_init_pkt routine allows for the callback function to
6349	 * return a 0 indicating the callback should be rescheduled or a 1
6350	 * indicating not to reschedule. This routine always returns 1
6351	 * because the driver always provides a callback function to
6352	 * scsi_init_pkt. This results in a callback always being scheduled
6353	 * (via the scsi_init_pkt callback implementation) if a resource
6354	 * failure occurs.
6355	 */
6356
6357	return (1);
6358}
6359
6360/*
6361 * st_done_and_mutex_exit()
6362 *	- remove bp from runq
6363 *	- start up the next request
6364 *	- if this was an asynch bp, clean up
6365 *	- exit with released mutex
6366 */
6367static void
6368st_done_and_mutex_exit(struct scsi_tape *un, struct buf *bp)
6369{
6370	struct buf *runqbp, *prevbp;
6371	int	pe_flagged = 0;
6372
6373	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
6374#if !defined(lint)
6375	_NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(&un->un_sd->sd_mutex))
6376#endif
6377	ASSERT(mutex_owned(ST_MUTEX));
6378
6379	/*
6380	 * if bp is still on the runq (anywhere), then remove it
6381	 */
6382	prevbp = NULL;
6383	for (runqbp = un->un_runqf; runqbp != 0; runqbp = runqbp->b_actf) {
6384		if (runqbp == bp) {
6385			if (runqbp == un->un_runqf) {
6386				un->un_runqf = bp->b_actf;
6387			} else {
6388				prevbp->b_actf = bp->b_actf;
6389			}
6390			if (un->un_runql == bp) {
6391				un->un_runql = prevbp;
6392			}
6393			break;
6394		}
6395		prevbp = runqbp;
6396	}
6397	bp->b_actf = NULL;
6398
6399	un->un_ncmds--;
6400	cv_signal(&un->un_queue_cv);
6401
6402	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6403	"st_done_and_mutex_exit(): cmd=0x%x count=%ld resid=%ld  flags=0x%x\n",
6404		(uchar_t)*((caddr_t)(BP_PKT(bp))->pkt_cdbp),
6405		bp->b_bcount, bp->b_resid, bp->b_flags);
6406
6407
6408	/*
6409	 * update kstats with transfer count info
6410	 */
6411	if (un->un_stats && (bp != un->un_sbufp) && IS_RW(bp)) {
6412		uint32_t n_done =  bp->b_bcount - bp->b_resid;
6413		if (bp->b_flags & B_READ) {
6414			IOSP->reads++;
6415			IOSP->nread += n_done;
6416		} else {
6417			IOSP->writes++;
6418			IOSP->nwritten += n_done;
6419		}
6420	}
6421
6422	/*
6423	 * Start the next one before releasing resources on this one, if
6424	 * there is something on the queue and persistent errors has not been
6425	 * flagged
6426	 */
6427
6428	if ((pe_flagged = IS_PE_FLAG_SET(un)) != 0) {
6429		un->un_last_resid = bp->b_resid;
6430		un->un_last_count = bp->b_bcount;
6431	}
6432
6433	if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
6434		cv_broadcast(&un->un_tape_busy_cv);
6435	} else if (un->un_quef && un->un_throttle && !pe_flagged) {
6436		st_start(un);
6437	}
6438
6439	if (bp == un->un_sbufp && (bp->b_flags & B_ASYNC)) {
6440		/*
6441		 * Since we marked this ourselves as ASYNC,
6442		 * there isn't anybody around waiting for
6443		 * completion any more.
6444		 */
6445		uchar_t com = (uchar_t)(uintptr_t)bp->b_forw;
6446		if (com == SCMD_READ || com == SCMD_WRITE) {
6447			bp->b_un.b_addr = (caddr_t)0;
6448		}
6449		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6450		    "st_done_and_mutex_exit(async): freeing pkt\n");
6451		scsi_destroy_pkt(BP_PKT(bp));
6452		un->un_sbuf_busy = 0;
6453		cv_signal(&un->un_sbuf_cv);
6454		mutex_exit(ST_MUTEX);
6455		return;
6456	}
6457
6458	if (bp == un->un_sbufp && BP_UCMD(bp)) {
6459		/*
6460		 * Copy status from scsi_pkt to uscsi_cmd
6461		 * since st_ioctl_cmd needs it
6462		 */
6463		BP_UCMD(bp)->uscsi_status = SCBP_C(BP_PKT(bp));
6464	}
6465
6466
6467#ifdef STDEBUG
6468	if ((st_debug >= 4) &&
6469	    (((un->un_blkno % 100) == 0) || IS_PE_FLAG_SET(un))) {
6470
6471		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6472		    "st_d_a_m_exit(): ncmds = %d, thr = %d, "
6473		    "un_errno = %d, un_pe = %d\n",
6474		    un->un_ncmds, un->un_throttle, un->un_errno,
6475		    un->un_persist_errors);
6476	}
6477
6478#endif
6479
6480	mutex_exit(ST_MUTEX);
6481	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6482	    "st_done_and_mutex_exit: freeing pkt\n");
6483
6484	scsi_destroy_pkt(BP_PKT(bp));
6485
6486	biodone(bp);
6487
6488	/*
6489	 * now that we biodoned that command, if persistent errors have been
6490	 * flagged, flush the waitq
6491	 */
6492	if (pe_flagged)
6493		st_flush(un);
6494}
6495
6496
6497/*
6498 * Tape error, flush tape driver queue.
6499 */
6500static void
6501st_flush(struct scsi_tape *un)
6502{
6503	struct buf *bp;
6504
6505	mutex_enter(ST_MUTEX);
6506
6507	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6508	    "st_flush(), ncmds = %d, quef = 0x%p\n",
6509	    un->un_ncmds, (void *)un->un_quef);
6510
6511	/*
6512	 * if we still have commands outstanding, wait for them to come in
6513	 * before flushing the queue, and make sure there is a queue
6514	 */
6515	if (un->un_ncmds || !un->un_quef)
6516		goto exit;
6517
6518	/*
6519	 * we have no more commands outstanding, so let's deal with special
6520	 * cases in the queue for EOM and FM. If we are here, and un_errno
6521	 * is 0, then we know there was no error and we return a 0 read or
6522	 * write before showing errors
6523	 */
6524
6525	/* Flush the wait queue. */
6526	while ((bp = un->un_quef) != NULL) {
6527		un->un_quef = bp->b_actf;
6528
6529		bp->b_resid = bp->b_bcount;
6530
6531		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
6532		    "st_flush() : blkno=%ld, err=%d, b_bcount=%ld\n",
6533		    un->un_blkno, un->un_errno, bp->b_bcount);
6534
6535		st_set_pe_errno(un);
6536
6537		bioerror(bp, un->un_errno);
6538
6539		mutex_exit(ST_MUTEX);
6540		/* it should have one, but check anyway */
6541		if (BP_PKT(bp)) {
6542			scsi_destroy_pkt(BP_PKT(bp));
6543		}
6544		biodone(bp);
6545		mutex_enter(ST_MUTEX);
6546	}
6547
6548	/*
6549	 * It's not a bad practice to reset the
6550	 * waitq tail pointer to NULL.
6551	 */
6552	un->un_quel = NULL;
6553
6554exit:
6555	/* we mucked with the queue, so let others know about it */
6556	cv_signal(&un->un_queue_cv);
6557	mutex_exit(ST_MUTEX);
6558}
6559
6560
6561/*
6562 * Utility functions
6563 */
6564static int
6565st_determine_generic(dev_t dev)
6566{
6567	int bsize;
6568	static char *cart = "0.25 inch cartridge";
6569	char *sizestr;
6570
6571	GET_SOFT_STATE(dev);
6572
6573	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6574	    "st_determine_generic(dev = 0x%lx)\n", dev);
6575
6576	ASSERT(mutex_owned(ST_MUTEX));
6577
6578	if (st_modesense(un)) {
6579		return (-1);
6580	}
6581
6582	bsize = (un->un_mspl->high_bl << 16)	|
6583		(un->un_mspl->mid_bl << 8)	|
6584		(un->un_mspl->low_bl);
6585
6586	if (bsize == 0) {
6587		un->un_dp->options |= ST_VARIABLE;
6588		un->un_dp->bsize = 0;
6589		un->un_bsize = 0;
6590	} else if (bsize > ST_MAXRECSIZE_FIXED) {
6591		/*
6592		 * record size of this device too big.
6593		 * try and convert it to variable record length.
6594		 *
6595		 */
6596		un->un_dp->options |= ST_VARIABLE;
6597		if (st_change_block_size(dev, 0) != 0) {
6598			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
6599			    "Fixed Record Size %d is too large\n", bsize);
6600			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
6601			    "Cannot switch to variable record size\n");
6602			un->un_dp->options &= ~ST_VARIABLE;
6603			return (-1);
6604		}
6605	} else if (st_change_block_size(dev, 0) == 0) {
6606		/*
6607		 * If the drive was set to a non zero block size,
6608		 * See if it can be set to a zero block size.
6609		 * If it works, ST_VARIABLE so user can set it as they want.
6610		 */
6611		un->un_dp->options |= ST_VARIABLE;
6612		un->un_dp->bsize = 0;
6613		un->un_bsize = 0;
6614	} else {
6615		un->un_dp->bsize = bsize;
6616		un->un_bsize = bsize;
6617	}
6618
6619
6620	switch (un->un_mspl->density) {
6621	default:
6622	case 0x0:
6623		/*
6624		 * default density, cannot determine any other
6625		 * information.
6626		 */
6627		sizestr = "Unknown type- assuming 0.25 inch cartridge";
6628		un->un_dp->type = ST_TYPE_DEFAULT;
6629		un->un_dp->options |= (ST_AUTODEN_OVERRIDE|ST_QIC);
6630		break;
6631	case 0x1:
6632	case 0x2:
6633	case 0x3:
6634	case 0x6:
6635		/*
6636		 * 1/2" reel
6637		 */
6638		sizestr = "0.50 inch reel";
6639		un->un_dp->type = ST_TYPE_REEL;
6640		un->un_dp->options |= ST_REEL;
6641		un->un_dp->densities[0] = 0x1;
6642		un->un_dp->densities[1] = 0x2;
6643		un->un_dp->densities[2] = 0x6;
6644		un->un_dp->densities[3] = 0x3;
6645		break;
6646	case 0x4:
6647	case 0x5:
6648	case 0x7:
6649	case 0x0b:
6650
6651		/*
6652		 * Quarter inch.
6653		 */
6654		sizestr = cart;
6655		un->un_dp->type = ST_TYPE_DEFAULT;
6656		un->un_dp->options |= ST_QIC;
6657
6658		un->un_dp->densities[1] = 0x4;
6659		un->un_dp->densities[2] = 0x5;
6660		un->un_dp->densities[3] = 0x7;
6661		un->un_dp->densities[0] = 0x0b;
6662		break;
6663
6664	case 0x0f:
6665	case 0x10:
6666	case 0x11:
6667	case 0x12:
6668		/*
6669		 * QIC-120, QIC-150, QIC-320, QIC-600
6670		 */
6671		sizestr = cart;
6672		un->un_dp->type = ST_TYPE_DEFAULT;
6673		un->un_dp->options |= ST_QIC;
6674		un->un_dp->densities[0] = 0x0f;
6675		un->un_dp->densities[1] = 0x10;
6676		un->un_dp->densities[2] = 0x11;
6677		un->un_dp->densities[3] = 0x12;
6678		break;
6679
6680	case 0x09:
6681	case 0x0a:
6682	case 0x0c:
6683	case 0x0d:
6684		/*
6685		 * 1/2" cartridge tapes. Include HI-TC.
6686		 */
6687		sizestr = cart;
6688		sizestr[2] = '5';
6689		sizestr[3] = '0';
6690		un->un_dp->type = ST_TYPE_HIC;
6691		un->un_dp->densities[0] = 0x09;
6692		un->un_dp->densities[1] = 0x0a;
6693		un->un_dp->densities[2] = 0x0c;
6694		un->un_dp->densities[3] = 0x0d;
6695		break;
6696
6697	case 0x13:
6698			/* DDS-2/DDS-3 scsi spec densities */
6699	case 0x24:
6700	case 0x25:
6701	case 0x26:
6702		sizestr = "DAT Data Storage (DDS)";
6703		un->un_dp->type = ST_TYPE_DAT;
6704		un->un_dp->options |= ST_AUTODEN_OVERRIDE;
6705		break;
6706
6707	case 0x14:
6708		/*
6709		 * Helical Scan (Exabyte) devices
6710		 */
6711		sizestr = "8mm helical scan cartridge";
6712		un->un_dp->type = ST_TYPE_EXABYTE;
6713		un->un_dp->options |= ST_AUTODEN_OVERRIDE;
6714		break;
6715	}
6716
6717	/*
6718	 * Assume LONG ERASE, BSF and BSR
6719	 */
6720
6721	un->un_dp->options |= (ST_LONG_ERASE|ST_UNLOADABLE|ST_BSF|
6722				ST_BSR|ST_KNOWS_EOD);
6723
6724	/*
6725	 * Only if mode sense data says no buffered write, set NOBUF
6726	 */
6727	if (un->un_mspl->bufm == 0)
6728		un->un_dp->options |= ST_NOBUF;
6729
6730	/*
6731	 * set up large read and write retry counts
6732	 */
6733
6734	un->un_dp->max_rretries = un->un_dp->max_wretries = 1000;
6735
6736	/*
6737	 * If this is a 0.50 inch reel tape, and
6738	 * it is *not* variable mode, try and
6739	 * set it to variable record length
6740	 * mode.
6741	 */
6742	if ((un->un_dp->options & ST_REEL) && un->un_bsize != 0 &&
6743	    (un->un_dp->options & ST_VARIABLE)) {
6744		if (st_change_block_size(dev, 0) == 0) {
6745			un->un_dp->bsize = 0;
6746			un->un_mspl->high_bl = un->un_mspl->mid_bl =
6747			    un->un_mspl->low_bl = 0;
6748		}
6749	}
6750
6751	/*
6752	 * Write to console about type of device found
6753	 */
6754	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
6755	    "Generic Drive, Vendor=%s\n\t%s", un->un_dp->name,
6756	    sizestr);
6757	if (un->un_dp->options & ST_VARIABLE) {
6758		scsi_log(ST_DEVINFO, st_label, CE_NOTE,
6759		    "!Variable record length I/O\n");
6760	} else {
6761		scsi_log(ST_DEVINFO, st_label, CE_NOTE,
6762		    "!Fixed record length (%d byte blocks) I/O\n",
6763		    un->un_dp->bsize);
6764	}
6765	ASSERT(mutex_owned(ST_MUTEX));
6766	return (0);
6767}
6768
6769static int
6770st_determine_density(dev_t dev, int rw)
6771{
6772	int rval = 0;
6773
6774	GET_SOFT_STATE(dev);
6775
6776	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6777	    "st_determine_density(dev = 0x%lx, rw = %s)\n",
6778	    dev, (rw == B_WRITE ? wr_str: rd_str));
6779
6780	ASSERT(mutex_owned(ST_MUTEX));
6781
6782	/*
6783	 * If we're past BOT, density is determined already.
6784	 */
6785	if (un->un_fileno > 0 || (un->un_fileno == 0 && un->un_blkno != 0)) {
6786		/*
6787		 * XXX: put in a bitch message about attempting to
6788		 * XXX: change density past BOT.
6789		 */
6790		goto exit;
6791	}
6792
6793	/*
6794	 * If we're going to be writing, we set the density
6795	 */
6796	if (rw == 0 || rw == B_WRITE) {
6797		/* un_curdens is used as an index into densities table */
6798		un->un_curdens = MT_DENSITY(un->un_dev);
6799		if (st_set_density(dev)) {
6800			rval = -1;
6801		}
6802		goto exit;
6803	}
6804
6805	/*
6806	 * If density is known already,
6807	 * we don't have to get it again.(?)
6808	 */
6809	if (!un->un_density_known) {
6810		if (st_get_density(dev)) {
6811			rval = -1;
6812		}
6813	}
6814
6815exit:
6816	ASSERT(mutex_owned(ST_MUTEX));
6817	return (rval);
6818}
6819
6820
6821/*
6822 * Try to determine density. We do this by attempting to read the
6823 * first record off the tape, cycling through the available density
6824 * codes as we go.
6825 */
6826
6827static int
6828st_get_density(dev_t dev)
6829{
6830	int succes = 0, rval = -1, i;
6831	uint_t size;
6832	uchar_t dens, olddens;
6833
6834	GET_SOFT_STATE(dev);
6835
6836	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6837	    "st_get_density(dev = 0x%lx)\n", dev);
6838
6839	ASSERT(mutex_owned(ST_MUTEX));
6840
6841	/*
6842	 * If Auto Density override is enabled The drive has
6843	 * only one density and there is no point in attempting
6844	 * find the correct one.
6845	 *
6846	 * Since most modern drives auto detect the density
6847	 * and format of the recorded media before they come
6848	 * ready. What this function does is a legacy behavior
6849	 * and modern drives not only don't need it, The backup
6850	 * utilities that do positioning via uscsi find the un-
6851	 * expected rewinds problematic.
6852	 *
6853	 * The drives that need this are old reel to reel devices.
6854	 * I took a swag and said they must be scsi-1 or older.
6855	 * I don't beleave there will any of the newer devices
6856	 * that need this. There will be some scsi-1 devices that
6857	 * don't need this but I don't think they will be using the
6858	 * BIG aftermarket backup and restore utilitys.
6859	 */
6860	if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) ||
6861	    (un->un_sd->sd_inq->inq_ansi > 1)) {
6862		un->un_density_known = 1;
6863		rval = 0;
6864		goto exit;
6865	}
6866
6867	/*
6868	 * This will only work on variable record length tapes
6869	 * if and only if all variable record length tapes autodensity
6870	 * select.
6871	 */
6872	size = (unsigned)(un->un_dp->bsize ? un->un_dp->bsize : SECSIZE);
6873	un->un_tmpbuf = kmem_alloc(size, KM_SLEEP);
6874
6875	/*
6876	 * Start at the specified density
6877	 */
6878
6879	dens = olddens = un->un_curdens = MT_DENSITY(un->un_dev);
6880
6881	for (i = 0; i < NDENSITIES; i++, ((un->un_curdens == NDENSITIES - 1) ?
6882					(un->un_curdens = 0) :
6883					(un->un_curdens += 1))) {
6884		/*
6885		 * If we've done this density before,
6886		 * don't bother to do it again.
6887		 */
6888		dens = un->un_dp->densities[un->un_curdens];
6889		if (i > 0 && dens == olddens)
6890			continue;
6891		olddens = dens;
6892		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
6893		    "trying density 0x%x\n", dens);
6894		if (st_set_density(dev)) {
6895			continue;
6896		}
6897
6898		/*
6899		 * XXX - the creates lots of headaches and slowdowns - must
6900		 * fix.
6901		 */
6902		succes = (st_cmd(dev, SCMD_READ, (int)size, SYNC_CMD) == 0);
6903		if (st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD)) {
6904			break;
6905		}
6906		if (succes) {
6907			st_init(un);
6908			rval = 0;
6909			un->un_density_known = 1;
6910			break;
6911		}
6912	}
6913	kmem_free(un->un_tmpbuf, size);
6914	un->un_tmpbuf = 0;
6915
6916exit:
6917	ASSERT(mutex_owned(ST_MUTEX));
6918	return (rval);
6919}
6920
6921static int
6922st_set_density(dev_t dev)
6923{
6924	int rval = 0;
6925
6926	GET_SOFT_STATE(dev);
6927
6928	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6929	    "st_set_density(dev = 0x%lx): density = 0x%x\n", dev,
6930	    un->un_dp->densities[un->un_curdens]);
6931
6932	ASSERT(mutex_owned(ST_MUTEX));
6933
6934	un->un_mspl->density = un->un_dp->densities[un->un_curdens];
6935
6936	if ((un->un_dp->options & ST_AUTODEN_OVERRIDE) == 0) {
6937		/*
6938		 * If auto density override is not set, Use mode select
6939		 * to set density and compression.
6940		 */
6941		if (st_modeselect(un)) {
6942			rval = -1;
6943		}
6944	} else if ((un->un_dp->options & ST_MODE_SEL_COMP) != 0) {
6945		/*
6946		 * If auto density and mode select compression are set,
6947		 * This is a drive with one density code but compression
6948		 * can be enabled or disabled.
6949		 * Set compression but no need to set density.
6950		 */
6951		rval = st_set_compression(un);
6952		if ((rval != 0) && (rval != EALREADY)) {
6953			rval = -1;
6954		} else {
6955			rval = 0;
6956		}
6957	}
6958
6959	/* If sucessful set density and/or compression, mark density known */
6960	if (rval == 0) {
6961		un->un_density_known = 1;
6962	}
6963
6964	ASSERT(mutex_owned(ST_MUTEX));
6965	return (rval);
6966}
6967
6968static int
6969st_loadtape(dev_t dev)
6970{
6971	int rval;
6972
6973	GET_SOFT_STATE(dev);
6974
6975	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
6976	    "st_loadtape(dev = 0x%lx)\n", dev);
6977
6978	ASSERT(mutex_owned(ST_MUTEX));
6979
6980	/*
6981	 * 'LOAD' the tape to BOT by rewinding
6982	 */
6983	rval = st_cmd(dev, SCMD_REWIND, 1, SYNC_CMD);
6984	if (rval == 0) {
6985		st_init(un);
6986		un->un_density_known = 0;
6987	}
6988
6989	ASSERT(mutex_owned(ST_MUTEX));
6990	return (rval);
6991}
6992
6993
6994/*
6995 * Note: QIC devices aren't so smart.  If you try to append
6996 * after EOM, the write can fail because the device doesn't know
6997 * it's at EOM.	 In that case, issue a read.  The read should fail
6998 * because there's no data, but the device knows it's at EOM,
6999 * so a subsequent write should succeed.  To further confuse matters,
7000 * the target returns the same error if the tape is positioned
7001 * such that a write would overwrite existing data.  That's why
7002 * we have to do the append test.  A read in the middle of
7003 * recorded data would succeed, thus indicating we're attempting
7004 * something illegal.
7005 */
7006
7007void bp_mapin(struct buf *bp);
7008
7009static void
7010st_test_append(struct buf *bp)
7011{
7012	dev_t dev = bp->b_edev;
7013	struct scsi_tape *un;
7014	uchar_t status;
7015	unsigned bcount;
7016
7017	un = ddi_get_soft_state(st_state, MTUNIT(dev));
7018
7019	ASSERT(mutex_owned(ST_MUTEX));
7020
7021	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7022	    "st_test_append(): fileno %d\n", un->un_fileno);
7023
7024	un->un_laststate = un->un_state;
7025	un->un_state = ST_STATE_APPEND_TESTING;
7026	un->un_test_append = 0;
7027
7028	/*
7029	 * first, map in the buffer, because we're doing a double write --
7030	 * first into the kernel, then onto the tape.
7031	 */
7032	bp_mapin(bp);
7033
7034	/*
7035	 * get a copy of the data....
7036	 */
7037	un->un_tmpbuf = kmem_alloc((unsigned)bp->b_bcount, KM_SLEEP);
7038	bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount);
7039
7040	/*
7041	 * attempt the write..
7042	 */
7043
7044	if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount, SYNC_CMD) == 0) {
7045success:
7046		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7047		    "append write succeeded\n");
7048		bp->b_resid = un->un_sbufp->b_resid;
7049		mutex_exit(ST_MUTEX);
7050		bcount = (unsigned)bp->b_bcount;
7051		biodone(bp);
7052		mutex_enter(ST_MUTEX);
7053		un->un_laststate = un->un_state;
7054		un->un_state = ST_STATE_OPEN;
7055		kmem_free(un->un_tmpbuf, bcount);
7056		un->un_tmpbuf = NULL;
7057		return;
7058	}
7059
7060	/*
7061	 * The append failed. Do a short read. If that fails,  we are at EOM
7062	 * so we can retry the write command. If that succeeds, than we're
7063	 * all screwed up (the controller reported a real error).
7064	 *
7065	 * XXX: should the dummy read be > SECSIZE? should it be the device's
7066	 * XXX: block size?
7067	 *
7068	 */
7069	status = un->un_status;
7070	un->un_status = 0;
7071	(void) st_cmd(dev, SCMD_READ, SECSIZE, SYNC_CMD);
7072	if (un->un_status == KEY_BLANK_CHECK) {
7073		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7074		    "append at EOM\n");
7075		/*
7076		 * Okay- the read failed. We should actually have confused
7077		 * the controller enough to allow writing. In any case, the
7078		 * i/o is on its own from here on out.
7079		 */
7080		un->un_laststate = un->un_state;
7081		un->un_state = ST_STATE_OPEN;
7082		bcopy(bp->b_un.b_addr, un->un_tmpbuf, (uint_t)bp->b_bcount);
7083		if (st_cmd(dev, (int)SCMD_WRITE, (int)bp->b_bcount,
7084		    SYNC_CMD) == 0) {
7085			goto success;
7086		}
7087	}
7088
7089	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7090	    "append write failed- not at EOM\n");
7091	bp->b_resid = bp->b_bcount;
7092	st_bioerror(bp, EIO);
7093
7094	ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
7095	    "st_test_append : EIO : append write failed - not at EOM");
7096
7097	/*
7098	 * backspace one record to get back to where we were
7099	 */
7100	if (st_cmd(dev, SCMD_SPACE, Blk(-1), SYNC_CMD)) {
7101		un->un_fileno = -1;
7102	}
7103
7104	un->un_err_resid = bp->b_resid;
7105	un->un_status = status;
7106
7107	/*
7108	 * Note: biodone will do a bp_mapout()
7109	 */
7110	mutex_exit(ST_MUTEX);
7111	bcount = (unsigned)bp->b_bcount;
7112	biodone(bp);
7113	mutex_enter(ST_MUTEX);
7114	un->un_laststate = un->un_state;
7115	un->un_state = ST_STATE_OPEN_PENDING_IO;
7116	kmem_free(un->un_tmpbuf, bcount);
7117	un->un_tmpbuf = NULL;
7118}
7119
7120/*
7121 * Special command handler
7122 */
7123
7124/*
7125 * common st_cmd code. The fourth parameter states
7126 * whether the caller wishes to await the results
7127 * Note the release of the mutex during most of the function
7128 */
7129static int
7130st_cmd(dev_t dev, int com, int count, int wait)
7131{
7132	struct buf *bp;
7133	int err;
7134
7135	GET_SOFT_STATE(dev);
7136
7137	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7138	    "st_cmd(dev = 0x%lx, com = 0x%x, count = %x, wait = %d)\n",
7139	    dev, com, count, wait);
7140
7141	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
7142	ASSERT(mutex_owned(ST_MUTEX));
7143
7144#ifdef STDEBUG
7145	if (st_debug)
7146		st_debug_cmds(un, com, count, wait);
7147#endif
7148
7149	/* check to see if this command requires the drive to be reserved */
7150	err = st_check_cmd_for_need_to_reserve(un, com, count);
7151
7152	if (err) {
7153		return (err);
7154	}
7155
7156	while (un->un_sbuf_busy)
7157		cv_wait(&un->un_sbuf_cv, ST_MUTEX);
7158	un->un_sbuf_busy = 1;
7159
7160	bp = un->un_sbufp;
7161	bzero(bp, sizeof (buf_t));
7162
7163	bp->b_flags = (wait) ? B_BUSY : B_BUSY|B_ASYNC;
7164
7165	/*
7166	 * Set count to the actual size of the data tranfer.
7167	 * For commands with no data transfer, set bp->b_bcount
7168	 * to the value to be used when constructing the
7169	 * cdb in st_make_cmd().
7170	 */
7171	switch (com) {
7172	case SCMD_READ:
7173		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7174		    "special read %d\n", count);
7175		bp->b_flags |= B_READ;
7176		bp->b_un.b_addr = un->un_tmpbuf;
7177		break;
7178
7179	case SCMD_WRITE:
7180		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7181		    "special write %d\n", count);
7182		bp->b_un.b_addr = un->un_tmpbuf;
7183		break;
7184
7185	case SCMD_WRITE_FILE_MARK:
7186		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7187		    "write %d file marks\n", count);
7188		bp->b_bcount = count;
7189		count = 0;
7190		break;
7191
7192	case SCMD_REWIND:
7193		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "rewind\n");
7194		bp->b_bcount = 0;
7195		count = 0;
7196		break;
7197
7198	case SCMD_SPACE:
7199		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "space\n");
7200		bp->b_bcount = count;
7201		count = 0;
7202		break;
7203
7204	case SCMD_RESERVE:
7205		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "reserve");
7206		bp->b_bcount = 0;
7207		count = 0;
7208		break;
7209
7210	case SCMD_RELEASE:
7211		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "release");
7212		bp->b_bcount = 0;
7213		count = 0;
7214		break;
7215
7216	case SCMD_LOAD:
7217		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7218		    "%s tape\n", (count) ? "load" : "unload");
7219		bp->b_bcount = count;
7220		count = 0;
7221		break;
7222
7223	case SCMD_ERASE:
7224		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7225		    "erase tape\n");
7226		bp->b_bcount = 0;
7227		count = 0;
7228		break;
7229
7230	case SCMD_MODE_SENSE:
7231		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7232		    "mode sense\n");
7233		bp->b_flags |= B_READ;
7234		bp->b_un.b_addr = (caddr_t)(un->un_mspl);
7235		break;
7236
7237	case SCMD_MODE_SELECT:
7238		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7239		    "mode select\n");
7240		bp->b_un.b_addr = (caddr_t)(un->un_mspl);
7241		break;
7242
7243	case SCMD_READ_BLKLIM:
7244		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7245		    "read block limits\n");
7246		bp->b_flags |= B_READ;
7247		bp->b_un.b_addr = (caddr_t)(un->un_rbl);
7248		break;
7249
7250	case SCMD_TEST_UNIT_READY:
7251		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7252		    "test unit ready\n");
7253		bp->b_bcount = 0;
7254		count = 0;
7255		break;
7256	default:
7257		ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
7258		    "Unhandled scsi command 0x%x in st_cmd()\n", com);
7259	}
7260
7261	mutex_exit(ST_MUTEX);
7262
7263	if (count > 0) {
7264		/*
7265		 * We're going to do actual I/O.
7266		 * Set things up for physio.
7267		 */
7268		struct iovec aiov;
7269		struct uio auio;
7270		struct uio *uio = &auio;
7271
7272		bzero(&auio, sizeof (struct uio));
7273		bzero(&aiov, sizeof (struct iovec));
7274		aiov.iov_base = bp->b_un.b_addr;
7275		aiov.iov_len = count;
7276
7277		uio->uio_iov = &aiov;
7278		uio->uio_iovcnt = 1;
7279		uio->uio_resid = aiov.iov_len;
7280		uio->uio_segflg = UIO_SYSSPACE;
7281
7282		/*
7283		 * Let physio do the rest...
7284		 */
7285		bp->b_forw = (struct buf *)(uintptr_t)com;
7286		bp->b_back = NULL;
7287		err = physio(st_strategy, bp, dev,
7288			(bp->b_flags & B_READ) ? B_READ : B_WRITE,
7289			st_minphys, uio);
7290		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7291		    "st_cmd: physio returns %d\n", err);
7292	} else {
7293		/*
7294		 * Mimic physio
7295		 */
7296		bp->b_forw = (struct buf *)(uintptr_t)com;
7297		bp->b_back = NULL;
7298		bp->b_edev = dev;
7299		bp->b_dev = cmpdev(dev);
7300		bp->b_blkno = 0;
7301		bp->b_resid = 0;
7302		(void) st_strategy(bp);
7303		if (!wait) {
7304			/*
7305			 * This is an async command- the caller won't wait
7306			 * and doesn't care about errors.
7307			 */
7308			mutex_enter(ST_MUTEX);
7309			return (0);
7310		}
7311
7312		/*
7313		 * BugTraq #4260046
7314		 * ----------------
7315		 * Restore Solaris 2.5.1 behavior, namely call biowait
7316		 * unconditionally. The old comment said...
7317		 *
7318		 * "if strategy was flagged with  persistent errors, we would
7319		 *  have an error here, and the bp would never be sent, so we
7320		 *  don't want to wait on a bp that was never sent...or hang"
7321		 *
7322		 * The new rationale, courtesy of Chitrank...
7323		 *
7324		 * "we should unconditionally biowait() here because
7325		 *  st_strategy() will do a biodone() in the persistent error
7326		 *  case and the following biowait() will return immediately.
7327		 *  If not, in the case of "errors after pkt alloc" in
7328		 *  st_start(), we will not biowait here which will cause the
7329		 *  next biowait() to return immediately which will cause
7330		 *  us to send out the next command. In the case where both of
7331		 *  these use the sbuf, when the first command completes we'll
7332		 *  free the packet attached to sbuf and the same pkt will
7333		 *  get freed again when we complete the second command.
7334		 *  see esc 518987.  BTW, it is necessary to do biodone() in
7335		 *  st_start() for the pkt alloc failure case because physio()
7336		 *  does biowait() and will hang if we don't do biodone()"
7337		 */
7338
7339		err = biowait(bp);
7340		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7341		    "st_cmd: biowait returns %d\n", err);
7342	}
7343	mutex_enter(ST_MUTEX);
7344
7345	un->un_sbuf_busy = 0;
7346	cv_signal(&un->un_sbuf_cv);
7347	return (err);
7348}
7349
7350static int
7351st_set_compression(struct scsi_tape *un)
7352{
7353	int rval;
7354	int turn_compression_on;
7355	minor_t minor;
7356
7357	/*
7358	 * Drive either dosn't have compression or it is controlled with
7359	 * special density codes. Return ENOTTY so caller
7360	 * knows nothing was done.
7361	 */
7362	if ((un->un_dp->options & ST_MODE_SEL_COMP) == 0) {
7363		un->un_comp_page = 0;
7364		return (ENOTTY);
7365	}
7366
7367	/* set compression based on minor node opened */
7368	minor = MT_DENSITY(un->un_dev);
7369
7370	/*
7371	 * If this the compression density or
7372	 * the drive has two densities and uses mode select for
7373	 * control of compression turn on compression for MT_DENSITY2
7374	 * as well.
7375	 */
7376	if ((minor == ST_COMPRESSION_DENSITY) ||
7377	    (minor == MT_DENSITY(MT_DENSITY2)) &&
7378	    (un->un_dp->densities[0] == un->un_dp->densities[1]) &&
7379	    (un->un_dp->densities[2] == un->un_dp->densities[3]) &&
7380	    (un->un_dp->densities[0] != un->un_dp->densities[2])) {
7381
7382		turn_compression_on = 1;
7383	} else {
7384		turn_compression_on = 0;
7385	}
7386
7387	un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16);
7388	un->un_mspl->mid_bl  = (uchar_t)(un->un_bsize >> 8);
7389	un->un_mspl->low_bl  = (uchar_t)(un->un_bsize);
7390
7391	/*
7392	 * Need to determine which page does the device use for compression.
7393	 * First try the data compression page. If this fails try the device
7394	 * configuration page
7395	 */
7396
7397	if ((un->un_comp_page & ST_DEV_DATACOMP_PAGE) == ST_DEV_DATACOMP_PAGE) {
7398		rval = st_set_datacomp_page(un, turn_compression_on);
7399		if (rval == EALREADY) {
7400			return (rval);
7401		}
7402		if (rval != 0) {
7403			if (un->un_status == KEY_ILLEGAL_REQUEST) {
7404				/*
7405				 * This device does not support data
7406				 * compression page
7407				 */
7408				un->un_comp_page = ST_DEV_CONFIG_PAGE;
7409			} else if (un->un_state >= ST_STATE_OPEN) {
7410				un->un_fileno = -1;
7411				rval = EIO;
7412			} else {
7413				rval = -1;
7414			}
7415		} else {
7416			un->un_comp_page = ST_DEV_DATACOMP_PAGE;
7417		}
7418	}
7419
7420	if ((un->un_comp_page & ST_DEV_CONFIG_PAGE) == ST_DEV_CONFIG_PAGE) {
7421		rval = st_set_devconfig_page(un, turn_compression_on);
7422		if (rval == EALREADY) {
7423			return (rval);
7424		}
7425		if (rval != 0) {
7426			if (un->un_status == KEY_ILLEGAL_REQUEST) {
7427				/*
7428				 * This device does not support
7429				 * compression at all advice the
7430				 * user and unset ST_MODE_SEL_COMP
7431				 */
7432				un->un_dp->options &= ~ST_MODE_SEL_COMP;
7433				un->un_comp_page = 0;
7434				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
7435				    "Device Does Not Support Compression\n");
7436			} else if (un->un_state >= ST_STATE_OPEN) {
7437				un->un_fileno = -1;
7438				rval = EIO;
7439			} else {
7440				rval = -1;
7441			}
7442		}
7443	}
7444
7445	return (rval);
7446}
7447
7448/*
7449 * set or unset compression thru device configuration page.
7450 */
7451static int
7452st_set_devconfig_page(struct scsi_tape *un, int compression_on)
7453{
7454	unsigned char cflag;
7455	int rval = 0;
7456
7457	ASSERT(mutex_owned(ST_MUTEX));
7458
7459	/*
7460	 * Figure what to set compression flag to.
7461	 */
7462	if (compression_on) {
7463		/* They have selected a compression node */
7464		if (un->un_dp->type == ST_TYPE_FUJI) {
7465			cflag = 0x84;   /* use EDRC */
7466		} else {
7467			cflag = ST_DEV_CONFIG_DEF_COMP;
7468		}
7469	} else {
7470		cflag = ST_DEV_CONFIG_NO_COMP;
7471	}
7472
7473	/*
7474	 * If compression is already set the way it was requested.
7475	 * And if this not the first time we has tried.
7476	 */
7477	if ((cflag == un->un_mspl->page.dev.comp_alg) &&
7478	    (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) {
7479		return (EALREADY);
7480	}
7481
7482	un->un_mspl->page.dev.comp_alg = cflag;
7483	/*
7484	 * need to send mode select even if correct compression is
7485	 * already set since need to set density code
7486	 */
7487
7488#ifdef STDEBUG
7489	if (st_debug >= 6) {
7490		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
7491		    "st_set_devconfig_page: sense data for mode select",
7492		    (char *)un->un_mspl, sizeof (struct seq_mode));
7493	}
7494#endif
7495	rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode));
7496
7497	return (rval);
7498}
7499
7500/*
7501 * set/reset compression bit thru data compression page
7502 */
7503static int
7504st_set_datacomp_page(struct scsi_tape *un, int compression_on)
7505{
7506	int compression_on_already;
7507	int rval = 0;
7508
7509	ASSERT(mutex_owned(ST_MUTEX));
7510
7511	/*
7512	 * If drive is not capable of compression (at this time)
7513	 * return EALREADY so caller doesn't think that this page
7514	 * is not supported. This check is for drives that can
7515	 * disable compression from the front panel or configuration.
7516	 * I doubt that a drive that supports this page is not really
7517	 * capable of compression.
7518	 */
7519	if (un->un_mspl->page.comp.dcc == 0) {
7520		return (EALREADY);
7521	}
7522
7523	/* See if compression currently turned on */
7524	if (un->un_mspl->page.comp.dce) {
7525		compression_on_already = 1;
7526	} else {
7527		compression_on_already = 0;
7528	}
7529
7530	/*
7531	 * If compression is already set the way it was requested.
7532	 * And if this not the first time we has tried.
7533	 */
7534	if ((compression_on == compression_on_already) &&
7535	    (un->un_comp_page == ST_DEV_DATACOMP_PAGE)) {
7536		return (EALREADY);
7537	}
7538
7539	/*
7540	 * if we are already set to the appropriate compression
7541	 * mode, don't set it again
7542	 */
7543	if (compression_on) {
7544		/* compression selected */
7545		un->un_mspl->page.comp.dce = 1;
7546	} else {
7547		un->un_mspl->page.comp.dce = 0;
7548	}
7549
7550
7551#ifdef STDEBUG
7552	if (st_debug >= 6) {
7553		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
7554		    "st_set_datacomp_page: sense data for mode select",
7555		    (char *)un->un_mspl, sizeof (struct seq_mode));
7556	}
7557#endif
7558	rval = st_gen_mode_select(un, un->un_mspl, sizeof (struct seq_mode));
7559
7560	return (rval);
7561}
7562
7563static int
7564st_modesense(struct scsi_tape *un)
7565{
7566	int rval;
7567	uchar_t page;
7568
7569	page = un->un_comp_page;
7570
7571	switch (page) {
7572	case ST_DEV_DATACOMP_PAGE:
7573	case ST_DEV_CONFIG_PAGE: /* fall through */
7574		rval = st_gen_mode_sense(un, page, un->un_mspl,
7575		    sizeof (struct seq_mode));
7576		break;
7577
7578	case ST_DEV_DATACOMP_PAGE | ST_DEV_CONFIG_PAGE:
7579		if (un->un_dp->options & ST_MODE_SEL_COMP) {
7580			page = ST_DEV_DATACOMP_PAGE;
7581			rval = st_gen_mode_sense(un, page, un->un_mspl,
7582			    sizeof (struct seq_mode));
7583			if (rval == 0 && un->un_mspl->page_code == page) {
7584				un->un_comp_page = page;
7585				break;
7586			}
7587			page = ST_DEV_CONFIG_PAGE;
7588			rval = st_gen_mode_sense(un, page, un->un_mspl,
7589			    sizeof (struct seq_mode));
7590			if (rval == 0 && un->un_mspl->page_code == page) {
7591				un->un_comp_page = page;
7592				break;
7593			}
7594			un->un_dp->options &= ~ST_MODE_SEL_COMP;
7595			un->un_comp_page = 0;
7596		} else {
7597			un->un_comp_page = 0;
7598		}
7599
7600	default:	/* fall through */
7601		rval = st_cmd(un->un_dev, SCMD_MODE_SENSE, MSIZE, SYNC_CMD);
7602	}
7603	return (rval);
7604}
7605
7606static int
7607st_modeselect(struct scsi_tape *un)
7608{
7609	int rval = 0;
7610	int ix;
7611
7612	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7613	    "st_modeselect(dev = 0x%lx): density = 0x%x\n",
7614	    un->un_dev, un->un_mspl->density);
7615
7616	ASSERT(mutex_owned(ST_MUTEX));
7617
7618	/*
7619	 * The parameter list should be the same for all of the
7620	 * cases that follow so set them here
7621	 *
7622	 * Try mode select first if if fails set fields manually
7623	 */
7624	rval = st_modesense(un);
7625	if (rval != 0) {
7626		ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
7627		    "st_modeselect: First mode sense failed\n");
7628		un->un_mspl->bd_len  = 8;
7629		un->un_mspl->high_nb = 0;
7630		un->un_mspl->mid_nb  = 0;
7631		un->un_mspl->low_nb  = 0;
7632	}
7633	un->un_mspl->high_bl = (uchar_t)(un->un_bsize >> 16);
7634	un->un_mspl->mid_bl  = (uchar_t)(un->un_bsize >> 8);
7635	un->un_mspl->low_bl  = (uchar_t)(un->un_bsize);
7636
7637
7638	/*
7639	 * If configured to use a specific density code for a media type.
7640	 * curdens is previously set by the minor node opened.
7641	 * If the media type doesn't match the minor node we change it so it
7642	 * looks like the correct one was opened.
7643	 */
7644	if (un->un_dp->options & ST_KNOWS_MEDIA) {
7645		uchar_t best;
7646
7647		for (best = 0xff, ix = 0; ix < NDENSITIES; ix++) {
7648			if (un->un_mspl->media_type ==
7649			    un->un_dp->mediatype[ix]) {
7650				best = ix;
7651				/*
7652				 * It matches but it might not be the only one.
7653				 * Use the highest matching media type but not
7654				 * to exceed the density selected by the open.
7655				 */
7656				if (ix < un->un_curdens) {
7657					continue;
7658				}
7659				un->un_curdens = ix;
7660				break;
7661			}
7662		}
7663		/* If a match was found best will not be 0xff any more */
7664		if (best < NDENSITIES) {
7665			ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
7666			    "found media 0x%X using density 0x%X\n",
7667			    un->un_mspl->media_type,
7668			    un->un_dp->densities[best]);
7669			un->un_mspl->density = un->un_dp->densities[best];
7670		} else {
7671			/* Otherwise set density based on minor node opened */
7672			un->un_mspl->density =
7673			    un->un_dp->densities[un->un_curdens];
7674		}
7675	} else {
7676		un->un_mspl->density = un->un_dp->densities[un->un_curdens];
7677	}
7678
7679	if (un->un_dp->options & ST_NOBUF) {
7680		un->un_mspl->bufm = 0;
7681	} else {
7682		un->un_mspl->bufm = 1;
7683	}
7684
7685	rval = st_set_compression(un);
7686
7687	/*
7688	 * If st_set_compression returned invalid or already it
7689	 * found no need to do the mode select.
7690	 * So do it here.
7691	 */
7692	if ((rval == ENOTTY) || (rval == EALREADY)) {
7693
7694		/* Zero non-writeable fields */
7695		un->un_mspl->data_len = 0;
7696		un->un_mspl->media_type = 0;
7697		un->un_mspl->wp = 0;
7698
7699		/* need to set the density code */
7700		rval = st_cmd(un->un_dev, SCMD_MODE_SELECT, MSIZE, SYNC_CMD);
7701		if (rval != 0) {
7702			if (un->un_state >= ST_STATE_OPEN) {
7703				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
7704				    "unable to set tape mode\n");
7705				un->un_fileno = -1;
7706				rval = EIO;
7707			} else {
7708				rval = -1;
7709			}
7710		}
7711	}
7712
7713	/*
7714	 * The spec recommends to send a mode sense after a mode select
7715	 */
7716	(void) st_modesense(un);
7717
7718	ASSERT(mutex_owned(ST_MUTEX));
7719
7720	return (rval);
7721}
7722
7723/*
7724 * st_gen_mode_sense
7725 *
7726 * generic mode sense.. it allows for any page
7727 */
7728static int
7729st_gen_mode_sense(struct scsi_tape *un, int page, struct seq_mode *page_data,
7730    int page_size)
7731{
7732
7733	int r;
7734	char	cdb[CDB_GROUP0];
7735	struct uscsi_cmd *com;
7736
7737	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7738
7739	bzero(cdb, CDB_GROUP0);
7740	cdb[0] = SCMD_MODE_SENSE;
7741	cdb[2] = (char)page;
7742	cdb[4] = (char)page_size;
7743
7744	com->uscsi_cdb = cdb;
7745	com->uscsi_cdblen = CDB_GROUP0;
7746	com->uscsi_bufaddr = (caddr_t)page_data;
7747	com->uscsi_buflen = page_size;
7748	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7749	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT |
7750			    USCSI_READ | USCSI_RQENABLE;
7751
7752	r = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE,
7753		UIO_SYSSPACE);
7754	kmem_free(com, sizeof (*com));
7755	return (r);
7756}
7757
7758/*
7759 * st_gen_mode_select
7760 *
7761 * generic mode select.. it allows for any page
7762 */
7763static int
7764st_gen_mode_select(struct scsi_tape *un, struct seq_mode *page_data,
7765    int page_size)
7766{
7767
7768	int r;
7769	char cdb[CDB_GROUP0];
7770	struct uscsi_cmd *com;
7771
7772	/* Zero non-writeable fields */
7773	page_data->data_len = 0;
7774	page_data->media_type = 0;
7775	page_data->wp = 0;
7776
7777	/*
7778	 * If mode select has any page data, zero the ps (Page Savable) bit.
7779	 */
7780	if (page_size > MSIZE) {
7781		page_data->ps = 0;
7782	}
7783
7784
7785	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
7786
7787	/*
7788	 * then, do a mode select to set what ever info
7789	 */
7790	bzero(cdb, CDB_GROUP0);
7791	cdb[0] = SCMD_MODE_SELECT;
7792	cdb[1] = 0x10;		/* set PF bit for many third party drives */
7793	cdb[4] = (char)page_size;
7794
7795	com->uscsi_cdb = cdb;
7796	com->uscsi_cdblen = CDB_GROUP0;
7797	com->uscsi_bufaddr = (caddr_t)page_data;
7798	com->uscsi_buflen = page_size;
7799	com->uscsi_timeout = un->un_dp->non_motion_timeout;
7800	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT
7801		| USCSI_WRITE | USCSI_RQENABLE;
7802
7803	r = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE,
7804		UIO_SYSSPACE);
7805
7806	kmem_free(com, sizeof (*com));
7807	return (r);
7808}
7809
7810/*
7811 * Changes devices blocksize and bsize to requested blocksize nblksz.
7812 * Returns returned value from first failed call or zero on success.
7813 */
7814static int
7815st_change_block_size(dev_t dev, uint32_t nblksz)
7816{
7817	struct seq_mode *current;
7818	int rval;
7819	uint32_t oldblksz;
7820
7821	GET_SOFT_STATE(dev);
7822
7823	current = kmem_zalloc(MSIZE, KM_SLEEP);
7824
7825	/* Read current settings */
7826	rval = st_gen_mode_sense(un, 0, current, MSIZE);
7827	if (rval != 0) {
7828		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
7829		    "mode sense for change block size failed: rval = %d", rval);
7830		goto finish;
7831	}
7832
7833	/* Figure the current block size */
7834	oldblksz =
7835	    (current->high_bl << 16) |
7836	    (current->mid_bl << 8) |
7837	    (current->low_bl);
7838
7839	/* If current block size is the same as requested were done */
7840	if (oldblksz == nblksz) {
7841		un->un_bsize = nblksz;
7842		rval = 0;
7843		goto finish;
7844	}
7845
7846	/* Change to requested block size */
7847	current->high_bl = (uchar_t)(nblksz >> 16);
7848	current->mid_bl  = (uchar_t)(nblksz >> 8);
7849	current->low_bl  = (uchar_t)(nblksz);
7850
7851	/* Attempt to change block size */
7852	rval = st_gen_mode_select(un, current, MSIZE);
7853	if (rval != 0) {
7854		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
7855		    "Set new block size failed: rval = %d", rval);
7856		goto finish;
7857	}
7858
7859	/* Read back and verify setting */
7860	rval = st_modesense(un);
7861	if (rval == 0) {
7862		un->un_bsize =
7863		    (un->un_mspl->high_bl << 16) |
7864		    (un->un_mspl->mid_bl << 8) |
7865		    (un->un_mspl->low_bl);
7866
7867		if (un->un_bsize != nblksz) {
7868			scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
7869			    "Blocksize set does not equal requested blocksize"
7870			    "(read: %u requested: %u)\n", nblksz, un->un_bsize);
7871			rval = EIO;
7872		}
7873	}
7874finish:
7875	kmem_free(current, MSIZE);
7876	return (rval);
7877}
7878
7879
7880static void
7881st_init(struct scsi_tape *un)
7882{
7883	ASSERT(mutex_owned(ST_MUTEX));
7884
7885	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7886	"st_init(): dev = 0x%lx, will reset fileno, blkno, eof\n", un->un_dev);
7887
7888	un->un_blkno = 0;
7889	un->un_fileno = 0;
7890	un->un_lastop = ST_OP_NIL;
7891	un->un_eof = ST_NO_EOF;
7892	un->un_pwr_mgmt = ST_PWR_NORMAL;
7893	if (st_error_level != SCSI_ERR_ALL) {
7894		if (DEBUGGING) {
7895			st_error_level = SCSI_ERR_ALL;
7896		} else {
7897			st_error_level = SCSI_ERR_RETRYABLE;
7898		}
7899	}
7900}
7901
7902
7903static void
7904st_make_cmd(struct scsi_tape *un, struct buf *bp, int (*func)(caddr_t))
7905{
7906	struct scsi_pkt *pkt;
7907	struct uscsi_cmd *ucmd;
7908	int count, tval = 0;
7909	int flags = 0;
7910	uchar_t com;
7911	char fixbit;
7912
7913	ASSERT(mutex_owned(ST_MUTEX));
7914
7915	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
7916	    "st_make_cmd(): dev = 0x%lx\n", un->un_dev);
7917
7918
7919	/*
7920	 * fixbit is for setting the Fixed Mode and Suppress Incorrect
7921	 * Length Indicator bits on read/write commands, for setting
7922	 * the Long bit on erase commands, and for setting the Code
7923	 * Field bits on space commands.
7924	 * XXX why do we set lastop here?
7925	 */
7926
7927	if (bp != un->un_sbufp) {		/* regular raw I/O */
7928		int stat_size = (un->un_arq_enabled ?
7929			sizeof (struct scsi_arq_status) : 1);
7930		pkt = scsi_init_pkt(ROUTE, NULL, bp,
7931		    CDB_GROUP0, stat_size, 0, 0, func, (caddr_t)un);
7932		if (pkt == NULL) {
7933			goto exit;
7934		}
7935		SET_BP_PKT(bp, pkt);
7936		if (un->un_bsize == 0) {
7937			count = bp->b_bcount;
7938			fixbit = 0;
7939		} else {
7940			count = bp->b_bcount / un->un_bsize;
7941			fixbit = 1;
7942		}
7943		if (bp->b_flags & B_READ) {
7944			com = SCMD_READ;
7945			un->un_lastop = ST_OP_READ;
7946			if ((un->un_bsize == 0) && /* Not Fixed Block */
7947			    (un->un_dp->options & ST_READ_IGNORE_ILI)) {
7948				fixbit = 2;
7949			}
7950		} else {
7951			com = SCMD_WRITE;
7952			un->un_lastop = ST_OP_WRITE;
7953		}
7954
7955		tval = un->un_dp->io_timeout;
7956
7957		/*
7958		 * For really large xfers, increase timeout
7959		 */
7960		if (bp->b_bcount > (10 * ONE_MEG))
7961			tval *= bp->b_bcount/(10 * ONE_MEG);
7962
7963		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7964		    "%s %ld amt 0x%lx\n", (com == SCMD_WRITE) ?
7965		    wr_str: rd_str, un->un_blkno, bp->b_bcount);
7966
7967	} else if ((ucmd = BP_UCMD(bp)) != NULL) {
7968		/*
7969		 * uscsi - build command, allocate scsi resources
7970		 */
7971		st_make_uscsi_cmd(un, ucmd, bp, func);
7972		goto exit;
7973
7974	} else {				/* special I/O */
7975		struct buf *allocbp = NULL;
7976		int stat_size = (un->un_arq_enabled ?
7977			sizeof (struct scsi_arq_status) : 1);
7978
7979
7980		com = (uchar_t)(uintptr_t)bp->b_forw;
7981		count = bp->b_bcount;
7982
7983		switch (com) {
7984		case SCMD_READ:
7985			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
7986			    "special read %d\n", count);
7987			if (un->un_bsize == 0) {
7988				fixbit = 2;	/* suppress SILI */
7989			} else {
7990				fixbit = 1;	/* Fixed Block Mode */
7991				count /= un->un_bsize;
7992			}
7993			allocbp = bp;
7994			un->un_lastop = ST_OP_READ;
7995			tval = un->un_dp->io_timeout;
7996			break;
7997
7998		case SCMD_WRITE:
7999			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8000			    "special write %d\n", count);
8001			if (un->un_bsize != 0) {
8002				fixbit = 1;	/* Fixed Block Mode */
8003				count /= un->un_bsize;
8004			} else {
8005				fixbit = 0;
8006			}
8007			allocbp = bp;
8008			un->un_lastop = ST_OP_WRITE;
8009			tval = un->un_dp->io_timeout;
8010			break;
8011
8012		case SCMD_WRITE_FILE_MARK:
8013			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8014			    "write %d file marks\n", count);
8015			un->un_lastop = ST_OP_WEOF;
8016			fixbit = 0;
8017			tval = un->un_dp->io_timeout;
8018			break;
8019
8020		case SCMD_REWIND:
8021			if (bp->b_flags & B_ASYNC) {
8022				fixbit = 1;
8023			} else {
8024				fixbit = 0;
8025			}
8026			count = 0;
8027			un->un_lastop = ST_OP_CTL;
8028			tval = un->un_dp->rewind_timeout;
8029			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8030			    "rewind\n");
8031			break;
8032
8033		case SCMD_SPACE:
8034			fixbit = Isfmk(count);
8035			count = (int)space_cnt(count);
8036			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8037			    "space %d %s from file %d blk %ld\n",
8038			    count, (fixbit) ? "filemarks" : "records",
8039			    un->un_fileno, un->un_blkno);
8040			un->un_lastop = ST_OP_CTL;
8041			tval = un->un_dp->space_timeout;
8042			break;
8043
8044		case SCMD_LOAD:
8045			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8046			    "%s tape\n", (count & 1) ? "load" : "unload");
8047			fixbit = 0;
8048
8049			/* Loading or Unloading */
8050			if (count & 1) {
8051				tval = un->un_dp->load_timeout;
8052			} else {
8053				tval = un->un_dp->unload_timeout;
8054			}
8055			/* Is Retension requested */
8056			if (count & 2) {
8057				tval += un->un_dp->rewind_timeout;
8058			}
8059			un->un_lastop = ST_OP_CTL;
8060			break;
8061
8062		case SCMD_ERASE:
8063			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8064			    "erase tape\n");
8065			count = 0;
8066			/*
8067			 * We support long erase only
8068			 */
8069			fixbit = 1;
8070			tval = un->un_dp->erase_timeout;
8071			un->un_lastop = ST_OP_CTL;
8072			break;
8073
8074		case SCMD_MODE_SENSE:
8075			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8076			    "mode sense\n");
8077			allocbp = bp;
8078			fixbit = 0;
8079			tval = un->un_dp->non_motion_timeout;
8080			break;
8081
8082		case SCMD_MODE_SELECT:
8083			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8084			    "mode select\n");
8085			allocbp = bp;
8086			fixbit = 0;
8087			tval = un->un_dp->non_motion_timeout;
8088			break;
8089
8090		case SCMD_RESERVE:
8091			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8092			    "reserve\n");
8093			fixbit = 0;
8094			tval = un->un_dp->non_motion_timeout;
8095			break;
8096
8097		case SCMD_RELEASE:
8098			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8099			    "release\n");
8100			fixbit = 0;
8101			tval = un->un_dp->non_motion_timeout;
8102			break;
8103
8104		case SCMD_READ_BLKLIM:
8105			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8106			    "read block limits\n");
8107			allocbp = bp;
8108			fixbit = count = 0;
8109			tval = un->un_dp->non_motion_timeout;
8110			break;
8111
8112		case SCMD_TEST_UNIT_READY:
8113			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8114			    "test unit ready\n");
8115			fixbit = 0;
8116			tval = un->un_dp->non_motion_timeout;
8117			break;
8118		default:
8119			ST_DEBUG(ST_DEVINFO, st_label, CE_PANIC,
8120			    "Unhandled scsi command 0x%x in st_make_cmd()\n",
8121			    com);
8122		}
8123		pkt = scsi_init_pkt(ROUTE, NULL, allocbp,
8124			CDB_GROUP0, stat_size, 0, 0, func, (caddr_t)un);
8125		if (pkt == NULL) {
8126			goto exit;
8127		}
8128		if (allocbp)
8129			ASSERT(geterror(allocbp) == 0);
8130
8131	}
8132
8133	(void) scsi_setup_cdb((union scsi_cdb *)pkt->pkt_cdbp,
8134	    com, 0, (uint_t)count, 0);
8135	FILL_SCSI1_LUN(un->un_sd, pkt);
8136	/*
8137	 * Initialize the SILI/Fixed bits of the byte 1 of cdb.
8138	 */
8139	((union scsi_cdb *)(pkt->pkt_cdbp))->t_code = fixbit;
8140	pkt->pkt_flags = flags;
8141
8142	/*
8143	 * If ST_SHORT_FILEMARKS bit is ON for EXABYTE
8144	 * device, set the Vendor Unique bit to
8145	 * write Short File Mark.
8146	 */
8147	if (com == SCMD_WRITE_FILE_MARK &&
8148		un->un_dp->options & ST_SHORT_FILEMARKS) {
8149		switch (un->un_dp->type) {
8150		case ST_TYPE_EXB8500:
8151		case ST_TYPE_EXABYTE:
8152			/*
8153			 * Now the Vendor Unique bit 7 in Byte 5 of CDB
8154			 * is set to to write Short File Mark
8155			 */
8156			((union scsi_cdb *)pkt->pkt_cdbp)->g0_vu_1 = 1;
8157			break;
8158
8159		default:
8160			/*
8161			 * Well, if ST_SHORT_FILEMARKS is set for other
8162			 * tape drives, it is just ignored
8163			 */
8164			break;
8165		}
8166	}
8167	ASSERT(tval);
8168	pkt->pkt_time = tval;
8169	pkt->pkt_comp = st_intr;
8170	pkt->pkt_private = (opaque_t)bp;
8171	SET_BP_PKT(bp, pkt);
8172
8173exit:
8174	ASSERT(mutex_owned(ST_MUTEX));
8175}
8176
8177
8178/*
8179 * Build a command based on a uscsi command;
8180 */
8181static void
8182st_make_uscsi_cmd(struct scsi_tape *un, struct uscsi_cmd *ucmd,
8183    struct buf *bp, int (*func)(caddr_t))
8184{
8185	struct scsi_pkt *pkt;
8186	caddr_t cdb;
8187	int	cdblen;
8188	int stat_size;
8189
8190	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8191	    "st_make_uscsi_cmd(): dev = 0x%lx\n", un->un_dev);
8192
8193	if (ucmd->uscsi_flags & USCSI_RQENABLE) {
8194		stat_size = (un->un_arq_enabled ?
8195		    sizeof (struct scsi_arq_status) : 1);
8196	} else {
8197		stat_size = 1;
8198	}
8199
8200	ASSERT(mutex_owned(ST_MUTEX));
8201
8202	un->un_lastop = ST_OP_CTL;	/* usual */
8203
8204	cdb = ucmd->uscsi_cdb;
8205	cdblen = ucmd->uscsi_cdblen;
8206
8207	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8208	    "st_make_uscsi_cmd: buflen=%ld bcount=%ld\n",
8209		ucmd->uscsi_buflen, bp->b_bcount);
8210	pkt = scsi_init_pkt(ROUTE, NULL,
8211		(bp->b_bcount > 0) ? bp : NULL,
8212		cdblen, stat_size, 0, 0, func, (caddr_t)un);
8213	if (pkt == NULL) {
8214		goto exit;
8215	}
8216
8217	bcopy(cdb, pkt->pkt_cdbp, (uint_t)cdblen);
8218
8219#ifdef STDEBUG
8220	if (st_debug >= 6) {
8221		st_clean_print(ST_DEVINFO, st_label, SCSI_DEBUG,
8222		    "pkt_cdbp", (char *)cdb, cdblen);
8223	}
8224#endif
8225
8226	if (ucmd->uscsi_flags & USCSI_SILENT) {
8227		pkt->pkt_flags |= FLAG_SILENT;
8228	}
8229
8230	pkt->pkt_time = ucmd->uscsi_timeout;
8231	pkt->pkt_comp = st_intr;
8232	pkt->pkt_private = (opaque_t)bp;
8233	SET_BP_PKT(bp, pkt);
8234exit:
8235	ASSERT(mutex_owned(ST_MUTEX));
8236}
8237
8238
8239/*
8240 * restart cmd currently at the head of the runq
8241 *
8242 * If scsi_transport() succeeds or the retries
8243 * count exhausted, restore the throttle that was
8244 * zeroed out in st_handle_intr_busy().
8245 *
8246 */
8247static void
8248st_intr_restart(void *arg)
8249{
8250	struct scsi_tape *un = arg;
8251	struct buf *bp;
8252	int status = TRAN_ACCEPT;
8253
8254	mutex_enter(ST_MUTEX);
8255
8256	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8257		"st_intr_restart(), un = 0x%p\n", (void *)un);
8258
8259	un->un_hib_tid = 0;
8260
8261	/*
8262	 * move from waitq to runq, if there is anything on the waitq
8263	 */
8264	if ((bp = un->un_quef) == NULL) {
8265		mutex_exit(ST_MUTEX);
8266		return;
8267	}
8268
8269	/*
8270	 * Here we know :
8271	 *	throttle = 0, via st_handle_intr_busy
8272	 */
8273
8274	if (un->un_quel == bp) {
8275		un->un_quel = NULL;
8276		un->un_quef = NULL;	/* we know it's the first one */
8277	} else {
8278		un->un_quef = bp->b_actf;
8279	}
8280	bp->b_actf = NULL;
8281
8282	if (un->un_runqf) {
8283		/*
8284		 * not good, we don't want to requeue something after
8285		 * another.
8286		 */
8287		mutex_exit(ST_MUTEX);
8288		goto done_error;
8289	} else {
8290		un->un_runqf = bp;
8291		un->un_runql = bp;
8292	}
8293
8294	ST_DO_KSTATS(bp, kstat_waitq_to_runq);
8295
8296	mutex_exit(ST_MUTEX);
8297
8298	status = scsi_transport(BP_PKT(bp));
8299
8300	mutex_enter(ST_MUTEX);
8301
8302	if (status != TRAN_ACCEPT) {
8303		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
8304		mutex_exit(ST_MUTEX);
8305
8306		if (status == TRAN_BUSY) {
8307			if (st_handle_intr_busy(un, bp,
8308			    ST_TRAN_BUSY_TIMEOUT) == 0)
8309				return;	/* timeout is setup again */
8310		}
8311
8312	} else {
8313		un->un_tran_retry_ct = 0;
8314		if (un->un_last_throttle) {
8315			un->un_throttle = un->un_last_throttle;
8316		}
8317		mutex_exit(ST_MUTEX);
8318		return;
8319	}
8320
8321done_error:
8322	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
8323	    "restart transport rejected\n");
8324	bp->b_resid = bp->b_bcount;
8325
8326#ifndef __lock_lint
8327	/*
8328	 * warlock doesn't understand this potential
8329	 * recursion?
8330	 */
8331	mutex_enter(ST_MUTEX);
8332	if (un->un_last_throttle) {
8333		un->un_throttle = un->un_last_throttle;
8334	}
8335	if (status != TRAN_ACCEPT)
8336		ST_DO_ERRSTATS(un, st_transerrs);
8337	ST_DO_KSTATS(bp, kstat_waitq_exit);
8338	SET_PE_FLAG(un);
8339	st_bioerror(bp, EIO);
8340	st_done_and_mutex_exit(un, bp);
8341#endif
8342	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
8343	    "busy restart aborted\n");
8344}
8345
8346/*
8347 * st_check_media():
8348 * Periodically check the media state using scsi_watch service;
8349 * this service calls back after TUR and possibly request sense
8350 * the callback handler (st_media_watch_cb()) decodes the request sense
8351 * data (if any)
8352 */
8353
8354static int
8355st_check_media(dev_t dev, enum mtio_state state)
8356{
8357	int rval = 0;
8358	enum mtio_state	prev_state;
8359	opaque_t token = NULL;
8360
8361	GET_SOFT_STATE(dev);
8362
8363	mutex_enter(ST_MUTEX);
8364
8365	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8366	    "st_check_media:state=%x, mediastate=%x\n",
8367	    state, un->un_mediastate);
8368
8369	prev_state = un->un_mediastate;
8370
8371	/*
8372	 * is there anything to do?
8373	 */
8374retry:
8375	if (state == un->un_mediastate || un->un_mediastate == MTIO_NONE) {
8376		/*
8377		 * submit the request to the scsi_watch service;
8378		 * scsi_media_watch_cb() does the real work
8379		 */
8380		mutex_exit(ST_MUTEX);
8381		token = scsi_watch_request_submit(ST_SCSI_DEVP,
8382			st_check_media_time, SENSE_LENGTH,
8383			st_media_watch_cb, (caddr_t)dev);
8384		if (token == NULL) {
8385			rval = EAGAIN;
8386			goto done;
8387		}
8388		mutex_enter(ST_MUTEX);
8389
8390		un->un_swr_token = token;
8391		un->un_specified_mediastate = state;
8392
8393		/*
8394		 * now wait for media change
8395		 * we will not be signalled unless mediastate == state but it
8396		 * still better to test for this condition, since there
8397		 * is a 5 sec cv_broadcast delay when
8398		 *  mediastate == MTIO_INSERTED
8399		 */
8400		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8401			"st_check_media:waiting for media state change\n");
8402		while (un->un_mediastate == state) {
8403			if (cv_wait_sig(&un->un_state_cv, ST_MUTEX) == 0) {
8404				mutex_exit(ST_MUTEX);
8405				ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8406				    "st_check_media:waiting for media state "
8407				    "was interrupted\n");
8408				rval = EINTR;
8409				goto done;
8410			}
8411			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8412			    "st_check_media:received signal, state=%x\n",
8413			    un->un_mediastate);
8414		}
8415	}
8416
8417	/*
8418	 * if we transitioned to MTIO_INSERTED, media has really been
8419	 * inserted.  If TUR fails, it is probably a exabyte slow spin up.
8420	 * Reset and retry the state change.  If everything is ok, replay
8421	 * the open() logic.
8422	 */
8423	if ((un->un_mediastate == MTIO_INSERTED) &&
8424	    (un->un_state == ST_STATE_OFFLINE)) {
8425		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8426		    "st_check_media: calling st_cmd to confirm inserted\n");
8427
8428		/*
8429		 * set this early so that TUR will make it through strategy
8430		 * without triggering a st_tape_init().  We needed it set
8431		 * before calling st_tape_init() ourselves anyway.  If TUR
8432		 * fails, set it back
8433		 */
8434		un->un_state = ST_STATE_INITIALIZING;
8435
8436		/*
8437		 * If not reserved fail as getting reservation conflict
8438		 * will make this hang forever.
8439		 */
8440		if ((un->un_rsvd_status &
8441		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
8442			mutex_exit(ST_MUTEX);
8443			rval = EACCES;
8444			goto done;
8445		}
8446		rval = st_cmd(dev, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
8447		if (rval == EACCES) {
8448			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8449			    "st_check_media: TUR got Reservation Conflict\n");
8450			mutex_exit(ST_MUTEX);
8451			goto done;
8452		}
8453		if (rval) {
8454			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8455			    "st_check_media: TUR failed, going to retry\n");
8456			un->un_mediastate = prev_state;
8457			un->un_state = ST_STATE_OFFLINE;
8458			goto retry;
8459		}
8460		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8461		    "st_check_media: media inserted\n");
8462
8463		/* this also rewinds the tape */
8464		rval = st_tape_init(dev);
8465		if (rval != 0) {
8466			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8467			    "st_check_media : OFFLINE init failure ");
8468			un->un_state = ST_STATE_OFFLINE;
8469			un->un_fileno = -1;
8470		} else {
8471			un->un_state = ST_STATE_OPEN_PENDING_IO;
8472			un->un_fileno = 0;
8473			un->un_blkno = 0;
8474		}
8475	} else if ((un->un_mediastate == MTIO_EJECTED) &&
8476		(un->un_state != ST_STATE_OFFLINE)) {
8477		/*
8478		 * supported devices must be rewound before ejection
8479		 * rewind resets fileno & blkno
8480		 */
8481		un->un_laststate = un->un_state;
8482		un->un_state = ST_STATE_OFFLINE;
8483	}
8484	mutex_exit(ST_MUTEX);
8485done:
8486	if (token) {
8487		(void) scsi_watch_request_terminate(token,
8488				SCSI_WATCH_TERMINATE_WAIT);
8489		mutex_enter(ST_MUTEX);
8490		un->un_swr_token = (opaque_t)NULL;
8491		mutex_exit(ST_MUTEX);
8492	}
8493
8494	ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_media: done\n");
8495
8496	return (rval);
8497}
8498
8499/*
8500 * st_media_watch_cb() is called by scsi_watch_thread for
8501 * verifying the request sense data (if any)
8502 */
8503static int
8504st_media_watch_cb(caddr_t arg, struct scsi_watch_result *resultp)
8505{
8506	struct scsi_status *statusp = resultp->statusp;
8507	struct scsi_extended_sense *sensep = resultp->sensep;
8508	uchar_t actual_sense_length = resultp->actual_sense_length;
8509	struct scsi_tape *un;
8510	enum mtio_state state = MTIO_NONE;
8511	int instance;
8512	dev_t dev = (dev_t)arg;
8513
8514	instance = MTUNIT(dev);
8515	if ((un = ddi_get_soft_state(st_state, instance)) == NULL) {
8516		return (-1);
8517	}
8518
8519	mutex_enter(ST_MUTEX);
8520	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8521		"st_media_watch_cb: status=%x, sensep=%p, len=%x\n",
8522			*((char *)statusp), (void *)sensep,
8523			actual_sense_length);
8524
8525	/*
8526	 * if there was a check condition then sensep points to valid
8527	 * sense data
8528	 * if status was not a check condition but a reservation or busy
8529	 * status then the new state is MTIO_NONE
8530	 */
8531	if (sensep) {
8532		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8533		    "st_media_watch_cb: KEY=%x, ASC=%x, ASCQ=%x\n",
8534		    sensep->es_key, sensep->es_add_code, sensep->es_qual_code);
8535
8536		switch (un->un_dp->type) {
8537		default:
8538			ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8539	    "st_media_watch_cb: unknown drive type %d, default to ST_TYPE_HP\n",
8540	    un->un_dp->type);
8541		/* FALLTHROUGH */
8542
8543		case ST_TYPE_STC3490:	/* STK 4220 1/2" cartridge */
8544		case ST_TYPE_FUJI:	/* 1/2" cartridge */
8545		case ST_TYPE_HP:	/* HP 88780 1/2" reel */
8546			if (un->un_dp->type == ST_TYPE_FUJI) {
8547				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8548				    "st_media_watch_cb: ST_TYPE_FUJI\n");
8549			} else {
8550				ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8551				    "st_media_watch_cb: ST_TYPE_HP\n");
8552			}
8553			switch (sensep->es_key) {
8554			case KEY_UNIT_ATTENTION:
8555				/* not ready to ready transition */
8556				/* hp/es_qual_code == 80 on>off>on */
8557				/* hp/es_qual_code == 0 on>off>unld>ld>on */
8558				if (sensep->es_add_code == 0x28) {
8559					state = MTIO_INSERTED;
8560				}
8561				break;
8562			case KEY_NOT_READY:
8563				/* in process, rewinding or loading */
8564				if ((sensep->es_add_code == 0x04) &&
8565				    (sensep->es_qual_code == 0x00)) {
8566					state = MTIO_EJECTED;
8567				}
8568				break;
8569			}
8570			break;
8571
8572		case ST_TYPE_EXB8500:	/* Exabyte 8500 */
8573			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8574			    "st_media_watch_cb: ST_TYPE_EXB8500\n");
8575			switch (sensep->es_key) {
8576			case KEY_UNIT_ATTENTION:
8577				/* operator medium removal request */
8578				if ((sensep->es_add_code == 0x5a) &&
8579				    (sensep->es_qual_code == 0x01)) {
8580					state = MTIO_EJECTED;
8581				/* not ready to ready transition */
8582				} else if ((sensep->es_add_code == 0x28) &&
8583				    (sensep->es_qual_code == 0x00)) {
8584					state = MTIO_INSERTED;
8585				}
8586				break;
8587			case KEY_NOT_READY:
8588				/* medium not present */
8589				if (sensep->es_add_code == 0x3a) {
8590					state = MTIO_EJECTED;
8591				}
8592				break;
8593			}
8594			break;
8595		case ST_TYPE_EXABYTE:	/* Exabyte 8200 */
8596			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8597			    "st_media_watch_cb: ST_TYPE_EXABYTE\n");
8598			switch (sensep->es_key) {
8599			case KEY_NOT_READY:
8600				if ((sensep->es_add_code == 0x04) &&
8601				    (sensep->es_qual_code == 0x00)) {
8602					/* volume not mounted? */
8603					state = MTIO_EJECTED;
8604				} else if (sensep->es_add_code == 0x3a) {
8605					state = MTIO_EJECTED;
8606				}
8607				break;
8608			case KEY_UNIT_ATTENTION:
8609				state = MTIO_EJECTED;
8610				break;
8611			}
8612			break;
8613
8614		case ST_TYPE_DLT:		/* quantum DLT4xxx */
8615			switch (sensep->es_key) {
8616			case KEY_UNIT_ATTENTION:
8617				if (sensep->es_add_code == 0x28) {
8618					state = MTIO_INSERTED;
8619				}
8620				break;
8621			case KEY_NOT_READY:
8622				if (sensep->es_add_code == 0x04) {
8623					/* in transition but could be either */
8624					state = un->un_specified_mediastate;
8625				} else if ((sensep->es_add_code == 0x3a) &&
8626				    (sensep->es_qual_code == 0x00)) {
8627					state = MTIO_EJECTED;
8628				}
8629				break;
8630			}
8631			break;
8632		}
8633	} else if (*((char *)statusp) == STATUS_GOOD) {
8634		state = MTIO_INSERTED;
8635	}
8636
8637	ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8638	    "st_media_watch_cb:state=%x, specified=%x\n",
8639	    state, un->un_specified_mediastate);
8640
8641	/*
8642	 * now signal the waiting thread if this is *not* the specified state;
8643	 * delay the signal if the state is MTIO_INSERTED
8644	 * to allow the target to recover
8645	 */
8646	if (state != un->un_specified_mediastate) {
8647		un->un_mediastate = state;
8648		if (state == MTIO_INSERTED) {
8649			/*
8650			 * delay the signal to give the drive a chance
8651			 * to do what it apparently needs to do
8652			 */
8653			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8654			    "st_media_watch_cb:delayed cv_broadcast\n");
8655			un->un_delay_tid = timeout(st_delayed_cv_broadcast,
8656			    un, drv_usectohz((clock_t)MEDIA_ACCESS_DELAY));
8657		} else {
8658			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
8659			    "st_media_watch_cb:immediate cv_broadcast\n");
8660			cv_broadcast(&un->un_state_cv);
8661		}
8662	}
8663	mutex_exit(ST_MUTEX);
8664	return (0);
8665}
8666
8667/*
8668 * delayed cv_broadcast to allow for target to recover
8669 * from media insertion
8670 */
8671static void
8672st_delayed_cv_broadcast(void *arg)
8673{
8674	struct scsi_tape *un = arg;
8675
8676	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8677	    "st_delayed_cv_broadcast:delayed cv_broadcast\n");
8678
8679	mutex_enter(ST_MUTEX);
8680	cv_broadcast(&un->un_state_cv);
8681	mutex_exit(ST_MUTEX);
8682}
8683
8684/*
8685 * restart cmd currently at the start of the waitq
8686 */
8687static void
8688st_start_restart(void *arg)
8689{
8690	struct scsi_tape *un = arg;
8691
8692	ASSERT(un != NULL);
8693
8694	mutex_enter(ST_MUTEX);
8695
8696	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8697		"st_tran_restart()\n");
8698
8699	if (un->un_quef) {
8700		st_start(un);
8701	}
8702
8703	mutex_exit(ST_MUTEX);
8704}
8705
8706
8707/*
8708 * Command completion processing
8709 *
8710 */
8711static void
8712st_intr(struct scsi_pkt *pkt)
8713{
8714	struct scsi_tape *un;
8715	struct buf *last_runqf;
8716	struct buf *bp;
8717	int action = COMMAND_DONE;
8718	clock_t	timout;
8719	int	status;
8720
8721	bp = (struct buf *)pkt->pkt_private;
8722	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
8723
8724	mutex_enter(ST_MUTEX);
8725
8726	un->un_rqs_state &= ~(ST_RQS_ERROR);
8727
8728	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_intr()\n");
8729
8730	if (pkt->pkt_reason != CMD_CMPLT) {
8731
8732		/* If device has gone away not much else to do */
8733		if (pkt->pkt_reason == CMD_DEV_GONE) {
8734			action = COMMAND_DONE_ERROR;
8735		} else if (un->un_state == ST_STATE_SENSING) {
8736			ST_DO_ERRSTATS(un, st_transerrs);
8737			action = COMMAND_DONE_ERROR;
8738		} else {
8739			action = st_handle_incomplete(un, bp);
8740		}
8741	/*
8742	 * At this point we know that the command was successfully
8743	 * completed. Now what?
8744	 */
8745	} else if (un->un_arq_enabled &&
8746	    (pkt->pkt_state & STATE_ARQ_DONE)) {
8747		/*
8748		 * the transport layer successfully completed an autorqsense
8749		 */
8750		action = st_handle_autosense(un, bp);
8751
8752	} else if (un->un_state == ST_STATE_SENSING) {
8753		/*
8754		 * okay. We were running a REQUEST SENSE. Find
8755		 * out what to do next.
8756		 * some actions are based on un_state, hence
8757		 * restore the state st was in before ST_STATE_SENSING.
8758		 */
8759		un->un_state = un->un_laststate;
8760		action = st_handle_sense(un, bp);
8761		/*
8762		 * set pkt back to original packet in case we will have
8763		 * to requeue it
8764		 */
8765		pkt = BP_PKT(bp);
8766	} else  if ((SCBP(pkt)->sts_busy) || (SCBP(pkt)->sts_chk)) {
8767		/*
8768		 * Okay, we weren't running a REQUEST SENSE. Call a routine
8769		 * to see if the status bits we're okay. If a request sense
8770		 * is to be run, that will happen.
8771		 */
8772		action = st_check_error(un, pkt);
8773	}
8774
8775	if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
8776		switch (action) {
8777			case QUE_COMMAND:
8778				/*
8779				 * return cmd to head to the queue
8780				 * since we are suspending so that
8781				 * it gets restarted during resume
8782				 */
8783				if (un->un_runqf) {
8784					last_runqf = un->un_runqf;
8785					un->un_runqf = bp;
8786					bp->b_actf = last_runqf;
8787				} else {
8788					bp->b_actf = NULL;
8789					un->un_runqf = bp;
8790					un->un_runql = bp;
8791				}
8792				action = JUST_RETURN;
8793				break;
8794
8795			case QUE_SENSE:
8796				action = COMMAND_DONE_ERROR;
8797				break;
8798
8799			default:
8800				break;
8801		}
8802	}
8803
8804	/*
8805	 * Restore old state if we were sensing.
8806	 */
8807	if (un->un_state == ST_STATE_SENSING && action != QUE_SENSE) {
8808		un->un_state = un->un_laststate;
8809	}
8810
8811	ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
8812	    "st_intr: pkt=%p, bp=%p, action=%x, status=%x\n",
8813	    (void *)pkt, (void *)bp, action, SCBP_C(pkt));
8814
8815
8816	switch (action) {
8817	case COMMAND_DONE_EACCES:
8818		/* this is to report a reservation conflict */
8819		st_bioerror(bp, EACCES);
8820		ST_DEBUG(ST_DEVINFO, st_label, SCSI_DEBUG,
8821			"Reservation Conflict \n");
8822
8823		/*FALLTHROUGH*/
8824	case COMMAND_DONE_ERROR:
8825		if (un->un_eof < ST_EOT_PENDING &&
8826		    un->un_state >= ST_STATE_OPEN) {
8827			/*
8828			 * all errors set state of the tape to 'unknown'
8829			 * unless we're at EOT or are doing append testing.
8830			 * If sense key was illegal request, preserve state.
8831			 */
8832			if (un->un_status != KEY_ILLEGAL_REQUEST) {
8833				un->un_fileno = -1;
8834			}
8835		}
8836		un->un_err_resid = bp->b_resid = bp->b_bcount;
8837		/*
8838		 * since we have an error (COMMAND_DONE_ERROR), we want to
8839		 * make sure an error ocurrs, so make sure at least EIO is
8840		 * returned
8841		 */
8842		if (geterror(bp) == 0)
8843			st_bioerror(bp, EIO);
8844
8845		SET_PE_FLAG(un);
8846		if (!(un->un_rqs_state & ST_RQS_ERROR) &&
8847		    (un->un_errno == EIO)) {
8848			un->un_rqs_state &= ~(ST_RQS_VALID);
8849		}
8850		goto done;
8851
8852	case COMMAND_DONE_ERROR_RECOVERED:
8853		un->un_err_resid = bp->b_resid = bp->b_bcount;
8854		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
8855		    "st_intr(): COMMAND_DONE_ERROR_RECOVERED");
8856		if (geterror(bp) == 0)
8857			st_bioerror(bp, EIO);
8858		SET_PE_FLAG(un);
8859		if (!(un->un_rqs_state & ST_RQS_ERROR) &&
8860		    (un->un_errno == EIO)) {
8861			un->un_rqs_state &= ~(ST_RQS_VALID);
8862		}
8863		/*FALLTHROUGH*/
8864	case COMMAND_DONE:
8865		st_set_state(un);
8866done:
8867		ST_DO_KSTATS(bp, kstat_runq_exit);
8868		st_done_and_mutex_exit(un, bp);
8869		return;
8870
8871	case QUE_SENSE:
8872		if ((un->un_ncmds > 1) && !un->un_flush_on_errors)
8873			goto sense_error;
8874
8875		if (un->un_state != ST_STATE_SENSING) {
8876			un->un_laststate = un->un_state;
8877			un->un_state = ST_STATE_SENSING;
8878		}
8879
8880		un->un_rqs->pkt_private = (opaque_t)bp;
8881		bzero(ST_RQSENSE, SENSE_LENGTH);
8882
8883		if (un->un_throttle) {
8884			un->un_last_throttle = un->un_throttle;
8885			un->un_throttle = 0;
8886		}
8887
8888		mutex_exit(ST_MUTEX);
8889
8890		/*
8891		 * never retry this, some other command will have nuked the
8892		 * sense, anyway
8893		 */
8894		status = scsi_transport(un->un_rqs);
8895
8896		mutex_enter(ST_MUTEX);
8897
8898		if (un->un_last_throttle) {
8899			un->un_throttle = un->un_last_throttle;
8900		}
8901
8902		if (status == TRAN_ACCEPT) {
8903			mutex_exit(ST_MUTEX);
8904			return;
8905		}
8906		if (status != TRAN_BUSY)
8907			ST_DO_ERRSTATS(un, st_transerrs);
8908sense_error:
8909		un->un_fileno = -1;
8910		st_bioerror(bp, EIO);
8911		SET_PE_FLAG(un);
8912		goto done;
8913
8914	case QUE_BUSY_COMMAND:
8915		/* longish timeout */
8916		timout = ST_STATUS_BUSY_TIMEOUT;
8917		goto que_it_up;
8918
8919	case QUE_COMMAND:
8920		/* short timeout */
8921		timout = ST_TRAN_BUSY_TIMEOUT;
8922que_it_up:
8923		/*
8924		 * let st_handle_intr_busy put this bp back on waitq and make
8925		 * checks to see if it is ok to requeue the command.
8926		 */
8927		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
8928
8929		/*
8930		 * Save the throttle before setting up the timeout
8931		 */
8932		if (un->un_throttle) {
8933			un->un_last_throttle = un->un_throttle;
8934		}
8935		mutex_exit(ST_MUTEX);
8936		if (st_handle_intr_busy(un, bp, timout) == 0)
8937			return;		/* timeout is setup again */
8938
8939		mutex_enter(ST_MUTEX);
8940		un->un_fileno = -1;
8941		un->un_err_resid = bp->b_resid = bp->b_bcount;
8942		st_bioerror(bp, EIO);
8943		SET_PE_FLAG(un);
8944		goto done;
8945
8946	case QUE_LAST_COMMAND:
8947
8948		if ((un->un_ncmds > 1) && !un->un_flush_on_errors) {
8949			scsi_log(ST_DEVINFO, st_label, CE_CONT,
8950			    "un_ncmds: %d can't retry cmd \n", un->un_ncmds);
8951			goto last_command_error;
8952		}
8953		mutex_exit(ST_MUTEX);
8954		if (st_handle_intr_retry_lcmd(un, bp) == 0)
8955			return;
8956		mutex_enter(ST_MUTEX);
8957last_command_error:
8958		un->un_err_resid = bp->b_resid = bp->b_bcount;
8959		un->un_fileno = -1;
8960		st_bioerror(bp, EIO);
8961		SET_PE_FLAG(un);
8962		goto done;
8963
8964	case JUST_RETURN:
8965	default:
8966		ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
8967		mutex_exit(ST_MUTEX);
8968		return;
8969	}
8970	/*NOTREACHED*/
8971}
8972
8973static int
8974st_handle_incomplete(struct scsi_tape *un, struct buf *bp)
8975{
8976	static char *fail = "SCSI transport failed: reason '%s': %s\n";
8977	int rval = COMMAND_DONE_ERROR;
8978	struct scsi_pkt *pkt = (un->un_state == ST_STATE_SENSING) ?
8979			un->un_rqs : BP_PKT(bp);
8980	int result;
8981
8982	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
8983		"st_handle_incomplete(): dev = 0x%lx\n", un->un_dev);
8984
8985	ASSERT(mutex_owned(ST_MUTEX));
8986
8987	switch (pkt->pkt_reason) {
8988	case CMD_INCOMPLETE:	/* tran stopped with not normal state */
8989		/*
8990		 * this occurs when accessing a powered down drive, no
8991		 * need to complain; just fail the open
8992		 */
8993#ifdef STDEBUG
8994		if (st_debug >= 1) {
8995			st_clean_print(ST_DEVINFO, st_label, CE_WARN,
8996			    "Failed CDB", (char *)pkt->pkt_cdbp, CDB_SIZE);
8997		}
8998
8999#endif
9000		/*
9001		 * if we have commands outstanding in HBA, and a command
9002		 * comes back incomplete, we're hosed, so reset target
9003		 * If we have the bus, but cmd_incomplete, we probably just
9004		 * have a failed selection, so don't reset the target, just
9005		 * requeue the command and try again
9006		 */
9007		if ((un->un_ncmds > 1) || (pkt->pkt_state != STATE_GOT_BUS)) {
9008			goto reset_target;
9009		}
9010
9011		/*
9012		 * Retry selection a couple more times if we're
9013		 * open.  If opening, we only try just once to
9014		 * reduce probe time for nonexistant devices.
9015		 */
9016		if ((un->un_laststate > ST_STATE_OPENING) &&
9017		    ((int)un->un_retry_ct < st_selection_retry_count)) {
9018			rval = QUE_COMMAND;
9019		}
9020		ST_DO_ERRSTATS(un, st_transerrs);
9021		break;
9022
9023	case CMD_ABORTED:
9024		/*
9025		 * most likely this is caused by flush-on-error support. If
9026		 * it was not there, the we're in trouble.
9027		 */
9028		if (!un->un_flush_on_errors) {
9029			un->un_status = SUN_KEY_FATAL;
9030			goto reset_target;
9031		}
9032
9033		st_set_pe_errno(un);
9034		bioerror(bp, un->un_errno);
9035		if (un->un_errno)
9036			return (COMMAND_DONE_ERROR);
9037		else
9038			return (COMMAND_DONE);
9039
9040	case CMD_TIMEOUT:	/* Command timed out */
9041		un->un_status = SUN_KEY_TIMEOUT;
9042
9043		/*FALLTHROUGH*/
9044	default:
9045reset_target:
9046		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9047		    "transport completed with %s\n",
9048		    scsi_rname(pkt->pkt_reason));
9049		ST_DO_ERRSTATS(un, st_transerrs);
9050		if ((pkt->pkt_state & STATE_GOT_TARGET) &&
9051		    ((pkt->pkt_statistics & (STAT_BUS_RESET | STAT_DEV_RESET |
9052			STAT_ABORTED)) == 0)) {
9053
9054			/*
9055			 * If we haven't reserved the drive don't reset it.
9056			 */
9057			if ((un->un_rsvd_status &
9058			    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
9059				return (rval);
9060			}
9061
9062			mutex_exit(ST_MUTEX);
9063
9064			result = scsi_reset(ROUTE, RESET_TARGET);
9065			/*
9066			 * if target reset fails, then pull the chain
9067			 */
9068			if (result == 0) {
9069				result = scsi_reset(ROUTE, RESET_ALL);
9070			}
9071			mutex_enter(ST_MUTEX);
9072
9073			if ((result == 0) && (un->un_state >= ST_STATE_OPEN)) {
9074				/* no hope left to recover */
9075				scsi_log(ST_DEVINFO, st_label, CE_WARN,
9076				    "recovery by resets failed\n");
9077				return (rval);
9078			}
9079		}
9080	}
9081
9082	if ((pkt->pkt_reason == CMD_RESET) || (pkt->pkt_statistics &
9083		(STAT_BUS_RESET | STAT_DEV_RESET))) {
9084		if ((un->un_rsvd_status & ST_RESERVE)) {
9085			un->un_rsvd_status |= ST_LOST_RESERVE;
9086			ST_DEBUG3(ST_DEVINFO, st_label, CE_WARN,
9087				"Lost Reservation\n");
9088		}
9089	}
9090
9091	if ((int)un->un_retry_ct++ < st_retry_count) {
9092		if (un->un_pwr_mgmt == ST_PWR_SUSPENDED) {
9093			rval = QUE_COMMAND;
9094		} else if (bp == un->un_sbufp) {
9095			switch ((uchar_t)(uintptr_t)bp->b_forw) {
9096			case SCMD_MODE_SENSE:
9097			case SCMD_MODE_SELECT:
9098			case SCMD_READ_BLKLIM:
9099			case SCMD_REWIND:
9100			case SCMD_LOAD:
9101			case SCMD_TEST_UNIT_READY:
9102				/*
9103				 * These commands can be rerun with impunity
9104				 */
9105				rval = QUE_COMMAND;
9106				break;
9107
9108			default:
9109				break;
9110			}
9111		}
9112	} else {
9113		rval = COMMAND_DONE_ERROR;
9114	}
9115
9116	if (un->un_state >= ST_STATE_OPEN) {
9117		scsi_log(ST_DEVINFO, st_label, CE_WARN,
9118		    fail, scsi_rname(pkt->pkt_reason),
9119		    (rval == COMMAND_DONE_ERROR)?
9120		    "giving up" : "retrying command");
9121	}
9122	return (rval);
9123}
9124
9125/*
9126 * if the device is busy, then put this bp back on the waitq, on the
9127 * interrupt thread, where we want the head of the queue and not the
9128 * end
9129 *
9130 * The callers of this routine should take measures to save the
9131 * un_throttle in un_last_throttle which will be restored in
9132 * st_intr_restart(). The only exception should be st_intr_restart()
9133 * calling this routine for which the saving is already done.
9134 */
9135static int
9136st_handle_intr_busy(struct scsi_tape *un, struct buf *bp,
9137	clock_t timeout_interval)
9138{
9139	struct buf *last_quef;
9140	int rval = 0;
9141
9142	mutex_enter(ST_MUTEX);
9143
9144	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9145	    "st_handle_intr_busy(), un = 0x%p\n", (void *)un);
9146
9147	/*
9148	 * Check to see if we hit the retry timeout. We check to make sure
9149	 * this is the first one on the runq and make sure we have not
9150	 * queued up any more, so this one has to be the last on the list
9151	 * also. If it is not, we have to fail.  If it is not the first, but
9152	 * is the last we are in trouble anyway, as we are in the interrupt
9153	 * context here.
9154	 */
9155	if (((int)un->un_tran_retry_ct++ > st_retry_count) ||
9156	    ((un->un_runqf != bp) && (un->un_runql != bp))) {
9157		rval = -1;
9158		goto exit;
9159	}
9160
9161	/* put the bp back on the waitq */
9162	if (un->un_quef) {
9163		last_quef = un->un_quef;
9164		un->un_quef = bp;
9165		bp->b_actf = last_quef;
9166	} else  {
9167		bp->b_actf = NULL;
9168		un->un_quef = bp;
9169		un->un_quel = bp;
9170	}
9171
9172	/*
9173	 * We know that this is the first and last on the runq at this time,
9174	 * so we just nullify those two queues
9175	 */
9176	un->un_runqf = NULL;
9177	un->un_runql = NULL;
9178
9179	/*
9180	 * We don't want any other commands being started in the mean time.
9181	 * If start had just released mutex after putting something on the
9182	 * runq, we won't even get here.
9183	 */
9184	un->un_throttle = 0;
9185
9186	/*
9187	 * send a marker pkt, if appropriate
9188	 */
9189	st_hba_unflush(un);
9190
9191	/*
9192	 * all queues are aligned, we are just waiting to
9193	 * transport
9194	 */
9195	un->un_hib_tid = timeout(st_intr_restart, un, timeout_interval);
9196
9197exit:
9198	mutex_exit(ST_MUTEX);
9199	return (rval);
9200}
9201
9202static int
9203st_handle_sense(struct scsi_tape *un, struct buf *bp)
9204{
9205	struct scsi_pkt *rqpkt = un->un_rqs;
9206	int rval = COMMAND_DONE_ERROR;
9207	int amt;
9208
9209	ASSERT(mutex_owned(ST_MUTEX));
9210
9211	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9212		"st_handle_sense()\n");
9213
9214	if (SCBP(rqpkt)->sts_busy) {
9215		ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN,
9216		    "busy unit on request sense\n");
9217		if ((int)un->un_retry_ct++ < st_retry_count) {
9218			rval = QUE_BUSY_COMMAND;
9219		}
9220		return (rval);
9221	} else if (SCBP(rqpkt)->sts_chk) {
9222		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9223		    "Check Condition on REQUEST SENSE\n");
9224		return (rval);
9225	}
9226
9227	/* was there enough data? */
9228	amt = (int)SENSE_LENGTH - rqpkt->pkt_resid;
9229	if ((rqpkt->pkt_state & STATE_XFERRED_DATA) == 0 ||
9230	    (amt < SUN_MIN_SENSE_LENGTH)) {
9231		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9232		    "REQUEST SENSE couldn't get sense data\n");
9233		return (rval);
9234	}
9235	return (st_decode_sense(un, bp, amt, SCBP(rqpkt)));
9236}
9237
9238static int
9239st_handle_autosense(struct scsi_tape *un, struct buf *bp)
9240{
9241	struct scsi_pkt *pkt = BP_PKT(bp);
9242	struct scsi_arq_status *arqstat =
9243	    (struct scsi_arq_status *)pkt->pkt_scbp;
9244	int rval = COMMAND_DONE_ERROR;
9245	int amt;
9246
9247	ASSERT(mutex_owned(ST_MUTEX));
9248
9249	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9250		"st_handle_autosense()\n");
9251
9252	if (arqstat->sts_rqpkt_status.sts_busy) {
9253		ST_DEBUG4(ST_DEVINFO, st_label, CE_WARN,
9254		    "busy unit on request sense\n");
9255		/*
9256		 * we return QUE_SENSE so st_intr will setup the SENSE cmd.
9257		 * the disadvantage is that we do not have any delay for the
9258		 * second retry of rqsense and we have to keep a packet around
9259		 */
9260		return (QUE_SENSE);
9261
9262	} else if (arqstat->sts_rqpkt_reason != CMD_CMPLT) {
9263		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9264		    "transport error on REQUEST SENSE\n");
9265		if ((arqstat->sts_rqpkt_state & STATE_GOT_TARGET) &&
9266		    ((arqstat->sts_rqpkt_statistics &
9267		    (STAT_BUS_RESET | STAT_DEV_RESET | STAT_ABORTED)) == 0)) {
9268			mutex_exit(ST_MUTEX);
9269			if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
9270				/*
9271				 * if target reset fails, then pull the chain
9272				 */
9273				if (scsi_reset(ROUTE, RESET_ALL) == 0) {
9274					ST_DEBUG6(ST_DEVINFO, st_label,
9275					    CE_WARN,
9276					    "recovery by resets failed\n");
9277				}
9278			}
9279			mutex_enter(ST_MUTEX);
9280		}
9281		return (rval);
9282
9283	} else if (arqstat->sts_rqpkt_status.sts_chk) {
9284		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9285		    "Check Condition on REQUEST SENSE\n");
9286		return (rval);
9287	}
9288
9289
9290	/* was there enough data? */
9291	amt = (int)SENSE_LENGTH - arqstat->sts_rqpkt_resid;
9292	if ((arqstat->sts_rqpkt_state & STATE_XFERRED_DATA) == 0 ||
9293	    (amt < SUN_MIN_SENSE_LENGTH)) {
9294		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9295		    "REQUEST SENSE couldn't get sense data\n");
9296		return (rval);
9297	}
9298
9299	bcopy(&arqstat->sts_sensedata, ST_RQSENSE, SENSE_LENGTH);
9300
9301	return (st_decode_sense(un, bp, amt, &arqstat->sts_rqpkt_status));
9302}
9303
9304static int
9305st_decode_sense(struct scsi_tape *un, struct buf *bp,  int amt,
9306	struct scsi_status *statusp)
9307{
9308	struct scsi_pkt *pkt = BP_PKT(bp);
9309	int rval = COMMAND_DONE_ERROR;
9310	long resid;
9311	struct scsi_extended_sense *sensep = ST_RQSENSE;
9312	int severity;
9313	int get_error;
9314
9315	ASSERT(mutex_owned(ST_MUTEX));
9316
9317	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9318		"st_decode_sense()\n");
9319
9320	/*
9321	 * For uscsi commands, squirrel away a copy of the
9322	 * results of the Request Sense.
9323	 */
9324	if (USCSI_CMD(bp)) {
9325		struct uscsi_cmd *ucmd = BP_UCMD(bp);
9326		ucmd->uscsi_rqstatus = *(uchar_t *)statusp;
9327		if (ucmd->uscsi_rqlen && un->un_srqbufp) {
9328			uchar_t rqlen = min((uchar_t)amt, ucmd->uscsi_rqlen);
9329			ucmd->uscsi_rqresid = ucmd->uscsi_rqlen - rqlen;
9330			bcopy(ST_RQSENSE, un->un_srqbufp, rqlen);
9331			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
9332				"st_decode_sense: stat=0x%x resid=0x%x\n",
9333				ucmd->uscsi_rqstatus, ucmd->uscsi_rqresid);
9334		}
9335	}
9336
9337	/*
9338	 * If the drive is an MT-02, reposition the
9339	 * secondary error code into the proper place.
9340	 *
9341	 * XXX	MT-02 is non-CCS tape, so secondary error code
9342	 * is in byte 8.  However, in SCSI-2, tape has CCS definition
9343	 * so it's in byte 12.
9344	 */
9345	if (un->un_dp->type == ST_TYPE_EMULEX) {
9346		sensep->es_code = sensep->es_add_info[0];
9347	}
9348
9349	/* for normal I/O check extract the resid values. */
9350	if (bp != un->un_sbufp) {
9351		if (sensep->es_valid) {
9352			resid = (sensep->es_info_1 << 24) |
9353				(sensep->es_info_2 << 16) |
9354				(sensep->es_info_3 << 8)  |
9355				(sensep->es_info_4);
9356			if (un->un_bsize) {
9357				resid *= un->un_bsize;
9358			}
9359		} else if (pkt->pkt_state & STATE_XFERRED_DATA) {
9360			resid = pkt->pkt_resid;
9361		} else {
9362			resid = bp->b_bcount;
9363		}
9364		ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9365		    "st_handle_sense (rw): xferred bit = %d, resid=%ld (%d), "
9366		    "pkt_resid=%ld\n", pkt->pkt_state & STATE_XFERRED_DATA,
9367		    resid,
9368		    (sensep->es_info_1 << 24) |
9369		    (sensep->es_info_2 << 16) |
9370		    (sensep->es_info_3 << 8)  |
9371		    (sensep->es_info_4),
9372		    pkt->pkt_resid);
9373		/*
9374		 * The problem is, what should we believe?
9375		 */
9376		if (resid && (pkt->pkt_resid == 0)) {
9377			pkt->pkt_resid = resid;
9378		}
9379	} else {
9380		/*
9381		 * If the command is SCMD_SPACE, we need to get the
9382		 * residual as returned in the sense data, to adjust
9383		 * our idea of current tape position correctly
9384		 */
9385		if ((CDBP(pkt)->scc_cmd == SCMD_SPACE ||
9386		    CDBP(pkt)->scc_cmd == SCMD_WRITE_FILE_MARK) &&
9387		    (sensep->es_valid)) {
9388			resid = (sensep->es_info_1 << 24) |
9389			    (sensep->es_info_2 << 16) |
9390			    (sensep->es_info_3 << 8)  |
9391			    (sensep->es_info_4);
9392			bp->b_resid = resid;
9393			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9394			    "st_handle_sense(other):	resid=%ld\n",
9395			    resid);
9396		} else {
9397			/*
9398			 * If the special command is SCMD_READ,
9399			 * the correct resid will be set later.
9400			 */
9401			resid = bp->b_bcount;
9402			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9403			    "st_handle_sense(special read):  resid=%ld\n",
9404				resid);
9405		}
9406	}
9407
9408	if ((un->un_state >= ST_STATE_OPEN) &&
9409	    (DEBUGGING || st_error_level == SCSI_ERR_ALL)) {
9410		st_clean_print(ST_DEVINFO, st_label, CE_NOTE,
9411		    "Failed CDB", (char *)pkt->pkt_cdbp, CDB_SIZE);
9412		st_clean_print(ST_DEVINFO, st_label, CE_CONT,
9413		    "sense data", (char *)sensep, amt);
9414		scsi_log(ST_DEVINFO, st_label, CE_CONT,
9415		    "count 0x%lx resid 0x%lx pktresid 0x%lx\n",
9416		    bp->b_bcount, resid, pkt->pkt_resid);
9417	}
9418
9419	switch (un->un_status = sensep->es_key) {
9420	case KEY_NO_SENSE:
9421		severity = SCSI_ERR_INFO;
9422		goto common;
9423
9424	case KEY_RECOVERABLE_ERROR:
9425		severity = SCSI_ERR_RECOVERED;
9426		if ((sensep->es_class == CLASS_EXTENDED_SENSE) &&
9427		    (sensep->es_code == ST_DEFERRED_ERROR)) {
9428		    if (un->un_dp->options &
9429			ST_RETRY_ON_RECOVERED_DEFERRED_ERROR) {
9430			    rval = QUE_LAST_COMMAND;
9431			    scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity,
9432				un->un_blkno, un->un_err_blkno, scsi_cmds,
9433				sensep);
9434			    scsi_log(ST_DEVINFO, st_label, CE_CONT,
9435				"Command will be retried\n");
9436			} else {
9437			    severity = SCSI_ERR_FATAL;
9438			    rval = COMMAND_DONE_ERROR_RECOVERED;
9439			    ST_DO_ERRSTATS(un, st_softerrs);
9440			    scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity,
9441				un->un_blkno, un->un_err_blkno, scsi_cmds,
9442				sensep);
9443			}
9444			break;
9445		}
9446common:
9447		/*
9448		 * XXX only want reads to be stopped by filemarks.
9449		 * Don't want them to be stopped by EOT.  EOT matters
9450		 * only on write.
9451		 */
9452		if (sensep->es_filmk && !sensep->es_eom) {
9453			rval = COMMAND_DONE;
9454		} else if (sensep->es_eom) {
9455			rval = COMMAND_DONE;
9456		} else if (sensep->es_ili) {
9457			/*
9458			 * Fun with variable length record devices:
9459			 * for specifying larger blocks sizes than the
9460			 * actual physical record size.
9461			 */
9462			if (un->un_bsize == 0 && resid > 0) {
9463				/*
9464				 * XXX! Ugly.
9465				 * The requested blocksize is > tape blocksize,
9466				 * so this is ok, so we just return the
9467				 * actual size xferred.
9468				 */
9469				pkt->pkt_resid = resid;
9470				rval = COMMAND_DONE;
9471			} else if (un->un_bsize == 0 && resid < 0) {
9472				/*
9473				 * The requested blocksize is < tape blocksize,
9474				 * so this is not ok, so we err with ENOMEM
9475				 */
9476				rval = COMMAND_DONE_ERROR_RECOVERED;
9477				st_bioerror(bp, ENOMEM);
9478			} else {
9479				ST_DO_ERRSTATS(un, st_softerrs);
9480				severity = SCSI_ERR_FATAL;
9481				rval = COMMAND_DONE_ERROR;
9482				st_bioerror(bp, EINVAL);
9483			}
9484		} else {
9485			/*
9486			 * we hope and pray for this just being
9487			 * something we can ignore (ie. a
9488			 * truly recoverable soft error)
9489			 */
9490			rval = COMMAND_DONE;
9491		}
9492		if (sensep->es_filmk) {
9493			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9494			    "filemark\n");
9495			un->un_status = SUN_KEY_EOF;
9496			un->un_eof = ST_EOF_PENDING;
9497			SET_PE_FLAG(un);
9498		}
9499
9500		/*
9501		 * ignore eom when reading, a fmk should terminate reading
9502		 */
9503		if ((sensep->es_eom) &&
9504		    (CDBP(pkt)->scc_cmd != SCMD_READ)) {
9505			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n");
9506			un->un_status = SUN_KEY_EOT;
9507			un->un_eof = ST_EOM;
9508			SET_PE_FLAG(un);
9509		}
9510
9511		break;
9512
9513	case KEY_ILLEGAL_REQUEST:
9514
9515		if (un->un_laststate >= ST_STATE_OPEN) {
9516			ST_DO_ERRSTATS(un, st_softerrs);
9517			severity = SCSI_ERR_FATAL;
9518		} else {
9519			severity = SCSI_ERR_INFO;
9520		}
9521		break;
9522
9523	case KEY_MEDIUM_ERROR:
9524		ST_DO_ERRSTATS(un, st_harderrs);
9525		severity = SCSI_ERR_FATAL;
9526
9527		/*
9528		 * for (buffered) writes, a medium error must be fatal
9529		 */
9530		if (CDBP(pkt)->scc_cmd != SCMD_WRITE) {
9531			rval = COMMAND_DONE_ERROR_RECOVERED;
9532		}
9533
9534check_keys:
9535		/*
9536		 * attempt to process the keys in the presence of
9537		 * other errors
9538		 */
9539		if (sensep->es_ili && rval != COMMAND_DONE_ERROR) {
9540			/*
9541			 * Fun with variable length record devices:
9542			 * for specifying larger blocks sizes than the
9543			 * actual physical record size.
9544			 */
9545			if (un->un_bsize == 0 && resid > 0) {
9546				/*
9547				 * XXX! Ugly
9548				 */
9549				pkt->pkt_resid = resid;
9550			} else if (un->un_bsize == 0 && resid < 0) {
9551				st_bioerror(bp, EINVAL);
9552			} else {
9553				severity = SCSI_ERR_FATAL;
9554				rval = COMMAND_DONE_ERROR;
9555				st_bioerror(bp, EINVAL);
9556			}
9557		}
9558		if (sensep->es_filmk) {
9559			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9560			    "filemark\n");
9561			un->un_status = SUN_KEY_EOF;
9562			un->un_eof = ST_EOF_PENDING;
9563			SET_PE_FLAG(un);
9564		}
9565
9566		/*
9567		 * ignore eom when reading, a fmk should terminate reading
9568		 */
9569		if ((sensep->es_eom) &&
9570		    (CDBP(pkt)->scc_cmd != SCMD_READ)) {
9571			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG, "eom\n");
9572			un->un_status = SUN_KEY_EOT;
9573			un->un_eof = ST_EOM;
9574			SET_PE_FLAG(un);
9575		}
9576
9577		break;
9578
9579	case KEY_VOLUME_OVERFLOW:
9580		ST_DO_ERRSTATS(un, st_softerrs);
9581		un->un_eof = ST_EOM;
9582		severity = SCSI_ERR_FATAL;
9583		rval = COMMAND_DONE_ERROR;
9584		goto check_keys;
9585
9586	case KEY_HARDWARE_ERROR:
9587		ST_DO_ERRSTATS(un, st_harderrs);
9588		severity = SCSI_ERR_FATAL;
9589		rval = COMMAND_DONE_ERROR;
9590		if (un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE)
9591			un->un_eject_tape_on_failure = st_check_asc_ascq(un);
9592		break;
9593
9594	case KEY_BLANK_CHECK:
9595		ST_DO_ERRSTATS(un, st_softerrs);
9596		severity = SCSI_ERR_INFO;
9597
9598		/*
9599		 * if not a special request and some data was xferred then it
9600		 * it is not an error yet
9601		 */
9602		if (bp != un->un_sbufp && (bp->b_flags & B_READ)) {
9603			/*
9604			 * no error for read with or without data xferred
9605			 */
9606			un->un_status = SUN_KEY_EOT;
9607			un->un_eof = ST_EOT;
9608			rval = COMMAND_DONE_ERROR;
9609			SET_PE_FLAG(un);
9610			goto check_keys;
9611		} else if (bp != un->un_sbufp &&
9612		    (pkt->pkt_state & STATE_XFERRED_DATA)) {
9613			rval = COMMAND_DONE;
9614		} else {
9615			rval = COMMAND_DONE_ERROR_RECOVERED;
9616		}
9617
9618		if (un->un_laststate >= ST_STATE_OPEN) {
9619			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
9620			    "blank check\n");
9621			un->un_eof = ST_EOM;
9622		}
9623		if ((CDBP(pkt)->scc_cmd == SCMD_SPACE) &&
9624		    (un->un_dp->options & ST_KNOWS_EOD) &&
9625		    (severity = SCSI_ERR_INFO)) {
9626			/*
9627			 * we were doing a fast forward by skipping
9628			 * multiple fmk at the time
9629			 */
9630			st_bioerror(bp, EIO);
9631			severity = SCSI_ERR_RECOVERED;
9632			rval	 = COMMAND_DONE;
9633		}
9634		SET_PE_FLAG(un);
9635		goto check_keys;
9636
9637	case KEY_WRITE_PROTECT:
9638		if (st_wrongtapetype(un)) {
9639			un->un_status = SUN_KEY_WRONGMEDIA;
9640			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9641		"wrong tape for writing- use DC6150 tape (or equivalent)\n");
9642			severity = SCSI_ERR_UNKNOWN;
9643		} else {
9644			severity = SCSI_ERR_FATAL;
9645		}
9646		ST_DO_ERRSTATS(un, st_harderrs);
9647		rval = COMMAND_DONE_ERROR;
9648		st_bioerror(bp, EACCES);
9649		break;
9650
9651	case KEY_UNIT_ATTENTION:
9652		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9653		    "KEY_UNIT_ATTENTION : un_state = %d\n", un->un_state);
9654
9655		/*
9656		 * If we have detected a Bus Reset and the tape
9657		 * drive has been reserved.
9658		 */
9659		if (ST_RQSENSE->es_add_code == 0x29 &&
9660			(un->un_rsvd_status & ST_RESERVE)) {
9661			un->un_rsvd_status |= ST_LOST_RESERVE;
9662			ST_DEBUG(ST_DEVINFO, st_label, CE_WARN,
9663				"st_decode_sense: Lost Reservation\n");
9664		}
9665
9666		if (un->un_state <= ST_STATE_OPENING) {
9667			/*
9668			 * Look, the tape isn't open yet, now determine
9669			 * if the cause is a BUS RESET, Save the file and
9670			 * Block positions for the callers to recover from
9671			 * the loss of position.
9672			 */
9673			if ((un->un_fileno >= 0) &&
9674			(un->un_fileno || un->un_blkno)) {
9675				if (ST_RQSENSE->es_add_code == 0x29) {
9676					un->un_save_fileno = un->un_fileno;
9677					un->un_save_blkno = un->un_blkno;
9678					un->un_restore_pos = 1;
9679				}
9680			}
9681
9682			if ((int)un->un_retry_ct++ < st_retry_count) {
9683				rval = QUE_COMMAND;
9684			} else {
9685				rval = COMMAND_DONE_ERROR;
9686			}
9687			severity = SCSI_ERR_INFO;
9688
9689		} else {
9690			/*
9691			 * Check if it is an Unexpected Unit Attention.
9692			 * If state is >= ST_STATE_OPEN, we have
9693			 * already done the initialization .
9694			 * In this case it is Fatal Error
9695			 * since no further reading/writing
9696			 * can be done with fileno set to < 0.
9697			 */
9698			if (un->un_state >= ST_STATE_OPEN) {
9699				ST_DO_ERRSTATS(un, st_harderrs);
9700				severity = SCSI_ERR_FATAL;
9701			} else {
9702				severity = SCSI_ERR_INFO;
9703			}
9704			rval = COMMAND_DONE_ERROR;
9705		}
9706		un->un_fileno = -1;
9707
9708		break;
9709
9710	case KEY_NOT_READY:
9711		/*
9712		 * If in process of getting ready retry.
9713		 */
9714		if (sensep->es_add_code  == 0x04 &&
9715		    sensep->es_qual_code == 0x01 &&
9716		    un->un_retry_ct++ < st_retry_count) {
9717			rval = QUE_COMMAND;
9718			severity = SCSI_ERR_INFO;
9719		} else {
9720			/* give up */
9721			rval = COMMAND_DONE_ERROR;
9722			severity = SCSI_ERR_FATAL;
9723		}
9724
9725		/*
9726		 * If this was an error and after device opened
9727		 * do error stats.
9728		 */
9729		if (rval == COMMAND_DONE_ERROR &&
9730		    un->un_state > ST_STATE_OPENING) {
9731			ST_DO_ERRSTATS(un, st_harderrs);
9732		}
9733
9734		if (ST_RQSENSE->es_add_code == 0x3a) {
9735			if (st_error_level >= SCSI_ERR_FATAL)
9736				scsi_log(ST_DEVINFO, st_label, CE_NOTE,
9737				    "Tape not inserted in drive\n");
9738			un->un_mediastate = MTIO_EJECTED;
9739			cv_broadcast(&un->un_state_cv);
9740		}
9741		if ((un->un_dp->options & ST_EJECT_ON_CHANGER_FAILURE) &&
9742		    (rval != QUE_COMMAND))
9743			un->un_eject_tape_on_failure = st_check_asc_ascq(un);
9744		break;
9745
9746	case KEY_ABORTED_COMMAND:
9747
9748		/*
9749		 * Probably a parity error...
9750		 * if we retry here then this may cause data to be
9751		 * written twice or data skipped during reading
9752		 */
9753		ST_DO_ERRSTATS(un, st_harderrs);
9754		severity = SCSI_ERR_FATAL;
9755		rval = COMMAND_DONE_ERROR;
9756		goto check_keys;
9757
9758	default:
9759		/*
9760		 * Undecoded sense key.	 Try retries and hope
9761		 * that will fix the problem.  Otherwise, we're
9762		 * dead.
9763		 */
9764		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9765		    "Unhandled Sense Key '%s'\n",
9766		    sense_keys[un->un_status]);
9767		ST_DO_ERRSTATS(un, st_harderrs);
9768		severity = SCSI_ERR_FATAL;
9769		rval = COMMAND_DONE_ERROR;
9770		goto check_keys;
9771	}
9772
9773	if ((!(pkt->pkt_flags & FLAG_SILENT) &&
9774	    un->un_state >= ST_STATE_OPEN) && (DEBUGGING ||
9775		(un->un_laststate > ST_STATE_OPENING) &&
9776		(severity >= st_error_level))) {
9777
9778		scsi_errmsg(ST_SCSI_DEVP, pkt, st_label, severity,
9779		    un->un_blkno, un->un_err_blkno, scsi_cmds, sensep);
9780		if (sensep->es_filmk) {
9781			scsi_log(ST_DEVINFO, st_label, CE_CONT,
9782			    "File Mark Detected\n");
9783		}
9784		if (sensep->es_eom) {
9785			scsi_log(ST_DEVINFO, st_label, CE_CONT,
9786			    "End-of-Media Detected\n");
9787		}
9788		if (sensep->es_ili) {
9789			scsi_log(ST_DEVINFO, st_label, CE_CONT,
9790			    "Incorrect Length Indicator Set\n");
9791		}
9792	}
9793	get_error = geterror(bp);
9794	if (((rval == COMMAND_DONE_ERROR) ||
9795	    (rval == COMMAND_DONE_ERROR_RECOVERED)) &&
9796	    ((get_error == EIO) || (get_error == 0))) {
9797		un->un_rqs_state |= (ST_RQS_ERROR | ST_RQS_VALID);
9798		bcopy(ST_RQSENSE, un->un_uscsi_rqs_buf, SENSE_LENGTH);
9799		if (un->un_rqs_state & ST_RQS_READ) {
9800		    un->un_rqs_state &= ~(ST_RQS_READ);
9801		} else {
9802		    un->un_rqs_state |= ST_RQS_OVR;
9803		}
9804	}
9805
9806	return (rval);
9807}
9808
9809
9810static int
9811st_handle_intr_retry_lcmd(struct scsi_tape *un, struct buf *bp)
9812{
9813	int status = TRAN_ACCEPT;
9814
9815	mutex_enter(ST_MUTEX);
9816
9817	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9818		"st_handle_intr_rtr_lcmd(), un = 0x%p\n", (void *)un);
9819
9820	/*
9821	 * Check to see if we hit the retry timeout. We check to make sure
9822	 * this is the first one on the runq and make sure we have not
9823	 * queued up any more, so this one has to be the last on the list
9824	 * also. If it is not, we have to fail.  If it is not the first, but
9825	 * is the last we are in trouble anyway, as we are in the interrupt
9826	 * context here.
9827	 */
9828	if (((int)un->un_retry_ct > st_retry_count) ||
9829	    ((un->un_runqf != bp) && (un->un_runql != bp))) {
9830	    goto exit;
9831	}
9832
9833	if (un->un_throttle) {
9834		un->un_last_throttle = un->un_throttle;
9835		un->un_throttle = 0;
9836	}
9837
9838	/*
9839	 * Here we know : bp is the first and last one on the runq
9840	 * it is not necessary to put it back on the head of the
9841	 * waitq and then move from waitq to runq. Save this queuing
9842	 * and call scsi_transport.
9843	 */
9844
9845	mutex_exit(ST_MUTEX);
9846
9847	status = scsi_transport(BP_PKT(bp));
9848
9849	mutex_enter(ST_MUTEX);
9850
9851	if (status == TRAN_ACCEPT) {
9852		un->un_tran_retry_ct = 0;
9853		if (un->un_last_throttle) {
9854			un->un_throttle = un->un_last_throttle;
9855		}
9856		mutex_exit(ST_MUTEX);
9857
9858		ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9859		    "restart transport \n");
9860		return (0);
9861	}
9862
9863	ST_DO_KSTATS(bp, kstat_runq_back_to_waitq);
9864	mutex_exit(ST_MUTEX);
9865
9866	if (status == TRAN_BUSY) {
9867	    if (st_handle_intr_busy(un, bp,
9868		ST_TRAN_BUSY_TIMEOUT) == 0)
9869		return (0);
9870	}
9871	ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
9872		"restart transport rejected\n");
9873	mutex_enter(ST_MUTEX);
9874	ST_DO_ERRSTATS(un, st_transerrs);
9875	if (un->un_last_throttle) {
9876		un->un_throttle = un->un_last_throttle;
9877	}
9878exit:
9879	mutex_exit(ST_MUTEX);
9880	return (-1);
9881}
9882
9883static int
9884st_wrongtapetype(struct scsi_tape *un)
9885{
9886
9887	ASSERT(mutex_owned(ST_MUTEX));
9888
9889	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9890		"st_wrongtapetype()\n");
9891
9892	/*
9893	 * Hack to handle  600A, 600XTD, 6150 && 660 vs. 300XL tapes...
9894	 */
9895	if (un->un_dp && (un->un_dp->options & ST_QIC) && un->un_mspl) {
9896		switch (un->un_dp->type) {
9897		case ST_TYPE_WANGTEK:
9898		case ST_TYPE_ARCHIVE:
9899			/*
9900			 * If this really worked, we could go off of
9901			 * the density codes set in the modesense
9902			 * page. For this drive, 0x10 == QIC-120,
9903			 * 0xf == QIC-150, and 0x5 should be for
9904			 * both QIC-24 and, maybe, QIC-11. However,
9905			 * the h/w doesn't do what the manual says
9906			 * that it should, so we'll key off of
9907			 * getting a WRITE PROTECT error AND wp *not*
9908			 * set in the mode sense information.
9909			 */
9910			/*
9911			 * XXX but we already know that status is
9912			 * write protect, so don't check it again.
9913			 */
9914
9915			if (un->un_status == KEY_WRITE_PROTECT &&
9916			    un->un_mspl->wp == 0) {
9917				return (1);
9918			}
9919			break;
9920		default:
9921			break;
9922		}
9923	}
9924	return (0);
9925}
9926
9927static int
9928st_check_error(struct scsi_tape *un, struct scsi_pkt *pkt)
9929{
9930	int action;
9931
9932	ASSERT(mutex_owned(ST_MUTEX));
9933
9934	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_check_error()\n");
9935
9936	if (SCBP_C(pkt) == STATUS_RESERVATION_CONFLICT) {
9937		action = COMMAND_DONE_EACCES;
9938		un->un_rsvd_status |= ST_RESERVATION_CONFLICT;
9939	} else if (SCBP(pkt)->sts_busy) {
9940		ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG, "unit busy\n");
9941		if ((int)un->un_retry_ct++ < st_retry_count) {
9942			action = QUE_BUSY_COMMAND;
9943		} else if ((un->un_rsvd_status &
9944		    (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) == 0) {
9945			/*
9946			 * If this is a command done before reserve is done
9947			 * don't reset.
9948			 */
9949			action = COMMAND_DONE_ERROR;
9950		} else {
9951			ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN,
9952			    "unit busy too long\n");
9953			mutex_exit(ST_MUTEX);
9954			if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
9955				(void) scsi_reset(ROUTE, RESET_ALL);
9956			}
9957			mutex_enter(ST_MUTEX);
9958			action = COMMAND_DONE_ERROR;
9959		}
9960	} else if (SCBP(pkt)->sts_chk) {
9961		/*
9962		 * we should only get here if the auto rqsense failed
9963		 * thru a uscsi cmd without autorequest sense
9964		 * so we just try again
9965		 */
9966		action = QUE_SENSE;
9967	} else {
9968		action = COMMAND_DONE;
9969	}
9970	return (action);
9971}
9972
9973static void
9974st_calc_bnum(struct scsi_tape *un, struct buf *bp)
9975{
9976	int n;
9977
9978	ASSERT(mutex_owned(ST_MUTEX));
9979
9980	if (un->un_bsize == 0) {
9981		n = ((bp->b_bcount - bp->b_resid  == 0) ? 0 : 1);
9982		un->un_kbytes_xferred += (bp->b_bcount - bp->b_resid)/1000;
9983	} else {
9984		n = ((bp->b_bcount - bp->b_resid) / un->un_bsize);
9985	}
9986	un->un_blkno += n;
9987}
9988
9989static void
9990st_set_state(struct scsi_tape *un)
9991{
9992	struct buf *bp = un->un_runqf;
9993	struct scsi_pkt *sp = BP_PKT(bp);
9994	struct uscsi_cmd *ucmd;
9995
9996	ASSERT(mutex_owned(ST_MUTEX));
9997
9998	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
9999	    "st_set_state(): un_eof=%x	fmneeded=%x  pkt_resid=0x%lx (%ld)\n",
10000	    un->un_eof, un->un_fmneeded, sp->pkt_resid, sp->pkt_resid);
10001
10002	if (bp != un->un_sbufp) {
10003#ifdef STDEBUG
10004		if (DEBUGGING && sp->pkt_resid) {
10005			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10006			    "pkt_resid %ld bcount %ld\n",
10007			    sp->pkt_resid, bp->b_bcount);
10008		}
10009#endif
10010		bp->b_resid = sp->pkt_resid;
10011		st_calc_bnum(un, bp);
10012		if (bp->b_flags & B_READ) {
10013			un->un_lastop = ST_OP_READ;
10014			un->un_fmneeded = 0;
10015		} else {
10016			un->un_lastop = ST_OP_WRITE;
10017			if (un->un_dp->options & ST_REEL) {
10018				un->un_fmneeded = 2;
10019			} else {
10020				un->un_fmneeded = 1;
10021			}
10022		}
10023		/*
10024		 * all is honky dory at this point, so let's
10025		 * readjust the throttle, to increase speed, if we
10026		 * have not throttled down.
10027		 */
10028		if (un->un_throttle)
10029			un->un_throttle = un->un_max_throttle;
10030	} else {
10031		char saved_lastop = un->un_lastop;
10032		uchar_t cmd = (uchar_t)(intptr_t)bp->b_forw;
10033
10034		un->un_lastop = ST_OP_CTL;
10035
10036		switch (cmd) {
10037		case SCMD_WRITE:
10038			bp->b_resid = sp->pkt_resid;
10039			un->un_lastop = ST_OP_WRITE;
10040			st_calc_bnum(un, bp);
10041			if (un->un_dp->options & ST_REEL) {
10042				un->un_fmneeded = 2;
10043			} else {
10044				un->un_fmneeded = 1;
10045			}
10046			break;
10047		case SCMD_READ:
10048			bp->b_resid = sp->pkt_resid;
10049			un->un_lastop = ST_OP_READ;
10050			st_calc_bnum(un, bp);
10051			un->un_fmneeded = 0;
10052			break;
10053		case SCMD_WRITE_FILE_MARK:
10054			if (un->un_eof != ST_EOM)
10055				un->un_eof = ST_NO_EOF;
10056			un->un_lastop = ST_OP_WEOF;
10057			un->un_fileno += (bp->b_bcount - bp->b_resid);
10058			un->un_blkno = 0;
10059			if (un->un_dp->options & ST_REEL) {
10060				un->un_fmneeded -=
10061					(bp->b_bcount - bp->b_resid);
10062				if (un->un_fmneeded < 0) {
10063					un->un_fmneeded = 0;
10064				}
10065			} else {
10066				un->un_fmneeded = 0;
10067			}
10068
10069			break;
10070		case SCMD_REWIND:
10071			un->un_eof = ST_NO_EOF;
10072			un->un_fileno = 0;
10073			un->un_blkno = 0;
10074			break;
10075
10076		case SCMD_SPACE:
10077		{
10078			int space_fmk, count;
10079			long resid;
10080
10081			count = (int)space_cnt(bp->b_bcount);
10082			resid = (long)space_cnt(bp->b_resid);
10083			space_fmk = ((bp->b_bcount) & (1<<24)) ? 1 : 0;
10084
10085
10086			if (count >= 0) {
10087				if (space_fmk) {
10088					if (un->un_eof <= ST_EOF) {
10089						un->un_eof = ST_NO_EOF;
10090					}
10091					un->un_fileno += (count - resid);
10092					un->un_blkno = 0;
10093				} else {
10094					un->un_blkno += count - resid;
10095				}
10096			} else if (count < 0) {
10097				if (space_fmk) {
10098					un->un_fileno -=
10099					    ((-count) - resid);
10100					if (un->un_fileno < 0) {
10101						un->un_fileno = 0;
10102						un->un_blkno = 0;
10103					} else {
10104						un->un_blkno = INF;
10105					}
10106				} else {
10107					if (un->un_eof >= ST_EOF_PENDING) {
10108					/*
10109					 * we stepped back into
10110					 * a previous file; we are not
10111					 * making an effort to pretend that
10112					 * we are still in the current file
10113					 * ie. logical == physical position
10114					 * and leave it to st_ioctl to correct
10115					 */
10116						if (un->un_fileno > 0) {
10117							un->un_fileno--;
10118							un->un_blkno = INF;
10119						} else {
10120							un->un_blkno = 0;
10121						}
10122					} else {
10123						un->un_blkno -=
10124						    (-count) - resid;
10125					}
10126				}
10127			}
10128			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10129			    "aft_space rs %ld fil %d blk %ld\n",
10130			    resid, un->un_fileno, un->un_blkno);
10131			break;
10132		}
10133		case SCMD_LOAD:
10134			if (bp->b_bcount & 0x1) {
10135				un->un_fileno = 0;
10136			} else {
10137				un->un_state = ST_STATE_OFFLINE;
10138				un->un_fileno = -1;
10139			}
10140			un->un_density_known = 0;
10141			un->un_eof = ST_NO_EOF;
10142			un->un_blkno = 0;
10143			break;
10144		case SCMD_ERASE:
10145			un->un_eof = ST_NO_EOF;
10146			un->un_blkno = 0;
10147			un->un_fileno = 0;
10148			break;
10149		case SCMD_RESERVE:
10150			un->un_rsvd_status |= ST_RESERVE;
10151			un->un_rsvd_status &=
10152			    ~(ST_RELEASE | ST_LOST_RESERVE |
10153			    ST_RESERVATION_CONFLICT);
10154			un->un_lastop = saved_lastop;
10155			break;
10156		case SCMD_RELEASE:
10157			un->un_rsvd_status |= ST_RELEASE;
10158			un->un_rsvd_status &=
10159			    ~(ST_RESERVE | ST_LOST_RESERVE |
10160			    ST_RESERVATION_CONFLICT);
10161			un->un_lastop = saved_lastop;
10162			break;
10163		case SCMD_PERSISTENT_RESERVE_IN:
10164			ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10165			    "PGR_IN command\n");
10166			break;
10167		case SCMD_PERSISTENT_RESERVE_OUT:
10168			switch (sp->pkt_cdbp[1] & ST_SA_MASK) {
10169			case ST_SA_SCSI3_RESERVE:
10170			case ST_SA_SCSI3_PREEMPT:
10171			case ST_SA_SCSI3_PREEMPTANDABORT:
10172				un->un_rsvd_status |=
10173				    ST_APPLICATION_RESERVATIONS;
10174				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10175				    "PGR Reserve and set: entering"
10176				    " ST_APPLICATION_RESERVATIONS mode");
10177				break;
10178			case ST_SA_SCSI3_RELEASE:
10179			case ST_SA_SCSI3_CLEAR:
10180				un->un_rsvd_status &=
10181				    ~ST_APPLICATION_RESERVATIONS;
10182				ST_DEBUG6(ST_DEVINFO, st_label, CE_WARN,
10183				    "PGR Release and reset: exiting"
10184				    " ST_APPLICATION_RESERVATIONS mode");
10185				break;
10186			}
10187			break;
10188		case SCMD_TEST_UNIT_READY:
10189		case SCMD_READ_BLKLIM:
10190		case SCMD_REQUEST_SENSE:
10191		case SCMD_INQUIRY:
10192		case SCMD_RECOVER_BUF:
10193		case SCMD_MODE_SELECT:
10194		case SCMD_MODE_SENSE:
10195		case SCMD_DOORLOCK:
10196		case SCMD_READ_POSITION:
10197		case SCMD_READ_BUFFER:
10198		case SCMD_REPORT_DENSITIES:
10199		case SCMD_LOG_SELECT_G1:
10200		case SCMD_LOG_SENSE_G1:
10201		case SCMD_REPORT_LUNS:
10202		case SCMD_READ_ATTRIBUTE:
10203			un->un_lastop = saved_lastop;
10204			break;
10205		case SCMD_LOCATE:	/* Locate makes position unknown */
10206		default:
10207			/*
10208			 * Unknown command, If was USCSI and USCSI_SILENT
10209			 * flag was not set, set position to unknown.
10210			 */
10211			if ((((ucmd = BP_UCMD(bp)) != NULL) &&
10212			    (ucmd->uscsi_flags & USCSI_SILENT) == 0)) {
10213				ST_DEBUG2(ST_DEVINFO, st_label, CE_WARN,
10214				    "unknown cmd 0x%X caused loss of state\n",
10215				    cmd);
10216			} else {
10217				break;
10218			}
10219			/* FALLTHROUGH */
10220		case SCMD_WRITE_BUFFER: /* Writes new firmware to device */
10221			un->un_fileno = -1;
10222			break;
10223		}
10224	}
10225
10226	/*
10227	 * In the st driver we have a logical and physical file position.
10228	 * Under BSD behavior, when you get a zero read, the logical position
10229	 * is before the filemark but after the last record of the file.
10230	 * The physical position is after the filemark. MTIOCGET should always
10231	 * return the logical file position.
10232	 *
10233	 * The next read gives a silent skip to the next file.
10234	 * Under SVR4, the logical file position remains before the filemark
10235	 * until the file is closed or a space operation is performed.
10236	 * Hence set err_resid and err_file before changing fileno if case
10237	 * BSD Behaviour.
10238	 */
10239	un->un_err_resid = bp->b_resid;
10240	un->un_err_fileno = un->un_fileno;
10241	un->un_err_blkno = un->un_blkno;
10242	un->un_retry_ct = 0;
10243
10244
10245	/*
10246	 * If we've seen a filemark via the last read operation
10247	 * advance the file counter, but mark things such that
10248	 * the next read operation gets a zero count. We have
10249	 * to put this here to handle the case of sitting right
10250	 * at the end of a tape file having seen the file mark,
10251	 * but the tape is closed and then re-opened without
10252	 * any further i/o. That is, the position information
10253	 * must be updated before a close.
10254	 */
10255
10256	if (un->un_lastop == ST_OP_READ && un->un_eof == ST_EOF_PENDING) {
10257		/*
10258		 * If we're a 1/2" tape, and we get a filemark
10259		 * right on block 0, *AND* we were not in the
10260		 * first file on the tape, and we've hit logical EOM.
10261		 * We'll mark the state so that later we do the
10262		 * right thing (in st_close(), st_strategy() or
10263		 * st_ioctl()).
10264		 *
10265		 */
10266		if ((un->un_dp->options & ST_REEL) &&
10267			!(un->un_dp->options & ST_READ_IGNORE_EOFS) &&
10268		    un->un_blkno == 0 && un->un_fileno > 0) {
10269			un->un_eof = ST_EOT_PENDING;
10270			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10271			    "eot pending\n");
10272			un->un_fileno++;
10273			un->un_blkno = 0;
10274		} else if (BSD_BEHAVIOR) {
10275			/*
10276			 * If the read of the filemark was a side effect
10277			 * of reading some blocks (i.e., data was actually
10278			 * read), then the EOF mark is pending and the
10279			 * bump into the next file awaits the next read
10280			 * operation (which will return a zero count), or
10281			 * a close or a space operation, else the bump
10282			 * into the next file occurs now.
10283			 */
10284			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10285			    "resid=%lx, bcount=%lx\n",
10286				bp->b_resid, bp->b_bcount);
10287			if (bp->b_resid != bp->b_bcount) {
10288				un->un_eof = ST_EOF;
10289			} else {
10290				un->un_silent_skip = 1;
10291				un->un_eof = ST_NO_EOF;
10292				un->un_fileno++;
10293				un->un_save_blkno = un->un_blkno;
10294				un->un_blkno = 0;
10295			}
10296			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10297			    "eof of file %d, un_eof=%d\n",
10298			    un->un_fileno, un->un_eof);
10299		} else if (SVR4_BEHAVIOR) {
10300			/*
10301			 * If the read of the filemark was a side effect
10302			 * of reading some blocks (i.e., data was actually
10303			 * read), then the next read should return 0
10304			 */
10305			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10306			    "resid=%lx, bcount=%lx\n",
10307			    bp->b_resid, bp->b_bcount);
10308			if (bp->b_resid == bp->b_bcount) {
10309				un->un_eof = ST_EOF;
10310			}
10311			ST_DEBUG6(ST_DEVINFO, st_label, SCSI_DEBUG,
10312			    "eof of file=%d, un_eof=%d\n",
10313			    un->un_fileno, un->un_eof);
10314		}
10315	}
10316}
10317
10318/*
10319 * set the correct un_errno, to take corner cases into consideration
10320 */
10321static void
10322st_set_pe_errno(struct scsi_tape *un)
10323{
10324	ASSERT(mutex_owned(ST_MUTEX));
10325
10326	/* if errno is already set, don't reset it */
10327	if (un->un_errno)
10328		return;
10329
10330	/* here un_errno == 0 */
10331	/*
10332	 * if the last transfer before flushing all the
10333	 * waiting I/O's, was 0 (resid = count), then we
10334	 * want to give the user an error on all the rest,
10335	 * so here.  If there was a transfer, we set the
10336	 * resid and counts to 0, and let it drop through,
10337	 * giving a zero return.  the next I/O will then
10338	 * give an error.
10339	 */
10340	if (un->un_last_resid == un->un_last_count) {
10341		switch (un->un_eof) {
10342		case ST_EOM:
10343			un->un_errno = ENOMEM;
10344			break;
10345		case ST_EOT:
10346		case ST_EOF:
10347			un->un_errno = EIO;
10348			break;
10349		}
10350	} else {
10351		/*
10352		 * we know they did not have a zero, so make
10353		 * sure they get one
10354		 */
10355		un->un_last_resid = un->un_last_count = 0;
10356	}
10357}
10358
10359
10360/*
10361 * send in a marker pkt to terminate flushing of commands by BBA (via
10362 * flush-on-errors) property.  The HBA will always return TRAN_ACCEPT
10363 */
10364static void
10365st_hba_unflush(struct scsi_tape *un)
10366{
10367	ASSERT(mutex_owned(ST_MUTEX));
10368
10369	if (!un->un_flush_on_errors)
10370		return;
10371
10372#ifdef FLUSH_ON_ERRORS
10373
10374	if (!un->un_mkr_pkt) {
10375		un->un_mkr_pkt = scsi_init_pkt(ROUTE, NULL, (struct buf *)NULL,
10376		    NULL, 0, 0, 0, SLEEP_FUNC, NULL);
10377
10378		/* we slept, so it must be there */
10379		pkt->pkt_flags |= FLAG_FLUSH_MARKER;
10380	}
10381
10382	mutex_exit(ST_MUTEX);
10383	scsi_transport(un->un_mkr_pkt);
10384	mutex_enter(ST_MUTEX);
10385#endif
10386}
10387
10388static void
10389st_clean_print(dev_info_t *dev, char *label, uint_t level,
10390	char *title, char *data, int len)
10391{
10392	int	i;
10393	char	buf[256];
10394
10395	(void) sprintf(buf, "%s: ", title);
10396	for (i = 0; i < len; i++) {
10397		(void) sprintf(&buf[(int)strlen(buf)], "0x%x ",
10398			(data[i] & 0xff));
10399	}
10400	(void) sprintf(&buf[(int)strlen(buf)], "\n");
10401
10402	scsi_log(dev, label, level, "%s", buf);
10403}
10404
10405/*
10406 * Conditionally enabled debugging
10407 */
10408#ifdef	STDEBUG
10409static void
10410st_debug_cmds(struct scsi_tape *un, int com, int count, int wait)
10411{
10412	char tmpbuf[64];
10413
10414	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10415	    "cmd=%s count=0x%x (%d)	 %ssync\n",
10416	    scsi_cmd_name(com, scsi_cmds, tmpbuf),
10417	    count, count,
10418	    wait == ASYNC_CMD ? "a" : "");
10419}
10420
10421/*
10422 * Returns pointer to name of minor node name of device 'dev'.
10423 */
10424static char *
10425st_dev_name(dev_t dev)
10426{
10427	const char density[] = { 'l', 'm', 'h', 'c' };
10428	static char name[4];
10429	minor_t minor;
10430	int nprt = 0;
10431
10432	minor = getminor(dev);
10433	name[nprt] = density[(minor & MT_DENSITY_MASK) >> 3];
10434
10435	if (minor & MT_BSD) {
10436		name[++nprt] = 'b';
10437	}
10438
10439	if (minor & MT_NOREWIND) {
10440		name[++nprt] = 'n';
10441	}
10442
10443	/* NULL terminator */
10444	name[++nprt] = 0;
10445
10446	return (name);
10447}
10448#endif	/* STDEBUG */
10449
10450/*
10451 * Soft error reporting, so far unique to each drive
10452 *
10453 * Currently supported: exabyte and DAT soft error reporting
10454 */
10455static int
10456st_report_exabyte_soft_errors(dev_t dev, int flag)
10457{
10458	uchar_t *sensep;
10459	int amt;
10460	int rval = 0;
10461	char cdb[CDB_GROUP0], *c = cdb;
10462	struct uscsi_cmd *com;
10463
10464	GET_SOFT_STATE(dev);
10465
10466	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10467	    "st_report_exabyte_soft_errors(dev = 0x%lx, flag = %d)\n",
10468	    dev, flag);
10469
10470	ASSERT(mutex_owned(ST_MUTEX));
10471
10472	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
10473	sensep = kmem_zalloc(TAPE_SENSE_LENGTH, KM_SLEEP);
10474
10475	*c++ = SCMD_REQUEST_SENSE;
10476	*c++ = 0;
10477	*c++ = 0;
10478	*c++ = 0;
10479	*c++ = TAPE_SENSE_LENGTH;
10480	/*
10481	 * set CLRCNT (byte 5, bit 7 which clears the error counts)
10482	 */
10483	*c   = (char)0x80;
10484
10485	com->uscsi_cdb = cdb;
10486	com->uscsi_cdblen = CDB_GROUP0;
10487	com->uscsi_bufaddr = (caddr_t)sensep;
10488	com->uscsi_buflen = TAPE_SENSE_LENGTH;
10489	com->uscsi_flags = USCSI_DIAGNOSE | USCSI_SILENT
10490		| USCSI_READ | USCSI_RQENABLE;
10491	com->uscsi_timeout = un->un_dp->non_motion_timeout;
10492
10493	rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE,
10494		UIO_SYSSPACE);
10495	if (rval || com->uscsi_status) {
10496		goto done;
10497	}
10498
10499	/*
10500	 * was there enough data?
10501	 */
10502	amt = (int)TAPE_SENSE_LENGTH - com->uscsi_resid;
10503
10504	if ((amt >= 19) && un->un_kbytes_xferred) {
10505		uint_t count, error_rate;
10506		uint_t rate;
10507
10508		if (sensep[21] & CLN) {
10509			scsi_log(ST_DEVINFO, st_label, CE_WARN,
10510			    "Periodic head cleaning required");
10511		}
10512		if (un->un_kbytes_xferred < (EXABYTE_MIN_TRANSFER/1000))
10513			goto done;
10514		/*
10515		 * check if soft error reporting needs to be done.
10516		 */
10517		count = sensep[16] << 16 | sensep[17] << 8 | sensep[18];
10518		count &= 0xffffff;
10519		error_rate = (count * 100)/un->un_kbytes_xferred;
10520
10521#ifdef	STDEBUG
10522		if (st_soft_error_report_debug) {
10523			scsi_log(ST_DEVINFO, st_label, CE_NOTE,
10524			    "Exabyte Soft Error Report:\n");
10525			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10526			    "read/write error counter: %d\n", count);
10527			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10528			    "number of bytes transferred: %dK\n",
10529				un->un_kbytes_xferred);
10530			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10531			    "error_rate: %d%%\n", error_rate);
10532
10533			if (amt >= 22) {
10534				scsi_log(ST_DEVINFO, st_label, CE_CONT,
10535				    "unit sense: 0x%b 0x%b 0x%b\n",
10536				    sensep[19], SENSE_19_BITS,
10537				    sensep[20], SENSE_20_BITS,
10538				    sensep[21], SENSE_21_BITS);
10539			}
10540			if (amt >= 27) {
10541				scsi_log(ST_DEVINFO, st_label, CE_CONT,
10542				    "tracking retry counter: %d\n",
10543				    sensep[26]);
10544				scsi_log(ST_DEVINFO, st_label, CE_CONT,
10545				    "read/write retry counter: %d\n",
10546				    sensep[27]);
10547			}
10548		}
10549#endif
10550
10551		if (flag & FWRITE) {
10552			rate = EXABYTE_WRITE_ERROR_THRESHOLD;
10553		} else {
10554			rate = EXABYTE_READ_ERROR_THRESHOLD;
10555		}
10556		if (error_rate >= rate) {
10557			scsi_log(ST_DEVINFO, st_label, CE_WARN,
10558			    "Soft error rate (%d%%) during %s was too high",
10559			    error_rate,
10560			    ((flag & FWRITE) ? wrg_str : rdg_str));
10561			scsi_log(ST_DEVINFO, st_label, CE_CONT,
10562			    "Please, replace tape cartridge\n");
10563		}
10564	}
10565
10566done:
10567	kmem_free(com, sizeof (*com));
10568	kmem_free(sensep, TAPE_SENSE_LENGTH);
10569
10570	if (rval != 0) {
10571		scsi_log(ST_DEVINFO, st_label, CE_WARN,
10572		    "exabyte soft error reporting failed\n");
10573	}
10574	return (rval);
10575}
10576
10577/*
10578 * this is very specific to Archive 4mm dat
10579 */
10580#define	ONEGIG	(1024 * 1024 * 1024)
10581
10582static int
10583st_report_dat_soft_errors(dev_t dev, int flag)
10584{
10585	uchar_t *sensep;
10586	int amt, i;
10587	int rval = 0;
10588	char cdb[CDB_GROUP1], *c = cdb;
10589	struct uscsi_cmd *com;
10590
10591	GET_SOFT_STATE(dev);
10592
10593	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10594	    "st_report_dat_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag);
10595
10596	ASSERT(mutex_owned(ST_MUTEX));
10597
10598	com = kmem_zalloc(sizeof (*com), KM_SLEEP);
10599	sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP);
10600
10601	*c++ = SCMD_LOG_SENSE_G1;
10602	*c++ = 0;
10603	*c++ = (flag & FWRITE) ? 0x42 : 0x43;
10604	*c++ = 0;
10605	*c++ = 0;
10606	*c++ = 0;
10607	*c++ = 2;
10608	*c++ = 0;
10609	*c++ = (char)LOG_SENSE_LENGTH;
10610	*c   = 0;
10611	com->uscsi_cdb    = cdb;
10612	com->uscsi_cdblen  = CDB_GROUP1;
10613	com->uscsi_bufaddr = (caddr_t)sensep;
10614	com->uscsi_buflen  = LOG_SENSE_LENGTH;
10615	com->uscsi_flags   =
10616	    USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE;
10617	com->uscsi_timeout = un->un_dp->non_motion_timeout;
10618	rval =
10619	    st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
10620	if (rval) {
10621		scsi_log(ST_DEVINFO, st_label, CE_WARN,
10622		    "DAT soft error reporting failed\n");
10623	}
10624	if (rval || com->uscsi_status) {
10625		goto done;
10626	}
10627
10628	/*
10629	 * was there enough data?
10630	 */
10631	amt = (int)LOG_SENSE_LENGTH - com->uscsi_resid;
10632
10633	if ((amt >= MIN_LOG_SENSE_LENGTH) && un->un_kbytes_xferred) {
10634		int total, retries, param_code;
10635
10636		total = -1;
10637		retries = -1;
10638		amt = sensep[3] + 4;
10639
10640
10641#ifdef STDEBUG
10642		if (st_soft_error_report_debug) {
10643			(void) printf("logsense:");
10644			for (i = 0; i < MIN_LOG_SENSE_LENGTH; i++) {
10645				if (i % 16 == 0) {
10646					(void) printf("\t\n");
10647				}
10648				(void) printf(" %x", sensep[i]);
10649			}
10650			(void) printf("\n");
10651		}
10652#endif
10653
10654		/*
10655		 * parse the param_codes
10656		 */
10657		if (sensep[0] == 2 || sensep[0] == 3) {
10658			for (i = 4; i < amt; i++) {
10659				param_code = (sensep[i++] << 8);
10660				param_code += sensep[i++];
10661				i++; /* skip control byte */
10662				if (param_code == 5) {
10663					if (sensep[i++] == 4) {
10664						total = (sensep[i++] << 24);
10665						total += (sensep[i++] << 16);
10666						total += (sensep[i++] << 8);
10667						total += sensep[i];
10668					}
10669				} else if (param_code == 0x8007) {
10670					if (sensep[i++] == 2) {
10671						retries = sensep[i++] << 8;
10672						retries += sensep[i];
10673					}
10674				} else {
10675					i += sensep[i];
10676				}
10677			}
10678		}
10679
10680		/*
10681		 * if the log sense returned valid numbers then determine
10682		 * the read and write error thresholds based on the amount of
10683		 * data transferred
10684		 */
10685
10686		if (total > 0 && retries > 0) {
10687			short normal_retries = 0;
10688			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
10689			"total xferred (%s) =%x, retries=%x\n",
10690				((flag & FWRITE) ? wrg_str : rdg_str),
10691				total, retries);
10692
10693			if (flag & FWRITE) {
10694				if (total <=
10695					WRITE_SOFT_ERROR_WARNING_THRESHOLD) {
10696					normal_retries =
10697						DAT_SMALL_WRITE_ERROR_THRESHOLD;
10698				} else {
10699					normal_retries =
10700						DAT_LARGE_WRITE_ERROR_THRESHOLD;
10701				}
10702			} else {
10703				if (total <=
10704					READ_SOFT_ERROR_WARNING_THRESHOLD) {
10705					normal_retries =
10706						DAT_SMALL_READ_ERROR_THRESHOLD;
10707				} else {
10708					normal_retries =
10709						DAT_LARGE_READ_ERROR_THRESHOLD;
10710				}
10711			}
10712
10713			ST_DEBUG4(ST_DEVINFO, st_label, SCSI_DEBUG,
10714			"normal retries=%d\n", normal_retries);
10715
10716			if (retries >= normal_retries) {
10717				scsi_log(ST_DEVINFO, st_label, CE_WARN,
10718				    "Soft error rate (retries = %d) during "
10719				    "%s was too high",  retries,
10720				    ((flag & FWRITE) ? wrg_str : rdg_str));
10721				scsi_log(ST_DEVINFO, st_label, CE_CONT,
10722				    "Periodic head cleaning required "
10723				    "and/or replace tape cartridge\n");
10724			}
10725
10726		} else if (total == -1 || retries == -1) {
10727			scsi_log(ST_DEVINFO, st_label, CE_WARN,
10728			    "log sense parameter code does not make sense\n");
10729		}
10730	}
10731
10732	/*
10733	 * reset all values
10734	 */
10735	c = cdb;
10736	*c++ = SCMD_LOG_SELECT_G1;
10737	*c++ = 2;	/* this resets all values */
10738	*c++ = (char)0xc0;
10739	*c++ = 0;
10740	*c++ = 0;
10741	*c++ = 0;
10742	*c++ = 0;
10743	*c++ = 0;
10744	*c++ = 0;
10745	*c   = 0;
10746	com->uscsi_bufaddr = NULL;
10747	com->uscsi_buflen  = 0;
10748	com->uscsi_flags   = USCSI_DIAGNOSE | USCSI_SILENT | USCSI_RQENABLE;
10749	rval =
10750	    st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
10751	if (rval) {
10752		scsi_log(ST_DEVINFO, st_label, CE_WARN,
10753		    "DAT soft error reset failed\n");
10754	}
10755done:
10756	kmem_free(com, sizeof (*com));
10757	kmem_free(sensep, LOG_SENSE_LENGTH);
10758	return (rval);
10759}
10760
10761static int
10762st_report_soft_errors(dev_t dev, int flag)
10763{
10764	GET_SOFT_STATE(dev);
10765
10766	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
10767	    "st_report_soft_errors(dev = 0x%lx, flag = %d)\n", dev, flag);
10768
10769	ASSERT(mutex_owned(ST_MUTEX));
10770
10771	switch (un->un_dp->type) {
10772	case ST_TYPE_EXB8500:
10773	case ST_TYPE_EXABYTE:
10774		return (st_report_exabyte_soft_errors(dev, flag));
10775		/*NOTREACHED*/
10776	case ST_TYPE_PYTHON:
10777		return (st_report_dat_soft_errors(dev, flag));
10778		/*NOTREACHED*/
10779	default:
10780		un->un_dp->options &= ~ST_SOFT_ERROR_REPORTING;
10781		return (-1);
10782	}
10783}
10784
10785/*
10786 * persistent error routines
10787 */
10788
10789/*
10790 * enable persistent errors, and set the throttle appropriately, checking
10791 * for flush-on-errors capability
10792 */
10793static void
10794st_turn_pe_on(struct scsi_tape *un)
10795{
10796	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_on\n");
10797	ASSERT(mutex_owned(ST_MUTEX));
10798
10799	un->un_persistence = 1;
10800
10801	/*
10802	 * only use flush-on-errors if auto-request-sense and untagged-qing are
10803	 * enabled.  This will simplify the error handling for request senses
10804	 */
10805
10806	if (un->un_arq_enabled && un->un_untagged_qing) {
10807		uchar_t f_o_e;
10808
10809		mutex_exit(ST_MUTEX);
10810		f_o_e = (scsi_ifsetcap(ROUTE, "flush-on-errors", 1, 1) == 1) ?
10811		    1 : 0;
10812		mutex_enter(ST_MUTEX);
10813
10814		un->un_flush_on_errors = f_o_e;
10815	} else {
10816		un->un_flush_on_errors = 0;
10817	}
10818
10819	if (un->un_flush_on_errors)
10820		un->un_max_throttle = (uchar_t)st_max_throttle;
10821	else
10822		un->un_max_throttle = 1;
10823
10824	if (un->un_dp->options & ST_RETRY_ON_RECOVERED_DEFERRED_ERROR)
10825		un->un_max_throttle = 1;
10826
10827	/* this will send a marker pkt */
10828	CLEAR_PE(un);
10829}
10830
10831/*
10832 * This turns persistent errors permanently off
10833 */
10834static void
10835st_turn_pe_off(struct scsi_tape *un)
10836{
10837	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_off\n");
10838	ASSERT(mutex_owned(ST_MUTEX));
10839
10840	/* turn it off for good */
10841	un->un_persistence = 0;
10842
10843	/* this will send a marker pkt */
10844	CLEAR_PE(un);
10845
10846	/* turn off flush on error capability, if enabled */
10847	if (un->un_flush_on_errors) {
10848		mutex_exit(ST_MUTEX);
10849		(void) scsi_ifsetcap(ROUTE, "flush-on-errors", 0, 1);
10850		mutex_enter(ST_MUTEX);
10851	}
10852
10853
10854	un->un_flush_on_errors = 0;
10855}
10856
10857/*
10858 * This clear persistent errors, allowing more commands through, and also
10859 * sending a marker packet.
10860 */
10861static void
10862st_clear_pe(struct scsi_tape *un)
10863{
10864	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_clear\n");
10865	ASSERT(mutex_owned(ST_MUTEX));
10866
10867	un->un_persist_errors = 0;
10868	un->un_throttle = un->un_last_throttle = 1;
10869	un->un_errno = 0;
10870	st_hba_unflush(un);
10871}
10872
10873/*
10874 * This will flag persistent errors, shutting everything down, if the
10875 * application had enabled persistent errors via MTIOCPERSISTENT
10876 */
10877static void
10878st_set_pe_flag(struct scsi_tape *un)
10879{
10880	ASSERT(mutex_owned(ST_MUTEX));
10881
10882	if (un->un_persistence) {
10883		ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG, "st_pe_flag\n");
10884		un->un_persist_errors = 1;
10885		un->un_throttle = un->un_last_throttle = 0;
10886	}
10887}
10888
10889/*
10890 * List of commands that are allowed to be done while another host holds
10891 * the reservation.
10892 */
10893struct {
10894	uchar_t cmd;
10895	uchar_t byte;	/* byte to look for data */
10896	uint32_t mask;	/* bits that matter in the above data */
10897} rcmds[] = {
10898	{ SCMD_TEST_UNIT_READY, 0, 0 }, /* may fail on older drives */
10899	{ SCMD_REQUEST_SENSE, 0, 0 },
10900	{ SCMD_READ_BLKLIM, 0, 0 },
10901	{ SCMD_INQUIRY, 0, 0 },
10902	{ SCMD_RESERVE, 0, 0 },
10903	{ SCMD_RELEASE, 0, 0 },
10904	{ SCMD_DOORLOCK, 4, 3 },	/* allow (unlock) media access only */
10905	{ SCMD_REPORT_DENSITIES, 0, 0 },
10906	{ SCMD_LOG_SENSE_G1, 0, 0 },
10907	{ SCMD_PERSISTENT_RESERVE_IN, 0, 0 },
10908	{ SCMD_PERSISTENT_RESERVE_OUT, 0, 0 },
10909	{ SCMD_REPORT_LUNS, 0, 0 }
10910};
10911
10912static int
10913st_do_reserve(struct scsi_tape *un)
10914{
10915	int rval;
10916
10917	/*
10918	 * Issue a Throw-Away reserve command to clear the
10919	 * check condition.
10920	 * If the current behaviour of reserve/release is to
10921	 * hold reservation across opens , and if a Bus reset
10922	 * has been issued between opens then this command
10923	 * would set the ST_LOST_RESERVE flags in rsvd_status.
10924	 * In this case return an EACCES so that user knows that
10925	 * reservation has been lost in between opens.
10926	 * If this error is not returned and we continue with
10927	 * successful open , then user may think position of the
10928	 * tape is still the same but inreality we would rewind the
10929	 * tape and continue from BOT.
10930	 */
10931	rval = st_reserve_release(un, ST_RESERVE);
10932	if (rval) {
10933		if ((un->un_rsvd_status & ST_LOST_RESERVE_BETWEEN_OPENS) ==
10934		    ST_LOST_RESERVE_BETWEEN_OPENS) {
10935			un->un_rsvd_status &= ~(ST_LOST_RESERVE | ST_RESERVE);
10936			un->un_errno = EACCES;
10937			return (EACCES);
10938		}
10939		rval = st_reserve_release(un, ST_RESERVE);
10940	}
10941	if (rval == 0) {
10942		un->un_rsvd_status |= ST_INIT_RESERVE;
10943	}
10944
10945	return (rval);
10946}
10947
10948static int
10949st_check_cdb_for_need_to_reserve(struct scsi_tape *un, caddr_t cdb)
10950{
10951	int i;
10952	int rval = 0;
10953
10954	/*
10955	 * If already reserved no need to do it again.
10956	 * Also if Reserve and Release are disabled Just return.
10957	 */
10958	if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) ||
10959	    (un->un_dp->options & ST_NO_RESERVE_RELEASE)) {
10960		ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
10961		    "st_check_cdb_for_need_to_reserve() reserve unneeded 0x%x",
10962		    cdb[0]);
10963		return (0);
10964	}
10965
10966	/* See if command is on the list */
10967	for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) {
10968		if ((uchar_t)cdb[0] == rcmds[i].cmd) {
10969			/*
10970			 * cmd is on list.
10971			 * if byte is zero always allowed.
10972			 */
10973			if (rcmds[i].byte == 0) {
10974				return (rval);
10975			}
10976			if (((cdb[rcmds[i].byte]) & (rcmds[i].mask)) == 0) {
10977				return (rval);
10978			}
10979			break;
10980		}
10981	}
10982
10983	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
10984	    "Command 0x%x requires reservation", cdb[0]);
10985
10986	rval = st_do_reserve(un);
10987
10988	return (rval);
10989}
10990
10991static int
10992st_check_cmd_for_need_to_reserve(struct scsi_tape *un, uchar_t cmd, int cnt)
10993{
10994	int i;
10995	int rval = 0;
10996
10997	if ((un->un_rsvd_status & (ST_RESERVE | ST_APPLICATION_RESERVATIONS)) ||
10998	    (un->un_dp->options & ST_NO_RESERVE_RELEASE)) {
10999		ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11000		    "st_check_cmd_for_need_to_reserve() reserve unneeded 0x%x",
11001		    cmd);
11002		return (0);
11003	}
11004
11005	/* See if command is on the list */
11006	for (i = 0; i < ST_NUM_MEMBERS(rcmds); i++) {
11007		if (cmd == rcmds[i].cmd) {
11008			/*
11009			 * cmd is on list.
11010			 * if byte is zero always allowed.
11011			 */
11012			if (rcmds[i].byte == 0) {
11013				return (rval);
11014			}
11015			if (((rcmds[i].mask) & cnt) == 0) {
11016				return (rval);
11017			}
11018			break;
11019		}
11020	}
11021
11022	ST_DEBUG6(ST_DEVINFO, st_label, CE_NOTE,
11023	    "Cmd 0x%x requires reservation", cmd);
11024
11025	rval = st_do_reserve(un);
11026
11027	return (rval);
11028}
11029
11030static int
11031st_reserve_release(struct scsi_tape *un, int cmd)
11032{
11033	struct uscsi_cmd	uscsi_cmd;
11034	struct uscsi_cmd	*com = &uscsi_cmd;
11035	int			rval;
11036	char			cdb[CDB_GROUP0];
11037
11038
11039	ASSERT(mutex_owned(ST_MUTEX));
11040
11041	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11042	    "st_reserve_release: %s \n",
11043	    (cmd == ST_RELEASE)?  "Releasing":"Reserving");
11044
11045	bzero(cdb, CDB_GROUP0);
11046	if (cmd == ST_RELEASE) {
11047		cdb[0] = SCMD_RELEASE;
11048	} else {
11049		cdb[0] = SCMD_RESERVE;
11050	}
11051	bzero(com, sizeof (struct uscsi_cmd));
11052	com->uscsi_flags = USCSI_WRITE;
11053	com->uscsi_cdb = cdb;
11054	com->uscsi_cdblen = CDB_GROUP0;
11055	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11056
11057	rval = st_ioctl_cmd(un->un_dev, com, UIO_SYSSPACE, UIO_SYSSPACE,
11058	    UIO_SYSSPACE);
11059
11060	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11061	    "st_reserve_release: rval(1)=%d\n", rval);
11062
11063	if (rval) {
11064		if (com->uscsi_status == STATUS_RESERVATION_CONFLICT) {
11065			rval = EACCES;
11066		}
11067		/*
11068		 * dynamically turn off reserve/release support
11069		 * in case of drives which do not support
11070		 * reserve/release command(ATAPI drives).
11071		 */
11072		if (un->un_status == KEY_ILLEGAL_REQUEST) {
11073			if (un->un_dp->options & ST_NO_RESERVE_RELEASE) {
11074				un->un_dp->options |= ST_NO_RESERVE_RELEASE;
11075				ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11076				    "Tape unit does not support "
11077				    "reserve/release \n");
11078			}
11079			rval = 0;
11080		}
11081	}
11082	return (rval);
11083}
11084
11085static int
11086st_take_ownership(dev_t dev)
11087{
11088	int rval;
11089
11090	GET_SOFT_STATE(dev);
11091	ASSERT(mutex_owned(ST_MUTEX));
11092
11093	ST_DEBUG3(ST_DEVINFO, st_label, SCSI_DEBUG,
11094		"st_take_ownership: Entering ...\n");
11095
11096
11097	rval = st_reserve_release(un, ST_RESERVE);
11098	/*
11099	 * XXX -> Should reset be done only if we get EACCES.
11100	 * .
11101	 */
11102	if (rval) {
11103		mutex_exit(ST_MUTEX);
11104		if (scsi_reset(ROUTE, RESET_TARGET) == 0) {
11105			if (scsi_reset(ROUTE, RESET_ALL) == 0) {
11106				mutex_enter(ST_MUTEX);
11107				return (EIO);
11108			}
11109		}
11110		mutex_enter(ST_MUTEX);
11111		un->un_rsvd_status &=
11112			~(ST_LOST_RESERVE | ST_RESERVATION_CONFLICT);
11113
11114		mutex_exit(ST_MUTEX);
11115		delay(drv_usectohz(ST_RESERVATION_DELAY));
11116		mutex_enter(ST_MUTEX);
11117		/*
11118		 * remove the check condition.
11119		 */
11120		(void) st_reserve_release(un, ST_RESERVE);
11121		if ((rval = st_reserve_release(un, ST_RESERVE)) != 0) {
11122			if ((st_reserve_release(un, ST_RESERVE)) != 0) {
11123				rval = (un->un_rsvd_status &
11124					ST_RESERVATION_CONFLICT) ? EACCES : EIO;
11125				return (rval);
11126			}
11127		}
11128		/*
11129		 * Set tape state to ST_STATE_OFFLINE , in case if
11130		 * the user wants to continue and start using
11131		 * the tape.
11132		 */
11133		un->un_state = ST_STATE_OFFLINE;
11134		un->un_rsvd_status |= ST_INIT_RESERVE;
11135	}
11136	return (rval);
11137}
11138
11139static int
11140st_create_errstats(struct scsi_tape *un, int instance)
11141{
11142	char	kstatname[KSTAT_STRLEN];
11143
11144	/*
11145	 * Create device error kstats
11146	 */
11147
11148	if (un->un_errstats == (kstat_t *)0) {
11149		(void) sprintf(kstatname, "st%d,err", instance);
11150		un->un_errstats = kstat_create("sterr", instance, kstatname,
11151			"device_error", KSTAT_TYPE_NAMED,
11152			sizeof (struct st_errstats) / sizeof (kstat_named_t),
11153			KSTAT_FLAG_PERSISTENT);
11154
11155		if (un->un_errstats) {
11156			struct st_errstats	*stp;
11157
11158			stp = (struct st_errstats *)un->un_errstats->ks_data;
11159			kstat_named_init(&stp->st_softerrs, "Soft Errors",
11160				KSTAT_DATA_ULONG);
11161			kstat_named_init(&stp->st_harderrs, "Hard Errors",
11162				KSTAT_DATA_ULONG);
11163			kstat_named_init(&stp->st_transerrs, "Transport Errors",
11164				KSTAT_DATA_ULONG);
11165			kstat_named_init(&stp->st_vid, "Vendor",
11166				KSTAT_DATA_CHAR);
11167			kstat_named_init(&stp->st_pid, "Product",
11168				KSTAT_DATA_CHAR);
11169			kstat_named_init(&stp->st_revision, "Revision",
11170				KSTAT_DATA_CHAR);
11171			kstat_named_init(&stp->st_serial, "Serial No",
11172				KSTAT_DATA_CHAR);
11173			un->un_errstats->ks_private = un;
11174			un->un_errstats->ks_update = nulldev;
11175			kstat_install(un->un_errstats);
11176			/*
11177			 * Fill in the static data
11178			 */
11179			(void) strncpy(&stp->st_vid.value.c[0],
11180					ST_INQUIRY->inq_vid, 8);
11181			/*
11182			 * XXX:  Emulex MT-02 (and emulators) predates
11183			 *	 SCSI-1 and has no vid & pid inquiry data.
11184			 */
11185			if (ST_INQUIRY->inq_len != 0) {
11186				(void) strncpy(&stp->st_pid.value.c[0],
11187					ST_INQUIRY->inq_pid, 16);
11188				(void) strncpy(&stp->st_revision.value.c[0],
11189					ST_INQUIRY->inq_revision, 4);
11190				(void) strncpy(&stp->st_serial.value.c[0],
11191					ST_INQUIRY->inq_serial, 12);
11192			}
11193		}
11194	}
11195	return (0);
11196}
11197
11198static int
11199st_validate_tapemarks(struct scsi_tape *un, int fileno, daddr_t blkno)
11200{
11201	dev_t dev;
11202	int rval;
11203
11204	ASSERT(MUTEX_HELD(&un->un_sd->sd_mutex));
11205	ASSERT(mutex_owned(ST_MUTEX));
11206
11207	dev = un->un_dev;
11208
11209	scsi_log(ST_DEVINFO, st_label, CE_NOTE, "Restoring tape"
11210	" position at fileno=%x, blkno=%lx....", fileno, blkno);
11211
11212	/*
11213	 * Rewind ? Oh yeah, Fidelity has got the STK F/W changed
11214	 * so as not to rewind tape on RESETS: Gee, Has life ever
11215	 * been simple in tape land ?
11216	 */
11217	rval = st_cmd(dev, SCMD_REWIND, 0, SYNC_CMD);
11218	if (rval) {
11219		scsi_log(ST_DEVINFO, st_label, CE_WARN,
11220		"Failed to restore the last file and block position: In"
11221		" this state, Tape will be loaded at BOT during next open");
11222		un->un_fileno = -1;
11223		return (rval);
11224	}
11225
11226	if (fileno) {
11227		rval = st_cmd(dev, SCMD_SPACE, Fmk(fileno), SYNC_CMD);
11228		if (rval) {
11229			scsi_log(ST_DEVINFO, st_label, CE_WARN,
11230			"Failed to restore the last file position: In this "
11231			" state, Tape will be loaded at BOT during next open");
11232			un->un_fileno = -1;
11233			return (rval);
11234		}
11235	}
11236
11237	if (blkno) {
11238		rval = st_cmd(dev, SCMD_SPACE, Blk(blkno), SYNC_CMD);
11239		if (rval) {
11240			scsi_log(ST_DEVINFO, st_label, CE_WARN,
11241			"Failed to restore the last block position: In this"
11242			" state, tape will be loaded at BOT during next open");
11243			un->un_fileno = -1;
11244			return (rval);
11245		}
11246	}
11247
11248	return (0);
11249}
11250
11251/*
11252 * check sense key, ASC, ASCQ in order to determine if the tape needs
11253 * to be ejected
11254 */
11255
11256static int
11257st_check_asc_ascq(struct scsi_tape *un)
11258{
11259	struct scsi_extended_sense *sensep = ST_RQSENSE;
11260	struct tape_failure_code   *code;
11261
11262	for (code = st_tape_failure_code; code->key != 0xff; code++) {
11263		if ((code->key  == sensep->es_key) &&
11264		    (code->add_code  == sensep->es_add_code) &&
11265		    (code->qual_code == sensep->es_qual_code))
11266			return (1);
11267	}
11268	return (0);
11269}
11270
11271/*
11272 * st_logpage_supported() sends a Log Sense command with
11273 * page code = 0 = Supported Log Pages Page to the device,
11274 * to see whether the page 'page' is supported.
11275 * Return values are:
11276 * -1 if the Log Sense command fails
11277 * 0 if page is not supported
11278 * 1 if page is supported
11279 */
11280
11281static int
11282st_logpage_supported(dev_t dev, uchar_t page)
11283{
11284	uchar_t *sp, *sensep;
11285	unsigned length;
11286	struct uscsi_cmd *com;
11287	int rval;
11288	char cdb[CDB_GROUP1] = {
11289		SCMD_LOG_SENSE_G1,
11290		0,
11291		SUPPORTED_LOG_PAGES_PAGE,
11292		0,
11293		0,
11294		0,
11295		0,
11296		0,
11297		(char)LOG_SENSE_LENGTH,
11298		0
11299	};
11300
11301	GET_SOFT_STATE(dev);
11302	ASSERT(mutex_owned(ST_MUTEX));
11303
11304	com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
11305	sensep = kmem_zalloc(LOG_SENSE_LENGTH, KM_SLEEP);
11306
11307	com->uscsi_cdb = cdb;
11308	com->uscsi_cdblen = CDB_GROUP1;
11309	com->uscsi_bufaddr = (caddr_t)sensep;
11310	com->uscsi_buflen = LOG_SENSE_LENGTH;
11311	com->uscsi_flags =
11312		USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE;
11313	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11314	rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
11315	if (rval || com->uscsi_status) {
11316		/* uscsi-command failed */
11317		rval = -1;
11318	} else {
11319
11320		sp = sensep + 3;
11321
11322		for (length = *sp++; length > 0; length--, sp++) {
11323
11324			if (*sp == page) {
11325				rval = 1;
11326				break;
11327			}
11328		}
11329	}
11330	kmem_free(com, sizeof (struct uscsi_cmd));
11331	kmem_free(sensep, LOG_SENSE_LENGTH);
11332	return (rval);
11333}
11334
11335
11336/*
11337 * st_check_clean_bit() gets the status of the tape's cleaning bit.
11338 *
11339 * If the device does support the TapeAlert log page, then the cleaning bit
11340 * information will be read from this page. Otherwise we will see if one of
11341 * ST_CLN_TYPE_1, ST_CLN_TYPE_2 or ST_CLN_TYPE_3 is set in the properties of
11342 * the device, which means, that we can get the cleaning bit information via
11343 * a RequestSense command.
11344 * If both methods of getting cleaning bit information are not supported
11345 * st_check_clean_bit() will return with 0. Otherwise st_check_clean_bit()
11346 * returns with
11347 * - MTF_TAPE_CLN_SUPPORTED if cleaning bit is not set or
11348 * - MTF_TAPE_CLN_SUPPORTED | MTF_TAPE_HEAD_DIRTY if cleaning bit is set.
11349 * If the call to st_ioctl_cmd() to do the Log Sense or the Request Sense
11350 * command fails, or if the amount of Request Sense data is not enough, then
11351 *  st_check_clean_bit() returns with -1.
11352 */
11353
11354static int
11355st_check_clean_bit(dev_t dev)
11356{
11357	int rval = 0;
11358
11359	GET_SOFT_STATE(dev);
11360
11361	ASSERT(mutex_owned(ST_MUTEX));
11362
11363	if (un->un_HeadClean & TAPE_ALERT_NOT_SUPPORTED) {
11364		return (rval);
11365	}
11366
11367	if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) {
11368
11369		rval = st_logpage_supported(dev, TAPE_SEQUENTIAL_PAGE);
11370		if (rval == 1) {
11371
11372			un->un_HeadClean |= TAPE_SEQUENTIAL_SUPPORTED;
11373		}
11374
11375		rval = st_logpage_supported(dev, TAPE_ALERT_PAGE);
11376		if (rval == 1) {
11377
11378			un->un_HeadClean |= TAPE_ALERT_SUPPORTED;
11379		}
11380
11381		if (un->un_HeadClean == TAPE_ALERT_SUPPORT_UNKNOWN) {
11382
11383			un->un_HeadClean = TAPE_ALERT_NOT_SUPPORTED;
11384		}
11385	}
11386
11387	rval = 0;
11388
11389	if (un->un_HeadClean & TAPE_SEQUENTIAL_SUPPORTED) {
11390
11391		rval = st_check_sequential_clean_bit(dev);
11392	}
11393
11394	if ((rval <= 0) && (un->un_HeadClean & TAPE_ALERT_SUPPORTED)) {
11395
11396		rval = st_check_alert_flags(dev);
11397	}
11398
11399	if ((rval <= 0) && (un->un_dp->options & ST_CLN_MASK)) {
11400
11401		rval = st_check_sense_clean_bit(dev);
11402	}
11403
11404	if (rval < 0) {
11405		return (rval);
11406	}
11407
11408	/*
11409	 * If found a supported means to check need to clean.
11410	 */
11411	if (rval & MTF_TAPE_CLN_SUPPORTED) {
11412
11413		/*
11414		 * head needs to be cleaned.
11415		 */
11416		if (rval & MTF_TAPE_HEAD_DIRTY) {
11417
11418			/*
11419			 * Print log message only first time
11420			 * found needing cleaned.
11421			 */
11422			if ((un->un_HeadClean & TAPE_PREVIOUSLY_DIRTY) == 0) {
11423
11424				scsi_log(ST_DEVINFO, st_label, CE_WARN,
11425				    "Periodic head cleaning required");
11426
11427				un->un_HeadClean |= TAPE_PREVIOUSLY_DIRTY;
11428			}
11429
11430		} else {
11431
11432			un->un_HeadClean &= ~TAPE_PREVIOUSLY_DIRTY;
11433		}
11434	}
11435
11436	return (rval);
11437}
11438
11439
11440static int
11441st_check_sequential_clean_bit(dev_t dev)
11442{
11443	int rval;
11444	int ix;
11445	ushort_t parameter;
11446	struct uscsi_cmd *cmd;
11447	struct log_sequential_page *sp;
11448	struct log_sequential_page_parameter *prm;
11449	char cdb[CDB_GROUP1] = {
11450		SCMD_LOG_SENSE_G1,
11451		0,
11452		TAPE_SEQUENTIAL_PAGE | CURRENT_CUMULATIVE_VALUES,
11453		0,
11454		0,
11455		0,
11456		0,
11457		(char)(sizeof (struct log_sequential_page) >> 8),
11458		(char)(sizeof (struct log_sequential_page)),
11459		0
11460	};
11461
11462	GET_SOFT_STATE(dev);
11463
11464	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
11465	sp  = kmem_zalloc(sizeof (struct log_sequential_page), KM_SLEEP);
11466
11467	cmd->uscsi_flags   =
11468		USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE;
11469	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
11470	cmd->uscsi_cdb	   = cdb;
11471	cmd->uscsi_cdblen  = CDB_GROUP1;
11472	cmd->uscsi_bufaddr = (caddr_t)sp;
11473	cmd->uscsi_buflen  = sizeof (struct log_sequential_page);
11474
11475	rval = st_ioctl_cmd(dev, cmd, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
11476
11477	if (rval || cmd->uscsi_status || cmd->uscsi_resid) {
11478
11479		rval = -1;
11480
11481	} else if (sp->log_page.code != TAPE_SEQUENTIAL_PAGE) {
11482
11483		rval = -1;
11484	}
11485
11486	prm = &sp->param[0];
11487
11488	for (ix = 0; rval == 0 && ix < TAPE_SEQUENTIAL_PAGE_PARA; ix++) {
11489
11490		if (prm->log_param.length == 0) {
11491			break;
11492		}
11493
11494		parameter = (((prm->log_param.pc_hi << 8) & 0xff00) +
11495			(prm->log_param.pc_lo & 0xff));
11496
11497		if (parameter == SEQUENTIAL_NEED_CLN) {
11498
11499			rval = MTF_TAPE_CLN_SUPPORTED;
11500			if (prm->param_value[prm->log_param.length - 1]) {
11501
11502				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11503					    "sequential log says head dirty\n");
11504				rval |= MTF_TAPE_HEAD_DIRTY;
11505			}
11506		}
11507		prm = (struct log_sequential_page_parameter *)
11508			&prm->param_value[prm->log_param.length];
11509	}
11510
11511	kmem_free(cmd, sizeof (struct uscsi_cmd));
11512	kmem_free(sp,  sizeof (struct log_sequential_page));
11513
11514	return (rval);
11515}
11516
11517
11518static int
11519st_check_alert_flags(dev_t dev)
11520{
11521	struct st_tape_alert *ta;
11522	struct uscsi_cmd *com;
11523	unsigned ix, length;
11524	int rval;
11525	tape_alert_flags flag;
11526	char cdb[CDB_GROUP1] = {
11527		SCMD_LOG_SENSE_G1,
11528		0,
11529		TAPE_ALERT_PAGE | CURRENT_THRESHOLD_VALUES,
11530		0,
11531		0,
11532		0,
11533		0,
11534		(char)(sizeof (struct st_tape_alert) >> 8),
11535		(char)(sizeof (struct st_tape_alert)),
11536		0
11537	};
11538
11539	GET_SOFT_STATE(dev);
11540
11541	com = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
11542	ta  = kmem_zalloc(sizeof (struct st_tape_alert), KM_SLEEP);
11543
11544	com->uscsi_cdb = cdb;
11545	com->uscsi_cdblen = CDB_GROUP1;
11546	com->uscsi_bufaddr = (caddr_t)ta;
11547	com->uscsi_buflen = sizeof (struct st_tape_alert);
11548	com->uscsi_flags =
11549		USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE;
11550	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11551
11552	rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
11553
11554	if (rval || com->uscsi_status || com->uscsi_resid) {
11555
11556		rval = -1; /* uscsi-command failed */
11557
11558	} else if (ta->log_page.code != TAPE_ALERT_PAGE) {
11559
11560		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11561		"Not Alert Log Page returned 0x%X\n", ta->log_page.code);
11562		rval = -1;
11563	}
11564
11565	length = (ta->log_page.length_hi << 8) + ta->log_page.length_lo;
11566
11567
11568	if (length != TAPE_ALERT_PARAMETER_LENGTH) {
11569
11570		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11571		    "TapeAlert length %d\n", length);
11572	}
11573
11574
11575	for (ix = 0; ix < TAPE_ALERT_MAX_PARA; ix++) {
11576
11577		/*
11578		 * if rval is bad before the first pass don't bother
11579		 */
11580		if (ix == 0 && rval != 0) {
11581
11582			break;
11583		}
11584
11585		flag = ((ta->param[ix].log_param.pc_hi << 8) +
11586			ta->param[ix].log_param.pc_lo);
11587
11588		if ((ta->param[ix].param_value & 1) == 0) {
11589			continue;
11590		}
11591		/*
11592		 * check to see if current parameter is of interest.
11593		 * CLEAN_FOR_ERRORS is vendor specific to 9840 9940 stk's.
11594		 */
11595		if ((flag == TAF_CLEAN_NOW) ||
11596		    (flag == TAF_CLEAN_PERIODIC) ||
11597		    ((flag == CLEAN_FOR_ERRORS) &&
11598		    (un->un_dp->type == ST_TYPE_STK9840))) {
11599
11600			rval = MTF_TAPE_CLN_SUPPORTED;
11601
11602
11603			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11604			    "alert_page drive needs clean %d\n", flag);
11605			un->un_HeadClean |= TAPE_ALERT_STILL_DIRTY;
11606			rval |= MTF_TAPE_HEAD_DIRTY;
11607
11608		} else if (flag == TAF_CLEANING_MEDIA) {
11609
11610			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11611			    "alert_page drive was cleaned\n");
11612			un->un_HeadClean &= ~TAPE_ALERT_STILL_DIRTY;
11613		}
11614
11615	}
11616
11617	/*
11618	 * Report it as dirty till we see it cleaned
11619	 */
11620	if (un->un_HeadClean & TAPE_ALERT_STILL_DIRTY) {
11621
11622		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11623		    "alert_page still dirty\n");
11624		rval |= MTF_TAPE_HEAD_DIRTY;
11625	}
11626
11627	kmem_free(com, sizeof (struct uscsi_cmd));
11628	kmem_free(ta,  sizeof (struct st_tape_alert));
11629
11630	return (rval);
11631}
11632
11633
11634static int
11635st_check_sense_clean_bit(dev_t dev)
11636{
11637	uchar_t *sensep;
11638	char cdb[CDB_GROUP0];
11639	struct uscsi_cmd *com;
11640	ushort_t byte_pos;
11641	uchar_t bit_mask;
11642	unsigned length;
11643	int index;
11644	int rval;
11645
11646	GET_SOFT_STATE(dev);
11647
11648	/*
11649	 * Since this tape does not support Tape Alert,
11650	 * we now try to get the cleanbit status via
11651	 * Request Sense.
11652	 */
11653
11654	if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_1) {
11655
11656		index = 0;
11657
11658	} else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_2) {
11659
11660		index = 1;
11661
11662	} else if ((un->un_dp->options & ST_CLN_MASK) == ST_CLN_TYPE_3) {
11663
11664		index = 2;
11665
11666	} else {
11667
11668		return (-1);
11669	}
11670
11671	byte_pos  = st_cln_bit_position[index].cln_bit_byte;
11672	bit_mask  = st_cln_bit_position[index].cln_bit_mask;
11673	length = byte_pos + 1;
11674
11675	com    = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
11676	sensep = kmem_zalloc(length, KM_SLEEP);
11677
11678	cdb[0] = SCMD_REQUEST_SENSE;
11679	cdb[1] = 0;
11680	cdb[2] = 0;
11681	cdb[3] = 0;
11682	cdb[4] = (char)length;
11683	cdb[5] = 0;
11684
11685	com->uscsi_cdb = cdb;
11686	com->uscsi_cdblen = CDB_GROUP0;
11687	com->uscsi_bufaddr = (caddr_t)sensep;
11688	com->uscsi_buflen = length;
11689	com->uscsi_flags =
11690		USCSI_DIAGNOSE | USCSI_SILENT | USCSI_READ | USCSI_RQENABLE;
11691	com->uscsi_timeout = un->un_dp->non_motion_timeout;
11692
11693	rval = st_ioctl_cmd(dev, com, UIO_SYSSPACE, UIO_SYSSPACE,
11694			UIO_SYSSPACE);
11695
11696	if (rval || com->uscsi_status || com->uscsi_resid) {
11697
11698		rval = -1;
11699
11700	} else {
11701
11702		rval = MTF_TAPE_CLN_SUPPORTED;
11703		if ((sensep[byte_pos] & bit_mask) == bit_mask) {
11704
11705			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11706				    "sense data says head dirty\n");
11707			rval |= MTF_TAPE_HEAD_DIRTY;
11708		}
11709	}
11710
11711	kmem_free(com, sizeof (struct uscsi_cmd));
11712	kmem_free(sensep, length);
11713	return (rval);
11714}
11715
11716/*
11717 * st_clear_unit_attention
11718 *
11719 *  	run test unit ready's to clear out outstanding
11720 * 	unit attentions.
11721 * 	returns zero for SUCCESS or the errno from st_cmd call
11722 */
11723static int
11724st_clear_unit_attentions(dev_t dev_instance, int max_trys)
11725{
11726	int	i    = 0;
11727	int	rval;
11728
11729	do {
11730		rval = st_cmd(dev_instance, SCMD_TEST_UNIT_READY, 0, SYNC_CMD);
11731	} while ((rval != 0) && (rval != ENXIO) && (++i < max_trys));
11732	return (rval);
11733}
11734
11735static void
11736st_calculate_timeouts(struct scsi_tape *un)
11737{
11738	if (un->un_dp->non_motion_timeout == 0) {
11739		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11740			un->un_dp->non_motion_timeout =
11741				st_io_time * st_long_timeout_x;
11742		} else {
11743			un->un_dp->non_motion_timeout = (ushort_t)st_io_time;
11744		}
11745	}
11746
11747	if (un->un_dp->io_timeout == 0) {
11748		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11749			un->un_dp->io_timeout = st_io_time * st_long_timeout_x;
11750		} else {
11751			un->un_dp->io_timeout = (ushort_t)st_io_time;
11752		}
11753	}
11754
11755	if (un->un_dp->rewind_timeout == 0) {
11756		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11757			un->un_dp->rewind_timeout =
11758				st_space_time * st_long_timeout_x;
11759		} else {
11760			un->un_dp->rewind_timeout = (ushort_t)st_space_time;
11761		}
11762	}
11763
11764	if (un->un_dp->space_timeout == 0) {
11765		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11766			un->un_dp->space_timeout =
11767				st_space_time * st_long_timeout_x;
11768		} else {
11769			un->un_dp->space_timeout = (ushort_t)st_space_time;
11770		}
11771	}
11772
11773	if (un->un_dp->load_timeout == 0) {
11774		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11775			un->un_dp->load_timeout =
11776				st_space_time * st_long_timeout_x;
11777		} else {
11778			un->un_dp->load_timeout = (ushort_t)st_space_time;
11779		}
11780	}
11781
11782	if (un->un_dp->unload_timeout == 0) {
11783		if (un->un_dp->options & ST_LONG_TIMEOUTS) {
11784			un->un_dp->unload_timeout =
11785				st_space_time * st_long_timeout_x;
11786		} else {
11787			un->un_dp->unload_timeout = (ushort_t)st_space_time;
11788		}
11789	}
11790
11791	if (un->un_dp->erase_timeout == 0) {
11792		if (un->un_dp->options & ST_LONG_ERASE) {
11793			un->un_dp->erase_timeout =
11794				st_space_time * st_long_space_time_x;
11795		} else {
11796			un->un_dp->erase_timeout = (ushort_t)st_space_time;
11797		}
11798	}
11799}
11800
11801
11802/*ARGSUSED*/
11803static writablity
11804st_is_not_wormable(struct scsi_tape *un)
11805{
11806	return (RDWR);
11807}
11808
11809static writablity
11810st_is_hp_lto_tape_worm(struct scsi_tape *un)
11811{
11812	writablity wrt;
11813
11814
11815	/* Mode sense should be current */
11816	switch (un->un_mspl->media_type) {
11817	case 0x00:
11818		switch (un->un_mspl->density) {
11819		case 0x40:
11820			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11821			    "Drive has standard Gen I media loaded\n");
11822			break;
11823		case 0x42:
11824			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11825			    "Drive has standard Gen II media loaded\n");
11826			break;
11827		case 0x44:
11828			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11829			    "Drive has standard Gen III media loaded\n");
11830			break;
11831		default:
11832			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11833			    "Drive has standard unknown 0x%X media loaded\n",
11834			    un->un_mspl->density);
11835		}
11836		wrt = RDWR;
11837		break;
11838	case 0x01:
11839		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11840		    "Drive has WORM medium loaded\n");
11841		wrt = WORM;
11842		break;
11843	case 0x80:
11844		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11845		    "Drive has CD-ROM emulation medium loaded\n");
11846		wrt = WORM;
11847		break;
11848	default:
11849		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11850		    "Drive has an unexpected medium type 0x%X loaded\n",
11851		    un->un_mspl->media_type);
11852		wrt = RDWR;
11853	}
11854
11855	return (wrt);
11856}
11857
11858#define	LTO_REQ_INQUIRY 44
11859static writablity
11860st_is_hp_lto_worm(struct scsi_tape *un)
11861{
11862	char *buf;
11863	int result;
11864	writablity wrt;
11865
11866	buf = kmem_zalloc(LTO_REQ_INQUIRY, KM_SLEEP);
11867
11868	result = st_get_special_inquiry(un, LTO_REQ_INQUIRY, buf, 0);
11869
11870	if (result != 0) {
11871		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11872		    "Read Standard Inquiry for WORM support failed");
11873		wrt = ERROR;
11874	} else if ((buf[40] & 1) == 0) {
11875		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11876		    "Drive is NOT WORMable\n");
11877		/* This drive doesn't support it so don't check again */
11878		un->un_dp->options &= ~ST_WORMABLE;
11879		wrt = RDWR;
11880		un->un_wormable = st_is_not_wormable;
11881	} else {
11882		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11883		    "Drive supports WORM version %d\n", buf[40] >> 1);
11884		un->un_wormable = st_is_hp_lto_tape_worm;
11885		wrt = un->un_wormable(un);
11886	}
11887
11888	kmem_free(buf, LTO_REQ_INQUIRY);
11889
11890	/*
11891	 * If drive doesn't support it no point in checking further.
11892	 */
11893	return (wrt);
11894}
11895
11896static writablity
11897st_is_t10_worm_device(struct scsi_tape *un)
11898{
11899	writablity wrt;
11900
11901	if (un->un_mspl->media_type == 0x3c) {
11902		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11903		    "Drive has WORM media loaded\n");
11904		wrt = WORM;
11905	} else {
11906		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11907		    "Drive has non WORM media loaded\n");
11908		wrt = RDWR;
11909	}
11910	return (wrt);
11911}
11912
11913#define	SEQ_CAP_PAGE	(char)0xb0
11914static writablity
11915st_is_t10_worm(struct scsi_tape *un)
11916{
11917	char *buf;
11918	int result;
11919	writablity wrt;
11920
11921	buf = kmem_zalloc(6, KM_SLEEP);
11922
11923	result = st_get_special_inquiry(un, 6, buf, SEQ_CAP_PAGE);
11924
11925	if (result != 0) {
11926		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11927		    "Read Vitial Inquiry for Sequental Capability"
11928		    " WORM support failed %x", result);
11929		wrt = ERROR;
11930	} else if ((buf[4] & 1) == 0) {
11931		ASSERT(buf[1] == SEQ_CAP_PAGE);
11932		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11933		    "Drive is NOT WORMable\n");
11934		/* This drive doesn't support it so don't check again */
11935		un->un_dp->options &= ~ST_WORMABLE;
11936		wrt = RDWR;
11937		un->un_wormable = st_is_not_wormable;
11938	} else {
11939		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11940		    "Drive supports WORM\n");
11941		un->un_wormable = st_is_t10_worm_device;
11942		wrt = un->un_wormable(un);
11943	}
11944
11945	kmem_free(buf, 6);
11946
11947	return (wrt);
11948}
11949
11950
11951#define	STK_REQ_SENSE 26
11952
11953static writablity
11954st_is_stk_worm(struct scsi_tape *un)
11955{
11956	char cdb[CDB_GROUP0] = {SCMD_REQUEST_SENSE, 0, 0, 0, STK_REQ_SENSE, 0};
11957	struct scsi_extended_sense *sense;
11958	struct uscsi_cmd *cmd;
11959	char *buf;
11960	int result;
11961	writablity wrt;
11962
11963	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
11964	buf = kmem_alloc(STK_REQ_SENSE, KM_SLEEP);
11965	sense = (struct scsi_extended_sense *)buf;
11966
11967	cmd->uscsi_flags = USCSI_READ;
11968	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
11969	cmd->uscsi_cdb = &cdb[0];
11970	cmd->uscsi_bufaddr = buf;
11971	cmd->uscsi_buflen = STK_REQ_SENSE;
11972	cmd->uscsi_cdblen = CDB_GROUP0;
11973	cmd->uscsi_rqlen = 0;
11974	cmd->uscsi_rqbuf = NULL;
11975
11976	result = st_ioctl_cmd(un->un_dev, cmd,
11977	    UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
11978
11979	if (result != 0 || cmd->uscsi_status != 0) {
11980		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11981		    "Request Sense for WORM failed");
11982		wrt = RDWR;
11983	} else if (sense->es_add_len + 8 < 24) {
11984		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11985		    "Drive didn't send enough sense data for WORM byte %d\n",
11986		    sense->es_add_len + 8);
11987		wrt = RDWR;
11988		un->un_wormable = st_is_not_wormable;
11989	} else if ((buf[24]) & 0x02) {
11990		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11991		    "Drive has WORM tape loaded\n");
11992		wrt = WORM;
11993		un->un_wormable = st_is_stk_worm;
11994	} else {
11995		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
11996		    "Drive has normal tape loaded\n");
11997		wrt = RDWR;
11998		un->un_wormable = st_is_stk_worm;
11999	}
12000
12001	kmem_free(buf, STK_REQ_SENSE);
12002	kmem_free(cmd, sizeof (struct uscsi_cmd));
12003	return (wrt);
12004}
12005
12006#define	DLT_INQ_SZ 44
12007
12008static writablity
12009st_is_dlt_tape_worm(struct scsi_tape *un)
12010{
12011	caddr_t buf;
12012	int result;
12013	writablity wrt;
12014
12015	buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP);
12016
12017	/* Read Attribute Media Type */
12018
12019	result = st_read_attributes(un, 0x0408, buf, 10);
12020
12021	/*
12022	 * If this quantum drive is attached via an HBA that cannot
12023	 * support thr read attributes command return error in the
12024	 * hope that someday they will support the t10 method.
12025	 */
12026	if (result == EINVAL && un->un_max_cdb_sz < CDB_GROUP4) {
12027		scsi_log(ST_DEVINFO, st_label, SCSI_DEBUG,
12028		    "Read Attribute Command for WORM Media detection is not "
12029		    "supported on the HBA that this drive is attached to.");
12030		wrt = RDWR;
12031		un->un_wormable = st_is_not_wormable;
12032		goto out;
12033	}
12034
12035	if (result != 0) {
12036		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12037		    "Read Attribute Command for WORM Media returned 0x%x",
12038		    result);
12039		wrt = RDWR;
12040		un->un_dp->options &= ~ST_WORMABLE;
12041		goto out;
12042	}
12043
12044	if ((uchar_t)buf[9] == 0x80) {
12045		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12046		    "Drive media is WORM\n");
12047		wrt = WORM;
12048	} else {
12049		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12050		    "Drive media is not WORM Media 0x%x\n", (uchar_t)buf[9]);
12051		wrt = RDWR;
12052	}
12053
12054out:
12055	kmem_free(buf, DLT_INQ_SZ);
12056	return (wrt);
12057}
12058
12059static writablity
12060st_is_dlt_worm(struct scsi_tape *un)
12061{
12062	caddr_t buf;
12063	int result;
12064	writablity wrt;
12065
12066	buf = kmem_alloc(DLT_INQ_SZ, KM_SLEEP);
12067
12068	result = st_get_special_inquiry(un, DLT_INQ_SZ, buf, 0xC0);
12069
12070	if (result != 0) {
12071		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12072		    "Read Vendor Specific Inquiry for WORM support failed");
12073		wrt = RDWR;
12074		goto out;
12075	}
12076
12077	if ((buf[2] & 1) == 0) {
12078		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12079		    "Drive is not WORMable\n");
12080		wrt = RDWR;
12081		un->un_dp->options &= ~ST_WORMABLE;
12082		un->un_wormable = st_is_not_wormable;
12083		goto out;
12084	} else {
12085		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12086		    "Drive is WORMable\n");
12087		un->un_wormable = st_is_dlt_tape_worm;
12088		wrt = un->un_wormable(un);
12089	}
12090out:
12091	kmem_free(buf, DLT_INQ_SZ);
12092
12093	return (wrt);
12094}
12095
12096typedef struct {
12097	struct modeheader_seq header;
12098#if defined(_BIT_FIELDS_LTOH) /* X86 */
12099	uchar_t pagecode	:6,
12100				:2;
12101	uchar_t page_len;
12102	uchar_t syslogalive	:2,
12103		device		:1,
12104		abs		:1,
12105		ulpbot		:1,
12106		prth		:1,
12107		ponej		:1,
12108		ait		:1;
12109	uchar_t span;
12110
12111	uchar_t			:6,
12112		worm		:1,
12113		mic		:1;
12114	uchar_t worm_cap	:1,
12115				:7;
12116	uint32_t		:32;
12117#else /* SPARC */
12118	uchar_t			:2,
12119		pagecode	:6;
12120	uchar_t page_len;
12121	uchar_t ait		:1,
12122		device		:1,
12123		abs		:1,
12124		ulpbot		:1,
12125		prth		:1,
12126		ponej		:1,
12127		syslogalive	:2;
12128	uchar_t span;
12129	uchar_t mic		:1,
12130		worm		:1,
12131				:6;
12132	uchar_t			:7,
12133		worm_cap	:1;
12134	uint32_t		:32;
12135#endif
12136}ait_dev_con;
12137
12138#define	AIT_DEV_PAGE 0x31
12139static writablity
12140st_is_sony_worm(struct scsi_tape *un)
12141{
12142	int result;
12143	writablity wrt;
12144	ait_dev_con *ait_conf;
12145
12146	ait_conf = kmem_zalloc(sizeof (ait_dev_con), KM_SLEEP);
12147
12148	result = st_gen_mode_sense(un, AIT_DEV_PAGE,
12149	    (struct seq_mode *)ait_conf, sizeof (ait_dev_con));
12150
12151	if (result == 0) {
12152
12153		if (ait_conf->pagecode != AIT_DEV_PAGE) {
12154			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12155			    "returned page 0x%x not 0x%x AIT_DEV_PAGE\n",
12156			    ait_conf->pagecode, AIT_DEV_PAGE);
12157			wrt = RDWR;
12158			un->un_wormable = st_is_not_wormable;
12159
12160		} else if (ait_conf->worm_cap) {
12161
12162			un->un_wormable = st_is_sony_worm;
12163
12164			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12165			    "Drives is WORMable\n");
12166			if (ait_conf->worm) {
12167				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12168				    "Media is WORM\n");
12169				wrt = WORM;
12170			} else {
12171				ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12172				    "Media is not WORM\n");
12173				wrt = RDWR;
12174			}
12175
12176		} else {
12177			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12178			    "Drives not is WORMable\n");
12179			wrt = RDWR;
12180			/* No further checking required */
12181			un->un_dp->options &= ~ST_WORMABLE;
12182		}
12183
12184	} else {
12185
12186		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12187		    "AIT device config mode sense page read command failed"
12188		    " result = %d ", result);
12189		wrt = ERROR;
12190		un->un_wormable = st_is_not_wormable;
12191	}
12192
12193	kmem_free(ait_conf, sizeof (ait_dev_con));
12194	return (wrt);
12195}
12196
12197static writablity
12198st_is_drive_worm(struct scsi_tape *un)
12199{
12200	writablity wrt;
12201
12202	switch (un->un_dp->type) {
12203	case MT_ISDLT:
12204		wrt = st_is_dlt_worm(un);
12205		break;
12206
12207	case MT_ISSTK9840:
12208		wrt = st_is_stk_worm(un);
12209		break;
12210
12211	case MT_IS8MM:
12212	case MT_ISAIT:
12213		wrt = st_is_sony_worm(un);
12214		break;
12215
12216	case MT_LTO:
12217		if (strncmp("HP ", un->un_dp->vid, 3) == 0) {
12218			wrt = st_is_hp_lto_worm(un);
12219		} else {
12220			wrt = st_is_t10_worm(un);
12221		}
12222		break;
12223
12224	default:
12225		wrt = ERROR;
12226		break;
12227	}
12228
12229	/*
12230	 * If any of the above failed try the t10 standard method.
12231	 */
12232	if (wrt == ERROR) {
12233		wrt = st_is_t10_worm(un);
12234	}
12235
12236	/*
12237	 * Unknown method for detecting WORM media.
12238	 */
12239	if (wrt == ERROR) {
12240		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12241		    "Unknown method for WORM media detection\n");
12242		wrt = RDWR;
12243		un->un_dp->options &= ~ST_WORMABLE;
12244	}
12245
12246	return (wrt);
12247}
12248
12249static int
12250st_read_attributes(struct scsi_tape *un, uint16_t attribute, caddr_t buf,
12251    size_t size)
12252{
12253	uchar_t cdb[CDB_GROUP4];
12254	struct uscsi_cmd *cmd;
12255	int result;
12256
12257	cdb[0] = SCMD_READ_ATTRIBUTE;
12258	cdb[1] = 0;
12259	cdb[2] = 0;
12260	cdb[3] = 0;
12261	cdb[4] = 0;
12262	cdb[5] = 0;
12263	cdb[6] = 0;
12264	cdb[7] = 0;
12265	cdb[8] = (uchar_t)(attribute >> 8);
12266	cdb[9] = (uchar_t)(attribute);
12267	cdb[10] = (uchar_t)(size >> 24);
12268	cdb[11] = (uchar_t)(size >> 16);
12269	cdb[12] = (uchar_t)(size >> 8);
12270	cdb[13] = (uchar_t)(size);
12271	cdb[14] = 0;
12272	cdb[15] = 0;
12273
12274	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12275
12276	cmd->uscsi_flags = USCSI_READ | USCSI_DIAGNOSE;
12277	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
12278	cmd->uscsi_cdb = (caddr_t)&cdb[0];
12279	cmd->uscsi_bufaddr = (caddr_t)buf;
12280	cmd->uscsi_buflen = size;
12281	cmd->uscsi_cdblen = sizeof (cdb);
12282
12283	result = st_ioctl_cmd(un->un_dev, cmd,
12284	    UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
12285
12286	if (result != 0 || cmd->uscsi_status != 0) {
12287		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12288		    "st_read_attribute failed: result %d status %d\n",
12289		    result, cmd->uscsi_status);
12290		if (result == 0) {
12291			result = EIO;
12292		}
12293	}
12294
12295	kmem_free(cmd, sizeof (cdb));
12296	return (result);
12297}
12298
12299static int
12300st_get_special_inquiry(struct scsi_tape *un, uchar_t size, caddr_t dest,
12301    uchar_t page)
12302{
12303	char cdb[CDB_GROUP0];
12304	struct scsi_extended_sense *sense;
12305	struct uscsi_cmd *cmd;
12306	int result;
12307
12308	cdb[0] = SCMD_INQUIRY;
12309	cdb[1] = page ? 1 : 0;
12310	cdb[2] = page;
12311	cdb[3] = 0;
12312	cdb[4] = size;
12313	cdb[5] = 0;
12314
12315	cmd = kmem_zalloc(sizeof (struct uscsi_cmd), KM_SLEEP);
12316	sense = kmem_alloc(sizeof (struct scsi_extended_sense), KM_SLEEP);
12317
12318	cmd->uscsi_flags = USCSI_READ | USCSI_RQENABLE;
12319	cmd->uscsi_timeout = un->un_dp->non_motion_timeout;
12320	cmd->uscsi_cdb = &cdb[0];
12321	cmd->uscsi_bufaddr = dest;
12322	cmd->uscsi_buflen = size;
12323	cmd->uscsi_cdblen = CDB_GROUP0;
12324	cmd->uscsi_rqlen = sizeof (struct scsi_extended_sense);
12325	cmd->uscsi_rqbuf = (caddr_t)sense;
12326
12327	result = st_ioctl_cmd(un->un_dev, cmd,
12328	    UIO_SYSSPACE, UIO_SYSSPACE, UIO_SYSSPACE);
12329
12330	if (result != 0 || cmd->uscsi_status != 0) {
12331		ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12332		    "st_get_special_inquiry() failed for page %x", page);
12333		if (result == 0) {
12334			result = EIO;
12335		}
12336	}
12337
12338	kmem_free(sense, sizeof (struct scsi_extended_sense));
12339	kmem_free(cmd, sizeof (struct uscsi_cmd));
12340
12341	return (result);
12342}
12343
12344
12345#if defined(__i386) || defined(__amd64)
12346
12347/*
12348 * release contig_mem and wake up waiting thread, if any
12349 */
12350static void
12351st_release_contig_mem(struct scsi_tape *un, struct contig_mem *cp)
12352{
12353	mutex_enter(ST_MUTEX);
12354
12355	cp->cm_next = un->un_contig_mem;
12356	un->un_contig_mem = cp;
12357	un->un_contig_mem_available_num++;
12358	cv_broadcast(&un->un_contig_mem_cv);
12359
12360	mutex_exit(ST_MUTEX);
12361}
12362
12363/*
12364 * St_get_contig_mem will return a contig_mem if there is one available
12365 * in current system. Otherwise, it will try to alloc one, if the total
12366 * number of contig_mem is within st_max_contig_mem_num.
12367 * It will sleep, if allowed by caller or return NULL, if no contig_mem
12368 * is available for now.
12369 */
12370static struct contig_mem *
12371st_get_contig_mem(struct scsi_tape *un, size_t len, int alloc_flags)
12372{
12373	size_t rlen;
12374	struct contig_mem *cp = NULL;
12375	ddi_acc_handle_t acc_hdl;
12376	caddr_t addr;
12377	int big_enough = 0;
12378	int (*dma_alloc_cb)() = (alloc_flags == KM_SLEEP) ?
12379		DDI_DMA_SLEEP : DDI_DMA_DONTWAIT;
12380
12381	/* Try to get one available contig_mem */
12382	mutex_enter(ST_MUTEX);
12383	if (un->un_contig_mem_available_num > 0) {
12384		ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
12385	} else if (un->un_contig_mem_total_num < st_max_contig_mem_num) {
12386		/*
12387		 * we failed to get one. we're going to
12388		 * alloc one more contig_mem for this I/O
12389		 */
12390		mutex_exit(ST_MUTEX);
12391		cp = (struct contig_mem *)kmem_zalloc(
12392		    sizeof (struct contig_mem) + biosize(),
12393		    alloc_flags);
12394		if (cp == NULL) {
12395			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12396			    "alloc contig_mem failure\n");
12397			return (NULL); /* cannot get one */
12398		}
12399		cp->cm_bp = (struct buf *)
12400		    (((caddr_t)cp) + sizeof (struct contig_mem));
12401		bioinit(cp->cm_bp);
12402		mutex_enter(ST_MUTEX);
12403		un->un_contig_mem_total_num++; /* one more available */
12404	} else {
12405		/*
12406		 * we failed to get one and we're NOT allowed to
12407		 * alloc more contig_mem
12408		 */
12409		if (alloc_flags == KM_SLEEP) {
12410			while (un->un_contig_mem_available_num <= 0) {
12411				cv_wait(&un->un_contig_mem_cv,
12412				    ST_MUTEX);
12413			}
12414			ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
12415		} else {
12416			mutex_exit(ST_MUTEX);
12417			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12418			    "alloc contig_mem failure\n");
12419			return (NULL); /* cannot get one */
12420		}
12421	}
12422	mutex_exit(ST_MUTEX);
12423
12424	/* We need to check if this block of mem is big enough for this I/O */
12425	if (cp->cm_len < len) {
12426		/* not big enough, need to alloc a new one */
12427		if (ddi_dma_mem_alloc(un->un_contig_mem_hdl, len, &st_acc_attr,
12428			DDI_DMA_STREAMING, dma_alloc_cb, NULL,
12429			&addr, &rlen, &acc_hdl) != DDI_SUCCESS) {
12430			ST_DEBUG2(ST_DEVINFO, st_label, SCSI_DEBUG,
12431			    "alloc contig_mem failure: not enough mem\n");
12432			st_release_contig_mem(un, cp);
12433			cp = NULL;
12434		} else {
12435			if (cp->cm_addr) {
12436				/* release previous one before attach new one */
12437				ddi_dma_mem_free(&cp->cm_acc_hdl);
12438			}
12439			mutex_enter(ST_MUTEX);
12440			un->un_max_contig_mem_len =
12441			    un->un_max_contig_mem_len >= len ?
12442			    un->un_max_contig_mem_len : len;
12443			mutex_exit(ST_MUTEX);
12444
12445			/* attach new mem to this cp */
12446			cp->cm_addr = addr;
12447			cp->cm_acc_hdl = acc_hdl;
12448			cp->cm_len = len;
12449
12450			goto alloc_ok; /* get one usable cp */
12451		}
12452	} else {
12453		goto alloc_ok; /* get one usable cp */
12454	}
12455
12456	/* cannot find/alloc a usable cp, when we get here */
12457
12458	mutex_enter(ST_MUTEX);
12459	if ((un->un_max_contig_mem_len < len) ||
12460	    (alloc_flags != KM_SLEEP)) {
12461		mutex_exit(ST_MUTEX);
12462		return (NULL);
12463	}
12464
12465	/*
12466	 * we're allowed to sleep, and there is one big enough
12467	 * contig mem in the system, which is currently in use,
12468	 * wait for it...
12469	 */
12470	big_enough = 1;
12471	do {
12472		cv_wait(&un->un_contig_mem_cv, ST_MUTEX);
12473		ST_GET_CONTIG_MEM_HEAD(un, cp, len, big_enough);
12474	} while (cp == NULL);
12475	mutex_exit(ST_MUTEX);
12476
12477	/* we get the big enough contig mem, finally */
12478
12479alloc_ok:
12480	/* init bp attached to this cp */
12481	bioreset(cp->cm_bp);
12482	cp->cm_bp->b_un.b_addr = cp->cm_addr;
12483	cp->cm_bp->b_private = (void *)cp;
12484
12485	return (cp);
12486}
12487
12488/*
12489 * this is the biodone func for the bp used in big block I/O
12490 */
12491static int
12492st_bigblk_xfer_done(struct buf *bp)
12493{
12494	struct contig_mem *cp;
12495	struct buf *orig_bp;
12496	int remapped = 0;
12497	int ioerr;
12498	struct scsi_tape *un;
12499
12500	/* sanity check */
12501	if (bp == NULL) {
12502		return (DDI_FAILURE);
12503	}
12504
12505	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
12506	if (un == NULL) {
12507		return (DDI_FAILURE);
12508	}
12509
12510	cp = (struct contig_mem *)bp->b_private;
12511	orig_bp = cp->cm_bp; /* get back the bp we have replaced */
12512	cp->cm_bp = bp;
12513
12514	/* special handling for special I/O */
12515	if (cp->cm_use_sbuf) {
12516#ifndef __lock_lint
12517		ASSERT(un->un_sbuf_busy);
12518#endif
12519		un->un_sbufp = orig_bp;
12520		cp->cm_use_sbuf = 0;
12521	}
12522
12523	orig_bp->b_resid = bp->b_resid;
12524	ioerr = geterror(bp);
12525	if (ioerr != 0) {
12526		bioerror(orig_bp, ioerr);
12527	} else if (orig_bp->b_flags & B_READ) {
12528		/* copy data back to original bp */
12529		if (orig_bp->b_flags & (B_PHYS | B_PAGEIO)) {
12530			bp_mapin(orig_bp);
12531			remapped = 1;
12532		}
12533		bcopy(bp->b_un.b_addr, orig_bp->b_un.b_addr,
12534			bp->b_bcount - bp->b_resid);
12535		if (remapped)
12536			bp_mapout(orig_bp);
12537	}
12538
12539	st_release_contig_mem(un, cp);
12540
12541	biodone(orig_bp);
12542
12543	return (DDI_SUCCESS);
12544}
12545
12546/*
12547 * We use this func to replace original bp that may not be able to do I/O
12548 * in big block size with one that can
12549 */
12550static struct buf *
12551st_get_bigblk_bp(struct buf *bp)
12552{
12553	struct contig_mem *cp;
12554	struct scsi_tape *un;
12555	struct buf *cont_bp;
12556	int remapped = 0;
12557
12558	un = ddi_get_soft_state(st_state, MTUNIT(bp->b_edev));
12559	if (un == NULL) {
12560		return (bp);
12561	}
12562
12563	/* try to get one contig_mem */
12564	cp = st_get_contig_mem(un, bp->b_bcount, KM_SLEEP);
12565	if (!cp) {
12566		scsi_log(ST_DEVINFO, st_label, CE_WARN,
12567			"Cannot alloc contig buf for I/O for %lu blk size",
12568			bp->b_bcount);
12569		return (bp);
12570	}
12571	cont_bp = cp->cm_bp;
12572	cp->cm_bp = bp;
12573
12574	/* make sure that we "are" using un_sbufp for special I/O */
12575	if (bp == un->un_sbufp) {
12576#ifndef __lock_lint
12577		ASSERT(un->un_sbuf_busy);
12578#endif
12579		un->un_sbufp = cont_bp;
12580		cp->cm_use_sbuf = 1;
12581	}
12582
12583	/* clone bp */
12584	cont_bp->b_bcount = bp->b_bcount;
12585	cont_bp->b_resid = bp->b_resid;
12586	cont_bp->b_iodone = st_bigblk_xfer_done;
12587	cont_bp->b_file = bp->b_file;
12588	cont_bp->b_offset = bp->b_offset;
12589	cont_bp->b_dip = bp->b_dip;
12590	cont_bp->b_error = 0;
12591	cont_bp->b_proc = NULL;
12592	cont_bp->b_flags = bp->b_flags & ~(B_PAGEIO | B_PHYS | B_SHADOW);
12593	cont_bp->b_shadow = NULL;
12594	cont_bp->b_pages = NULL;
12595	cont_bp->b_edev = bp->b_edev;
12596	cont_bp->b_dev = bp->b_dev;
12597	cont_bp->b_lblkno = bp->b_lblkno;
12598	cont_bp->b_forw = bp->b_forw;
12599	cont_bp->b_back = bp->b_back;
12600	cont_bp->av_forw = bp->av_forw;
12601	cont_bp->av_back = bp->av_back;
12602	cont_bp->b_bufsize = bp->b_bufsize;
12603
12604	/* get data in original bp */
12605	if (bp->b_flags & B_WRITE) {
12606		if (bp->b_flags & (B_PHYS | B_PAGEIO)) {
12607			bp_mapin(bp);
12608			remapped = 1;
12609		}
12610		bcopy(bp->b_un.b_addr, cont_bp->b_un.b_addr, bp->b_bcount);
12611		if (remapped)
12612			bp_mapout(bp);
12613	}
12614
12615	return (cont_bp);
12616}
12617#else
12618#ifdef __lock_lint
12619static int
12620st_bigblk_xfer_done(struct buf *bp)
12621{
12622	return (0);
12623}
12624#endif
12625#endif
12626