1fcf3ce44SJohn Forte /*
2fcf3ce44SJohn Forte  * CDDL HEADER START
3fcf3ce44SJohn Forte  *
4fcf3ce44SJohn Forte  * The contents of this file are subject to the terms of the
5fcf3ce44SJohn Forte  * Common Development and Distribution License (the "License").
6fcf3ce44SJohn Forte  * You may not use this file except in compliance with the License.
7fcf3ce44SJohn Forte  *
8fcf3ce44SJohn Forte  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9fcf3ce44SJohn Forte  * or http://www.opensolaris.org/os/licensing.
10fcf3ce44SJohn Forte  * See the License for the specific language governing permissions
11fcf3ce44SJohn Forte  * and limitations under the License.
12fcf3ce44SJohn Forte  *
13fcf3ce44SJohn Forte  * When distributing Covered Code, include this CDDL HEADER in each
14fcf3ce44SJohn Forte  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15fcf3ce44SJohn Forte  * If applicable, add the following below this CDDL HEADER, with the
16fcf3ce44SJohn Forte  * fields enclosed by brackets "[]" replaced with your own identifying
17fcf3ce44SJohn Forte  * information: Portions Copyright [yyyy] [name of copyright owner]
18fcf3ce44SJohn Forte  *
19fcf3ce44SJohn Forte  * CDDL HEADER END
20fcf3ce44SJohn Forte  */
21fcf3ce44SJohn Forte /*
22*7ff83669SZhong Wang  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23fcf3ce44SJohn Forte  * Use is subject to license terms.
24fcf3ce44SJohn Forte  */
25fcf3ce44SJohn Forte 
26fcf3ce44SJohn Forte #ifndef	_FCSM_H
27fcf3ce44SJohn Forte #define	_FCSM_H
28fcf3ce44SJohn Forte 
29fcf3ce44SJohn Forte #ifdef	__cplusplus
30fcf3ce44SJohn Forte extern "C" {
31fcf3ce44SJohn Forte #endif
32fcf3ce44SJohn Forte 
33fcf3ce44SJohn Forte #ifdef _KERNEL
34fcf3ce44SJohn Forte 
35fcf3ce44SJohn Forte /*
36fcf3ce44SJohn Forte  * Message printing flags
37fcf3ce44SJohn Forte  */
38fcf3ce44SJohn Forte #define	SM_LOG			1
39fcf3ce44SJohn Forte #define	SM_CONSOLE		2
40fcf3ce44SJohn Forte #define	SM_LOG_AND_CONSOLE	3
41fcf3ce44SJohn Forte 
42fcf3ce44SJohn Forte /*
43fcf3ce44SJohn Forte  * Debug levels
44fcf3ce44SJohn Forte  */
45fcf3ce44SJohn Forte #define	SMDL_TRACE	0x0001
46fcf3ce44SJohn Forte #define	SMDL_IO		0x0002
47fcf3ce44SJohn Forte #define	SMDL_ERR	0x0004
48fcf3ce44SJohn Forte #define	SMDL_INFO	0x0008
49fcf3ce44SJohn Forte 
50fcf3ce44SJohn Forte #ifdef	DEBUG
51fcf3ce44SJohn Forte #define	FCSM_DEBUG(level, args)	\
52fcf3ce44SJohn Forte 	if (fcsm_debug & (level))	fcsm_display args
53fcf3ce44SJohn Forte 
54fcf3ce44SJohn Forte extern uint32_t fcsm_debug;
55fcf3ce44SJohn Forte #else /* DEBUG */
56fcf3ce44SJohn Forte #define	FCSM_DEBUG(level, args)
57fcf3ce44SJohn Forte #endif /* DEBUG */
58fcf3ce44SJohn Forte 
59fcf3ce44SJohn Forte #define	FCSM_INIT_INSTANCES	8	/* # of instances for soft_state_init */
60fcf3ce44SJohn Forte /*
61fcf3ce44SJohn Forte  * Open flags
62fcf3ce44SJohn Forte  */
63fcf3ce44SJohn Forte #define	FCSM_IDLE		0x00
64fcf3ce44SJohn Forte #define	FCSM_OPEN		0x01
65fcf3ce44SJohn Forte #define	FCSM_EXCL		0x02
66fcf3ce44SJohn Forte 
67fcf3ce44SJohn Forte #define	FCSM_ELS_TIMEOUT	(20)	/* secs */
68fcf3ce44SJohn Forte #define	FCSM_MS_TIMEOUT		(20)	/* secs */
69fcf3ce44SJohn Forte 
70fcf3ce44SJohn Forte #define	FCSM_OFFLINE_TICKER	(120)	/* secs */
71fcf3ce44SJohn Forte 
72fcf3ce44SJohn Forte /* Definitions for command retries */
73fcf3ce44SJohn Forte #define	FCSM_MAX_CMD_RETRIES	5	/* Max retries in case of failure */
74fcf3ce44SJohn Forte #define	FCSM_RETRY_INTERVAL	3	/* Retry interval in seconds */
75fcf3ce44SJohn Forte #define	FCSM_RETRY_TICKER	1	/* Retry thread execution interval */
76fcf3ce44SJohn Forte 
77fcf3ce44SJohn Forte #define	FCSM_MAX_JOB_RETRIES	3	/* Max retries in case of job failure */
78fcf3ce44SJohn Forte 
79fcf3ce44SJohn Forte /*
80fcf3ce44SJohn Forte  * fcsm_job - Job structure to issue commands using command thread
81fcf3ce44SJohn Forte  */
82fcf3ce44SJohn Forte typedef struct fcsm_job {
83fcf3ce44SJohn Forte 	uint32_t	job_code;		/* Command code */
84fcf3ce44SJohn Forte 	uint32_t	job_flags;		/* Command Flags */
85fcf3ce44SJohn Forte 	int		job_port_instance;	/* port driver instance */
86fcf3ce44SJohn Forte 	int		job_result;		/* job completion result */
87fcf3ce44SJohn Forte 	opaque_t	job_arg;		/* Command Arguments */
88fcf3ce44SJohn Forte 	opaque_t	job_caller_priv;	/* Caller private */
89fcf3ce44SJohn Forte 	void		(*job_comp)(opaque_t, struct fcsm_job *, int);
90fcf3ce44SJohn Forte 						/* completion func */
91fcf3ce44SJohn Forte 	opaque_t	job_comp_arg;		/* Arg for completion func */
92fcf3ce44SJohn Forte 	kmutex_t	job_mutex;		/* per command mutex */
93fcf3ce44SJohn Forte 	ksema_t		job_sema;		/* To wait for completion */
94fcf3ce44SJohn Forte 	struct fcsm_job	*job_next;		/* for linked list */
95fcf3ce44SJohn Forte 	int		job_retry_count;	/* Retry count */
96*7ff83669SZhong Wang 	void		*job_priv;		/* for fcsm private use	 */
97fcf3ce44SJohn Forte 	uint32_t	job_priv_flags;		/* fcsm private flags */
98fcf3ce44SJohn Forte } fcsm_job_t;
99fcf3ce44SJohn Forte 
100fcf3ce44SJohn Forte /*
101fcf3ce44SJohn Forte  * fcsm_t - FCSM Structure for per port information
102fcf3ce44SJohn Forte  */
103fcf3ce44SJohn Forte typedef struct fcsm {
104fcf3ce44SJohn Forte 	kmutex_t		sm_mutex;	/* mutex for protection */
105fcf3ce44SJohn Forte 	struct fcsm		*sm_next;	/* for global linked list */
106fcf3ce44SJohn Forte 	int			sm_sid;		/* FCA Port ID */
107fcf3ce44SJohn Forte 	int			sm_instance;	/* fc port instance number */
108fcf3ce44SJohn Forte 	uint32_t		sm_port_state;	/* FCA port state */
109fcf3ce44SJohn Forte 	uint32_t		sm_port_top;	/* Port topology */
110fcf3ce44SJohn Forte 	uint32_t		sm_state;	/* San Mgmt State information */
111fcf3ce44SJohn Forte 	uint32_t		sm_flags;	/* San Mgmt Flags (see below) */
112fcf3ce44SJohn Forte 	int			sm_ncmds;	/* # of pending commands */
113fcf3ce44SJohn Forte 	int			sm_cb_count;	/* # callbacks in progress */
114fcf3ce44SJohn Forte 	fc_ulp_port_info_t	sm_port_info;	/* FCA Port Information */
115fcf3ce44SJohn Forte 	fcsm_job_t		*sm_job_head;	/* port's job queue head */
116fcf3ce44SJohn Forte 	fcsm_job_t		*sm_job_tail;	/* port's job queue tail */
117fcf3ce44SJohn Forte 	struct fcsm_cmd		*sm_retry_head;	/* cmd retry queue head */
118fcf3ce44SJohn Forte 	struct fcsm_cmd		*sm_retry_tail;	/* cmd retry queue tail */
119fcf3ce44SJohn Forte 	timeout_id_t		sm_retry_tid;	/* retry timer */
120fcf3ce44SJohn Forte 	timeout_id_t		sm_offline_tid;	/* offline timer */
121fcf3ce44SJohn Forte 	kcondvar_t		sm_job_cv;	/* cv for job processing */
122fcf3ce44SJohn Forte 	uint32_t		sm_dev_count;	/* # of devices discovered */
123fcf3ce44SJohn Forte 	fc_portmap_t		*sm_portmap;	/* device map */
124fcf3ce44SJohn Forte 	kthread_t		*sm_thread;	/* per port job thread */
125fcf3ce44SJohn Forte 	kmem_cache_t		*sm_cmd_cache;	/* per port fc packet cache */
126fcf3ce44SJohn Forte 	la_els_logi_t		sm_ms_service_params;
127fcf3ce44SJohn Forte 						/* Mgmt Server Login Params */
128fcf3ce44SJohn Forte 	callb_cpr_t		sm_cpr_info;	/* CPR info */
129fcf3ce44SJohn Forte } fcsm_t;
130fcf3ce44SJohn Forte 
131fcf3ce44SJohn Forte 
132fcf3ce44SJohn Forte typedef struct fcsm_cmd {
133fcf3ce44SJohn Forte 	fc_packet_t	*cmd_fp_pkt;
134fcf3ce44SJohn Forte 	fcsm_job_t	*cmd_job;
135fcf3ce44SJohn Forte 	fcsm_t		*cmd_fcsm;
136fcf3ce44SJohn Forte 	int		cmd_retry_count;
137fcf3ce44SJohn Forte 	int		cmd_retry_interval;
138fcf3ce44SJohn Forte 	int		cmd_max_retries;
139fcf3ce44SJohn Forte 	struct fcsm_cmd	*cmd_next;
140fcf3ce44SJohn Forte 	void		(*cmd_comp)(struct fcsm_cmd *);
141fcf3ce44SJohn Forte 	int		(*cmd_transport)(opaque_t, fc_packet_t *);
142fcf3ce44SJohn Forte 	uint32_t	cmd_dma_flags;
143fcf3ce44SJohn Forte 	fc_packet_t	cmd_fc_packet;
144fcf3ce44SJohn Forte } fcsm_cmd_t;
145fcf3ce44SJohn Forte 
146fcf3ce44SJohn Forte /*
147fcf3ce44SJohn Forte  * sm_flags in the per port FCSM Structure
148fcf3ce44SJohn Forte  */
149fcf3ce44SJohn Forte #define	FCSM_ATTACHING			0x0001
150fcf3ce44SJohn Forte #define	FCSM_ATTACHED			0x0002
151fcf3ce44SJohn Forte #define	FCSM_DETACHING			0x0004
152fcf3ce44SJohn Forte #define	FCSM_DETACHED			0x0008
153fcf3ce44SJohn Forte #define	FCSM_SUSPENDED			0x0010
154fcf3ce44SJohn Forte #define	FCSM_POWER_DOWN			0x0020
155fcf3ce44SJohn Forte #define	FCSM_RESTORE_RETRY_TIMEOUT	0x0040
156fcf3ce44SJohn Forte #define	FCSM_RESTORE_OFFLINE_TIMEOUT	0x0080
157fcf3ce44SJohn Forte #define	FCSM_RETRY_TIMER_ACTIVE		0x0100
158fcf3ce44SJohn Forte #define	FCSM_SERIALIZE_JOBTHREAD	0x0200
159fcf3ce44SJohn Forte #define	FCSM_CMD_RETRY_Q_SUSPENDED	0x0400
160fcf3ce44SJohn Forte #define	FCSM_PORT_OFFLINE		0x0800
161fcf3ce44SJohn Forte #define	FCSM_LINK_DOWN			0x1000
162fcf3ce44SJohn Forte #define	FCSM_MGMT_SERVER_LOGGED_IN	0x2000
163fcf3ce44SJohn Forte #define	FCSM_MGMT_SERVER_LOGIN_IN_PROG	0x4000
164*7ff83669SZhong Wang #define	FCSM_USING_NODMA_FCA		0x8000
165fcf3ce44SJohn Forte 
166fcf3ce44SJohn Forte /* Command flags for Job structure */
167fcf3ce44SJohn Forte #define	FCSM_JOBFLAG_SYNC		0x01
168fcf3ce44SJohn Forte #define	FCSM_JOBFLAG_ASYNC		0x02
169fcf3ce44SJohn Forte #define	FCSM_JOBFLAG_SERIALIZE		0x04
170fcf3ce44SJohn Forte #define	FCSM_JOBFLAG_CTHEADER_BE	0X08
171fcf3ce44SJohn Forte 
172fcf3ce44SJohn Forte /* Command codes */
173fcf3ce44SJohn Forte #define	FCSM_JOB_NONE			0x00
174fcf3ce44SJohn Forte #define	FCSM_JOB_THREAD_SHUTDOWN	0x01
175fcf3ce44SJohn Forte #define	FCSM_JOB_LOGIN_NAME_SERVER	0x02
176fcf3ce44SJohn Forte #define	FCSM_JOB_LOGIN_MGMT_SERVER	0x03
177fcf3ce44SJohn Forte #define	FCSM_JOB_CT_PASSTHRU		0x04
178fcf3ce44SJohn Forte 
179fcf3ce44SJohn Forte /* Private flags for command */
180fcf3ce44SJohn Forte #define	FCSM_JOB_PRIV_WAIT_FOR_LOGIN	0x01
181fcf3ce44SJohn Forte #define	FCSM_JOB_PRIV_LOGIN_IN_PROG	0x02
182fcf3ce44SJohn Forte 
183fcf3ce44SJohn Forte /* Command DMA Flags */
184fcf3ce44SJohn Forte #define	FCSM_CF_CMD_VALID_DMA_MEM	0x01
185fcf3ce44SJohn Forte #define	FCSM_CF_CMD_VALID_DMA_BIND	0x02
186fcf3ce44SJohn Forte #define	FCSM_CF_RESP_VALID_DMA_MEM	0x04
187fcf3ce44SJohn Forte #define	FCSM_CF_RESP_VALID_DMA_BIND	0x08
188fcf3ce44SJohn Forte 
189fcf3ce44SJohn Forte #define	FCSM_INIT_CMD(cmd, job, tran_flags, tran_type, max_retries, func) { \
190fcf3ce44SJohn Forte 	(cmd)->cmd_job = (job); \
191fcf3ce44SJohn Forte 	(cmd)->cmd_fc_packet.pkt_tran_flags = (tran_flags); \
192fcf3ce44SJohn Forte 	(cmd)->cmd_fc_packet.pkt_tran_type = (tran_type); \
193fcf3ce44SJohn Forte 	(cmd)->cmd_max_retries = max_retries; \
194fcf3ce44SJohn Forte 	(cmd)->cmd_comp = func; \
195fcf3ce44SJohn Forte }
196fcf3ce44SJohn Forte 
197fcf3ce44SJohn Forte /*
198fcf3ce44SJohn Forte  * Macros to address endian issues
199*7ff83669SZhong Wang  * local variable "fcsm" must exist before using these
200fcf3ce44SJohn Forte  */
201*7ff83669SZhong Wang #define	FCSM_REP_RD(handle, hostaddr, devaddr, cnt)			\
202*7ff83669SZhong Wang 	{								\
203*7ff83669SZhong Wang 		if (!((fcsm)->sm_flags & FCSM_USING_NODMA_FCA)) {	\
204*7ff83669SZhong Wang 			ddi_rep_get8((handle), (uint8_t *)(hostaddr),	\
205*7ff83669SZhong Wang 				    (uint8_t *)(devaddr), (cnt),	\
206*7ff83669SZhong Wang 				    DDI_DEV_AUTOINCR);			\
207*7ff83669SZhong Wang 		} else {						\
208*7ff83669SZhong Wang 			bcopy((devaddr), (hostaddr), (cnt));		\
209*7ff83669SZhong Wang 		}							\
210*7ff83669SZhong Wang 	}
211*7ff83669SZhong Wang 
212*7ff83669SZhong Wang #define	FCSM_REP_WR(handle, hostaddr, devaddr, cnt)			\
213*7ff83669SZhong Wang 	{								\
214*7ff83669SZhong Wang 		if (!((fcsm)->sm_flags & FCSM_USING_NODMA_FCA)) {	\
215*7ff83669SZhong Wang 			ddi_rep_put8((handle), (uint8_t *)(hostaddr),	\
216*7ff83669SZhong Wang 				    (uint8_t *)(devaddr), (cnt),	\
217*7ff83669SZhong Wang 				    DDI_DEV_AUTOINCR);			\
218*7ff83669SZhong Wang 		} else {						\
219*7ff83669SZhong Wang 			bcopy((hostaddr), (devaddr), (cnt));		\
220*7ff83669SZhong Wang 		}							\
221*7ff83669SZhong Wang 	}
222fcf3ce44SJohn Forte 
223fcf3ce44SJohn Forte #endif /* _KERNEL */
224fcf3ce44SJohn Forte 
225fcf3ce44SJohn Forte /*
226fcf3ce44SJohn Forte  * IOCTL Definitions
227fcf3ce44SJohn Forte  */
228fcf3ce44SJohn Forte typedef struct fc_ct_aiu {
229fcf3ce44SJohn Forte 	fc_ct_header_t	aiu_header;
230fcf3ce44SJohn Forte 	char		aiu_payload[1];
231fcf3ce44SJohn Forte 	/* aiu_payload can be up to 'm' bytes (arbitrary length) */
232fcf3ce44SJohn Forte } fc_ct_aiu_t;
233fcf3ce44SJohn Forte 
234fcf3ce44SJohn Forte #define	FCSMIO			('S' << 8)
235fcf3ce44SJohn Forte #define	FCSMIO_CMD		(FCSMIO | 2000)
236fcf3ce44SJohn Forte 
237fcf3ce44SJohn Forte #define	FCSMIO_SUB_CMD		('Y' << 8)
238fcf3ce44SJohn Forte #define	FCSMIO_CT_CMD		(FCSMIO_SUB_CMD + 0x01)
239fcf3ce44SJohn Forte #define	FCSMIO_ADAPTER_LIST	(FCSMIO_SUB_CMD + 0x02)
240fcf3ce44SJohn Forte #define	FCSMIO_FIND_ADAPTER	(FCSMIO_SUB_CMD + 0x03)
241fcf3ce44SJohn Forte 
242fcf3ce44SJohn Forte #define	FCSM_MAX_CT_SIZE	(65536)		/* 64K */
243fcf3ce44SJohn Forte 
244fcf3ce44SJohn Forte /* Management Server - Fabric Configuration Server Commands */
245fcf3ce44SJohn Forte #define	MS_CS_GTIN	0x0100	/* Get Topology Information */
246fcf3ce44SJohn Forte #define	MS_CS_GIEL	0x0101	/* Get Interconnect Element List */
247fcf3ce44SJohn Forte #define	MS_CS_GIET	0x0111	/* Get Interconnect Element Type */
248fcf3ce44SJohn Forte #define	MS_CS_GDID	0x0112	/* Get Domain Identifier */
249fcf3ce44SJohn Forte #define	MS_CS_GMID	0x0113	/* Get Management Identifier */
250fcf3ce44SJohn Forte #define	MS_CS_GFN	0x0114	/* Get Fabric Name */
251fcf3ce44SJohn Forte #define	MS_CS_GIELN	0x0115	/* Get Interconnect Element Logical Name */
252fcf3ce44SJohn Forte #define	MS_CS_GMAL	0x0116	/* Get Management Address List */
253fcf3ce44SJohn Forte #define	MS_CS_GIEIL	0x0117	/* Get Interconnect Element Information List */
254fcf3ce44SJohn Forte #define	MS_CS_GPL	0x0118	/* Get Port List */
255fcf3ce44SJohn Forte #define	MS_CS_GPT	0x0121	/* Get Port Type */
256fcf3ce44SJohn Forte #define	MS_CS_GPPN	0x0122	/* Get Physical Port Number */
257fcf3ce44SJohn Forte #define	MS_CS_GAPNL	0x0124	/* Get Attached Port Name List */
258fcf3ce44SJohn Forte #define	MS_CS_GPS	0x0126	/* Get Port State */
259fcf3ce44SJohn Forte #define	MS_CS_GATIN	0x0128	/* Get Attached Topology Information */
260fcf3ce44SJohn Forte #define	MS_CS_GPLNL	0x0191	/* Get Platform Node Name List */
261fcf3ce44SJohn Forte #define	MS_CS_GPLT	0x0192	/* Get Platform Type */
262fcf3ce44SJohn Forte #define	MS_CS_GPLML	0x0193	/* Get Platform Management Address List */
263fcf3ce44SJohn Forte #define	MS_CS_GNPL	0x01a1	/* Get Platform Name - Node Name */
264fcf3ce44SJohn Forte #define	MS_CS_GPNL	0x01a2	/* Get Platform Name List */
265fcf3ce44SJohn Forte #define	MS_CS_GNID	0x01b1	/* Get Node Identification Data - Node Name */
266fcf3ce44SJohn Forte #define	MS_CS_RIELN	0x0215	/* Register Interconnect Element Logical Name */
267fcf3ce44SJohn Forte #define	MS_CS_RPL	0x0280	/* Register Platform */
268fcf3ce44SJohn Forte #define	MS_CS_RPLN	0x0291	/* Register Platform Name */
269fcf3ce44SJohn Forte #define	MS_CS_RPLT	0x0292	/* Register Platform Type */
270fcf3ce44SJohn Forte #define	MS_CS_RPLM	0x0293	/* Register Platform Management Address */
271fcf3ce44SJohn Forte #define	MS_CS_DPL	0x0380	/* Deregister Platform */
272fcf3ce44SJohn Forte #define	MS_CS_DPLN	0x0391	/* Deregister Platform Node Name */
273fcf3ce44SJohn Forte #define	MS_CS_DPLML	0x0393	/* Deregister Platform Management Addr List */
274fcf3ce44SJohn Forte 
275fcf3ce44SJohn Forte #ifdef _KERNEL
276fcf3ce44SJohn Forte 
277fcf3ce44SJohn Forte /*
278fcf3ce44SJohn Forte  * Driver entry point functions
279fcf3ce44SJohn Forte  */
280fcf3ce44SJohn Forte static int	fcsm_attach(dev_info_t *, ddi_attach_cmd_t);
281fcf3ce44SJohn Forte static int	fcsm_detach(dev_info_t *, ddi_detach_cmd_t);
282fcf3ce44SJohn Forte static int	fcsm_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
283fcf3ce44SJohn Forte static int	fcsm_open(dev_t *, int, int, cred_t *);
284fcf3ce44SJohn Forte static int	fcsm_close(dev_t, int, int, cred_t *);
285fcf3ce44SJohn Forte static int	fcsm_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
286fcf3ce44SJohn Forte 
287fcf3ce44SJohn Forte /*
288fcf3ce44SJohn Forte  * FC Transport functions
289fcf3ce44SJohn Forte  */
290fcf3ce44SJohn Forte static int	fcsm_port_attach(opaque_t, fc_ulp_port_info_t *,
291fcf3ce44SJohn Forte 		    fc_attach_cmd_t, uint32_t);
292fcf3ce44SJohn Forte static int	fcsm_port_detach(opaque_t, fc_ulp_port_info_t *,
293fcf3ce44SJohn Forte 		    fc_detach_cmd_t);
294fcf3ce44SJohn Forte static int	fcsm_port_ioctl(opaque_t, opaque_t, dev_t, int, intptr_t,
295fcf3ce44SJohn Forte 		    int, cred_t *, int *, uint32_t);
296fcf3ce44SJohn Forte static void	fcsm_statec_cb(opaque_t, opaque_t, uint32_t, uint32_t,
297fcf3ce44SJohn Forte 		    fc_portmap_t *, uint32_t, uint32_t);
298fcf3ce44SJohn Forte static int	fcsm_els_cb(opaque_t, opaque_t, fc_unsol_buf_t *, uint32_t);
299fcf3ce44SJohn Forte static int	fcsm_data_cb(opaque_t, opaque_t, fc_unsol_buf_t *, uint32_t);
300fcf3ce44SJohn Forte 
301fcf3ce44SJohn Forte /*
302fcf3ce44SJohn Forte  * Internal functions
303fcf3ce44SJohn Forte  */
304fcf3ce44SJohn Forte static int	fcsm_handle_port_attach(fc_ulp_port_info_t *, uint32_t, int);
305fcf3ce44SJohn Forte static int	fcsm_handle_port_resume(opaque_t, fc_ulp_port_info_t *,
306fcf3ce44SJohn Forte 		    fc_attach_cmd_t, uint32_t, fcsm_t *);
307fcf3ce44SJohn Forte static int	fcsm_handle_port_detach(fc_ulp_port_info_t *, fcsm_t *,
308fcf3ce44SJohn Forte 		    fc_detach_cmd_t);
309fcf3ce44SJohn Forte static void	fcsm_suspend_port(fcsm_t *);
310fcf3ce44SJohn Forte static void	fcsm_resume_port(fcsm_t *);
311fcf3ce44SJohn Forte static void	fcsm_cleanup_port(fcsm_t *);
312fcf3ce44SJohn Forte static void	fcsm_offline_timeout(void *);
313fcf3ce44SJohn Forte static int	fcsm_fciocmd(intptr_t, int, cred_t *, fcio_t *);
314fcf3ce44SJohn Forte static int	fcsm_fcio_copyout(fcio_t *, intptr_t, int);
315fcf3ce44SJohn Forte static int	fcsm_job_cache_constructor(void *, void *, int);
316fcf3ce44SJohn Forte static void	fcsm_job_cache_destructor(void *, void *);
317fcf3ce44SJohn Forte static fcsm_job_t *fcsm_alloc_job(int);
318fcf3ce44SJohn Forte static void	fcsm_dealloc_job(fcsm_job_t *);
319fcf3ce44SJohn Forte static void	fcsm_init_job(fcsm_job_t *, int, uint32_t, uint32_t, opaque_t,
320fcf3ce44SJohn Forte 		    opaque_t, void (*comp)(opaque_t, fcsm_job_t *, int),
321fcf3ce44SJohn Forte 		    opaque_t);
322fcf3ce44SJohn Forte static int	fcsm_process_job(fcsm_job_t *, int);
323fcf3ce44SJohn Forte static void	fcsm_enque_job(fcsm_t *, fcsm_job_t *, int);
324fcf3ce44SJohn Forte static fcsm_job_t *fcsm_deque_job(fcsm_t *);
325fcf3ce44SJohn Forte static int	fcsm_cmd_cache_constructor(void *, void *, int);
326fcf3ce44SJohn Forte static void	fcsm_cmd_cache_destructor(void *, void *);
327fcf3ce44SJohn Forte static fcsm_cmd_t	*fcsm_alloc_cmd(fcsm_t *, uint32_t, uint32_t, int);
328fcf3ce44SJohn Forte static void	fcsm_free_cmd_dma(fcsm_cmd_t *);
329fcf3ce44SJohn Forte static void	fcsm_job_thread(fcsm_t *);
330fcf3ce44SJohn Forte static int	fcsm_retry_job(fcsm_t *fcsm, fcsm_job_t *job);
331fcf3ce44SJohn Forte static void	fcsm_jobdone(fcsm_job_t *);
332fcf3ce44SJohn Forte static void	fcsm_ct_init(fcsm_t *, fcsm_cmd_t *, fc_ct_aiu_t *, size_t,
333fcf3ce44SJohn Forte 		    void (*comp_func)());
334fcf3ce44SJohn Forte static void	fcsm_ct_intr(fcsm_cmd_t *);
335fcf3ce44SJohn Forte static void	fcsm_job_ct_passthru(fcsm_job_t *);
336fcf3ce44SJohn Forte static int	fcsm_login_and_process_job(fcsm_t *, fcsm_job_t *);
337fcf3ce44SJohn Forte static void	fcsm_login_ms_comp(opaque_t, fcsm_job_t *, int);
338fcf3ce44SJohn Forte static void	fcsm_els_init(fcsm_cmd_t *, uint32_t);
339fcf3ce44SJohn Forte static int	fcsm_xlogi_init(fcsm_t *, fcsm_cmd_t *, uint32_t,
340fcf3ce44SJohn Forte 		    void (*comp_func)(), uchar_t);
341fcf3ce44SJohn Forte static void	fcsm_xlogi_intr(fcsm_cmd_t *);
342fcf3ce44SJohn Forte static void	fcsm_job_login_mgmt_server(fcsm_job_t *);
343fcf3ce44SJohn Forte int		fcsm_ct_passthru(int, fcio_t *, int, int,
344fcf3ce44SJohn Forte 		    void (*func)(fcio_t *));
345fcf3ce44SJohn Forte static void	fcsm_ct_passthru_comp(opaque_t, fcsm_job_t *, int);
346fcf3ce44SJohn Forte static void	fcsm_pkt_common_intr(fc_packet_t *);
347fcf3ce44SJohn Forte static int	fcsm_issue_cmd(fcsm_cmd_t *);
348fcf3ce44SJohn Forte static int	fcsm_retry_cmd(fcsm_cmd_t *);
349fcf3ce44SJohn Forte static void	fcsm_enque_cmd(fcsm_t *, fcsm_cmd_t *);
350fcf3ce44SJohn Forte static fcsm_cmd_t *fcsm_deque_cmd(fcsm_t *);
351fcf3ce44SJohn Forte static void	fcsm_retry_timeout(void *);
352fcf3ce44SJohn Forte static void	fcsm_force_port_detach_all(void);
353fcf3ce44SJohn Forte 
354fcf3ce44SJohn Forte 
355fcf3ce44SJohn Forte /*
356fcf3ce44SJohn Forte  * Utility functions
357fcf3ce44SJohn Forte  */
358fcf3ce44SJohn Forte static void	fcsm_disp_devlist(fcsm_t *, fc_portmap_t *, uint32_t);
359fcf3ce44SJohn Forte 
360fcf3ce44SJohn Forte static void	fcsm_display(int, int, fcsm_t *,
361fcf3ce44SJohn Forte 		    fc_packet_t *, const char *, ...);
362fcf3ce44SJohn Forte int		fcsm_pkt_state_to_rval(uchar_t, uint32_t);
363fcf3ce44SJohn Forte caddr_t		fcsm_port_state_to_str(uint32_t);
364fcf3ce44SJohn Forte caddr_t		fcsm_topology_to_str(uint32_t);
365fcf3ce44SJohn Forte static caddr_t	fcsm_dev_type_to_str(uint32_t);
366fcf3ce44SJohn Forte 
367fcf3ce44SJohn Forte 
368fcf3ce44SJohn Forte #endif /* _KERNEL */
369fcf3ce44SJohn Forte 
370fcf3ce44SJohn Forte 
371fcf3ce44SJohn Forte #ifdef	__cplusplus
372fcf3ce44SJohn Forte }
373fcf3ce44SJohn Forte #endif
374fcf3ce44SJohn Forte 
375fcf3ce44SJohn Forte #endif /* _FCSM_H */
376