1*3d19cdaeSstevel /*
2*3d19cdaeSstevel  * CDDL HEADER START
3*3d19cdaeSstevel  *
4*3d19cdaeSstevel  * The contents of this file are subject to the terms of the
5*3d19cdaeSstevel  * Common Development and Distribution License, Version 1.0 only
6*3d19cdaeSstevel  * (the "License").  You may not use this file except in compliance
7*3d19cdaeSstevel  * with the License.
8*3d19cdaeSstevel  *
9*3d19cdaeSstevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*3d19cdaeSstevel  * or http://www.opensolaris.org/os/licensing.
11*3d19cdaeSstevel  * See the License for the specific language governing permissions
12*3d19cdaeSstevel  * and limitations under the License.
13*3d19cdaeSstevel  *
14*3d19cdaeSstevel  * When distributing Covered Code, include this CDDL HEADER in each
15*3d19cdaeSstevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*3d19cdaeSstevel  * If applicable, add the following below this CDDL HEADER, with the
17*3d19cdaeSstevel  * fields enclosed by brackets "[]" replaced with your own identifying
18*3d19cdaeSstevel  * information: Portions Copyright [yyyy] [name of copyright owner]
19*3d19cdaeSstevel  *
20*3d19cdaeSstevel  * CDDL HEADER END
21*3d19cdaeSstevel  */
22*3d19cdaeSstevel /*
23*3d19cdaeSstevel  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*3d19cdaeSstevel  * Use is subject to license terms.
25*3d19cdaeSstevel  */
26*3d19cdaeSstevel 
27*3d19cdaeSstevel #ifndef	_SYS_SCSI_ADAPTERS_SFVAR_H
28*3d19cdaeSstevel #define	_SYS_SCSI_ADAPTERS_SFVAR_H
29*3d19cdaeSstevel 
30*3d19cdaeSstevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*3d19cdaeSstevel 
32*3d19cdaeSstevel /*
33*3d19cdaeSstevel  * FC-AL FCP driver definitions
34*3d19cdaeSstevel  */
35*3d19cdaeSstevel 
36*3d19cdaeSstevel #ifdef	__cplusplus
37*3d19cdaeSstevel extern "C" {
38*3d19cdaeSstevel #endif
39*3d19cdaeSstevel 
40*3d19cdaeSstevel /*
41*3d19cdaeSstevel  * this is to generate unique minor numbers for each minor
42*3d19cdaeSstevel  * node type being created. because of the limitations by SCSA,
43*3d19cdaeSstevel  * we have to use minor number values from 32 to 63 for the HBA
44*3d19cdaeSstevel  * drivers use
45*3d19cdaeSstevel  */
46*3d19cdaeSstevel #define	SF_BASE_MINOR		32
47*3d19cdaeSstevel #define	SF_DEVCTL_MINOR		(SF_BASE_MINOR + 1)
48*3d19cdaeSstevel #define	SF_FC_MINOR		(SF_BASE_MINOR + 2)
49*3d19cdaeSstevel #define	SF_INST_SHIFT4MINOR	6
50*3d19cdaeSstevel #define	SF_INST2DEVCTL_MINOR(x)	(((x) << SF_INST_SHIFT4MINOR) | SF_DEVCTL_MINOR)
51*3d19cdaeSstevel #define	SF_INST2FC_MINOR(x)	(((x) << SF_INST_SHIFT4MINOR) | SF_FC_MINOR)
52*3d19cdaeSstevel #define	SF_MINOR2INST(x)	((x) >> SF_INST_SHIFT4MINOR)
53*3d19cdaeSstevel 
54*3d19cdaeSstevel #define	SF_INIT_ITEMS		5
55*3d19cdaeSstevel #define	SF_MAX_TARGETS		126
56*3d19cdaeSstevel #define	SF_MAX_LILP_ENTRIES	126
57*3d19cdaeSstevel 
58*3d19cdaeSstevel #define	SF_NUM_HASH_QUEUES	32
59*3d19cdaeSstevel #define	SF_HASH(x, y)	((x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6]+x[7]) &\
60*3d19cdaeSstevel (SF_NUM_HASH_QUEUES-1))
61*3d19cdaeSstevel 
62*3d19cdaeSstevel 
63*3d19cdaeSstevel /*
64*3d19cdaeSstevel  * sf driver needs to be sanitized for exporting some of its
65*3d19cdaeSstevel  * macros/variables to userland programs.
66*3d19cdaeSstevel  */
67*3d19cdaeSstevel #ifdef	_KERNEL
68*3d19cdaeSstevel 
69*3d19cdaeSstevel /*
70*3d19cdaeSstevel  * sf instance structure
71*3d19cdaeSstevel  */
72*3d19cdaeSstevel 
73*3d19cdaeSstevel struct sf {
74*3d19cdaeSstevel 	struct scsi_hba_tran *sf_tran;
75*3d19cdaeSstevel 	dev_info_t	*sf_dip;
76*3d19cdaeSstevel 	struct sf	*sf_next;
77*3d19cdaeSstevel 	struct sf	*sf_sibling;
78*3d19cdaeSstevel 	kmutex_t	sf_mutex;
79*3d19cdaeSstevel 	kmutex_t	sf_cr_mutex;
80*3d19cdaeSstevel 	uint_t		sf_state;
81*3d19cdaeSstevel 	int64_t		sf_reset_time;	/* reset/lip init time for bus_config */
82*3d19cdaeSstevel 	struct sf_target *sf_targets[SF_MAX_TARGETS];
83*3d19cdaeSstevel 	struct sf_target *sf_wwn_lists[SF_NUM_HASH_QUEUES];
84*3d19cdaeSstevel 	void		*sf_socp;	/* pointer to socal state */
85*3d19cdaeSstevel 	struct fcal_transport *sf_sochandle;
86*3d19cdaeSstevel 	kmutex_t	sf_cmd_mutex;
87*3d19cdaeSstevel 	int		sf_throttle;
88*3d19cdaeSstevel 	int		sf_ncmds;
89*3d19cdaeSstevel 	int		sf_ncmds_exp_avg;
90*3d19cdaeSstevel 	int		sf_device_count;
91*3d19cdaeSstevel 	uint_t		sf_use_lock;
92*3d19cdaeSstevel 	uint_t		sf_timer;
93*3d19cdaeSstevel 	uint_t		sf_online_timer;
94*3d19cdaeSstevel 	int		sf_take_core;
95*3d19cdaeSstevel 	struct kmem_cache *sf_pkt_cache;
96*3d19cdaeSstevel 	struct sf_pkt *sf_pkt_head; /* packet queue */
97*3d19cdaeSstevel 	struct sf_pkt *sf_pkt_tail;
98*3d19cdaeSstevel 	struct sf_els_hdr *sf_els_list;
99*3d19cdaeSstevel 	struct sf_reset_list	*sf_reset_list;
100*3d19cdaeSstevel 	kcondvar_t	sf_cr_cv;
101*3d19cdaeSstevel 	uint_t		sf_cr_pool_cnt;
102*3d19cdaeSstevel 	struct sf_cr_pool *sf_cr_pool; /* list of command/response pools */
103*3d19cdaeSstevel 	uchar_t		sf_al_pa;
104*3d19cdaeSstevel 	uchar_t		sf_busy;
105*3d19cdaeSstevel 	uchar_t		sf_flag;
106*3d19cdaeSstevel 	uchar_t		sf_cr_flag; /* synchronize creation of new cr pools */
107*3d19cdaeSstevel 	uint_t		sf_lip_cnt;
108*3d19cdaeSstevel 	struct scsi_reset_notify_entry  *sf_reset_notify_listf;
109*3d19cdaeSstevel 	struct fcal_lilp_map	*sf_lilp_map;
110*3d19cdaeSstevel 	ddi_dma_handle_t	sf_lilp_dmahandle;
111*3d19cdaeSstevel 	ddi_acc_handle_t	sf_lilp_acchandle;
112*3d19cdaeSstevel 	ddi_dma_cookie_t	sf_lilp_dmacookie;
113*3d19cdaeSstevel 	kstat_t		*sf_ksp;
114*3d19cdaeSstevel 	kmutex_t	sf_hp_daemon_mutex;
115*3d19cdaeSstevel 	kcondvar_t	sf_hp_daemon_cv;
116*3d19cdaeSstevel 	struct sf_hp_elem *sf_hp_elem_head;
117*3d19cdaeSstevel 	struct sf_hp_elem *sf_hp_elem_tail;
118*3d19cdaeSstevel 	/*
119*3d19cdaeSstevel 	 * Event handling
120*3d19cdaeSstevel 	 */
121*3d19cdaeSstevel 	ndi_event_definition_t	*sf_event_defs;
122*3d19cdaeSstevel 	ndi_event_hdl_t		sf_event_hdl;
123*3d19cdaeSstevel 	ndi_event_set_t		sf_events;
124*3d19cdaeSstevel 	struct	sf_stats	sf_stats;
125*3d19cdaeSstevel 	uchar_t		sf_hp_exit;	/* hotplugging thread exit flag */
126*3d19cdaeSstevel 	uchar_t		sf_check_n_close;
127*3d19cdaeSstevel 		/* check if unopened sf is being closed */
128*3d19cdaeSstevel 	kt_did_t	sf_hp_tid;	/* hotplug thread id */
129*3d19cdaeSstevel };
130*3d19cdaeSstevel 
131*3d19cdaeSstevel #define	SF_STATE_INIT		0x01
132*3d19cdaeSstevel #define	SF_STATE_OFFLINE	0x02
133*3d19cdaeSstevel #define	SF_STATE_ONLINE		0x04
134*3d19cdaeSstevel #define	SF_STATE_ONLINING	0x08
135*3d19cdaeSstevel #define	SF_STATE_SUSPENDED	0x10		/* driver has been suspended */
136*3d19cdaeSstevel 
137*3d19cdaeSstevel #define	SF_EVENT_TAG_INSERT	0
138*3d19cdaeSstevel #define	SF_EVENT_TAG_REMOVE	1
139*3d19cdaeSstevel 
140*3d19cdaeSstevel /*
141*3d19cdaeSstevel  * pool of sf command response blocks
142*3d19cdaeSstevel  */
143*3d19cdaeSstevel 
144*3d19cdaeSstevel struct  sf_cr_pool {
145*3d19cdaeSstevel 	struct	sf_cr_pool	*next;
146*3d19cdaeSstevel 	struct	sf_cr_free_elem *free;
147*3d19cdaeSstevel 	struct	sf		*sf;
148*3d19cdaeSstevel 	caddr_t			cmd_base;	/* start addr of this chunk */
149*3d19cdaeSstevel 	ddi_dma_handle_t	cmd_dma_handle; /* dma mapping for this chunk */
150*3d19cdaeSstevel 	ddi_acc_handle_t	cmd_acc_handle;
151*3d19cdaeSstevel 	caddr_t			rsp_base;
152*3d19cdaeSstevel 	ddi_dma_handle_t	rsp_dma_handle;
153*3d19cdaeSstevel 	ddi_acc_handle_t	rsp_acc_handle;
154*3d19cdaeSstevel 	uint_t			nfree;
155*3d19cdaeSstevel 	uint_t			ntot;
156*3d19cdaeSstevel };
157*3d19cdaeSstevel 
158*3d19cdaeSstevel #define	SF_CR_POOL_MAX		32	/* allows 4096 outstanding packets */
159*3d19cdaeSstevel 
160*3d19cdaeSstevel #define	SF_ELEMS_IN_POOL	128
161*3d19cdaeSstevel #define	SF_LOG2_ELEMS_IN_POOL	7	/* LOG2 SF_ELEMS_IN_POOL */
162*3d19cdaeSstevel #define	SF_FREE_CR_EPSILON	64	/* SF_ELEMS_IN_POOL /2 */
163*3d19cdaeSstevel 
164*3d19cdaeSstevel /*
165*3d19cdaeSstevel  * sf command/response free structure which is overlaid on fcp_cmd
166*3d19cdaeSstevel  */
167*3d19cdaeSstevel 
168*3d19cdaeSstevel struct  sf_cr_free_elem {
169*3d19cdaeSstevel 	struct		sf_cr_free_elem *next;
170*3d19cdaeSstevel 	caddr_t		rsp;		/* ptr to corresponding rsp */
171*3d19cdaeSstevel 	uint_t		cmd_dmac;	/* dmac_address for cmd */
172*3d19cdaeSstevel 	uint_t		rsp_dmac;	/* dmac_address for rsp */
173*3d19cdaeSstevel };
174*3d19cdaeSstevel 
175*3d19cdaeSstevel /*
176*3d19cdaeSstevel  * list of targets for reset delay handling
177*3d19cdaeSstevel  */
178*3d19cdaeSstevel 
179*3d19cdaeSstevel struct sf_reset_list {
180*3d19cdaeSstevel 	struct sf_reset_list	*next;
181*3d19cdaeSstevel 	struct sf_target	*target;
182*3d19cdaeSstevel 	clock_t			timeout;
183*3d19cdaeSstevel 	uint_t			lip_cnt;
184*3d19cdaeSstevel };
185*3d19cdaeSstevel 
186*3d19cdaeSstevel /*
187*3d19cdaeSstevel  * structure used to store hotplug event callback info
188*3d19cdaeSstevel  */
189*3d19cdaeSstevel 
190*3d19cdaeSstevel struct sf_hp_event {
191*3d19cdaeSstevel 	int (*callback)();
192*3d19cdaeSstevel 	void *arg;
193*3d19cdaeSstevel };
194*3d19cdaeSstevel 
195*3d19cdaeSstevel 
196*3d19cdaeSstevel /*
197*3d19cdaeSstevel  * sf per target structure
198*3d19cdaeSstevel  */
199*3d19cdaeSstevel 
200*3d19cdaeSstevel struct sf_target	{
201*3d19cdaeSstevel 	struct sf_pkt *sft_pkt_head; /* queue of active commands */
202*3d19cdaeSstevel 	struct sf_pkt *sft_pkt_tail;
203*3d19cdaeSstevel 	kmutex_t	sft_mutex;
204*3d19cdaeSstevel 	kcondvar_t	sft_cv;
205*3d19cdaeSstevel 	kmutex_t	sft_pkt_mutex;
206*3d19cdaeSstevel 	dev_info_t	*sft_dip;
207*3d19cdaeSstevel 	uchar_t		sft_node_wwn[FC_WWN_SIZE];
208*3d19cdaeSstevel 	uchar_t		sft_port_wwn[FC_WWN_SIZE];
209*3d19cdaeSstevel 	union {
210*3d19cdaeSstevel 		/* It's easier to shove around an int64 than a byte array */
211*3d19cdaeSstevel 		uchar_t	b[FCP_LUN_SIZE];
212*3d19cdaeSstevel 		int64_t	l;
213*3d19cdaeSstevel 	}		sft_lun;
214*3d19cdaeSstevel 	/* XXXX The RAID LUN field is used to implement FCP Annex C */
215*3d19cdaeSstevel #ifdef RAID_LUNS
216*3d19cdaeSstevel 	uint_t		sft_raid_lun;
217*3d19cdaeSstevel #define	SCSA_LUN(t)	(int64_t)(t)->sft_raid_lun
218*3d19cdaeSstevel #else
219*3d19cdaeSstevel #define	SCSA_LUN(t)	(t)->sft_lun.l
220*3d19cdaeSstevel #endif
221*3d19cdaeSstevel 	uchar_t		sft_hard_address;
222*3d19cdaeSstevel 	uchar_t		sft_al_pa;
223*3d19cdaeSstevel 	uchar_t		sft_device_type;
224*3d19cdaeSstevel 	uchar_t		sft_scan_count;
225*3d19cdaeSstevel 	uint_t		sft_alive;
226*3d19cdaeSstevel 	uint_t		sft_state;
227*3d19cdaeSstevel 	uint_t		sft_lip_cnt;
228*3d19cdaeSstevel 	struct scsi_hba_tran *sft_tran;
229*3d19cdaeSstevel 	struct sf_target	*sft_next;
230*3d19cdaeSstevel 	struct sf_target	*sft_next_lun;
231*3d19cdaeSstevel 	struct sf_hp_event sft_insert_ev;
232*3d19cdaeSstevel 	struct sf_hp_event sft_remove_ev;
233*3d19cdaeSstevel 	struct scsi_inquiry	sft_inq;
234*3d19cdaeSstevel };
235*3d19cdaeSstevel 
236*3d19cdaeSstevel #define	SF_TARGET_INIT_DONE	0x1
237*3d19cdaeSstevel #define	SF_TARGET_BUSY		0x2
238*3d19cdaeSstevel #define	SF_TARGET_OFFLINE	0x4
239*3d19cdaeSstevel #define	SF_TARGET_MARK		0x8
240*3d19cdaeSstevel 
241*3d19cdaeSstevel /*
242*3d19cdaeSstevel  * sf packet
243*3d19cdaeSstevel  */
244*3d19cdaeSstevel 
245*3d19cdaeSstevel #define	PKT2CMD(pkt)		((struct sf_pkt *)pkt->pkt_ha_private)
246*3d19cdaeSstevel #define	CMD2PKT(cmd)		((cmd)->cmd_pkt)
247*3d19cdaeSstevel #ifdef	_LP64
248*3d19cdaeSstevel #define	PKT_PRIV_SIZE		2
249*3d19cdaeSstevel #define	PKT_PRIV_LEN		16
250*3d19cdaeSstevel #else /* _ILP32 */
251*3d19cdaeSstevel #define	PKT_PRIV_SIZE		1
252*3d19cdaeSstevel #define	PKT_PRIV_LEN		8
253*3d19cdaeSstevel #endif
254*3d19cdaeSstevel 
255*3d19cdaeSstevel 
256*3d19cdaeSstevel struct sf_pkt {
257*3d19cdaeSstevel 	struct sf_pkt		*cmd_forw;
258*3d19cdaeSstevel 	struct sf_pkt		*cmd_back;
259*3d19cdaeSstevel 	struct sf_pkt		*cmd_next;
260*3d19cdaeSstevel 	struct scsi_pkt		*cmd_pkt;
261*3d19cdaeSstevel 	fcal_packet_t		*cmd_fp_pkt;
262*3d19cdaeSstevel 	uint_t		cmd_state;
263*3d19cdaeSstevel 	uint_t		cmd_timeout;
264*3d19cdaeSstevel 	char		cmd_scsi_scb[sizeof (struct scsi_arq_status)];
265*3d19cdaeSstevel 	uint32_t	cmd_dmacount;
266*3d19cdaeSstevel 	ddi_dma_handle_t	cmd_dmahandle;  /* dma handle */
267*3d19cdaeSstevel 	ddi_dma_cookie_t	cmd_dmacookie;  /* current dma cookie */
268*3d19cdaeSstevel 	uint_t		cmd_flags;	/* private flags */
269*3d19cdaeSstevel 						/* needs ZEROING */
270*3d19cdaeSstevel 	uint_t		cmd_cdblen;	/* length of cdb */
271*3d19cdaeSstevel 					/* needs to be INITialized */
272*3d19cdaeSstevel 	uint_t		cmd_scblen;	/* length of scb */
273*3d19cdaeSstevel 					/* needs to be INITialized */
274*3d19cdaeSstevel 	uint_t		cmd_privlen;	/* length of tgt private */
275*3d19cdaeSstevel 					/* needs to be INITialized */
276*3d19cdaeSstevel 	struct	sf_cr_pool	*cmd_cr_pool; /* pool to which cmd/rsp belong */
277*3d19cdaeSstevel 	struct fcp_cmd		*cmd_block;
278*3d19cdaeSstevel 	struct fcp_rsp		*cmd_rsp_block;
279*3d19cdaeSstevel 	kmutex_t	cmd_abort_mutex;	/* packet abort mutex */
280*3d19cdaeSstevel 	uint_t		cmd_dmac;
281*3d19cdaeSstevel 	uint_t		cmd_rsp_dmac;
282*3d19cdaeSstevel 	uint64_t		cmd_pkt_private[PKT_PRIV_LEN];
283*3d19cdaeSstevel 			/* default target private area */
284*3d19cdaeSstevel };
285*3d19cdaeSstevel 
286*3d19cdaeSstevel #define	SF_STATE_IDLE		0x1
287*3d19cdaeSstevel #define	SF_STATE_ISSUED		0x2
288*3d19cdaeSstevel #define	SF_STATE_ABORTING	0x4
289*3d19cdaeSstevel 
290*3d19cdaeSstevel /*
291*3d19cdaeSstevel  * Define size of extended scsi cmd pkt (ie. includes ARQ)
292*3d19cdaeSstevel  */
293*3d19cdaeSstevel #define	EXTCMDS_STATUS_SIZE  (sizeof (struct scsi_arq_status))
294*3d19cdaeSstevel 
295*3d19cdaeSstevel /*
296*3d19cdaeSstevel  * These are the defined flags for this structure.
297*3d19cdaeSstevel  */
298*3d19cdaeSstevel #define	CFLAG_DMAVALID		0x0010	/* dma mapping valid */
299*3d19cdaeSstevel #define	CFLAG_DMASEND		0x0020	/* data is going 'out' */
300*3d19cdaeSstevel #define	CFLAG_CMDIOPB		0x0040	/* this is an 'iopb' packet */
301*3d19cdaeSstevel #define	CFLAG_CDBEXTERN		0x0100	/* cdb kmem_alloc'd */
302*3d19cdaeSstevel #define	CFLAG_SCBEXTERN		0x0200	/* scb kmem_alloc'd */
303*3d19cdaeSstevel #define	CFLAG_FREE		0x0400	/* packet is on free list */
304*3d19cdaeSstevel #define	CFLAG_PRIVEXTERN	0x1000	/* target private was */
305*3d19cdaeSstevel 					/* kmem_alloc'd */
306*3d19cdaeSstevel #define	CFLAG_IN_QUEUE		0x2000	/* command in sf queue */
307*3d19cdaeSstevel 
308*3d19cdaeSstevel struct sf_els_hdr {
309*3d19cdaeSstevel 	struct sf	*sf;
310*3d19cdaeSstevel 	caddr_t		cmd;
311*3d19cdaeSstevel 	caddr_t		rsp;
312*3d19cdaeSstevel 	uchar_t		els_code;
313*3d19cdaeSstevel 	uchar_t		delayed_retry;
314*3d19cdaeSstevel 	ddi_dma_handle_t	cmd_dma_handle;
315*3d19cdaeSstevel 	ddi_dma_handle_t	rsp_dma_handle;
316*3d19cdaeSstevel 	ddi_acc_handle_t	cmd_acc_handle;
317*3d19cdaeSstevel 	ddi_acc_handle_t	rsp_acc_handle;
318*3d19cdaeSstevel 	uint_t		dest_nport_id;
319*3d19cdaeSstevel 	struct	sf_els_hdr	*next;
320*3d19cdaeSstevel 	struct	sf_els_hdr	*prev;
321*3d19cdaeSstevel 	uint_t		size;
322*3d19cdaeSstevel 	uint_t		timeout;
323*3d19cdaeSstevel 	uint_t		retries;
324*3d19cdaeSstevel 	struct fcal_packet	*fpkt;
325*3d19cdaeSstevel 	uint_t		lip_cnt;
326*3d19cdaeSstevel 	uchar_t		port_wwn[FC_WWN_SIZE];
327*3d19cdaeSstevel 	uchar_t		node_wwn[FC_WWN_SIZE];
328*3d19cdaeSstevel 	struct sf_target *target;
329*3d19cdaeSstevel 	ddi_dma_handle_t	data_dma_handle;
330*3d19cdaeSstevel 	ddi_acc_handle_t	data_acc_handle;
331*3d19cdaeSstevel 	caddr_t			data_buf;
332*3d19cdaeSstevel };
333*3d19cdaeSstevel 
334*3d19cdaeSstevel union sf_els_cmd {
335*3d19cdaeSstevel 	struct la_els_logi logi;
336*3d19cdaeSstevel 	struct la_els_logo logo;
337*3d19cdaeSstevel 	struct la_els_prli prli;
338*3d19cdaeSstevel 	struct la_els_adisc adisc;
339*3d19cdaeSstevel 	struct fcp_cmd cmd;
340*3d19cdaeSstevel };
341*3d19cdaeSstevel 
342*3d19cdaeSstevel union sf_els_rsp {
343*3d19cdaeSstevel 	struct la_els_logi logi;
344*3d19cdaeSstevel 	struct la_els_logo logo;
345*3d19cdaeSstevel 	struct la_els_prli prli;
346*3d19cdaeSstevel 	struct la_els_adisc adisc;
347*3d19cdaeSstevel 	uchar_t rsp[FCP_MAX_RSP_IU_SIZE];
348*3d19cdaeSstevel };
349*3d19cdaeSstevel 
350*3d19cdaeSstevel struct sf_hp_elem {
351*3d19cdaeSstevel 	struct sf_hp_elem *next;
352*3d19cdaeSstevel 	dev_info_t	*dip;
353*3d19cdaeSstevel 	int		what;
354*3d19cdaeSstevel 	struct sf_target *target;
355*3d19cdaeSstevel 	struct sf	*sf;
356*3d19cdaeSstevel };
357*3d19cdaeSstevel #define	SF_ONLINE	0
358*3d19cdaeSstevel #define	SF_OFFLINE	1
359*3d19cdaeSstevel 
360*3d19cdaeSstevel 
361*3d19cdaeSstevel #define	ADDR2SF(ap)	(struct sf *)((ap)->a_hba_tran->tran_hba_private)
362*3d19cdaeSstevel #define	ADDR2TARGET(ap)	(struct sf_target *)((ap)->a_hba_tran->\
363*3d19cdaeSstevel     tran_tgt_private)
364*3d19cdaeSstevel #define	SF_ONLINE_TIMEOUT	180
365*3d19cdaeSstevel #define	SF_OFFLINE_TIMEOUT	45
366*3d19cdaeSstevel #define	SF_RESET_TIMEOUT	10
367*3d19cdaeSstevel #define	SF_ELS_TIMEOUT		5
368*3d19cdaeSstevel #define	SF_INVALID_TIMEOUT	0x7fffffff
369*3d19cdaeSstevel #define	SF_FCP_TIMEOUT		30
370*3d19cdaeSstevel #define	SF_BSY_TIMEOUT		10
371*3d19cdaeSstevel #define	SF_ABORT_TIMEOUT	10000000	/* in usec */
372*3d19cdaeSstevel #define	SF_POLL_TIMEOUT	60
373*3d19cdaeSstevel #define	SF_TARGET_RESET_DELAY	250000		/* in usec */
374*3d19cdaeSstevel 
375*3d19cdaeSstevel #define	SF_DECR_DELTA		5
376*3d19cdaeSstevel #define	SF_INCR_DELTA		5
377*3d19cdaeSstevel 
378*3d19cdaeSstevel #define	SF_LO_CMD_DELTA	512
379*3d19cdaeSstevel #define	SF_HI_CMD_DELTA	256
380*3d19cdaeSstevel 
381*3d19cdaeSstevel #define	SF_ELS_RETRIES		4
382*3d19cdaeSstevel #define	SF_BSY_RETRIES		7
383*3d19cdaeSstevel 
384*3d19cdaeSstevel #define	SF_INIT_WAIT_TIMEOUT	60000000
385*3d19cdaeSstevel #define		SF_CORE_CMD_TIMEOUT		0x01
386*3d19cdaeSstevel #define		SF_CORE_BAD_ABORT		0x02
387*3d19cdaeSstevel #define		SF_CORE_ABORT_TIMEOUT		0x04
388*3d19cdaeSstevel #define		SF_CORE_ELS_TIMEOUT		0x08
389*3d19cdaeSstevel #define		SF_CORE_ELS_FAILED		0x10
390*3d19cdaeSstevel #define		SF_CORE_LILP_FAILED		0x20
391*3d19cdaeSstevel #define		SF_CORE_OFFLINE_TIMEOUT		0x40
392*3d19cdaeSstevel #define		SF_CORE_LIP_FAILED		0x80
393*3d19cdaeSstevel #define		SF_CORE_OFFLINE_TARGET		0x100
394*3d19cdaeSstevel #define		SF_CORE_INCOMPLETE_DMA		0x200
395*3d19cdaeSstevel #define		SF_CORE_REPORTLUN_TIMEOUT	0x400
396*3d19cdaeSstevel #define		SF_CORE_INQUIRY_TIMEOUT		0x800
397*3d19cdaeSstevel #define		SF_CORE_BAD_DMA			0x1000
398*3d19cdaeSstevel 
399*3d19cdaeSstevel #define		SF_BAD_DMA_MAGIC	0xdeafbead
400*3d19cdaeSstevel 
401*3d19cdaeSstevel #define	TRUE		1
402*3d19cdaeSstevel #define	FALSE		0
403*3d19cdaeSstevel #define	UNDEFINED	-1
404*3d19cdaeSstevel 
405*3d19cdaeSstevel 
406*3d19cdaeSstevel /*
407*3d19cdaeSstevel  * The initiator must allocate a minimum of 16 bytes for the response
408*3d19cdaeSstevel  * to the REPORT_LUNS command.  Since there is 8 bytes of overhead and
409*3d19cdaeSstevel  * each LUN is 4 bytes, this means that the minimum size is 2 LUNs.  We
410*3d19cdaeSstevel  * will define the structure that way to prevent any spurious check
411*3d19cdaeSstevel  * conditions.
412*3d19cdaeSstevel  *
413*3d19cdaeSstevel  * There is no maximum size for the response.
414*3d19cdaeSstevel  *
415*3d19cdaeSstevel  * By default we support 256 LUNs for the moment, which means 256*8+16
416*3d19cdaeSstevel  * or 2064 bytes total size.
417*3d19cdaeSstevel  */
418*3d19cdaeSstevel 
419*3d19cdaeSstevel #define	REPORT_LUNS_MIN_LUNS	2
420*3d19cdaeSstevel #define	REPORT_LUNS_DEFAULT	256
421*3d19cdaeSstevel #define	REPORT_LUNS_SIZE	((REPORT_LUNS_DEFAULT)*sizeof (uint32_t) \
422*3d19cdaeSstevel 				+2*sizeof (uint32_t))
423*3d19cdaeSstevel 
424*3d19cdaeSstevel /*
425*3d19cdaeSstevel  * SCSI Report_Luns Data
426*3d19cdaeSstevel  *
427*3d19cdaeSstevel  * Format of data returned as a result of an REPORT_LUNS command.
428*3d19cdaeSstevel  *
429*3d19cdaeSstevel  */
430*3d19cdaeSstevel 
431*3d19cdaeSstevel struct scsi_report_luns {
432*3d19cdaeSstevel 	/* Number of bytes of data the target has available to send. */
433*3d19cdaeSstevel 	uint32_t	lun_list_len;
434*3d19cdaeSstevel 	uint32_t	reserved;
435*3d19cdaeSstevel 	uint64_t	lun[REPORT_LUNS_MIN_LUNS];
436*3d19cdaeSstevel };
437*3d19cdaeSstevel 
438*3d19cdaeSstevel #endif	/* _KERNEL */
439*3d19cdaeSstevel 
440*3d19cdaeSstevel #ifdef	__cplusplus
441*3d19cdaeSstevel }
442*3d19cdaeSstevel #endif
443*3d19cdaeSstevel 
444*3d19cdaeSstevel #endif	/* _SYS_SCSI_ADAPTERS_SFVAR_H */
445