xref: /illumos-gate/usr/src/uts/common/sys/emul64var.h (revision 2d6eb4a5)
1b1dd958fScth /*
2b1dd958fScth  * CDDL HEADER START
3b1dd958fScth  *
4b1dd958fScth  * The contents of this file are subject to the terms of the
5b1dd958fScth  * Common Development and Distribution License, Version 1.0 only
6b1dd958fScth  * (the "License").  You may not use this file except in compliance
7b1dd958fScth  * with the License.
8b1dd958fScth  *
9b1dd958fScth  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10b1dd958fScth  * or http://www.opensolaris.org/os/licensing.
11b1dd958fScth  * See the License for the specific language governing permissions
12b1dd958fScth  * and limitations under the License.
13b1dd958fScth  *
14b1dd958fScth  * When distributing Covered Code, include this CDDL HEADER in each
15b1dd958fScth  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16b1dd958fScth  * If applicable, add the following below this CDDL HEADER, with the
17b1dd958fScth  * fields enclosed by brackets "[]" replaced with your own identifying
18b1dd958fScth  * information: Portions Copyright [yyyy] [name of copyright owner]
19b1dd958fScth  *
20b1dd958fScth  * CDDL HEADER END
21b1dd958fScth  */
22b1dd958fScth /*
23b1dd958fScth  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24b1dd958fScth  * Use is subject to license terms.
25b1dd958fScth  */
26b1dd958fScth 
27b1dd958fScth #ifndef _SYS_SCSI_ADAPTERS_EMUL64VAR_H
28b1dd958fScth #define	_SYS_SCSI_ADAPTERS_EMUL64VAR_H
29b1dd958fScth 
30b1dd958fScth #include <sys/avl.h>
31b1dd958fScth #include <sys/note.h>
32b1dd958fScth #include <sys/emul64.h>
33b1dd958fScth 
34b1dd958fScth #ifdef	__cplusplus
35b1dd958fScth extern "C" {
36b1dd958fScth #endif
37b1dd958fScth 
38b1dd958fScth /*
39b1dd958fScth  * Convenient short hand defines
40b1dd958fScth  */
41b1dd958fScth #define	TRUE			 1
42b1dd958fScth #define	FALSE			 0
43b1dd958fScth #define	UNDEFINED		-1
44b1dd958fScth 
45b1dd958fScth #define	CNUM(emul64)		(ddi_get_instance(emul64->emul64_tran.tran_dev))
46b1dd958fScth 
47b1dd958fScth #define	EMUL64_RETRY_DELAY		5
48b1dd958fScth #define	EMUL64_RETRIES		0	/* retry of selections */
49b1dd958fScth #define	EMUL64_INITIAL_SOFT_SPACE	5 /* Used for the softstate_init func */
50b1dd958fScth 
51b1dd958fScth #define	MSW(x)			(int16_t)(((int32_t)x >> 16) & 0xFFFF)
52b1dd958fScth #define	LSW(x)			(int16_t)((int32_t)x & 0xFFFF)
53b1dd958fScth 
54b1dd958fScth #define	TGT(sp)			(CMD2PKT(sp)->pkt_address.a_target)
55b1dd958fScth #define	LUN(sp)			(CMD2PKT(sp)->pkt_address.a_lun)
56b1dd958fScth 
57b1dd958fScth #define	HW_REV(val)		(((val) >>8) & 0xff)
58b1dd958fScth #define	FW_REV(val)		((val) & 0xff)
59b1dd958fScth 
60b1dd958fScth /*
61b1dd958fScth  * max number of LUNs per target
62b1dd958fScth  */
63b1dd958fScth #define	EMUL64_NLUNS_PER_TARGET	32
64b1dd958fScth 
65b1dd958fScth /*
66b1dd958fScth  * Default emul64 scsi-options
67b1dd958fScth  */
68b1dd958fScth #define	EMUL64_DEFAULT_SCSI_OPTIONS					\
69b1dd958fScth 					SCSI_OPTIONS_PARITY	|	\
70b1dd958fScth 					SCSI_OPTIONS_DR		|	\
71b1dd958fScth 					SCSI_OPTIONS_SYNC	|	\
72b1dd958fScth 					SCSI_OPTIONS_TAG	|	\
73b1dd958fScth 					SCSI_OPTIONS_FAST	|	\
74b1dd958fScth 					SCSI_OPTIONS_WIDE
75b1dd958fScth 
76b1dd958fScth /*
77b1dd958fScth  *	Tag reject
78b1dd958fScth  */
79b1dd958fScth #define	TAG_REJECT	28
80b1dd958fScth /*
81b1dd958fScth  * Interrupt actions returned by emul64_i_flag_event()
82b1dd958fScth  */
83b1dd958fScth #define	ACTION_CONTINUE		0	/* Continue */
84b1dd958fScth #define	ACTION_RETURN		1	/* Exit */
85b1dd958fScth #define	ACTION_IGNORE		2	/* Ignore */
86b1dd958fScth 
87b1dd958fScth /*
88b1dd958fScth  * Reset actions for emul64_i_reset_interface()
89b1dd958fScth  */
90b1dd958fScth #define	EMUL64_RESET_BUS_IF_BUSY	0x01 /* reset scsi bus if it is busy */
91b1dd958fScth #define	EMUL64_FORCE_RESET_BUS	0x02	/* reset scsi bus on error reco */
92b1dd958fScth 
93b1dd958fScth 
94b1dd958fScth /*
95b1dd958fScth  * extracting period and offset from emul64_synch
96b1dd958fScth  */
97b1dd958fScth #define	PERIOD_MASK(val)	((val) & 0xff)
98b1dd958fScth #define	OFFSET_MASK(val)	(((val) >>8) & 0xff)
99b1dd958fScth 
100b1dd958fScth /*
101b1dd958fScth  * timeout values
102b1dd958fScth  */
103b1dd958fScth #define	EMUL64_GRACE		10	/* Timeout margin (sec.) */
104b1dd958fScth #define	EMUL64_TIMEOUT_DELAY(secs, delay)	(secs * (1000000 / delay))
105b1dd958fScth 
106b1dd958fScth /*
107b1dd958fScth  * delay time for polling loops
108b1dd958fScth  */
109b1dd958fScth #define	EMUL64_NOINTR_POLL_DELAY_TIME		1000	/* usecs */
110b1dd958fScth 
111b1dd958fScth /*
112b1dd958fScth  * busy wait delay time after chip reset
113b1dd958fScth  */
114b1dd958fScth #define	EMUL64_CHIP_RESET_BUSY_WAIT_TIME		100	/* usecs */
115b1dd958fScth 
116b1dd958fScth /*
117b1dd958fScth  * timeout for EMUL64 coming out of reset
118b1dd958fScth  */
119b1dd958fScth #define	EMUL64_RESET_WAIT				1000	/* ms */
120b1dd958fScth #define	EMUL64_SOFT_RESET_TIME			1	/* second */
121b1dd958fScth 
122b1dd958fScth /*
123b1dd958fScth  * emul64_softstate flags for introducing hot plug
124b1dd958fScth  */
125b1dd958fScth #define	EMUL64_SS_OPEN		0x01
126b1dd958fScth #define	EMUL64_SS_DRAINING		0x02
127b1dd958fScth #define	EMUL64_SS_QUIESCED		0x04
128b1dd958fScth #define	EMUL64_SS_DRAIN_ERROR	0x08
129b1dd958fScth 
130b1dd958fScth /*
131b1dd958fScth  * ioctl command definitions
132b1dd958fScth  */
133b1dd958fScth #ifndef	EMUL64_RESET_TARGET
134b1dd958fScth #define	EMUL64_RESET_TARGET		(('i' << 8) | 0x03)
135b1dd958fScth #endif
136b1dd958fScth 
137b1dd958fScth 
138b1dd958fScth /*
139b1dd958fScth  * Debugging macros
140b1dd958fScth  */
141b1dd958fScth #define	EMUL64_DEBUG	if (emul64debug) emul64_i_log
142b1dd958fScth #define	EMUL64_DEBUG2	if (emul64debug > 1) emul64_i_log
143b1dd958fScth 
144b1dd958fScth 
145b1dd958fScth #define	REQ_TGT_LUN(tgt, lun)			(((tgt) << 8) | (lun))
146b1dd958fScth 
147b1dd958fScth 
148b1dd958fScth #define	RESP_CQ_FLAGS(resp)	((resp->resp_header.cq_flags_seq) & 0xff)
149b1dd958fScth 
150b1dd958fScth 
151b1dd958fScth #define	EMUL64_NDATASEGS		4
152b1dd958fScth 
153b1dd958fScth 
154b1dd958fScth /*
155b1dd958fScth  * translate scsi_pkt flags into EMUL64 request packet flags
156b1dd958fScth  * It would be illegal if two flags are set; the driver does not
157b1dd958fScth  * check for this. Setting NODISCON and a tag flag is harmless.
158b1dd958fScth  */
159b1dd958fScth #define	EMUL64_SET_PKT_FLAGS(scsa_flags, emul64_flags) {		\
160b1dd958fScth 	emul64_flags = (scsa_flags >> 11) & 0xe; /* tags */		\
161b1dd958fScth 	emul64_flags |= (scsa_flags >> 1) & 0x1; /* no disconnect */	\
162b1dd958fScth }
163b1dd958fScth 
164b1dd958fScth /*
165b1dd958fScth  * throttle values for EMUL64 request queue
166b1dd958fScth  */
167b1dd958fScth #define	SHUTDOWN_THROTTLE	-1	/* do not submit any requests */
168b1dd958fScth #define	CLEAR_THROTTLE		(EMUL64_MAX_REQUESTS -1)
169b1dd958fScth 
170b1dd958fScth 
171b1dd958fScth #define	EMUL64_GET_PKT_STATE(state)	((uint32_t)(state >> 8))
172b1dd958fScth #define	EMUL64_GET_PKT_STATS(stats)	((uint32_t)(stats))
173b1dd958fScth 
174b1dd958fScth #define	EMUL64_STAT_NEGOTIATE	0x0080
175b1dd958fScth 
176b1dd958fScth #define	EMUL64_SET_REASON(sp, reason) { \
177b1dd958fScth 	if ((sp) && CMD2PKT(sp)->pkt_reason == CMD_CMPLT) \
178b1dd958fScth 		CMD2PKT(sp)->pkt_reason = (reason); \
179b1dd958fScth }
180b1dd958fScth 
181b1dd958fScth /*
182b1dd958fScth  * mutex short hands
183b1dd958fScth  */
184b1dd958fScth #define	EMUL64_REQ_MUTEX(emul64)	(&emul64->emul64_request_mutex)
185b1dd958fScth #define	EMUL64_RESP_MUTEX(emul64)	(&emul64->emul64_response_mutex)
186b1dd958fScth #define	EMUL64_HOTPLUG_MUTEX(emul64)	(&emul64->emul64_hotplug_mutex)
187b1dd958fScth 
188b1dd958fScth 
189b1dd958fScth #define	EMUL64_MUTEX_ENTER(emul64) mutex_enter(EMUL64_RESP_MUTEX(emul64)), \
190b1dd958fScth 				mutex_enter(EMUL64_REQ_MUTEX(emul64))
191b1dd958fScth #define	EMUL64_MUTEX_EXIT(emul64)	mutex_exit(EMUL64_RESP_MUTEX(emul64)), \
192b1dd958fScth 				mutex_exit(EMUL64_REQ_MUTEX(emul64))
193b1dd958fScth 
194b1dd958fScth #define	EMUL64_CV(emul64)			(&(emul64)->emul64_cv)
195b1dd958fScth 
196b1dd958fScth /*
197b1dd958fScth  * HBA interface macros
198b1dd958fScth  */
199b1dd958fScth #define	SDEV2TRAN(sd)		((sd)->sd_address.a_hba_tran)
200b1dd958fScth #define	SDEV2ADDR(sd)		(&((sd)->sd_address))
201b1dd958fScth #define	PKT2TRAN(pkt)		((pkt)->pkt_address.a_hba_tran)
202b1dd958fScth #define	ADDR2TRAN(ap)		((ap)->a_hba_tran)
203b1dd958fScth 
204b1dd958fScth #define	TRAN2EMUL64(tran)	((struct emul64 *)(tran)->tran_hba_private)
205b1dd958fScth #define	SDEV2EMUL64(sd)		(TRAN2EMUL64(SDEV2TRAN(sd)))
206b1dd958fScth #define	PKT2EMUL64(pkt)		(TRAN2EMUL64(PKT2TRAN(pkt)))
207b1dd958fScth #define	ADDR2EMUL64(ap)		(TRAN2EMUL64(ADDR2TRAN(ap)))
208b1dd958fScth 
209b1dd958fScth #define	CMD2ADDR(cmd)		(&CMD2PKT(cmd)->pkt_address)
210b1dd958fScth #define	CMD2TRAN(cmd)		(CMD2PKT(cmd)->pkt_address.a_hba_tran)
211b1dd958fScth #define	CMD2EMUL64(cmd)		(TRAN2EMUL64(CMD2TRAN(cmd)))
212b1dd958fScth 
213b1dd958fScth /*
214b1dd958fScth  * Results of checking for range overlap.
215b1dd958fScth  */
216b1dd958fScth typedef enum emul64_rng_overlap {
217b1dd958fScth 	O_NONE,			/* No overlap */
218b1dd958fScth 	O_SAME,			/* Ranges are identical */
219b1dd958fScth 	O_SUBSET,		/* Blocks are contained in range */
220b1dd958fScth 	O_OVERLAP		/* Ranges overlap. */
221b1dd958fScth } emul64_rng_overlap_t;
222b1dd958fScth 
223b1dd958fScth /*
224b1dd958fScth  * Rather than keep the entire image of the disk, we only keep
225b1dd958fScth  * the blocks which have been written with non-zeros.  As the
226b1dd958fScth  * purpose of this driver is to exercise format and perhaps other
227b1dd958fScth  * large-disk management tools, only recording the label for
228b1dd958fScth  * i/o is sufficient
229b1dd958fScth  */
230b1dd958fScth typedef struct blklist {
231b1dd958fScth 	diskaddr_t	bl_blkno;	/* Disk address of the data */
232b1dd958fScth 	uchar_t		*bl_data;	/* Pointer to the data */
233b1dd958fScth 	avl_node_t	bl_node;	/* Our linkage in AVL tree */
234b1dd958fScth } blklist_t;
235b1dd958fScth 
236b1dd958fScth /*
237b1dd958fScth  * Structure to track a range of blocks where writes are to be ignored.
238b1dd958fScth  */
239b1dd958fScth typedef struct emul64_nowrite {
240b1dd958fScth 	struct emul64_nowrite	*emul64_nwnext;	/* next item in list */
241b1dd958fScth 	emul64_range_t		emul64_blocked;	/* range to ignore writes */
242b1dd958fScth } emul64_nowrite_t;
243b1dd958fScth 
244b1dd958fScth typedef struct emul64_tgt {
245b1dd958fScth 	struct scsi_address	emul64_tgt_saddr;
246b1dd958fScth 	struct emul64_tgt	*emul64_tgt_next;	/* Next tgt on ctlr */
247b1dd958fScth 	emul64_nowrite_t	*emul64_tgt_nowrite;	/* List of regions to */
248b1dd958fScth 							/* skip writes */
249b1dd958fScth 	diskaddr_t		emul64_tgt_sectors;	/* # sectors in dev */
250b1dd958fScth 	char 			emul64_tgt_inq[8+16];
251b1dd958fScth 	uint_t			emul64_tgt_dtype;
252b1dd958fScth 	uint_t			emul64_tgt_ncyls;	/* # cylinders in dev */
253b1dd958fScth 	uint_t			emul64_tgt_nheads;	/* # disk heads */
254b1dd958fScth 	uint_t			emul64_tgt_nsect;	/* # sectors */
255b1dd958fScth 	uint64_t		emul64_list_length;	/* # data blks */
256b1dd958fScth 	avl_tree_t		emul64_tgt_data;	/* Tree of data blks */
257b1dd958fScth 	kmutex_t		emul64_tgt_blk_lock;	/* Protect data blks */
258b1dd958fScth 	krwlock_t		emul64_tgt_nw_lock;	/* Guard tgt_nowrite */
259*cefe316eSpd 	/* Fields for error injection */
260*cefe316eSpd 	ushort_t		emul64_einj_state;
261*cefe316eSpd 	ushort_t		emul64_einj_sense_length;
262*cefe316eSpd 	uint_t			emul64_einj_pkt_state;
263*cefe316eSpd 	uint_t			emul64_einj_pkt_reason;
264*cefe316eSpd 	struct scsi_status	emul64_einj_scsi_status;
265*cefe316eSpd 	uint8_t			*emul64_einj_sense_data;
266b1dd958fScth } emul64_tgt_t;
267b1dd958fScth 
268b1dd958fScth /*
269b1dd958fScth  * emul64 softstate structure
270b1dd958fScth  */
271b1dd958fScth 
272b1dd958fScth /*
273b1dd958fScth  * deadline slot structure for timeout handling
274b1dd958fScth  */
275b1dd958fScth struct emul64_slot {
276b1dd958fScth 	struct emul64_cmd	*slot_cmd;
277b1dd958fScth 	clock_t		slot_deadline;
278b1dd958fScth };
279b1dd958fScth 
280b1dd958fScth 
281b1dd958fScth /*
282b1dd958fScth  * Record the reset notification requests from target drivers.
283b1dd958fScth  */
284b1dd958fScth struct emul64_reset_notify_entry {
285b1dd958fScth 	struct scsi_address		*ap;
286b1dd958fScth 	void				(*callback)(caddr_t);
287b1dd958fScth 	caddr_t				arg;
288b1dd958fScth 	struct emul64_reset_notify_entry	*next;
289b1dd958fScth };
290b1dd958fScth 
291b1dd958fScth 
292b1dd958fScth struct emul64 {
293b1dd958fScth 
294b1dd958fScth 	/*
295b1dd958fScth 	 * Transport structure for this instance of the hba
296b1dd958fScth 	 */
297b1dd958fScth 	scsi_hba_tran_t		*emul64_tran;
298b1dd958fScth 
299b1dd958fScth 	/*
300b1dd958fScth 	 * dev_info_t reference can be found in the transport structure
301b1dd958fScth 	 */
302b1dd958fScth 	dev_info_t		*emul64_dip;
303b1dd958fScth 
304b1dd958fScth 	/*
305b1dd958fScth 	 * Interrupt block cookie
306b1dd958fScth 	 */
307b1dd958fScth 	ddi_iblock_cookie_t	emul64_iblock;
308b1dd958fScth 
309b1dd958fScth 	/*
310b1dd958fScth 	 * Firmware revision number
311b1dd958fScth 	 */
312b1dd958fScth 	uint16_t		emul64_major_rev;
313b1dd958fScth 	uint16_t		emul64_minor_rev;
314b1dd958fScth 
315b1dd958fScth 	/*
316b1dd958fScth 	 * timeout id
317b1dd958fScth 	 */
318b1dd958fScth 	timeout_id_t		emul64_timeout_id;
319b1dd958fScth 
320b1dd958fScth 	/*
321b1dd958fScth 	 * scsi options, scsi_tag_age_limit  per emul64
322b1dd958fScth 	 */
323b1dd958fScth 	int			emul64_scsi_options;
324b1dd958fScth 	int			emul64_target_scsi_options[NTARGETS_WIDE];
325b1dd958fScth 	int			emul64_scsi_tag_age_limit;
326b1dd958fScth 
327b1dd958fScth 	/*
328b1dd958fScth 	 * scsi_reset_delay per emul64
329b1dd958fScth 	 */
330b1dd958fScth 	clock_t			emul64_scsi_reset_delay;
331b1dd958fScth 
332b1dd958fScth 	/*
333b1dd958fScth 	 * current host ID
334b1dd958fScth 	 */
335b1dd958fScth 	uint8_t			emul64_initiator_id;
336b1dd958fScth 
337b1dd958fScth 	/*
338b1dd958fScth 	 * suspended flag for power management
339b1dd958fScth 	 */
340b1dd958fScth 	uint8_t			emul64_suspended;
341b1dd958fScth 
342b1dd958fScth 	/*
343b1dd958fScth 	 * Host adapter capabilities and offset/period values per target
344b1dd958fScth 	 */
345b1dd958fScth 	uint16_t		emul64_cap[NTARGETS_WIDE];
346b1dd958fScth 	int16_t			emul64_synch[NTARGETS_WIDE];
347b1dd958fScth 
348b1dd958fScth 	/*
349b1dd958fScth 	 * EMUL64 Hardware register pointer.
350b1dd958fScth 	 */
351b1dd958fScth 	struct emul64regs		*emul64_reg;
352b1dd958fScth 
353b1dd958fScth 
354b1dd958fScth 	kmutex_t		emul64_request_mutex;
355b1dd958fScth 	kmutex_t		emul64_response_mutex;
356b1dd958fScth 
357b1dd958fScth 	/*
358b1dd958fScth 	 * for keeping track of the max LUNs per target on this bus
359b1dd958fScth 	 */
360b1dd958fScth 	uchar_t			emul64_max_lun[NTARGETS_WIDE];
361b1dd958fScth 
362b1dd958fScth 	/*
363b1dd958fScth 	 * for keeping track of each target/lun
364b1dd958fScth 	 */
365b1dd958fScth 	int	nt_total_sectors[NTARGETS_WIDE][EMUL64_NLUNS_PER_TARGET];
366b1dd958fScth 
367b1dd958fScth 	struct emul64_reset_notify_entry	*emul64_reset_notify_listf;
368b1dd958fScth 
369b1dd958fScth 	ushort_t		emul64_backoff;
370b1dd958fScth 	uint_t			emul64_softstate; /* flags for hotplug */
371b1dd958fScth 	int			emul64_hotplug_waiting;
372b1dd958fScth 	kcondvar_t		emul64_cv; /* cv for bus quiesce/unquiesce */
373b1dd958fScth 	kmutex_t		emul64_hotplug_mutex; /* Mutex for hotplug */
374b1dd958fScth 	taskq_t			*emul64_taskq;
375b1dd958fScth 	emul64_tgt_t		*emul64_tgt;
376b1dd958fScth };
377b1dd958fScth 
378b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
379b1dd958fScth 				emul64::emul64_queue_space))
380b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
381b1dd958fScth 				emul64::emul64_request_in))
382b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
383b1dd958fScth 				emul64::emul64_request_out))
384b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
385b1dd958fScth 				emul64::emul64_request_ptr))
386b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
387b1dd958fScth 				emul64::emul64_mbox))
388b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_request_mutex,
389b1dd958fScth 				emul64::emul64_slots))
390b1dd958fScth 
391b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
392b1dd958fScth 				emul64::emul64_response_in))
393b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
394b1dd958fScth 				emul64::emul64_response_out))
395b1dd958fScth _NOTE(MUTEX_PROTECTS_DATA(emul64::emul64_response_mutex,
396b1dd958fScth 				emul64::emul64_response_ptr))
397b1dd958fScth 
398b1dd958fScth extern void emul64_bsd_init();
399b1dd958fScth extern void emul64_bsd_fini();
400b1dd958fScth extern void emul64_bsd_get_props(dev_info_t *);
401b1dd958fScth 
402b1dd958fScth extern emul64_rng_overlap_t emul64_overlap(emul64_range_t *,
403b1dd958fScth 						diskaddr_t, size_t);
404b1dd958fScth extern int emul64_bsd_blkcompare(const void *, const void *);
405b1dd958fScth extern int emul64debug;
406b1dd958fScth extern long emul64_nowrite_count;
407b1dd958fScth extern kmutex_t emul64_stats_mutex;
408b1dd958fScth extern int emul64_collect_stats;
409b1dd958fScth extern uint64_t emul64_taskq_max;
410b1dd958fScth extern int emul64_max_task;
411b1dd958fScth extern int emul64_task_nthreads;
412b1dd958fScth 
413b1dd958fScth #ifdef	__cplusplus
414b1dd958fScth }
415b1dd958fScth #endif
416b1dd958fScth 
417b1dd958fScth #endif	/* _SYS_SCSI_ADAPTERS_EMUL64VAR_H */
418