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 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_FCPVAR_H
27 #define	_FCPVAR_H
28 
29 
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/types.h>
36 
37 /*
38  * Maximum number of times FCP will re-issue a REPORTS_LUNS command if the
39  * device couldn't return all of them in the submitted buffer.
40  */
41 #define	FCP_MAX_REPORTLUNS_ATTEMPTS	2
42 /*
43  * Maximum number of LUNs supported.  This limit is enforced to accommodate
44  * certain HBAs.
45  */
46 #define	FCP_MAX_LUNS_SUPPORTED		65535
47 
48 /*
49  * Stuff to be defined in fc_ulpif.h FIXIT
50  */
51 #define	PORT_DEVICE_CREATE	0x40
52 #define	SCMD_REPORT_LUN		0xa0	/* SCSI cmd to report on LUNs */
53 #define	SCMD_INQUIRY_LWWN_SIZE	32	/* Max WWN size */
54 #define	SCMD_INQUIRY_PAGE83	0xF0	/* Internal opcode for page 0x83 */
55 #define	FC4_SCSI_FCP		0x08	/* our (SCSI) FC4 type number */
56 
57 #define	FCP_QUEUE_DELAY	(4)
58 #define	FCP_FAILED_DELAY	20
59 #define	FCP_RESET_DELAY		3	/* target reset delay of 3 secs */
60 #define	FCP_OFFLINE_DELAY	20	/* 20 seconds is 2*RA_TOV_els */
61 
62 /*
63  * Highest possible timeout value to indicate
64  * the watch thread to return the I/O
65  */
66 #define	FCP_INVALID_TIMEOUT	(0xFFFFFFFF)
67 
68 /*
69  * The max inquiry page 83 size as expected in the code today
70  * is 0xf0 bytes. Defining a constant to make it easy incase
71  * this needs to be changed at a later time.
72  */
73 #define	SCMD_MAX_INQUIRY_PAGE83_SIZE	0xF0
74 /*
75  * Events generated for Target drivers; "SUNW,sf:" prefix
76  * is a legacy fcal stuff hardcoded into ssd via the use of
77  * FCAL_INSERT_EVENT defined in an fcal header file; We
78  * just need to continue to use this.
79  */
80 #define	FCAL_INSERT_EVENT	"SUNW,sf:DEVICE-INSERTION.1"
81 #define	FCAL_REMOVE_EVENT	"SUNW,sf:DEVICE-REMOVAL.1"
82 
83 /*
84  * for debug trace
85  */
86 #define	FCP_STACK_DEPTH	14
87 
88 
89 /*
90  * All the stuff above needs to move intp appropriate header files.
91  */
92 
93 #define	FCP_NUM_HASH			128
94 
95 #define	FCP_HASH(x)			((x[0] + x[1] + x[2] + x[3] +\
96 					x[4] + x[5] + x[6] + x[7]) & \
97 					(FCP_NUM_HASH-1))
98 
99 #define	FCP_STATEC_MASK			(FC_STATE_OFFLINE | FC_STATE_ONLINE |\
100 					FC_STATE_LOOP | FC_STATE_NAMESERVICE |\
101 					FC_STATE_RESET |\
102 					FC_STATE_RESET_REQUESTED |\
103 					FC_STATE_LIP | FC_STATE_DEVICE_CHANGE)
104 
105 #define	PKT_PRIV_SIZE			2
106 
107 #ifdef	KSTATS_CODE
108 /*
109  * fcp_stats : Statistics provided for fcp.
110  */
111 struct fcp_stats {
112 	uint_t	version;		/* version of this struct */
113 	uint_t	lip_count;		/* lips forced by fcp */
114 	uint_t	link_reset_count;	/* lip failures, ie, no ONLINE */
115 					/* response after forcing lip */
116 	uint_t	ncmds;			/* outstanding commands */
117 	uint_t	throttle_limit;		/* current throttle limit */
118 	char	drvr_name[MAXNAMELEN];	/* Name of driver, NULL term. */
119 };
120 #endif
121 
122 /*
123  * Structure fcp_port
124  * --------------------
125  *
126  * This structure is the FCP representation of an N_Port on a local FC HBA card.
127  * This is the master structure off of which all the others will be hanging at
128  * some point and is the Solaris per-instance soft-state structure.
129  */
130 struct fcp_port {
131 	/*
132 	 * This mutex protects the access to this structure (or most of its
133 	 * fields).
134 	 */
135 	kmutex_t		port_mutex;
136 	/*
137 	 * This is the link to the next fcp_port structure in the global
138 	 * list.  The head of the global list is fcp_port_head and is
139 	 * defined in fcp.c.  This field is NULL for the last element of
140 	 * the global list.
141 	 */
142 	struct fcp_port		*port_next;
143 	/*
144 	 * This field points to the head of a list of internal requests that
145 	 * will be retried later.  Examples of internal requests are:
146 	 * 'Send a PRLI ELS', 'Send a PRLO ELS', 'Send a PLOGI ELS' or
147 	 * 'Send an Inquiry command'.  If the submission of the request to the
148 	 * fp/fctl module failed (for a set of specific reasons) and the
149 	 * request can be resubmitted later, it is queued here.	 The watchdog
150 	 * timer (fcp_watch()) will walk this queue and resubmit the requests.
151 	 */
152 	struct fcp_ipkt		*port_ipkt_list;
153 	/*
154 	 * This seems to be used as a temporary device counter during a
155 	 * discovery process (or reconfiguration as some comments put it).
156 	 * It seems to be initialized in fcp_statec_callback() with the
157 	 * number of devices that fp/fctl saw after the line came up and
158 	 * is supposed to reached zero when the reconfiguration process is
159 	 * over.
160 	 */
161 	int			port_tmp_cnt;
162 	/*
163 	 * This is supposed to indicate the state of this port.	 It is a
164 	 * bitmap which means several bits can be set simultaneously.  The list
165 	 * of the different bits and their meaning is given further down in
166 	 * this file.
167 	 */
168 	uint32_t		port_state;
169 	/*
170 	 * This field is initialized at the very end of the function
171 	 * fcp_handle_port_attach() if the attachment of the port was
172 	 * successful.	It is set to the value stored in lbolt64 at the
173 	 * time of the attachment.  This value is only used in the function
174 	 * fcp_scsi_bus_config().  It is used to determine the value of the
175 	 * parameter timeout when ndi_busop_bus_config() and cv_wait() are
176 	 * called.  It actually serves to figure out how long the enumeration
177 	 * can be delayed (the max value being FCP_INIT_WAIT_TIMEOUT).
178 	 */
179 	int64_t			port_attach_time;
180 	/*
181 	 * This field contains the topology of the SAN the port is connected
182 	 * to.
183 	 */
184 	uint32_t		port_topology;
185 	/*
186 	 * This field contains the local port ID.  It is provided by fp/fctl
187 	 * when calling fcp_statec_callback() and fcp_port_attach().  This
188 	 * value is used to build Fibre Channel headers (like for PLOGI or
189 	 * PRLI).
190 	 */
191 	uint32_t		port_id;
192 	/*
193 	 * This field keeps track of the physical port state (fcp_port being
194 	 * more like the FCP software port state).  The information stored here
195 	 * is provided by fp/fctl except in two instances: in
196 	 * fcp_handle_port_attach() and fcp_handle_port_resume(). The values
197 	 * this field can take are defined in fctl.h.
198 	 */
199 	uint32_t		port_phys_state;
200 	/*
201 	 * This field points to the first element of a list of fcp_reset_elem
202 	 * structures.	Those structures are created when the target driver
203 	 * calls fcp_reset_target().  The target or the LUN specified by the
204 	 * target driver is reset by sending a Task Management command.	 After
205 	 * the response has been received, a fcp_reset_elem structure is
206 	 * queued here and will remain queued for FCP_RESET_DELAY.  While
207 	 * the fcp_reset_elem structure is in this queue the LUNs of
208 	 * the target to reset or the LUN to reset is set to LUN_BUSY state.
209 	 * In fcp_watch() the timeout is tested.  If the timout has expired,
210 	 * the fcp_reset_elem structure is unqueued and freed, and all the
211 	 * active commands for the target or LUNs are aborted.
212 	 */
213 	struct fcp_reset_elem	*port_reset_list;
214 	/*
215 	 * This points to the first element of a list of fcp_tgt_elem
216 	 * structures.	This list is a list of targets to offline.  The list
217 	 * is walked in fcp_watch(). After the target is offlined the
218 	 * structure fcp_tgt_elem is freed.
219 	 */
220 	struct fcp_tgt_elem	*port_offline_tgts;
221 	/*
222 	 * This points to the first element of a list of fcp_lun_elem
223 	 * structures.	This list is a list of LUNs to offline.	 The list
224 	 * is walked in fcp_watch(). After the lun is offlined the
225 	 * structure fcp_lun_elem is freed.
226 	 */
227 	struct fcp_lun_elem	*port_offline_luns;
228 	/*
229 	 * This field is a counter initialized to 1 when the port attaches.
230 	 * It is incremented when the line goes from online to offline and
231 	 * vice versa.	It is also incremented when the port detaches.	The
232 	 * value stored in this counter is used as a reference in time of the
233 	 * link state.	For example, when the line comes up internal requests
234 	 * are generated (fcp_ipkt) such as PRLI and INQUIRY.  Those requests
235 	 * are tagged with the value contained in this field at the time the
236 	 * request is built.  When the callback for the request is called, the
237 	 * current value of port_link_cnt is checked against the one set in
238 	 * the internal request structure.  If they don't match, it means the
239 	 * the request is not relevant anymore to the current line state and
240 	 * must be discarded (in between a request is issued and the callback
241 	 * routine is called the line may have bounced).  This is the way FCP
242 	 * identifies the requests that were hanging out when the state of the
243 	 * line changed.
244 	 */
245 	uint32_t		port_link_cnt;
246 	/*
247 	 * This field, as its name suggests, specifies a deadline for the
248 	 * overall discovery process.  It is initialized in three cases:
249 	 *
250 	 * 1) When the line goes from the offline state to the online state.
251 	 * 2) When the FP/FCTL called fcp_statec_callback() indicating that
252 	 *    a notification was received from the fabric indicating that a new
253 	 *    port showed up or that one disappeared.
254 	 * 3) In the fcp_create_on_demand() function (called because of an
255 	 *    ioctl).
256 	 *
257 	 * In all instances it is set to:
258 	 *
259 	 *	fcp_watchdog_time + FCP_ICMD_DEADLINE
260 	 *
261 	 * In all those instances a discovery process is started or extended
262 	 * (2).	 The value stored in port_deadline is only checked in one
263 	 * function: fcp_is_retryable().  That function checks if an
264 	 * internal command (fcp_ipkt) is retryable or not.  Usually
265 	 * there's a counter that limits the number of times a command is
266 	 * retried (Max value is FCP_MAX_RETRIES).  However, even if the
267 	 * counter hasn't exceeded that value, the command will not be retried
268 	 * past the deadline.  This means that the discovery process has to
269 	 * be finished before port_deadline.  In other words, an internal
270 	 * command retry capability is limited numerically and in time.
271 	 */
272 	int			port_deadline;
273 	/*
274 	 * This is the Node WWN of the local port.  It is initialized
275 	 * during the port attachment.
276 	 */
277 	la_wwn_t		port_nwwn;
278 	/*
279 	 * This is the Port WWN of the local port.  It is initialized during
280 	 * the port attachment.
281 	 */
282 	la_wwn_t		port_pwwn;
283 	/*
284 	 * This is the fp/fctl port handle.
285 	 */
286 	opaque_t		*port_fp_handle;
287 	/*
288 	 * The following 4 fields handle the queue of fcp_pkt outstanding for
289 	 * this port.
290 	 *
291 	 *   port_pkt_mutex	Protects the access to the queue
292 	 *   port_pkt_head	Points to the head of the queue
293 	 *   port_pkt_tail	Points to the tail of the queue
294 	 *   port_npkts	Number of commands outstanding (used only when
295 	 *			DEBUG is defined).
296 	 */
297 	kmutex_t		port_pkt_mutex;
298 	uint32_t		port_npkts;
299 	struct fcp_pkt		*port_pkt_head;
300 	struct fcp_pkt		*port_pkt_tail;
301 	/*
302 	 * This field is the counter of allocated and currently active
303 	 * fcp_ipkt.
304 	 */
305 	int			port_ipkt_cnt;
306 	/*
307 	 * Port instance provided by FP/FCTL.  It is actually deduced using
308 	 * ddi_get_instance() in fcp_port_attach().
309 	 */
310 	uint32_t		port_instance;
311 	/*
312 	 * Maximum number of exchanges the underlying physical FibreChannel
313 	 * port can handle.  This field is initialized during the port
314 	 * attachment but is never used.
315 	 */
316 	uint32_t		port_max_exch;
317 	/*
318 	 * This port stores the behavior expected of the underlying FCA driver
319 	 * when a port reset occurs.  The values stored here are defined in the
320 	 * file fc_types.h.
321 	 */
322 	fc_reset_action_t	port_reset_action;
323 	/*
324 	 * This port stores the DMA behavior of the underlying FCA driver.  It
325 	 * is checked only once in fcp_prepare_pkt() and, as the comment
326 	 * suggests, to work around an issue with an Intel PCI bridge.
327 	 */
328 	fc_dma_behavior_t	port_cmds_dma_flags;
329 	/*
330 	 * The value stored here indicates if the underlying FCA driver
331 	 * supports DMA transfers with non SCSI data (Ex: PRLI request).
332 	 */
333 	fc_fcp_dma_t		port_fcp_dma;
334 	/*
335 	 * This field contains the size of the private space required by the
336 	 * underlying FCA driver in a FibreChannel packet (fc_packet_t).
337 	 */
338 	uint32_t		port_priv_pkt_len;
339 	/*
340 	 * This field contains the port's modlink info.	 It is provided by
341 	 * FP/FCTL during the port attachment.
342 	 */
343 	struct modlinkage	port_fp_modlinkage;
344 	/*
345 	 * DMA attributes for data packets, commands and responses.
346 	 */
347 	ddi_dma_attr_t		port_data_dma_attr;
348 	ddi_dma_attr_t		port_cmd_dma_attr;
349 	ddi_dma_attr_t		port_resp_dma_attr;
350 	ddi_device_acc_attr_t	port_dma_acc_attr;
351 	/*
352 	 * Field containing the hba_tran structure registered with SCSA.
353 	 */
354 	struct scsi_hba_tran	*port_tran;
355 	/*
356 	 * Device info structure provided by fp/fctl when the port attaches and
357 	 * representing the local physical fibre channel port.
358 	 */
359 	dev_info_t		*port_dip;
360 	/*
361 	 * Head of the list of callback routines to call when a bus reset
362 	 * occurs.  This list is  populated by the targets drivers by calling
363 	 * fcp_scsi_reset_notify() (tran_reset_notify(9E)).
364 	 */
365 	struct scsi_reset_notify_entry	*port_reset_notify_listf;
366 	/*
367 	 * for framework event management
368 	 */
369 	ndi_event_definition_t	*port_ndi_event_defs;
370 	ndi_event_hdl_t		port_ndi_event_hdl;
371 	ndi_event_set_t		port_ndi_events;
372 	/*
373 	 * hash lists of targets attached to this port.	  The hashing is based
374 	 * on the WWN.
375 	 */
376 	struct fcp_tgt		*port_tgt_hash_table[FCP_NUM_HASH];
377 	/*
378 	 * per-Port control flag.  By default mpxio is enabled on ports unless
379 	 * explicitly disabled through driver.conf.
380 	 */
381 	int			port_mpxio;
382 	/*
383 	 * Value used as a flag to determine if the throttling has been
384 	 * set/initialized in the FCA driver.
385 	 */
386 	int			port_notify;
387 	/*
388 	 * This field contains a string initialized at attachment time and used
389 	 * when calling the function the function fc_trace_debug() (through
390 	 * the macro FCP_TRACE and FCP_DTRACE) to identify the port that
391 	 * logged the message.
392 	 */
393 	char			port_instbuf[24];
394 	uchar_t			port_boot_wwn[FC_WWN_SIZE];
395 
396 #ifdef	DEBUG
397 	/*
398 	 * Use once in fcp_finish_init() when calling getpcstack().
399 	 */
400 	int			port_finish_depth;
401 	pc_t			port_finish_stack[FCP_STACK_DEPTH];
402 #endif /* DEBUG */
403 	/*
404 	 * Condition variable used during the bus enumeration process.
405 	 */
406 	kcondvar_t		port_config_cv;
407 	/*
408 	 * Size (in bytes) required to hold the cookies of a scatter/gather
409 	 * list.
410 	 */
411 	int			port_dmacookie_sz;
412 };
413 
414 /*
415  * We need to save the target change count values in a map tag so as
416  * to uniquely identify the cause and handle it better as they change
417  * counts are bound to change upon receiving more state changes.
418  */
419 typedef int fcp_map_tag_t;
420 
421 /*
422  * fcp_state definitions.
423  */
424 #define	FCP_STATE_INIT			0x0001
425 #define	FCP_STATE_OFFLINE		0x0002
426 #define	FCP_STATE_ONLINE		0x0004
427 #define	FCP_STATE_SUSPENDED		0x0008
428 #define	FCP_STATE_POWER_DOWN		0x0010
429 #define	FCP_STATE_ONLINING		0x0020
430 #define	FCP_STATE_DETACHING		0x0040
431 #define	FCP_STATE_IN_WATCHDOG		0x0080
432 #define	FCP_STATE_IN_MDI		0x0100	/* Not in S8/S9 */
433 #define	FCP_STATE_NS_REG_FAILED		0x0200	/* Diff value from S8/S9 */
434 /*
435  * FCP_STATE_IN_CB_DEVC indicates that we're handling a state change
436  * notification that will be changing the state of devices.  This is an
437  * indication to fcp_scsi_start that the target's status might change.
438  */
439 #define	FCP_STATE_IN_CB_DEVC		0x0400
440 
441 #define	FCP_MAX_DEVICES			127
442 
443 /* To remember that dip was allocated for a lun on this target. */
444 
445 #define	FCP_DEVICE_CREATED		0x1
446 
447 #define	FCP_EVENT_TAG_INSERT		0
448 #define	FCP_EVENT_TAG_REMOVE		1
449 
450 /*
451  * fcp_pkt: FCP packet
452  * ---------------------
453  *
454  * This structure is the one initialized/created in the tran_init_pkt(9E).  It
455  * embeds the fc_packet structure eventually passed to fp/fctl as well as
456  * the scsi_pkt returned by tran_init_pkt(9E) to the target driver.  There is
457  * a 1-to-1 correlation between the scsi_pkt, the fcp_pkt and the
458  * fc_packet.
459  *
460  * This is what a fcp_pkt looks like after allocation:
461  *
462  *			+================================+
463  *		 +--->	|	 struct scsi_pkt	 |
464  *		 |	|				 |
465  *		 | +--- | pkt_ha_private		 |
466  *		 | |	|				 |
467  *		 | |	+================================+
468  *		 | |
469  *		 | |	+================================+
470  *		 | +--> |	 struct fcp_pkt		 | <---------+
471  *		 +----- | cmd_pkt			 |	     |
472  *			|		      cmd_fp_pkt | ---+	     |
473  *	     +--------->| cmd_fcp_rsp[]			 |    |	     |
474  *	     | +------->| cmd_fcp_cmd[]			 |    |	     |
475  *	     | |	|--------------------------------|    |	     |
476  *	     | |	|	 struct fc_packet	 | <--+	     |
477  *	     | |	|				 |	     |
478  *	     | |	|		 pkt_ulp_private | ----------+
479  *	     | |	|		 pkt_fca_private | -----+
480  *	     | |	|		 pkt_data_cookie | ---+ |
481  *	     | |	| pkt_cmdlen			 |    | |
482  *	     | |(a)	| pkt_rsplen			 |    | |
483  *	     | +--------| .......... pkt_cmd ........... | ---|-|-------+
484  *	     |	(a)	|		  pkt_cmd_cookie | ---|-|-----+ |
485  *	     +----------| .......... pkt_resp .......... | ---|-|---+ | |
486  *			|		 pkt_resp_cookie | ---|-|-+ | | |
487  *			| pkt_cmd_dma			 |    | | | | | |
488  *			| pkt_cmd_acc			 |    | | | | | |
489  *			+================================+    | | | | | |
490  *			|	  dma_cookies		 | <--+ | | | | |
491  *			|				 |	| | | | |
492  *			+================================+	| | | | |
493  *			|	  fca_private		 | <----+ | | | |
494  *			|				 |	  | | | |
495  *			+================================+	  | | | |
496  *								  | | | |
497  *								  | | | |
498  *			+================================+   (b)  | | | |
499  *			|	 fcp_resp cookies	 | <------+ | | |
500  *			|				 |	    | | |
501  *			+================================+	    | | |
502  *								    | | |
503  *			+================================+   (b)    | | |
504  *			|	     fcp_resp		 | <--------+ | |
505  *			|   (DMA resources associated)	 |	      | |
506  *			+================================+	      | |
507  *								      | |
508  *								      | |
509  *								      | |
510  *			+================================+   (b)      | |
511  *			|	  fcp_cmd cookies	 | <----------+ |
512  *			|				 |		|
513  *			+================================+		|
514  *									|
515  *			+================================+   (b)	|
516  *			|	     fcp_cmd		 | <------------+
517  *			|   (DMA resources associated)	 |
518  *			+================================+
519  *
520  *
521  * (a)	The underlying FCA does NOT support DMA for this field
522  * (b)	The underlying FCA supports DMA for this field
523  */
524 struct fcp_pkt {
525 	/*
526 	 * The two following fields are used to queue fcp_pkt in the double
527 	 * link list of the lun structure.  The packet is queued in
528 	 * tran_init_pkt(9E) and unqueued in tran_destroy_pkt(9E).
529 	 */
530 	struct fcp_pkt		*cmd_forw;
531 	struct fcp_pkt		*cmd_back;
532 	/*
533 	 * This field is used to queue the packet in the single link list of the
534 	 * port structure.  The port keeps a list of all the commands issued
535 	 * through it and scans it, for example, when all of those commands
536 	 * have to be aborted.
537 	 */
538 	struct fcp_pkt		*cmd_next;
539 	/*
540 	 * This field points back to the scsi_pkt.
541 	 */
542 	struct scsi_pkt		*cmd_pkt;
543 	/*
544 	 * This field points to the field cmd_fc_packet defined further in this
545 	 * same structure.
546 	 */
547 	struct fc_packet	*cmd_fp_pkt;
548 	/*
549 	 * Structure where the FCP_CMD information unit is going to be built.
550 	 */
551 	fcp_cmd_t		cmd_fcp_cmd;
552 	/*
553 	 * State of the packet.	 The values for the state seem to indicate
554 	 * that it isn't a bitmap.  However, in several instances the code
555 	 * treats it as a bitmap doing a "&= ~FCP_PKT_ISSUED" to it
556 	 * eventhough the value stored is always checked using "!=" and "==".
557 	 */
558 	uint_t			cmd_state;
559 	/*
560 	 * This field is a bitmap indicating if
561 	 * the cmd is queued
562 	 */
563 	uint_t			cmd_flags;
564 	/* Contains the number of bytes DMA mappped. */
565 	uint_t			cmd_dmacount;
566 	/*
567 	 * Contains the timeout value for the packet.  This is not a delay or
568 	 * a delta but an absolute value.
569 	 */
570 	uint_t			cmd_timeout;
571 	/*
572 	 * This array is used to store the FCP_RSP information unit returned by
573 	 * the device when the underlying FCA cannot DMA it in.
574 	 */
575 	char			cmd_fcp_rsp[FCP_MAX_RSP_IU_SIZE];
576 	/*
577 	 * This is the fc_packet structure used to forward the request to
578 	 * fp/fctl.
579 	 */
580 	struct fc_packet	cmd_fc_packet;
581 };
582 
583 /*
584  * fcp_ipkt : Packet for internal commands.
585  * ------------------------------------------
586  *
587  *			+================================+
588  *			|	 struct fcp_ipkt	 | <---------+
589  *			|	 (kmem_zalloc())	 |	     |
590  *			|		       ipkt_fpkt | ---+	     |
591  *			|				 |    |	     |
592  *			|     ipkt_cmdlen = cmd_len	 |    |	     |
593  *			|				 |    |	     |
594  *			|				 |    |	     |
595  *			|				 |    |	     |
596  *			|--------------------------------|    |	     |
597  *			|	 struct fc_packet	 | <--+	     |
598  *			|				 |	     |
599  *			|		 pkt_ulp_private | ----------+
600  *			|		 pkt_fca_private | -----+
601  *			|		 pkt_data_cookie | ---+ |
602  *			|	    pkt_cmdlen		 |    | |
603  *			|	    pkt_rsplen		 |    | |
604  *			| pkt_cmd ...................... | ---|-|-------+
605  *			|		  pkt_cmd_cookie | ---|-|-----+ |
606  *			| pkt_resp ..................... | ---|-|---+ | |
607  *			|		 pkt_resp_cookie | ---|-|-+ | | |
608  *			|	   pkt_cmd_dma		 |    | | | | | |
609  *			|	   pkt_cmd_acc		 |    | | | | | |
610  *			+================================+    | | | | | |
611  *			|	  dma_cookies		 | <--+ | | | | |
612  *			|				 |	| | | | |
613  *			|				 |	| | | | |
614  *			|				 |	| | | | |
615  *			+================================+	| | | | |
616  *			|	  fca_private		 | <----+ | | | |
617  *			|				 |	  | | | |
618  *			|				 |	  | | | |
619  *			|				 |	  | | | |
620  *			+================================+	  | | | |
621  *								  | | | |
622  *								  | | | |
623  *			+================================+   (b)  | | | |
624  *			|	 fcp_resp cookies	 | <------+ | | |
625  *			|				 |	    | | |
626  *			+================================+	    | | |
627  *								    | | |
628  *			+================================+   (b)    | | |
629  *			|	     fcp_resp		 | <--------+ | |
630  *			|   (DMA resources associated)	 |	      | |
631  *			+================================+	      | |
632  *								      | |
633  *								      | |
634  *								      | |
635  *			+================================+   (b)      | |
636  *			|	  fcp_cmd cookies	 | <----------+ |
637  *			|				 |		|
638  *			+================================+		|
639  *									|
640  *			+================================+   (b)	|
641  *			|	     fcp_cmd		 | <------------+
642  *			|   (DMA resources associated)	 |
643  *			+================================+
644  *
645  * (a)	The underlying FCA does NOT support DMA for this field
646  * (b)	The underlying FCA supports DMA for this field
647  */
648 struct fcp_ipkt {
649 	/*
650 	 * Pointer to the port (fcp_port) in behalf of which this internal
651 	 * packet was allocated.
652 	 */
653 	struct fcp_port		*ipkt_port;
654 	/*
655 	 * Pointer to the target (fcp_tgt) in behalf of which this internal
656 	 * packet was allocated.
657 	 */
658 	struct fcp_tgt		*ipkt_tgt;
659 	/*
660 	 * Pointer to the lun (fcp_lun) in behalf of which this internal
661 	 * packet was allocated.  This field is only meaningful when the
662 	 * internal packet has been allocated for a "scsi passthru" command or
663 	 * for an internal SCSI command such as REPORT LUNs and INQUIRY.
664 	 */
665 	struct fcp_lun		*ipkt_lun;
666 	/*
667 	 * Fields used to queue the internal packet into the double linked list
668 	 * of the FCP port (fcp_port).
669 	 */
670 	struct fcp_ipkt		*ipkt_next;
671 	struct fcp_ipkt		*ipkt_prev;
672 	/*
673 	 * This field points to the field ipkt_fc_packet defined farther in
674 	 * this same structure.
675 	 */
676 	struct fc_packet	*ipkt_fpkt;
677 	/*
678 	 * This is the timeout value for the internal packet.  It seems to
679 	 * increase with the number of retries.	 It is initialized like this
680 	 * in the code:
681 	 *
682 	 *   icmd->ipkt_restart = fcp_watchdog_time + icmd->ipkt_retries++
683 	 *
684 	 * First time ipkt_retries is zero.  As it increases, the timeout
685 	 * value for the internal packet also increases.
686 	 */
687 	uint32_t		ipkt_restart;
688 	/*
689 	 * Link state counter when the internal packet was built.
690 	 */
691 	uint32_t		ipkt_link_cnt;
692 	int			ipkt_cause;
693 	uint32_t		ipkt_cmdlen;
694 	uint32_t		ipkt_resplen;
695 	uint32_t		ipkt_datalen;
696 	/*
697 	 * Counter of the times an internal packet has been retried.  Its
698 	 * value is checked against FCP_MAX_RETRIES.
699 	 */
700 	uint32_t		ipkt_retries;
701 	uint32_t		ipkt_change_cnt;
702 	int			ipkt_nodma;
703 	/*
704 	 * Semaphore used to wait for completion on.
705 	 */
706 	ksema_t			ipkt_sema;
707 	/*
708 	 * Opcode indicating what internal command the packet contains (PLOGI,
709 	 * PRLI, INQUIRY...).
710 	 */
711 	uchar_t			ipkt_opcode;
712 	/*
713 	 * FC packet.
714 	 */
715 	struct fc_packet	ipkt_fc_packet;
716 };
717 
718 /*
719  * cmd_state definitions
720  */
721 #define	FCP_PKT_IDLE			0x1
722 #define	FCP_PKT_ISSUED			0x2
723 #define	FCP_PKT_ABORTING		0x3
724 
725 /*
726  * These are the defined cmd_flags for this structure.
727  */
728 #define	CFLAG_IN_QUEUE		0x2000	/* command in fcp queue */
729 
730 /*
731  * Target structure
732  * ----------------
733  *
734  * This structure holds the information relative to a SCSI target.  This
735  * structure doesn't represent the object registered with the OS (NDI or
736  * MPxIO...).
737  */
738 struct fcp_tgt {
739 	/*
740 	 * This field is used to queue the target structure in one of the
741 	 * buckets of the fcp_port target hash table port_tgt_hash_table[].
742 	 */
743 	struct fcp_tgt		*tgt_next;
744 	/* Points to the fcp_port the target belongs to. */
745 	struct fcp_port		*tgt_port;
746 	/*
747 	 * This field is a bitmap indicating the state of the target.  Several
748 	 * bits can be set simultaneously.
749 	 */
750 	uint32_t		tgt_state;
751 	/*
752 	 * State controlling if the LUNs attached to this target will be
753 	 * automatically onlined or not.
754 	 */
755 	uint32_t		tgt_node_state;
756 	/*
757 	 * Mutex protecting this structure.
758 	 */
759 	kmutex_t		tgt_mutex;
760 	/*
761 	 * List of LUNs (single link list).
762 	 */
763 	struct fcp_lun		*tgt_lun;
764 	opaque_t		tgt_fca_dev;
765 	/*
766 	 * Number of LUNs in this target.
767 	 */
768 	uint_t			tgt_lun_cnt;
769 	/*
770 	 * Counter of LUNs to probe.  It is used during the discovery
771 	 * process.  Starts with the number of LUNs returned by REPORT_LUN
772 	 * and is decremented until it reaches zero.
773 	 */
774 	uint_t			tgt_tmp_cnt;
775 	/*
776 	 * fp/fctl handle for the "port_device".
777 	 */
778 	opaque_t		tgt_pd_handle;
779 	/*
780 	 * Node World Wide Name.
781 	 */
782 	la_wwn_t		tgt_node_wwn;
783 	/*
784 	 * Port World Wide Name.
785 	 */
786 	la_wwn_t		tgt_port_wwn;
787 	/*
788 	 * Fibre Channel Port ID.
789 	 */
790 	uint32_t		tgt_d_id;
791 	/*
792 	 * Fibre Channel Port ID.  Uses bit fields to represent it.
793 	 */
794 	uint32_t		tgt_hard_addr;
795 	/*
796 	 * Becomes 1 when the LUNs are created.
797 	 */
798 	uchar_t			tgt_device_created;
799 	/*
800 	 * Counter of how many REPORT_LUN commands were sent.  It is used to
801 	 * allow the REPORT_LUN command to be sent twice in case the buffer
802 	 * allocated the first time wasn't big enough.
803 	 */
804 	uchar_t			tgt_report_lun_cnt;
805 	/*
806 	 * This field is incremented each time the field tgt_state is updated.
807 	 * Its use is similar to the use of the field port_link_cnt in the
808 	 * fcp_port structure.	The internal packets are, for example, tagged
809 	 * with the value stored here.
810 	 */
811 	uint32_t		tgt_change_cnt;
812 	/*
813 	 * This field contains the cause of the last change in state.
814 	 */
815 	int			tgt_statec_cause;
816 	/*
817 	 * The following two fields indicate whether the remote port is an
818 	 * FCP initiator or an FCP target.  They are treated as booleans.
819 	 */
820 	uchar_t			tgt_icap;	/* Initiator */
821 	uchar_t			tgt_tcap;	/* Target */
822 #ifdef	DEBUG
823 	/*
824 	 * Updated in fcp_call_finish_init_held() when DEBUG  is defined
825 	 */
826 	int			tgt_tmp_cnt_depth;
827 	pc_t			tgt_tmp_cnt_stack[FCP_STACK_DEPTH];
828 #endif /* DEBUG */
829 	/*
830 	 * This field holds the timer id of the timer started when a LUN
831 	 * reconfiguration is needed for the target.  The reconfiguration
832 	 * is done in the timeout function.
833 	 */
834 	timeout_id_t		tgt_tid;
835 	int			tgt_done;
836 	/*
837 	 * Bitmap used to trace the discovery process.
838 	 */
839 	uint32_t		tgt_trace;
840 	/*
841 	 * This field is used when the code is sorting out which devices
842 	 * were known which ones are new and which ones went away.
843 	 */
844 	uint32_t		tgt_aux_state;
845 	/*
846 	 * Number of internal packets allocated in behalf of the target.
847 	 */
848 	int			tgt_ipkt_cnt;
849 	/*
850 	 * used to detect user unconfig when auto configuration is enabled.
851 	 */
852 	uint32_t		tgt_manual_config_only;
853 };
854 
855 /*
856  * Target States
857  */
858 #define	FCP_TGT_INIT		0x01
859 #define	FCP_TGT_BUSY		0x02
860 #define	FCP_TGT_MARK		0x04
861 #define	FCP_TGT_OFFLINE		0x08
862 #define	FCP_TGT_ORPHAN		0x80
863 #define	FCP_TGT_ILLREQ		0x10
864 
865 /*
866  * Target Aux Stat
867  */
868 #define	FCP_TGT_TAGGED		0x01
869 
870 /*
871  * Target discovery tracing
872  */
873 #define	FCP_TGT_TRACE_1		0x00000001
874 #define	FCP_TGT_TRACE_2		0x00000002
875 #define	FCP_TGT_TRACE_3		0x00000004
876 #define	FCP_TGT_TRACE_4		0x00000008
877 #define	FCP_TGT_TRACE_5		0x00000010
878 #define	FCP_TGT_TRACE_6		0x00000020
879 #define	FCP_TGT_TRACE_7		0x00000040
880 #define	FCP_TGT_TRACE_8		0x00000080
881 #define	FCP_TGT_TRACE_9		0x00000100
882 #define	FCP_TGT_TRACE_10	0x00000200
883 #define	FCP_TGT_TRACE_11	0x00000400
884 #define	FCP_TGT_TRACE_12	0x00000800
885 #define	FCP_TGT_TRACE_13	0x00001000
886 #define	FCP_TGT_TRACE_14	0x00002000
887 #define	FCP_TGT_TRACE_15	0x00004000
888 #define	FCP_TGT_TRACE_16	0x00008000
889 #define	FCP_TGT_TRACE_17	0x00010000
890 #define	FCP_TGT_TRACE_18	0x00020000
891 #define	FCP_TGT_TRACE_19	0x00040000
892 #define	FCP_TGT_TRACE_20	0x00080000
893 #define	FCP_TGT_TRACE_21	0x00100000
894 #define	FCP_TGT_TRACE_22	0x00200000
895 #define	FCP_TGT_TRACE_23	0x00400000
896 #define	FCP_TGT_TRACE_24	0x00800000
897 #define	FCP_TGT_TRACE_25	0x01000000
898 #define	FCP_TGT_TRACE_26	0x02000000
899 #define	FCP_TGT_TRACE_27	0x04000000
900 #define	FCP_TGT_TRACE_28	0x08000000
901 #define	FCP_TGT_TRACE_29	0x10000000
902 
903 #ifndef	__lock_lint
904 
905 #define	FCP_TGT_TRACE(ptgt, tcount, bit) {\
906 	if (ptgt) {\
907 		if (ptgt->tgt_change_cnt == tcount) {\
908 			ptgt->tgt_trace |= bit;\
909 		}\
910 	}\
911 }
912 
913 #else	/* __lock_lint */
914 
915 #define	FCP_TGT_TRACE(ptgt, tcount, bit)
916 
917 #endif /* __lock_lint */
918 
919 
920 /*
921  * state change cause
922  */
923 #define	FCP_CAUSE_TGT_CHANGE	0x01
924 #define	FCP_CAUSE_LINK_CHANGE	0x02
925 #define	FCP_CAUSE_LINK_DOWN	0x04
926 #define	FCP_CAUSE_USER_CREATE	0x08
927 
928 
929 /*
930  * Target node states (applicable to LUNs behind the target)
931  */
932 #define	FCP_TGT_NODE_NONE	0x00	/* No node exists */
933 #define	FCP_TGT_NODE_ON_DEMAND	0x01	/* create only upon request */
934 #define	FCP_TGT_NODE_PRESENT	0x02	/* Node exists; rediscover it */
935 
936 
937 #define	FCP_NO_CHANGE		0x1
938 #define	FCP_LINK_CHANGE		0x2
939 #define	FCP_DEV_CHANGE		0x3
940 
941 
942 /* hotplug event struct */
943 struct fcp_hp_event {
944 	int (*callback)();
945 	void *arg;
946 };
947 
948 /*
949  * We talk to both NDI and MDI framework to enumerate our child devices.
950  * We internally define a generic child handle and assign either dev_info
951  * or mdi_pathinfo handle depending on the device.
952  */
953 typedef void		*child_info_t;
954 
955 #define	CIP(child)	((child_info_t *)(child))
956 #define	DIP(child)	((dev_info_t *)(child))
957 #define	PIP(child)	((mdi_pathinfo_t *)(child))
958 
959 /*
960  * LUN structure
961  * -------------
962  *
963  * This structure holds the information relative to a SCSI LUN.	 This
964  * structure is the one representing the object registered with the OS (NDI
965  * or MPxIO...).
966  */
967 struct fcp_lun {
968 	/*
969 	 * Mutex protecting the access to this structure.
970 	 */
971 	kmutex_t		lun_mutex;
972 	/*
973 	 * Logical unit number.	 It is a SCSI3 format.
974 	 */
975 	fcp_ent_addr_t		lun_addr;
976 	/*
977 	 * The two following fields are respectively the head and tail of a
978 	 * double link list of fcp_packets.  It is populated in
979 	 * tran_init_pkt(9E) (fcp_scsi_init_pkt) and emptied in
980 	 * tran_destroy_pkt(9E) (fcp_scsi_destroy_pkt).
981 	 */
982 	struct fcp_pkt		*lun_pkt_head;
983 	struct fcp_pkt		*lun_pkt_tail;
984 	/*
985 	 * This field is treated like a union.	It may contain the dev_info_t
986 	 * or the mdi_pathinfo_t depending on how the device associated with
987 	 * this LUN was registered.
988 	 */
989 	child_info_t		*lun_cip;
990 	/*
991 	 * Online/Offline event count.
992 	 */
993 	int			lun_event_count;
994 	/*
995 	 * Back pointer to the target the LUN belongs to.
996 	 */
997 	struct fcp_tgt		*lun_tgt;
998 	/*
999 	 * Bit map reflecting the state of the LUN.
1000 	 */
1001 	uint_t			lun_state;
1002 	/*
1003 	 * LUN type (disk, tape...).  The value stored here is taken from the
1004 	 * inquiry data.
1005 	 */
1006 	uchar_t			lun_type;
1007 	/*
1008 	 * This field is incremented each time fcp_scsi_tgt_init()
1009 	 * (tran_tgt_init(9E)) is called and decremented each time
1010 	 * fcp_scsi_tgt_free() (tran_tgt_free(9E)) is called.  The
1011 	 * incrementation and decrementation will also have an effect on
1012 	 * lun_state bit FCP_SCSI_LUN_TGT_INIT.
1013 	 */
1014 	uchar_t			lun_tgt_count;
1015 	/*
1016 	 * LUN number as it is returned by REPORT_LUNS.
1017 	 */
1018 	uint16_t		lun_num;
1019 	/*
1020 	 * Pointer to the next LUN.
1021 	 */
1022 	struct fcp_lun		*lun_next;
1023 	/*
1024 	 * SCSI Host Bus Adapter (HBA) driver transport vector structure.
1025 	 */
1026 	struct scsi_hba_tran	*lun_tran;
1027 	/*
1028 	 * per-Lun control flag.  A value of '1' means the LUN is managed by
1029 	 * mpxio.  A value of '0' means the LUN has been physically enumerated
1030 	 * as a child of corresponding port driver node.
1031 	 */
1032 	int			lun_mpxio;
1033 	/*
1034 	 * Length of the GUID.
1035 	 */
1036 	size_t			lun_guid_size;
1037 	/*
1038 	 * Pointer to a buffer that contains the GUID.
1039 	 */
1040 	char			*lun_guid;
1041 	/*
1042 	 * Pointer to a buffer that contains the old GUID.
1043 	 */
1044 	char			*lun_old_guid;
1045 	/*
1046 	 * Length of the old GUID
1047 	 */
1048 	size_t			lun_old_guid_size;
1049 	/*
1050 	 * Bitmap used to track the LUN discovery process.
1051 	 */
1052 	uint32_t		lun_trace;
1053 	/*
1054 	 * Bitmap representing the SCSI capabilities.
1055 	 */
1056 	uchar_t			lun_cap;
1057 	/*
1058 	 * LUN inquiry data (as returned by the INQUIRY command).
1059 	 */
1060 	struct scsi_inquiry	lun_inq;
1061 };
1062 
1063 
1064 /*
1065  * Lun discovery tracing
1066  */
1067 #define	FCP_LUN_TRACE_1		0x0000001
1068 #define	FCP_LUN_TRACE_2		0x0000002
1069 #define	FCP_LUN_TRACE_3		0x0000004
1070 #define	FCP_LUN_TRACE_4		0x0000008
1071 #define	FCP_LUN_TRACE_5		0x0000010
1072 #define	FCP_LUN_TRACE_6		0x0000020
1073 #define	FCP_LUN_TRACE_7		0x0000040
1074 #define	FCP_LUN_TRACE_8		0x0000080
1075 #define	FCP_LUN_TRACE_9		0x0000100
1076 #define	FCP_LUN_TRACE_10	0x0000200
1077 #define	FCP_LUN_TRACE_11	0x0000400
1078 #define	FCP_LUN_TRACE_12	0x0000800
1079 #define	FCP_LUN_TRACE_13	0x0001000
1080 #define	FCP_LUN_TRACE_14	0x0002000
1081 #define	FCP_LUN_TRACE_15	0x0004000
1082 #define	FCP_LUN_TRACE_16	0x0008000
1083 #define	FCP_LUN_TRACE_17	0x0010000
1084 #define	FCP_LUN_TRACE_18	0x0020000
1085 #define	FCP_LUN_TRACE_19	0x0040000
1086 #define	FCP_LUN_TRACE_20	0x0080000
1087 #define	FCP_LUN_TRACE_21	0x0100000
1088 #define	FCP_LUN_TRACE_22	0x0200000
1089 #define	FCP_LUN_TRACE_23	0x0400000
1090 #define	FCP_LUN_TRACE_24	0x0800000
1091 #define	FCP_LUN_TRACE_25	0x1000000
1092 #define	FCP_LUN_TRACE_26	0x2000000
1093 #define	FCP_LUN_TRACE_27	0x4000000
1094 #define	FCP_LUN_TRACE_28	0x8000000
1095 
1096 
1097 #define	FCP_LUN_TRACE(plun, bit) {\
1098 	if (plun && plun->lun_tgt) {\
1099 		mutex_enter(&plun->lun_tgt->tgt_mutex);\
1100 		plun->lun_trace |= bit;\
1101 		mutex_exit(&plun->lun_tgt->tgt_mutex);\
1102 	}\
1103 }
1104 
1105 #define	FCP_LUN_CAP_RESET	0x01
1106 
1107 /*
1108  * Lun State -- these have the same values as the target states so
1109  * that they can be interchanged (in cases where the same state occurs
1110  * for both targets and luns)
1111  */
1112 
1113 #define	FCP_LUN_INIT		FCP_TGT_INIT
1114 #define	FCP_LUN_BUSY		FCP_TGT_BUSY
1115 #define	FCP_LUN_MARK		FCP_TGT_MARK
1116 #define	FCP_LUN_OFFLINE		FCP_TGT_OFFLINE
1117 #define	FCP_SCSI_LUN_TGT_INIT	0x20	/* target/LUNs all inited */
1118 #define	FCP_LUN_DISAPPEARED	0x40
1119 /*
1120  * Use the below flag with caution as it is can cause a delay in
1121  * fcp_scsi_start() which is in the normal I/O performance path
1122  */
1123 #define	FCP_LUN_ONLINING	0x80
1124 /*
1125  * Set the below flag when the DTYPE or GUID of a LUN changes during discovery
1126  */
1127 #define	FCP_LUN_CHANGED	0x100
1128 /*
1129  * This flag is used specifically for the special lun: lun 0.
1130  */
1131 #define	FCP_LUN_DEVICE_NOT_CONNECTED	0x200
1132 
1133 /*
1134  * Report Lun Format
1135  */
1136 struct fcp_reportlun_resp {
1137 	uint32_t	num_lun;	/* num LUNs * 8 */
1138 	uint32_t	reserved;
1139 	longlong_t	lun_string[1];
1140 };
1141 
1142 /*
1143  * This structure actually represents a request executed by the hot plug task.
1144  */
1145 struct fcp_hp_elem {
1146 	/*
1147 	 * FCP port concerned by the request.
1148 	 */
1149 	struct fcp_port	*port;
1150 	/*
1151 	 * LUN concerned by the request.
1152 	 */
1153 	struct fcp_lun	*lun;
1154 	/*
1155 	 * dev_info_t or mdi_pathinfo_t pointer.
1156 	 */
1157 	child_info_t		*cip;
1158 	/*
1159 	 * lun_mpxio when the event is submitted
1160 	 */
1161 	int			old_lun_mpxio;
1162 	/*
1163 	 * What to do (offline, online...).
1164 	 */
1165 	int			what;
1166 	/*
1167 	 * FLags used when calling NDI fucntions.
1168 	 */
1169 	int			flags;
1170 	/*
1171 	 * Link state change count when the structure was created.
1172 	 */
1173 	int			link_cnt;
1174 	/*
1175 	 * Target state change count when the structure was created.
1176 	 */
1177 	int			tgt_cnt;
1178 	/*
1179 	 * Online/Offline count when this event was queued.
1180 	 */
1181 	int			event_cnt;
1182 	/*
1183 	 * This is the flag protected by the mutex and condition variable
1184 	 * defined further in this structure.  It is the flag indicating
1185 	 * that the hot plug task is done with the treatment of the structure.
1186 	 */
1187 	int			wait;
1188 	/*
1189 	 * This is where the result of the request is returned when the sender
1190 	 * waits for the completion.
1191 	 */
1192 	int			result;
1193 	/*
1194 	 * Condition variable used when wait is true.
1195 	 */
1196 	kcondvar_t		cv;
1197 	/*
1198 	 * Mutex used in conjunction with the previous condition variable.
1199 	 */
1200 	kmutex_t		mutex;
1201 };
1202 
1203 
1204 struct fcp_reset_elem {
1205 	struct fcp_reset_elem	*next;
1206 	struct fcp_tgt		*tgt;
1207 	struct fcp_lun		*lun;
1208 	clock_t			timeout;
1209 	uint_t			tgt_cnt;
1210 };
1211 
1212 /*
1213  * This structure is used to offline targets.  It is queued in the FCP port
1214  * structure single linked list port_offline_tgts and walked by the watchdog
1215  * timer.
1216  */
1217 struct fcp_tgt_elem {
1218 	/*
1219 	 * Points to the next element of the list.
1220 	 */
1221 	struct fcp_tgt_elem	*next;
1222 	/*
1223 	 * Points to the target to offline.
1224 	 */
1225 	struct fcp_tgt		*ptgt;
1226 	/*
1227 	 * Absolute time after which the target must be offlined.
1228 	 */
1229 	int			time;
1230 	/*
1231 	 * Link state change count when the structure was created.
1232 	 */
1233 	int			link_cnt;
1234 	/*
1235 	 * Target state change count when the structure was created.
1236 	 */
1237 	int			tgt_cnt;
1238 	/*
1239 	 * Flags providing information for the offline (when calling mdi or
1240 	 * ndi).
1241 	 */
1242 	int			flags;
1243 };
1244 
1245 /*
1246  * This structure is used to offline LUNs.  It is queued in the FCP port
1247  * structure single linked list port_offline_luns and walked by the watchdog
1248  * timer.
1249  */
1250 struct fcp_lun_elem {
1251 	/*
1252 	 * Points to the next element of the list.
1253 	 */
1254 	struct fcp_lun_elem	*next;
1255 	/*
1256 	 * Points to the LUN to offline.
1257 	 */
1258 	struct fcp_lun		*plun;
1259 	/*
1260 	 * Absolute time after which the LUN must be offlined.
1261 	 */
1262 	int			time;
1263 	/*
1264 	 * Link state change count when the structure was created.
1265 	 */
1266 	int			link_cnt;
1267 	/*
1268 	 * Target state change count when the structure was created.
1269 	 */
1270 	int			tgt_cnt;
1271 	/*
1272 	 * Flags providing information for the offline (when calling mdi or
1273 	 * ndi).
1274 	 */
1275 	int			flags;
1276 };
1277 
1278 /*
1279  * LUN masking
1280  */
1281 typedef struct fcp_black_list_entry {
1282 	/*
1283 	 * Points to the next element of the list.
1284 	 */
1285 	struct fcp_black_list_entry	*next;
1286 	/*
1287 	 * Port WWN of the target.
1288 	 */
1289 	la_wwn_t			wwn;
1290 	/*
1291 	 * LUN number which need to be masked.
1292 	 */
1293 	uint32_t			lun;
1294 	/*
1295 	 * Counter of access times.
1296 	 */
1297 	int				masked;
1298 } fcp_black_list_entry_t;
1299 
1300 #define	ADDR2FCP(ap)	((struct fcp_port *) \
1301 			    ((ap)->a_hba_tran->tran_hba_private))
1302 #define	ADDR2LUN(ap)	((struct fcp_lun *) \
1303 			scsi_device_hba_private_get(scsi_address_device(ap)))
1304 #define	CMD2PKT(cmd)	((cmd)->cmd_pkt)
1305 #define	PKT2CMD(pkt)	((struct fcp_pkt *)((pkt)->pkt_ha_private))
1306 
1307 /*
1308  * timeout values
1309  */
1310 #define	FCP_ELS_TIMEOUT		20	/* 20 seconds */
1311 #define	FCP_SCSI_CMD_TIMEOUT	25	/* 30 seconds */
1312 #define	FCP_POLL_TIMEOUT	60	/* 60 seconds */
1313 #define	FCP_TIMEOUT_DELTA	2	/* 2 seconds */
1314 #define	FCP_ICMD_DEADLINE	120	/* 60 seconds */
1315 #define	FCP_MAX_RETRIES		4
1316 
1317 
1318 #if !defined(__lint)
1319 _NOTE(MUTEX_PROTECTS_DATA(fcp_port::port_mutex,
1320     fcp_port::port_state fcp_tgt::tgt_change_cnt
1321     fcp_port::fcp_next fcp_port::port_tgt_hash_table
1322     fcp_port::port_link_cnt fcp_port::port_reset_list
1323     fcp_port::port_tmp_cnt fcp_port::port_ipkt_list
1324     fcp_tgt::tgt_next))
1325 
1326 _NOTE(MUTEX_PROTECTS_DATA(fcp_port::port_pkt_mutex,
1327     fcp_port::port_pkt_head fcp_port::port_pkt_tail
1328     fcp_port::port_npkts))
1329 
1330 _NOTE(MUTEX_PROTECTS_DATA(fcp_tgt::tgt_mutex,
1331     fcp_tgt::tgt_state	fcp_tgt::tgt_device_created
1332     fcp_tgt::tgt_icap fcp_tgt::tgt_tcap
1333     fcp_tgt::tgt_tid fcp_tgt::tgt_pd_handle fcp_tgt::tgt_tmp_cnt
1334     fcp_tgt::tgt_statec_cause fcp_lun::lun_next fcp_lun::lun_state))
1335 
1336 _NOTE(LOCK_ORDER(fcp_port::fcp_mutex fcp_tgt::tgt_mutex))
1337 _NOTE(LOCK_ORDER(fcp_tgt::tgt_mutex fcp_lun::lun_mutex))
1338 
1339 _NOTE(MUTEX_PROTECTS_DATA(fcp_lun::lun_mutex,
1340     fcp_lun::lun_pkt_head fcp_lun::lun_pkt_tail
1341     fcp_lun::lun_cip fcp_lun::lun_mpxio))
1342 
1343 _NOTE(DATA_READABLE_WITHOUT_LOCK( fcp_tgt::tgt_state))
1344 _NOTE(DATA_READABLE_WITHOUT_LOCK( fcp_tgt::tgt_pd_handle))
1345 
1346 _NOTE(DATA_READABLE_WITHOUT_LOCK(fcp_tgt::tgt_tid))
1347 
1348 
1349 _NOTE(SCHEME_PROTECTS_DATA("Safe Data",
1350     fcp_port::port_dma_acc_attr
1351     fcp_port::port_fcp_dma fcp_port::fcp_tran
1352     fcp_port::port_ndi_events fcp_port::port_ndi_event_defs
1353     fcp_port::port_pkt_cache fcp_port::port_dip fcp_port::port_phys_state
1354     fcp_port::port_reset_action fcp_port::port_cmds_dma_flags
1355     fcp_port::port_fp_handle fcp_port::port_instance
1356     fcp_port::port_fp_modlinkage fcp_port::port_max_exch
1357     fcp_port::port_priv_pkt_len fcp_port::port_id
1358     fcp_port::port_topology fcp_port::port_deadline fcp_port::port_mpxio
1359     fcp_tgt::tgt_d_id fcp_tgt::tgt_hard_addr fcp_tgt::tgt_lun_cnt
1360     fcp_tgt::tgt_port fcp_lun::lun_num fcp_lun::lun_tgt
1361     fcp_lun::lun_type
1362     fcp_lun::lun_guid_size fcp_lun::lun_guid
1363     fcp_hp_elem::lun fcp_hp_elem::flags fcp_hp_elem::cip
1364     fcp_hp_elem::what fcp_hp_elem::tgt_cnt fcp_hp_elem::tgt_cnt
1365     fcp_hp_elem::link_cnt fcp_reset_elem fcp_pkt fcp_ipkt
1366     scsi_pkt scsi_arq_status scsi_device scsi_hba_tran scsi_cdb))
1367 #endif	/* __lint */
1368 
1369 #define	FCP_CP_IN(s, d, handle, len)	(ddi_rep_get8((handle), \
1370 					(uint8_t *)(d), (uint8_t *)(s), \
1371 					(len), DDI_DEV_AUTOINCR))
1372 
1373 #define	FCP_CP_OUT(s, d, handle, len)	(ddi_rep_put8((handle), \
1374 					(uint8_t *)(s), (uint8_t *)(d), \
1375 					(len), DDI_DEV_AUTOINCR))
1376 
1377 #define	FCP_ONLINE			0x1
1378 #define	FCP_OFFLINE			0x2
1379 #define	FCP_MPXIO_PATH_CLEAR_BUSY	0x3
1380 #define	FCP_MPXIO_PATH_SET_BUSY		0x4
1381 
1382 #define	FCP_IDLE			0x00
1383 #define	FCP_OPEN			0x01
1384 #define	FCP_EXCL			0x02
1385 #define	FCP_BUSY			0x04
1386 
1387 #define	LFA(x)				(x & 0xFFFF00)
1388 #define	FCP_SET				1
1389 #define	FCP_RESET			0
1390 
1391 /* init() and attach() wait timeout values (in usecs) */
1392 #define	FCP_INIT_WAIT_TIMEOUT		60000000	/* 60 seconds */
1393 #define	FCP_ATTACH_WAIT_TIMEOUT		10000000	/* 10 seconds */
1394 
1395 #ifdef	TRUE
1396 #undef	TRUE
1397 #endif
1398 #define	TRUE			1
1399 
1400 #ifdef	FALSE
1401 #undef	FALSE
1402 #endif
1403 #define	FALSE			0
1404 
1405 #define	UNDEFINED		-1
1406 
1407 /* for softstate */
1408 #define	FCP_INIT_ITEMS	5
1409 
1410 #ifdef	__cplusplus
1411 }
1412 #endif
1413 
1414 #endif	/* _FCPVAR_H */
1415