stdef.h 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 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_SYS_SCSI_TARGETS_STDEF_H
27#define	_SYS_SCSI_TARGETS_STDEF_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#include <sys/sunddi.h>
32#include <sys/note.h>
33#include <sys/condvar.h>
34#include <sys/kstat.h>
35#include <sys/scsi/scsi_types.h>
36#include <sys/mtio.h>
37
38#ifdef	__cplusplus
39extern "C" {
40#endif
41
42/*
43 * Defines for SCSI tape drives.
44 */
45
46/*
47 * Maximum variable length record size for a single request
48 */
49#define	ST_MAXRECSIZE_VARIABLE	65535
50
51/*
52 * If the requested record size exceeds ST_MAXRECSIZE_VARIABLE,
53 * then the following define is used.
54 */
55#define	ST_MAXRECSIZE_VARIABLE_LIMIT	65534
56
57#define	ST_MAXRECSIZE_FIXED	(63<<10)	/* maximum fixed record size */
58#define	INF 1000000000
59
60/*
61 * Supported tape device types plus default type for opening.
62 * Types 10 - 13, are special (ancient too) drives - *NOT SUPPORTED*
63 * Types 14 - 1f, are 1/4-inch cartridge drives.
64 * Types 20 - 28, are 1/2-inch cartridge or reel drives.
65 * Types 28+, are rdat (vcr) drives.
66 */
67#define	ST_TYPE_INVALID		0x00
68
69#define	ST_TYPE_SYSGEN1	MT_ISSYSGEN11	/* Sysgen with QIC-11 only */
70#define	ST_TYPE_SYSGEN	MT_ISSYSGEN	/* Sysgen with QIC-24 and QIC-11 */
71
72#define	ST_TYPE_DEFAULT	MT_ISDEFAULT	/* Generic 1/4" or undetermined  */
73#define	ST_TYPE_EMULEX	MT_ISMT02	/* Emulex MT-02 */
74#define	ST_TYPE_ARCHIVE	MT_ISVIPER1	/* Archive QIC-150 */
75#define	ST_TYPE_WANGTEK	MT_ISWANGTEK1	/* Wangtek QIC-150 */
76
77#define	ST_TYPE_CDC	MT_ISCDC	/* CDC - (not tested) */
78#define	ST_TYPE_FUJI	MT_ISFUJI	/* Fujitsu - (not tested) */
79#define	ST_TYPE_KENNEDY	MT_ISKENNEDY	/* Kennedy */
80#define	ST_TYPE_ANRITSU	MT_ISANRITSU	/* Anritsu */
81#define	ST_TYPE_HP	MT_ISHP		/* HP */
82#define	ST_TYPE_HIC	MT_ISCCS23	/* Generic 1/2" Cartridge */
83#define	ST_TYPE_REEL	MT_ISCCS24	/* Generic 1/2" Reel Tape */
84#define	ST_TYPE_DAT	MT_ISCCS28	/* Generic DAT Tape */
85
86#define	ST_TYPE_EXABYTE	MT_ISEXABYTE	/* Exabyte 8200 */
87#define	ST_TYPE_EXB8500	MT_ISEXB8500	/* Exabyte 8500 */
88#define	ST_TYPE_WANGTHS	MT_ISWANGTHS	/* Wangtek 6130HS */
89#define	ST_TYPE_WANGDAT	MT_ISWANGDAT	/* WangDAT */
90#define	ST_TYPE_PYTHON  MT_ISPYTHON	/* Archive Python DAT */
91#define	ST_TYPE_STC3490 MT_ISSTC	/* IBM STC 3490 */
92#define	ST_TYPE_TAND25G MT_ISTAND25G	/* TANDBERG 2.5G */
93#define	ST_TYPE_DLT	MT_ISDLT	/* DLT */
94#define	ST_TYPE_STK9840	MT_ISSTK9840	/* StorageTek 9840, 9940, 9840B */
95#define	ST_TYPE_BMDLT1	MT_ISBMDLT1	/* Benchmark DTL1 */
96#define	ST_TYPE_LTO	MT_LTO		/* sun: LTO's by HP, Seagate, IBM.. */
97#define	ST_TYPE_AIT	MT_ISAIT	/* Sony AIT I, II, III and SAIT */
98#define	ST_LAST_TYPE	ST_TYPE_AIT	/* Add new above type and change this */
99
100
101/* Internal flags */
102#define	ST_DYNAMIC		0x2000	/* Device name has been dynamically */
103					/* alloc'ed from the st.conf entry, */
104					/* instead of being used from the */
105					/* st_drivetypes array. */
106
107/*
108 * Defines for supported drive options
109 *
110 * WARNING : THESE OPTIONS SHOULD NEVER BE CHANGED, AS OLDER CONFIGURATIONS
111 * 		WILL DEPEND ON THE FLAG VALUES REMAINING THE SAME
112 */
113#define	ST_VARIABLE		0x001	/* Device supports variable	*/
114					/* length record sizes		*/
115#define	ST_QIC			0x002	/* QIC tape device 		*/
116#define	ST_REEL			0x004	/* 1/2-inch reel tape device	*/
117#define	ST_BSF			0x008	/* Device supports backspace	*/
118					/* file as in mt(1) bsf : 	*/
119					/* backspace over EOF marks.	*/
120					/* Devices not supporting bsf 	*/
121					/* will fail with ENOTTY upon	*/
122					/* use of bsf			*/
123#define	ST_BSR			0x010	/* Device supports backspace	*/
124					/* record as in mt(1) bsr :	*/
125					/* backspace over records. If	*/
126					/* the device does not support 	*/
127					/* bsr, the st driver emulates	*/
128					/* the action by rewinding the	*/
129					/* tape and using forward space	*/
130					/* file (fsf) to the correct	*/
131					/* file and then uses forward	*/
132					/* space record (fsr) to the	*/
133					/* correct  record		*/
134#define	ST_LONG_ERASE		0x020	/* Device needs a longer time	*/
135					/* than normal to erase		*/
136#define	ST_AUTODEN_OVERRIDE	0x040	/* Auto-Density override flag	*/
137					/* Device can figure out the	*/
138					/* tape density automatically,	*/
139					/* without issuing a		*/
140					/* mode-select/mode-sense 	*/
141#define	ST_NOBUF		0x080	/* Don't use buffered mode.	*/
142					/* This disables the device's	*/
143					/* ability for buffered	writes	*/
144					/* I.e. The device acknowledges	*/
145					/* write completion after the	*/
146					/* data is written to the	*/
147					/* device's buffer, but before	*/
148					/* all the data is actually	*/
149					/* written to tape		*/
150#define	ST_RESERVED_BIT1	0x100	/* resreved bit 		*/
151					/* parity while talking to it. 	*/
152#define	ST_KNOWS_EOD		0x200	/* Device knows when EOD (End	*/
153					/* of Data) has been reached.	*/
154					/* If the device knows EOD, st	*/
155					/* uses fast file skipping.	*/
156					/* If it does not know EOD,	*/
157					/* file skipping happens one	*/
158					/* file at a time. 		*/
159#define	ST_UNLOADABLE		0x400	/* Device will not complain if	*/
160					/* the st driver is unloaded &	*/
161					/* loaded again; e.g. will	*/
162					/* return the correct inquiry	*/
163					/* string			*/
164#define	ST_SOFT_ERROR_REPORTING 0x800	/* Do request or log sense on	*/
165					/* close to report soft errors.	*/
166					/* Currently only Exabyte and	*/
167					/* DAT drives support this	*/
168					/* feature.  			*/
169#define	ST_LONG_TIMEOUTS	0x1000	/* Device needs 5 times longer	*/
170					/* timeouts for normal		*/
171					/* operation			*/
172#define	ST_BUFFERED_WRITES	0x4000	/* The data is buffered in the	*/
173					/* driver and pre-acked to the	*/
174					/* application 			*/
175#define	ST_NO_RECSIZE_LIMIT	0x8000	/* For variable record size	*/
176					/* devices only. If flag is	*/
177					/* set, then don't limit	*/
178					/* record size to 64k as in	*/
179					/* pre-Solaris 2.4 releases.	*/
180					/* The only limit on the	*/
181					/* record size will be the max	*/
182					/* record size the device can	*/
183					/* handle or the max DMA	*/
184					/* transfer size of the		*/
185					/* machine, which ever is	*/
186					/* smaller. Beware of		*/
187					/* incompatabilities with	*/
188					/* tapes of pre-Solaris 2.4	*/
189					/* OS's written with large	*/
190					/* (>64k) block sizes, as	*/
191					/* their true block size is	*/
192					/* a max of approx 64k		*/
193#define	ST_MODE_SEL_COMP	0x10000	/* use mode select of device	*/
194					/* configuration page (0x10) to */
195					/* enable/disable compression	*/
196					/* instead of density codes for */
197					/* the "c" and "u" devices	*/
198#define	ST_NO_RESERVE_RELEASE	0x20000	/* For devices which do not	*/
199					/* support RESERVE/RELEASE SCSI	*/
200					/* command. If this is enabled	*/
201					/* then reserve/release would	*/
202					/* not be used during open/	*/
203					/* close for High Availability	*/
204#define	ST_READ_IGNORE_ILI	0x40000 /* This flag is only applicable */
205					/* to variable block devices 	*/
206					/* which support the SILI bit	*/
207					/* option. It indicates that 	*/
208					/* the SILI bit will be ignored */
209					/* during reads  		*/
210#define	ST_READ_IGNORE_EOFS 	0x80000 /* When this flag is set two 	*/
211					/* EOF marks do not indicate an */
212					/* EOM. This option is only	*/
213					/* supported on 1/2" reel tapes */
214#define	ST_SHORT_FILEMARKS	0x100000 /* This option applies only to */
215					/* EXABYTE 8mm tape drives 	*/
216					/* which support short 		*/
217					/* filemarks. When this flag 	*/
218					/* is set, short filemarks 	*/
219					/* will be used for writing	*/
220					/* filemarks. 			*/
221#define	ST_EJECT_ON_CHANGER_FAILURE 0x200000 /* When this flag is set   */
222					/* and the tape is trapped in   */
223					/* the medium changer, the tape */
224					/* is automatically ejected	*/
225#define	ST_RETRY_ON_RECOVERED_DEFERRED_ERROR 0x400000
226					/* This option applies only to  */
227					/* IBM MAGSTAR 3590. If this    */
228					/* flag is set, the st driver   */
229					/* will retry the last cmd if   */
230					/* the last error cause a check */
231					/* condition with error code    */
232					/* 0x71 and sense code  0x01 	*/
233#define	ST_KNOWS_MEDIA		0x800000 /* Use configured media type	*/
234					/* detected to select correct   */
235					/* density code.		*/
236#define	ST_WORMABLE		0x1000000
237					/* Drive is capable of doing	*/
238					/* Write Appends only at EOM	*/
239					/* if WORM media type is loaded */
240#define	ST_CLN_TYPE_1		0x10000000 /* When this flag is set,	*/
241					/* the tape drive provides the	*/
242					/* clean bit information in	*/
243					/* byte 21, bitmask 0x08 of	*/
244					/* Request Sense data		*/
245#define	ST_CLN_TYPE_2		0x20000000 /* When this flag is set,	*/
246					/* the tape drive provides the	*/
247					/* clean bit information in	*/
248					/* byte 70, bitmask 0xc0 of	*/
249					/* Request Sense data		*/
250#define	ST_CLN_TYPE_3		0x40000000 /* When this flag is set,	*/
251					/* the tape drive provides the	*/
252					/* clean bit information in	*/
253					/* byte 18, bitmask 0x01 of	*/
254					/* Request Sense data		*/
255
256#define	ST_CLN_MASK	(ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3)
257#define	ST_VALID_OPTS	(ST_VARIABLE | ST_QIC | ST_REEL | ST_BSF | ST_BSR |\
258	ST_LONG_ERASE | ST_AUTODEN_OVERRIDE | ST_NOBUF | ST_KNOWS_EOD |\
259	ST_UNLOADABLE | ST_SOFT_ERROR_REPORTING | ST_LONG_TIMEOUTS |\
260	ST_NO_RECSIZE_LIMIT | ST_MODE_SEL_COMP | ST_NO_RESERVE_RELEASE |\
261	ST_READ_IGNORE_ILI | ST_READ_IGNORE_EOFS | ST_SHORT_FILEMARKS |\
262	ST_EJECT_ON_CHANGER_FAILURE | ST_RETRY_ON_RECOVERED_DEFERRED_ERROR |\
263	ST_WORMABLE | ST_CLN_TYPE_1 | ST_CLN_TYPE_2 | ST_CLN_TYPE_3)
264
265#define	NDENSITIES	MT_NDENSITIES
266#define	NSPEEDS		MT_NSPEEDS
267
268/*
269 * defines for Log Sense Pages
270 */
271#define	SUPPORTED_LOG_PAGES_PAGE	0x00
272#define	TAPE_SEQUENTIAL_PAGE		0x0c
273#define	TAPE_ALERT_PAGE			0x2e
274
275/*
276 * Log Page Control definitions
277 */
278#define	CURRENT_THRESHOLD_VALUES	0x00
279#define	CURRENT_CUMULATIVE_VALUES	0x40
280#define	DEFAULT_THRESHOLD_VALUES	0x80
281#define	DEFAULT_CUMULATIVE_VALUES	0xC0
282
283/*
284 * Tape Alert Flag definitions
285 */
286typedef enum {
287	TAF_READ_WARN			= 0x01,
288	TAF_WRITE_WARN			= 0x02,
289	TAF_HARD_ERR			= 0x03,
290	TAF_MEDIA_ERR			= 0x04,
291	TAF_READ_FAIL			= 0x05,
292	TAF_WRITE_FAIL			= 0x06,
293	TAF_MEDIA_LIFE			= 0x07,
294	TAF_MEDIA_NOT_DATA_GRADE	= 0x08,
295	TAF_WRITE_PROTECTED		= 0x09,
296	TAF_NO_MEDIA_REMOVE		= 0x0A,
297	TAF_CLEANING_MEDIA		= 0x0B,
298	TAF_UNSUPPERTED_FORMAT		= 0x0C,
299	TAF_RECOVERED_TAPE_BREAK	= 0x0D,
300	TAF_TAPE_BREAK_FAUL		= 0x0E,
301	TAF_CART_MEM_FAIL		= 0x0F,
302	TAF_FORCED_EJECT		= 0x10,
303	TAF_READ_ONLY_FORMAT		= 0x11,
304	TAF_TAPE_DIR_CORRUPT		= 0x12,
305	TAF_NEARING_MEDIA_LIFE		= 0x13,
306	TAF_CLEAN_NOW			= 0x14,
307	TAF_CLEAN_PERIODIC		= 0x15,
308	TAF_EXP_CLEAN_CART		= 0x16,
309	TAF_INVALID_CLEAN_MEDIA		= 0x17,
310	TAF_RETENSION_REQUEST		= 0x18,
311	TAF_DUAL_PORT_INTERFACE_ERR	= 0x19,
312	TAF_COOLING_FAN_FAIL		= 0x1A,
313	TAF_POWER_SUPPLY_FAIL		= 0x1B,
314	TAF_POWER_CONSUMPTION		= 0x1C,
315	TAF_DRIVE_MAINT_REQUEST		= 0x1D,
316	TAF_HARDWARE_A			= 0x1E,
317	TAF_HARDWARE_B			= 0x1F,
318	TAF_INTERFACE			= 0x20,
319	TAF_EJECT_MEDIA			= 0x21,
320	TAF_DOWNLOAD_FAIL		= 0x22,
321	TAF_DRIVE_HUMIDITY		= 0x23,
322	TAF_DRIVE_TEMP			= 0x24,
323	TAF_DRIVE_VOLTAGE		= 0x25,
324	TAF_PREDICTIVE_FAIL		= 0x26,
325	TAF_DIAG_REQUIRED		= 0x27,
326	TAF_LOADER_HDWR_A		= 0x28,
327	TAF_LOADER_STRAY_TAPE		= 0x29,
328	TAF_LOADER_HDWR_B		= 0x2A,
329	TAF_LOADER_DOOR			= 0x2B,
330	TAF_LOADER_HDWR_C		= 0x2C,
331	TAF_LOADER_MAGAZINE		= 0x2D,
332	TAF_LOADER_PREDICTIVE_FAIL	= 0x2E,
333	TAF_LOST_STATISTICS		= 0x32,
334	TAF_TAPE_DIR_CURRUPT_UNLOAD	= 0x33,
335	TAF_TAPE_SYS_WRT_FAIL		= 0x34,
336	TAF_TAPE_SYS_RD_FAIL		= 0x35,
337	TAF_NO_START_OF_DATA		= 0x36,
338	TAF_WORM_INTEGRITY		= 0x3B,
339	TAF_WORM_OVRWRT_ATTEMPT		= 0x3C
340}tape_alert_flags;
341
342/*
343 * For ST_TYPE_STK9840 drives only. STK drive doesn't support retension
344 * so they reuse TAF_RETENSION_REQUEST.
345 */
346#define	CLEAN_FOR_ERRORS		 0x18
347
348
349#define	TAPE_ALERT_SUPPORT_UNKNOWN	0x00
350#define	TAPE_ALERT_NOT_SUPPORTED	0x01
351#define	TAPE_ALERT_SUPPORTED		0x02
352#define	TAPE_ALERT_STILL_DIRTY		0x04
353#define	TAPE_SEQUENTIAL_SUPPORTED	0x08
354#define	TAPE_PREVIOUSLY_DIRTY		0x10
355
356#define	TAPE_ALERT_MAX_PARA		64
357#define	TAPE_SEQUENTIAL_PAGE_PARA	64	/* way more then really used */
358#define	SEQUENTIAL_NEED_CLN		0x0100
359
360/*
361 * Parameters
362 */
363#define	ST_NAMESIZE	44	/* size of pretty string for vid/pid */
364#define	VIDLEN		8	/* size of vendor identifier length */
365#define	PIDLEN		16	/* size of product identifier length */
366#define	VIDPIDLEN	(VIDLEN + PIDLEN)
367
368
369struct st_drivetype {
370	char	name[ST_NAMESIZE];	/* Name, for debug */
371	char	length;			/* Length of vendor id */
372	char	vid[VIDPIDLEN];		/* Vendor id and model (product) id */
373	char	type;			/* Drive type for driver */
374	int	bsize;			/* Block size */
375	int	options;		/* Drive options */
376	int	max_rretries;		/* Max read retries */
377	int	max_wretries;		/* Max write retries */
378	uchar_t	densities[NDENSITIES];	/* density codes, low->hi */
379	uchar_t	default_density;	/* default density for this drive */
380	uchar_t	mediatype[NDENSITIES];	/* was speed. mediatype for density. */
381	ushort_t non_motion_timeout;	/* Inquiry type commands */
382	ushort_t io_timeout;		/* I/O timeout in seconds */
383	ushort_t rewind_timeout;	/* rewind timeout in seconds */
384	ushort_t space_timeout;		/* space cmd timeout in seconds */
385	ushort_t load_timeout;		/* load tape time in seconds */
386	ushort_t unload_timeout;	/* unload tape time in seconds */
387	ushort_t erase_timeout;		/* erase timeout. seconds */
388};
389
390#define	MINUTES(val)	((val) * 60)
391
392struct comp_mode_page {
393#if defined(_BIT_FIELDS_LTOH)
394	uchar_t	:		6,
395		dcc:		1,	/* Data Compression Capable */
396		dce:		1;	/* Data Compression Enable */
397	uchar_t	:		5,
398		red:		2,	/* Report Exceptions on Decompress */
399		dde:		1;	/* Data Decompression Enabled */
400	uchar_t	comp_alg_msb;		/* Compression Algorithm */
401	uchar_t comp_alg_high;
402	uchar_t	comp_alg_low;
403	uchar_t	comp_alg_lsb;
404	uchar_t	decomp_alg_msb;		/* Decompression Algorithm */
405	uchar_t decomp_alg_high;
406	uchar_t	decomp_alg_low;
407	uchar_t	decomp_alg_lsb;
408	uchar_t	reservered0;
409	uchar_t	reservered1;
410	uchar_t	reservered2;
411	uchar_t	reservered3;
412
413#elif defined(_BIT_FIELDS_HTOL)
414	uchar_t	dce:		1,	/* Data Compression Enable */
415		dcc:		1,	/* Data Compression Capable */
416		:		6;
417	uchar_t	dde:		1,	/* Data Decompression Enabled */
418		red:		2,	/* Report Exceptions on Decompress */
419		:		5;
420	uchar_t	comp_alg_msb;		/* Compression Algorithm */
421	uchar_t comp_alg_high;
422	uchar_t	comp_alg_low;
423	uchar_t	comp_alg_lsb;
424	uchar_t	decomp_alg_msb;		/* Decompression Algorithm */
425	uchar_t decomp_alg_high;
426	uchar_t	decomp_alg_low;
427	uchar_t	decomp_alg_lsb;
428	uchar_t	reservered0;
429	uchar_t	reservered1;
430	uchar_t	reservered2;
431	uchar_t	reservered3;
432#endif
433};
434
435struct dev_mode_page {
436#if defined(_BIT_FIELDS_LTOH)
437	uchar_t	act_format:	5,	/* active format */
438		caf:		1,	/* Change Active Format */
439		cap:		1,	/* Change Active Partition OBSOLETE */
440		:		1;
441	uchar_t	act_partition;		/* active partition */
442	uchar_t	wrt_buf_full_ratio;	/* write buffer full ratio */
443	uchar_t	rd_buf_full_ratio;	/* read buffer full ratio */
444	uchar_t	wrt_delay_time_msb;	/* write delay time MSB */
445	uchar_t	wrt_delay_time_lsb;	/* write delay time LSB */
446	uchar_t	rew:		1,	/* Report Early Warning */
447		robo:		1,	/* Reverse Object Buffer Order */
448		socf:		2,	/* Stop On Consecutive Filemarks */
449		avc:		1,	/* Automatic Velocity Control */
450		rsmk:		1,	/* Report SetMarKs OBSOLETE */
451		lois:		1,	/* Logical Object Identifiers Support */
452		obr:		1;	/* Object Buffer Recovery */
453	uchar_t	gap_size;		/* OBSOLETE */
454	uchar_t	bam:		1,	/* Block Address Mode */
455		bmal:		1,	/* Block Address Mode Lock */
456		swp:		1,	/* Software Write Protection */
457		sew:		1,	/* Sync data after Early Warning */
458		eeg:		1,	/* Enable Early Waring */
459		eod_defined:	3;
460	uchar_t	buf_size_leot_msb;	/* Buffer size after early warning */
461	uchar_t	buf_size_leot_mid;
462	uchar_t	buf_size_leot_lsb;
463	uchar_t	comp_alg;		/* Compression Algorithm (enable) */
464	uchar_t	prmwp:		1,	/* PeRManent Write Protect */
465		perswp:		1,	/* persistant write protection */
466		asocwp:		1,	/* associated write protect */
467		rew_on_rst:	2,	/* rewind on reset */
468		oir:		1,	/* Only If Reserved */
469		wtre:		2;	/* Worm Tamper Read Enable */
470
471#elif defined(_BIT_FIELDS_HTOL)
472	uchar_t	:		1,
473		cap:		1,	/* Change Active Partition OBSOLETE */
474		caf:		1,	/* Change Active Format */
475		act_format:	5;	/* active format */
476	uchar_t	act_partition;		/* active partition */
477	uchar_t	wrt_buf_full_ratio;	/* write buffer full ratio */
478	uchar_t	rd_buf_full_ratio;	/* read buffer full ratio */
479	uchar_t	wrt_delay_time_msb;	/* write delay time MSB */
480	uchar_t	wrt_delay_time_lsb;	/* write delay time LSB */
481	uchar_t	obr:		1,	/* Object Buffer Recovery */
482		lois:		1,	/* Logical Object Identifiers Support */
483		rsmk:		1,	/* Report SetMarKs OBSOLETE */
484		avc:		1,	/* Automatic Velocity Control */
485		socf:		2,	/* Stop On Consecutive Filemarks */
486		robo:		1,	/* Reverse Object Buffer Order */
487		rew:		1;	/* Report Early Warning */
488	uchar_t	gap_size;		/* OBSELETE */
489	uchar_t	eod_defined:	3,
490		eeg:		1,	/* Enable Early Waring */
491		sew:		1,	/* Sync data after Early Warning */
492		swp:		1,	/* Software Write Protection */
493		bmal:		1,	/* Block Address Mode Lock */
494		bam:		1;	/* Block Address Mode */
495	uchar_t	buf_size_leot_msb;	/* Buffer size after early warning */
496	uchar_t	buf_size_leot_mid;
497	uchar_t	buf_size_leot_lsb;
498	uchar_t	comp_alg;		/* Compression Algorithm (enable) */
499	uchar_t	wtre:		2,	/* Worm Tamper Read Enable */
500		oir:		1,	/* Only If Reserved */
501		rew_on_rst:	2,	/* rewind on reset */
502		asocwp:		1,	/* associated write protect */
503		perswp:		1,	/* persistant write protection */
504		prmwp:		1;	/* PeRManent Write Protect */
505#endif
506};
507
508typedef union {
509	struct comp_mode_page	comp;
510	struct dev_mode_page	dev;
511}modepage;
512
513/*
514 *
515 * Parameter list for the MODE_SELECT and MODE_SENSE commands.
516 * The parameter list contains a header, followed by zero or more
517 * block descriptors, followed by vendor unique parameters, if any.
518 *
519 */
520#define	MSIZE	0x0c		/* Size without additional pages */
521struct seq_mode {
522#if defined(_BIT_FIELDS_LTOH)
523	uchar_t	data_len;	/* sense data length, sense only */
524	uchar_t	media_type;	/* medium type, sense only */
525	uchar_t	speed	:4,	/* speed */
526		bufm	:3,	/* buffered mode */
527		wp	:1;	/* write protected, sense only */
528	uchar_t	bd_len;		/* block length in bytes */
529	uchar_t	density;	/* density code */
530	uchar_t	high_nb;	/* number of logical blocks on the medium */
531	uchar_t	mid_nb;		/* that are to be formatted with the density */
532	uchar_t	low_nb;		/* code and block length in block descriptor */
533	uchar_t	reserved;	/* reserved */
534	uchar_t	high_bl;	/* block length */
535	uchar_t	mid_bl;		/*   "      "   */
536	uchar_t	low_bl;		/*   "      "   */
537	uchar_t page_code:	6,
538		:		1,
539		ps:		1; /* Page Savable sense only */
540	uchar_t	page_len;
541	modepage page;
542
543#elif defined(_BIT_FIELDS_HTOL)
544	uchar_t	data_len;	/* sense data length, sense only */
545	uchar_t	media_type;	/* medium type, sense only */
546	uchar_t	wp	:1,	/* write protected, sense only */
547		bufm	:3,	/* buffered mode */
548		speed	:4;	/* speed */
549	uchar_t	bd_len;		/* block length in bytes */
550	uchar_t	density;	/* density code */
551	uchar_t	high_nb;	/* number of logical blocks on the medium */
552	uchar_t	mid_nb;		/* that are to be formatted with the density */
553	uchar_t	low_nb;		/* code and block length in block descriptor */
554	uchar_t	reserved;	/* reserved */
555	uchar_t	high_bl;	/* block length */
556	uchar_t	mid_bl;		/*   "      "   */
557	uchar_t	low_bl;		/*   "      "   */
558	uchar_t	ps:		1, /* Page Savable sense only */
559		:		1,
560		page_code:	6;
561	uchar_t	page_len;
562	modepage page;
563#else
564#error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
565#endif	/* _BIT_FIELDS_LTOH */
566};
567
568/*
569 * Data returned from the READ BLOCK LIMITS command.
570 */
571
572#define	RBLSIZE	(sizeof (struct read_blklim))
573struct read_blklim {
574#if defined(_BIT_FIELDS_HTOL)
575	uchar_t	reserved:	3;	/* reserved */
576	uchar_t granularity:	5;	/* Minimum Modularity */
577#elif defined(_BIT_FIELDS_LTOH)
578	uchar_t granularity:	5;	/* Minimum Modularity */
579	uchar_t	reserved:	3;	/* reserved */
580#endif
581	uchar_t	max_hi;			/* Maximum block length, high byte */
582	uchar_t	max_mid;		/* Maximum block length, middle byte */
583	uchar_t	max_lo;			/* Maximum block length, low byte */
584	uchar_t	min_hi;			/* Minimum block length, high byte */
585	uchar_t	min_lo;			/* Minimum block length, low byte */
586};
587
588#ifdef _KERNEL
589
590#if defined(__i386) || defined(__amd64)
591/* Data structure used in big block I/O on x86/x64 platform */
592
593/*
594 * alloc more than one contig_mem, so mutiple I/O can be
595 * on-going simultaneously
596 */
597#define	ST_MAX_CONTIG_MEM_NUM	3
598
599/*
600 * 60K is used due to the limitation(size) of the intermediate buffer
601 * in DMA bind code(rootnex.c), which is 64K. If the I/O buf is page
602 * aligned, HBA can do 64K DMA, but if not, HBA can only do
603 * 64K - PAGESIZE = 60K DMA due to the copy to/from intermediate
604 * buffer will keep the page offset.
605 */
606#define	ST_BIGBLK_XFER		60 * 1024
607struct contig_mem {
608	struct contig_mem *cm_next;
609	size_t cm_len;
610	caddr_t cm_addr;
611	ddi_acc_handle_t cm_acc_hdl;
612	struct buf *cm_bp;
613	int cm_use_sbuf;
614};
615
616#endif
617
618#endif /* _KERNEL */
619
620/*
621 * eof/eot/eom codes.
622 */
623
624typedef enum {
625	ST_NO_EOF,		/* 0x00 */
626	ST_EOF_PENDING,		/* 0x01	filemark pending */
627	ST_EOF,			/* 0x02	at filemark */
628	ST_EOT_PENDING,		/* 0x03	logical eot pending */
629	ST_EOT,			/* 0x04	at logical eot */
630	ST_EOM,			/* 0x05	at physical eot */
631	ST_WRITE_AFTER_EOM	/* 0x06	flag for allowing writes after EOM */
632}media_st;
633
634#define	IN_EOF(un)	(un->un_eof == ST_EOF_PENDING || un->un_eof == ST_EOF)
635
636/*
637 * operation codes
638 */
639typedef enum {
640	ST_OP_NIL,	/* 0 */
641	ST_OP_CTL,	/* 1 */
642	ST_OP_READ,	/* 2 */
643	ST_OP_WRITE,	/* 3 */
644	ST_OP_WEOF	/* 4 */
645}optype;
646
647typedef enum { RDWR, RDONLY, WORM, RDWORM, ERROR  } writablity;
648
649/*
650 * Private info for scsi tapes. Pointed to by the un_private pointer
651 * of one of the SCSI_DEVICE chains.
652 */
653
654struct scsi_tape {
655	struct scsi_device *un_sd;	/* back pointer to SCSI_DEVICE */
656	struct scsi_pkt *un_rqs;	/* ptr to request sense command */
657	struct scsi_pkt *un_mkr_pkt;	/* ptr to marker packet */
658	kcondvar_t un_sbuf_cv;		/* cv on ownership of special buf */
659	kcondvar_t un_queue_cv;		/* cv on all queued commands */
660	struct	buf *un_sbufp;		/* for use in special io */
661	char	*un_srqbufp;		/* sense buffer for special io */
662	kcondvar_t un_clscv;		/* closing cv */
663	struct	buf *un_quef;		/* head of wait queue */
664	struct	buf *un_quel;		/* tail of wait queue */
665	struct	buf *un_runqf;		/* head of run queue */
666	struct	buf *un_runql;		/* tail of run queue */
667	struct seq_mode *un_mspl;	/* ptr to mode select info */
668	struct st_drivetype *un_dp;	/* ptr to drive table entry */
669	uint_t	un_dp_size;		/* size of un_dp alloc'ed */
670	caddr_t	un_tmpbuf;		/* buf for append, autodens ops */
671	daddr_t	un_blkno;		/* block # in file (512 byte blocks) */
672	int	un_oflags;		/* open flags */
673	int	un_fileno;		/* current file number on tape */
674	int	un_err_fileno;		/* file where error occurred */
675	daddr_t	un_err_blkno;		/* block in file where err occurred */
676	uint_t	un_err_resid;		/* resid from last error */
677	short	un_fmneeded;		/* filemarks to be written - HP only */
678	dev_t	un_dev;			/* unix device */
679	uchar_t	un_attached;		/* unit known && attached */
680	int	un_pwr_mgmt;		/* power management state */
681	uchar_t	un_density_known;	/* density is known */
682	uchar_t	un_curdens;		/* index into density table */
683	optype	un_lastop;		/* last I/O was: read/write/ctl */
684	media_st un_eof;		/* eof states */
685	uchar_t	un_laststate;		/* last state */
686	uchar_t	un_state;		/* current state */
687	uchar_t	un_status;		/* status from last sense */
688	uchar_t	un_retry_ct;		/* retry count */
689	uchar_t	un_tran_retry_ct;	/* transport retry count */
690	writablity un_read_only;	/* RDWR, RDONLY, WORM, RDWORM */
691	uchar_t	un_test_append;		/* check writing at end of tape */
692	uchar_t un_arq_enabled;		/* auto request sense enabled */
693	uchar_t un_untagged_qing;	/* hba has untagged quing */
694	uchar_t	un_allow_large_xfer;	/* allow >64k xfers if requested */
695	uchar_t	un_sbuf_busy;		/* sbuf busy flag */
696	uchar_t	un_ncmds;		/* number of commands outstanding */
697	uchar_t	un_throttle;		/* curr. max number of cmds outst. */
698	uchar_t	un_last_throttle;	/* saved max number of cmds outst. */
699	uchar_t	un_max_throttle;	/* max poss. number cmds outstanding */
700	uchar_t	un_persistence;		/* 1 = persistence on, 0 off */
701	uchar_t	un_persist_errors;	/* 1 = persistenced flagged */
702	uchar_t	un_flush_on_errors;	/* HBA will flush all I/O's on a */
703					/* check condidtion or error */
704	uint_t	un_kbytes_xferred;	/* bytes (in K) counter */
705	uint_t	un_last_resid;		/* keep last resid, for PE */
706	uint_t	un_last_count;		/* keep last count, for PE */
707	struct 	kstat *un_stats;	/* for I/O statistics */
708	struct buf *un_rqs_bp;		/* bp used in rqpkt */
709	struct	buf *un_wf;		/* head of write queue */
710	struct	buf *un_wl;		/* tail of write queue */
711	struct	read_blklim *un_rbl;	/* ptr to read block limit info */
712	int	un_maxdma;		/* max dma xfer allowed by HBA */
713	uint_t	un_bsize;		/* block size currently being used */
714	int	un_maxbsize;		/* max block size allowed by drive */
715	uint_t	un_minbsize;		/* min block size allowed by drive */
716	int	un_errno;		/* errno (b_error) */
717	kcondvar_t	un_state_cv;	/* mediastate condition variable */
718	enum mtio_state	un_mediastate;	/* current media state */
719	enum mtio_state	un_specified_mediastate;	/* expected state */
720	timeout_id_t	un_delay_tid;	/* delayed cv tid */
721	timeout_id_t	un_hib_tid;	/* handle interrupt busy tid */
722	opaque_t	un_swr_token;	/* scsi_watch request token */
723	uchar_t	un_comp_page;		/* compression page */
724	uchar_t	un_rsvd_status;		/* Reservation Status */
725	kstat_t *un_errstats;		/* for error statistics */
726	int	un_init_options;  	/* Init time drive options */
727	int	un_save_fileno;		/* Save here for recovery */
728	daddr_t	un_save_blkno;		/* Save here for recovery */
729	uchar_t	un_restore_pos;		/* Indication to do recovery */
730	int	un_suspend_fileno;	/* Save fileno for SUSPEND */
731	daddr_t	un_suspend_blkno;	/* Save blkno for SUSPEND */
732	uchar_t	un_silent_skip;		/* to catch short reads */
733	short	un_tids_at_suspend; /* timeouts set at suspend */
734	kcondvar_t	un_tape_busy_cv;	/* busy cv */
735	kcondvar_t	un_suspend_cv;	/* busy cv */
736					/* restore on close */
737	uchar_t	un_eject_tape_on_failure; /* 1 = eject tape, 0 = don't */
738	uchar_t	un_HeadClean; 		/* support and need head cleaning? */
739	uchar_t	un_rqs_state;		/* see define below */
740	caddr_t	un_uscsi_rqs_buf;	/* uscsi_rqs: buffer for RQS data */
741	uchar_t	un_data_mod;		/* Device required data mod */
742	writablity (*un_wormable) (struct scsi_tape *un); /* worm test fuct */
743	int un_max_cdb_sz;		/* max cdb size to use */
744
745#if defined(__i386) || defined(__amd64)
746	ddi_dma_handle_t un_contig_mem_hdl;
747	struct contig_mem *un_contig_mem;
748	int un_contig_mem_available_num;
749	int un_contig_mem_total_num;
750	size_t un_max_contig_mem_len;
751	kcondvar_t un_contig_mem_cv;
752#endif
753
754};
755
756
757/*
758 * device error kstats
759 */
760struct st_errstats {
761	struct kstat_named	st_softerrs;
762	struct kstat_named	st_harderrs;
763	struct kstat_named	st_transerrs;
764	struct kstat_named	st_vid;
765	struct kstat_named	st_pid;
766	struct kstat_named	st_revision;
767	struct kstat_named	st_serial;
768};
769
770/*
771 * generic log page struct
772 */
773struct log_page {
774#if defined(_BIT_FIELDS_LTOH)
775	uchar_t	code	:6,	/* page code number */
776			:2;	/* reserved */
777#elif defined(_BIT_FIELDS_HTOL)
778	uchar_t		:2,	/* reserved */
779		code	:6;	/* page code number */
780#endif	/* _BIT_FIELDS_LTOH */
781	uchar_t	reserved;	/* reserved */
782	uchar_t	length_hi;	/* length of bytes to follow (msb) */
783	uchar_t	length_lo;	/* length of bytes to follow (lsb) */
784	/*
785	 * Log parameters follow right after this...
786	 */
787};
788
789/*
790 * generic log page parameter struct
791 */
792struct log_param {
793	uchar_t	pc_hi;			/* parameter code (msb) */
794	uchar_t	pc_lo;			/* parameter code (lsb) */
795#if defined(_BIT_FIELDS_LTOH)
796	uchar_t		lp	: 1,	/* list parameter */
797				: 1,	/* reserved */
798			tmc	: 2,	/* threshold met criteria */
799			etc	: 1,	/* enable threshold comparison */
800			tsd	: 1,	/* target save disable */
801			ds	: 1,	/* disable save */
802			du	: 1;	/* disable update */
803#elif defined(_BIT_FIELDS_HTOL)
804	uchar_t		du	: 1,	/* disable update */
805			ds	: 1,	/* disable save */
806			tsd	: 1,	/* target save disable */
807			etc	: 1,	/* enable threshold comparison */
808			tmc	: 2,	/* threshold met criteria */
809				: 1,	/* reserved */
810			lp	: 1;	/* list parameter */
811#endif	/* _BIT_FIELDS_LTOH */
812	uchar_t	length;		/* length of bytes to follow */
813	/*
814	 * Parameter values follow right after this...
815	 */
816};
817/*
818 * TapeAlert structures
819 */
820
821struct st_tape_alert_parameter {
822	struct log_param log_param;
823	uchar_t	param_value;
824};
825
826struct st_tape_alert {
827	struct log_page log_page;
828	struct st_tape_alert_parameter param[TAPE_ALERT_MAX_PARA];
829};
830
831#define	TAPE_ALERT_PARAMETER_LENGTH \
832	(sizeof (struct st_tape_alert_parameter)) * TAPE_ALERT_MAX_PARA
833
834struct log_sequential_page_parameter {
835	struct log_param log_param;
836	uchar_t param_value[8];
837};
838
839struct log_sequential_page {
840	struct log_page log_page;
841	struct log_sequential_page_parameter param[TAPE_SEQUENTIAL_PAGE_PARA];
842};
843
844#if !defined(__lint)
845_NOTE(MUTEX_PROTECTS_DATA(scsi_device::sd_mutex, scsi_tape))
846_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_dp))
847_NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_tape::un_sd))
848_NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_tape::un_rqs))
849_NOTE(SCHEME_PROTECTS_DATA("protected by cv", scsi_tape::un_sbufp))
850_NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_bsize))
851_NOTE(SCHEME_PROTECTS_DATA("not shared", scsi_arq_status))
852_NOTE(SCHEME_PROTECTS_DATA("save sharing",
853	scsi_tape::un_allow_large_xfer
854	scsi_tape::un_maxbsize
855	scsi_tape::un_maxdma
856))
857#if defined(__i386) || defined(__amd64)
858_NOTE(DATA_READABLE_WITHOUT_LOCK(scsi_tape::un_contig_mem_hdl))
859_NOTE(SCHEME_PROTECTS_DATA("not shared", contig_mem))
860#endif
861#endif
862
863
864/*
865 * driver states..
866 */
867#define	ST_STATE_CLOSED				0
868#define	ST_STATE_OFFLINE			1
869#define	ST_STATE_INITIALIZING			2
870#define	ST_STATE_OPENING			3
871#define	ST_STATE_OPEN_PENDING_IO		4
872#define	ST_STATE_APPEND_TESTING			5
873#define	ST_STATE_OPEN				6
874#define	ST_STATE_RESOURCE_WAIT			7
875#define	ST_STATE_CLOSING			8
876#define	ST_STATE_SENSING			9
877#define	ST_STATE_CLOSE_PENDING_OPEN		10
878
879/*
880 * Power management state
881 */
882#define	ST_PWR_NORMAL				0
883#define	ST_PWR_SUSPENDED			1
884
885
886
887
888/* un_rqs_state codes */
889
890#define	ST_RQS_OVR		0x1	/* RQS data was overwritten */
891#define	ST_RQS_VALID		0x2	/* RQS data is valid */
892#define	ST_RQS_READ		0x4	/* RQS data was read */
893#define	ST_RQS_ERROR		0x8	/* RQS resulted in an EIO */
894
895/*
896 * stintr codes
897 */
898
899#define	COMMAND_DONE					0
900#define	COMMAND_DONE_ERROR				1
901#define	COMMAND_DONE_ERROR_RECOVERED			2
902#define	QUE_COMMAND					3
903#define	QUE_BUSY_COMMAND				4
904#define	QUE_SENSE					5
905#define	JUST_RETURN					6
906#define	COMMAND_DONE_EACCES				7
907#define	QUE_LAST_COMMAND				8
908
909
910/*
911 *	Reservation Status
912 *
913 * ST_INIT_RESERVE      -Used to check if the reservation has been lost
914 *		         in between opens and also to indicate the reservation
915 *		         has not been done till now.
916 * ST_RELEASE	        -Tape Unit is Released.
917 * ST_RESERVE	        -Tape Unit is Reserved.
918 * ST_PRESERVE_RESERVE  -Reservation is to be preserved across opens.
919 *
920 */
921#define	ST_INIT_RESERVE			0x001
922#define	ST_RELEASE			0x002
923#define	ST_RESERVE			0x004
924#define	ST_PRESERVE_RESERVE		0x008
925#define	ST_RESERVATION_CONFLICT 	0x010
926#define	ST_LOST_RESERVE			0x020
927#define	ST_APPLICATION_RESERVATIONS	0x040
928#define	ST_LOST_RESERVE_BETWEEN_OPENS  \
929		(ST_RESERVE | ST_LOST_RESERVE | ST_PRESERVE_RESERVE)
930
931/*
932 * Service action defines for Persistant Reservation Commands
933 */
934#define	ST_SA_SCSI3_REGISTER			0x00
935#define	ST_SA_SCSI3_RESERVE			0x01
936#define	ST_SA_SCSI3_RELEASE			0x02
937#define	ST_SA_SCSI3_CLEAR			0x03
938#define	ST_SA_SCSI3_PREEMPT			0x04
939#define	ST_SA_SCSI3_PREEMPTANDABORT		0x05
940#define	ST_SA_SCSI3_REGISTERANDIGNOREKEY	0x06
941#define	ST_SA_MASK				0x1f
942
943#define	ST_RESERVATION_DELAY		500000
944
945/*
946 * Asynch I/O tunables
947 */
948#define	ST_MAX_THROTTLE		4
949
950/*
951 * 60 minutes seems a reasonable amount of time
952 * to wait for tape space operations to complete.
953 *
954 */
955#define	ST_SPACE_TIME	MINUTES(60)	/* 60 minutes per space operation */
956#define	ST_LONG_SPACE_TIME_X	5	/* multipiler for long space ops */
957
958/*
959 * 2 minutes seems a reasonable amount of time
960 * to wait for tape i/o operations to complete.
961 *
962 */
963#define	ST_IO_TIME	MINUTES(2)	/* minutes per i/o */
964#define	ST_LONG_TIMEOUT_X	5	/* multiplier for very long timeouts */
965
966
967/*
968 * 10 seconds is what we'll wait if we get a Busy Status back
969 */
970#define	ST_STATUS_BUSY_TIMEOUT	10*hz	/* seconds Busy Waiting */
971#define	ST_TRAN_BUSY_TIMEOUT	1*hz	/* seconds retry on TRAN_BSY */
972#define	ST_INTERRUPT_CONTEXT	1
973#define	ST_START_CONTEXT	2
974
975/*
976 * Number of times we'll retry a normal operation.
977 *
978 * XXX This includes retries due to transport failure as well as
979 * XXX busy timeouts- Need to distinguish between Target and Transport
980 * XXX failure.
981 */
982
983#define	ST_RETRY_COUNT		20
984
985/*
986 * Number of times to retry a failed selection
987 */
988#define	ST_SEL_RETRY_COUNT		2
989
990/*
991 * es_code value for deferred error
992 * should be moved to sense.h
993 */
994
995#define	ST_DEFERRED_ERROR		0x01
996
997/*
998 * Maximum number of units (determined by minor device byte)
999 */
1000#define	ST_MAXUNIT	128
1001
1002/*
1003 * Time to wait for completion of a command before cancelling it.
1004 * For SUSPEND use only
1005 */
1006#define	ST_WAIT_CMDS_COMPLETE		10	/* seconds */
1007
1008#ifndef	SECSIZE
1009#define	SECSIZE	512
1010#endif
1011#ifndef	SECDIV
1012#define	SECDIV	9
1013#endif
1014
1015/*
1016 * convenient defines
1017 */
1018#define	ST_SCSI_DEVP	(un->un_sd)
1019#define	ST_DEVINFO		(ST_SCSI_DEVP->sd_dev)
1020#define	ST_INQUIRY		(ST_SCSI_DEVP->sd_inq)
1021#define	ST_RQSENSE		(ST_SCSI_DEVP->sd_sense)
1022#define	ST_MUTEX		(&ST_SCSI_DEVP->sd_mutex)
1023#define	ROUTE			(&ST_SCSI_DEVP->sd_address)
1024
1025#define	BSD_BEHAVIOR	(getminor(un->un_dev) & MT_BSD)
1026#define	SVR4_BEHAVIOR	((getminor(un->un_dev) & MT_BSD) == 0)
1027#define	SCBP(pkt)		((struct scsi_status *)(pkt)->pkt_scbp)
1028#define	SCBP_C(pkt)		((*(pkt)->pkt_scbp) & STATUS_MASK)
1029#define	CDBP(pkt)		((union scsi_cdb *)(pkt)->pkt_cdbp)
1030#define	BP_PKT(bp)		((struct scsi_pkt *)(bp)->av_back)
1031#define	SET_BP_PKT(bp, pkt)	((bp)->av_back = (struct buf *)(pkt))
1032#define	BP_UCMD(bp)		((struct uscsi_cmd *)(bp)->b_back)
1033#define	USCSI_CMD(bp)	(((bp) == un->un_sbufp) && (BP_UCMD(bp)))
1034
1035#define	IS_CLOSING(un)	((un)->un_state == ST_STATE_CLOSING || \
1036	((un)->un_state == ST_STATE_SENSING && \
1037		(un)->un_laststate == ST_STATE_CLOSING))
1038
1039#define	ASYNC_CMD	0
1040#define	SYNC_CMD	1
1041
1042/*
1043 * Flush tape wait queue as needed.
1044 */
1045
1046#define	IS_PE_FLAG_SET(un) ((un)->un_persistence && (un)->un_persist_errors)
1047
1048#define	TURN_PE_ON(un)		st_turn_pe_on(un)
1049#define	TURN_PE_OFF(un)		st_turn_pe_off(un)
1050#define	SET_PE_FLAG(un)		st_set_pe_flag(un)
1051#define	CLEAR_PE(un)		st_clear_pe(un)
1052
1053#define	st_bioerror(bp, error) \
1054		{ bioerror(bp, error); \
1055		un->un_errno = error; }
1056
1057/*
1058 * Macros for internal coding of count for SPACE command:
1059 *
1060 * Isfmk is 1 when spacing filemarks; 0 when spacing records:
1061 * bit 24 set indicates a space filemark command.
1062 * Fmk sets the filemark bit (24) and changes a backspace
1063 * count into a positive number with the sign bit set.
1064 * Blk changes a backspace count into a positive number with
1065 * the sign bit set.
1066 * space_cnt converts backwards counts to negative numbers.
1067 */
1068#define	Isfmk(x)	((x & (1<<24)) != 0)
1069#define	Fmk(x)		((1<<24)|((x < 0) ? ((-(x)) | (1<<30)): x))
1070#define	Blk(x)		((x < 0)? ((-(x))|(1<<30)): x)
1071#define	space_cnt(x)	(((x) & (1<<30))? (-((x)&((1<<24)-1))):(x)&((1<<24)-1))
1072
1073
1074#define	GET_SOFT_STATE(dev)						\
1075	register struct scsi_tape *un;					\
1076	register int instance;						\
1077									\
1078	instance = MTUNIT(dev);						\
1079	if ((un = ddi_get_soft_state(st_state, instance)) == NULL)	\
1080		return (ENXIO);
1081
1082/*
1083 * Debugging turned on via conditional compilation switch -DSTDEBUG
1084 */
1085#ifdef DEBUG
1086#define	STDEBUG
1087#endif
1088
1089#ifdef	STDEBUG
1090#define	DEBUGGING	((scsi_options & SCSI_DEBUG_TGT) || st_debug > 1)
1091
1092
1093#define	ST_DEBUG1	if (st_debug >= 1) scsi_log	/* initialization */
1094#define	ST_DEBUG	ST_DEBUG1
1095
1096#define	ST_DEBUG2	if (st_debug >= 2) scsi_log	/* errors and UA's */
1097#define	ST_DEBUG3	if (st_debug >= 3) scsi_log	/* func calls */
1098#define	ST_DEBUG4	if (st_debug >= 4) scsi_log	/* ioctl calls */
1099#define	ST_DEBUG5	if (st_debug >= 5) scsi_log
1100#define	ST_DEBUG6	if (st_debug >= 6) scsi_log	/* full data tracking */
1101
1102#define	ST_DEBUG_SP	if (st_debug == 10) scsi_log	/* special cases */
1103
1104#else
1105
1106#define	st_debug	(0)
1107#define	DEBUGGING	(0)
1108#define	ST_DEBUG	if (0) scsi_log
1109#define	ST_DEBUG1	if (0) scsi_log
1110#define	ST_DEBUG2	if (0) scsi_log
1111#define	ST_DEBUG3	if (0) scsi_log
1112#define	ST_DEBUG4	if (0) scsi_log
1113#define	ST_DEBUG5	if (0) scsi_log
1114#define	ST_DEBUG6	if (0) scsi_log
1115
1116#define	ST_DEBUG_SP	if (0) scsi_log /* special cases */
1117
1118#endif
1119
1120/*
1121 * Media access values
1122 */
1123#define	MEDIA_ACCESS_DELAY 5000000	/* usecs wait for media state change */
1124
1125/*
1126 * SCSI tape mode sense page information
1127 */
1128#define	ST_DEV_CONFIG_PAGE	0x10	/* device config mode page */
1129#define	ST_DEV_CONFIG_NO_COMP	0x00	/* use no compression */
1130#define	ST_DEV_CONFIG_DEF_COMP	0x01	/* use default compression alg */
1131#define	ST_COMPRESSION_DENSITY	3	/* compression minor number */
1132
1133/*
1134 * SCSI tape data compression Page definition.
1135 */
1136#define	ST_DEV_DATACOMP_PAGE	0x0F	/* data compression page */
1137
1138
1139
1140/*
1141 * maxbsize values
1142 */
1143#define	MAXBSIZE_UNKNOWN	-2	/*  not found yet */
1144
1145#define	ONE_MEG			(1024 * 1024)
1146
1147/*
1148 * generic soft error reporting
1149 *
1150 * What we are doing here is allowing a greater number of errors to occur on
1151 * smaller transfers (i.e. usually at the beginning of the tape), than on
1152 * the rest of the tape.
1153 *
1154 * A small transfer is defined as :
1155 * Transfers <= SOFT_ERROR_WARNING_THRESHOLD  allow about 1.5 times more errors
1156 *
1157 * A larget tranfer is defined as :
1158 * Transfers >  SOFT_ERROR_WARNING_THRESHOLD  allow normal amount
1159 *
1160 */
1161#define	READ_SOFT_ERROR_WARNING_THRESHOLD    (25 * ONE_MEG)
1162#define	WRITE_SOFT_ERROR_WARNING_THRESHOLD    (20 * ONE_MEG)
1163
1164/*
1165 * soft error reporting for exabyte
1166 */
1167#define	TAPE_SENSE_LENGTH	32	/* allows for softerror info */
1168
1169#define	SENSE_19_BITS  \
1170	"\20\10PF\07BPE\06FPE\05ME\04ECO\03TME\02TNP\01LBOT"
1171#define	SENSE_20_BITS  \
1172	"\20\10RSVD\07RSVD\06WP\05FMKE\04URE\03WE1\02SSE\01FW"
1173#define	SENSE_21_BITS  \
1174	"\20\10RSVD\07RSVD\06RRR\05CLND\04CLN\03PEOT\02WSEB\01WSE0"
1175
1176/* these are defined in percentages */
1177#define	EXABYTE_WRITE_ERROR_THRESHOLD	6
1178#define	EXABYTE_READ_ERROR_THRESHOLD	3
1179/*
1180 * minumum amount of data transfer(MB) for checking soft error rate.
1181 */
1182#define	EXABYTE_MIN_TRANSFER			(25 * ONE_MEG)
1183
1184#define	CLN	0x8
1185#define	CLND	0x10
1186
1187/*
1188 * soft error reporting for Archive 4mm DAT
1189 */
1190
1191#define	LOG_SENSE_LENGTH		0xff
1192#define	MIN_LOG_SENSE_LENGTH		0x2b
1193#define	DAT_SMALL_WRITE_ERROR_THRESHOLD	40	/* retries per 20 mg */
1194#define	DAT_LARGE_WRITE_ERROR_THRESHOLD	200	/* retries for more 20 mg */
1195#define	DAT_SMALL_READ_ERROR_THRESHOLD	5	/* errors allowed */
1196#define	DAT_LARGE_READ_ERROR_THRESHOLD	3	/* errors allowed */
1197
1198/*
1199 * ST timeouts that need to be cancelled for suspend
1200 */
1201#define	ST_HIB_TID	0x01
1202#define	ST_DELAY_TID	0x02
1203
1204#ifdef	__cplusplus
1205}
1206#endif
1207
1208#endif	/* _SYS_SCSI_TARGETS_STDEF_H */
1209