xref: /illumos-gate/usr/src/uts/sun/sys/socalvar.h (revision 3db86aab)
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 2001 Sun Microsystems, Inc. All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_SOCALVAR_H
27 #define	_SYS_SOCALVAR_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 #include <sys/id32.h>
36 
37 /*
38  * socalvar.h - SOC+ Driver data struct definitions
39  */
40 
41 /*
42  * Define default name and # of SOC+s to allocate to the system
43  */
44 
45 #define	SOCAL_PORTA_NAME	"0"	/* node for port a */
46 #define	SOCAL_PORTB_NAME	"1"	/* node for port b */
47 #define	SOCAL_NT_PORT		NULL
48 #define	SOCAL_INIT_ITEMS	5
49 
50 /*
51  * Defines for the Circular Queues
52  */
53 #define	SOCAL_MAX_CQ_ENTRIES	256	/* Maximum number of CQ entries. */
54 #define	SOCAL_CQ_SIZE (sizeof (cqe_t) * SOC_MAX_CQ_ENTRIES)
55 
56 #define	SOCAL_SMALL_CQ_ENTRIES	8	/* Number of CQ entries for a small Q */
57 
58 #define	SOCAL_N_CQS		4	/* Number of queues we use */
59 #define	SOCAL_HW_N_CQS		4	/* Number of queues the hardware has */
60 #define	SOCAL_CQ_ALIGN		64	/* alignment boundary */
61 
62 #define	SOCAL_TAKE_CORE		0x1
63 #define	SOCAL_FAILED_LIP	0x2
64 
65 /*
66  * Misc. Macros
67  */
68 #define	SOCAL_POOL_SIZE		2112
69 #define	SOCAL_SVC_LENGTH	80
70 
71 #define	FABRIC_FLAG	1
72 #define	NPORT_FLAG	2
73 
74 #define	FCIO_DIAG_LBTFQ		(FIOC|203)
75 #define	SOC_DIAG_LBTFQ		0x0a
76 #define	PORT_LBF_PENDING	0x00100000
77 #define	SOCAL_LBF_TIMEOUT	15000000 /* usec */
78 
79 /* Macros to speed handling of 32-bit IDs */
80 #define	SOCAL_ID_GET(x, w)	id32_alloc((x), (w))
81 #define	SOCAL_ID_LOOKUP(x)	id32_lookup((x))
82 #define	SOCAL_ID_FREE(x)	id32_free((x))
83 
84 typedef	struct flb_hdr {
85 	uint_t max_length;
86 	uint_t length;
87 } flb_hdr_t;
88 
89 struct socal_state;
90 
91 /*
92  * SOC UNIX circular queue descriptor.
93  */
94 
95 typedef struct socal_kernel_cq {
96 	kmutex_t	skc_mtx;	/* MT lock for CQ manipulation  */
97 	kcondvar_t	skc_cv;		/* cond var for CQ manipulation. */
98 	ddi_dma_handle_t skc_dhandle;	/* DDI DMA handle to CQ. */
99 	ddi_dma_cookie_t skc_dcookie;	/* DDI DMA Cookie. */
100 	ddi_acc_handle_t skc_acchandle;	/* DDI DMA access handle */
101 	soc_cq_t	*skc_xram_cqdesc; /* Pointer to XRAM CQ desc */
102 	caddr_t		skc_cq_raw;	/* Pointer to unaligned CQ mem pool */
103 	cqe_t		*skc_cq;	/* Pointer to CQ memory pool. */
104 	uchar_t		skc_in;		/* Current Input pointer. */
105 	uchar_t		skc_out;	/* Current Input pointer. */
106 	uchar_t		skc_last_index;	/* Last cq index. */
107 	uchar_t		skc_seqno;	/* Current Go Around in CQ. */
108 	uchar_t		skc_full;	/* Indication of full. */
109 	uchar_t		skc_saved_out;	/* Current Input pointer. */
110 	uchar_t		skc_saved_seqno;	/* Current Go Around in CQ. */
111 	timeout_id_t	deferred_intr_timeoutid;
112 	struct fcal_packet	*skc_overflowh; /* cq overflow list */
113 	struct fcal_packet	*skc_overflowt;
114 	struct socal_state	*skc_socalp;
115 } socal_kcq_t;
116 
117 /*
118  * Values for skc_full
119  */
120 #define	SOCAL_SKC_FULL	1
121 #define	SOCAL_SKC_SLEEP	2
122 
123 /*
124  * State change callback routine descriptor
125  *
126  * There is one entry in this list for each hba that is attached
127  * to this port.
128  * This structure will need to be mutex protected when parallel
129  * attaches are supported.
130  */
131 typedef struct socal_unsol_cb {
132 	struct socal_unsol_cb	*next;
133 	uchar_t			type;
134 	void			(*statec_cb)(void *, uint32_t);
135 	void			(*els_cb)(void *, cqe_t *, caddr_t);
136 	void			(*data_cb)(void *, cqe_t *, caddr_t);
137 	void			*arg;
138 } socal_unsol_cb_t;
139 
140 /*
141  * SOC+ port status decriptor.
142  */
143 typedef struct socal_port {
144 	uint32_t		sp_status;	/* port status */
145 	struct socal_state	*sp_board;	/* hardware for instance */
146 
147 	uint32_t		sp_src_id;	/* Our nport id */
148 	uint32_t		sp_port;	/* Our physical port (0, 1) */
149 	la_wwn_t		sp_p_wwn;	/* Our Port WorldWide Name */
150 
151 	socal_unsol_cb_t	*sp_unsol_cb;	/* Callback for state change */
152 
153 	uint32_t		sp_open;	/* open count */
154 
155 	kmutex_t		sp_mtx;		/* Per port mutex */
156 	kcondvar_t		sp_cv;		/* Per port condvariable */
157 	fcal_transport_t	*sp_transport;	/* transport structure */
158 
159 	uint32_t		sp_hard_alpa;	/* Our optional Hard AL_PA */
160 
161 	uint32_t		sp_lilpmap_valid;  /* lilp map cache valid  */
162 	fcal_lilp_map_t		sp_lilpmap;  /* lilp map cache */
163 } socal_port_t;
164 
165 #define	PORT_FABRIC_PRESENT	0x00000001
166 #define	PORT_OFFLINE		0x00000002
167 #define	NPORT_LOGIN_SUCCESS	0x00000004
168 #define	PORT_LOGIN_ACTIVE	0x00000008
169 #define	PORT_LOGIN_RECOVERY	0x00000010
170 #define	PORT_ONLINE_LOOP	0x00000020
171 #define	PORT_ONLINE		0x00000040
172 #define	PORT_STATUS_FLAG	0x00000080
173 #define	PORT_STATUS_MASK	0x000000ff
174 #define	PORT_OPEN		0x00000100
175 #define	PORT_CHILD_INIT		0x00000200
176 #define	PORT_TARGET_MODE	0x00000400
177 #define	PORT_LILP_PENDING	0x00001000
178 #define	PORT_LIP_PENDING	0x00002000
179 #define	PORT_ABORT_PENDING	0x00004000
180 #define	PORT_ELS_PENDING	0x00008000
181 #define	PORT_BYPASS_PENDING	0x00010000
182 #define	PORT_OFFLINE_PENDING	0x00020000
183 #define	PORT_ADISC_PENDING	0x00040000
184 #define	PORT_RLS_PENDING	0x00080000
185 #define	PORT_DISABLED		0x00100000
186 
187 
188 #define	SOC_TIMEOUT_DELAY(secs, delay)  (secs * (1000000 / delay))
189 #define	SOCAL_NOINTR_POLL_DELAY_TIME	1000    /* usec */
190 
191 #define	SOCAL_LILP_TIMEOUT		10000000 /* usec */
192 #define	SOCAL_LIP_TIMEOUT		30000000 /* usec */
193 #define	SOCAL_ABORT_TIMEOUT		10000000 /* usec */
194 #define	SOCAL_BYPASS_TIMEOUT		5000000	/* usec */
195 #define	SOCAL_OFFLINE_TIMEOUT		5000000	/* usec */
196 #define	SOCAL_ADISC_TIMEOUT		15000000 /* usec */
197 #define	SOCAL_RLS_TIMEOUT		15000000 /* usec */
198 #define	SOCAL_DIAG_TIMEOUT		15000000 /* usec */
199 
200 /*
201  * We wait for up to SOC_INITIAL_ONLINE seconds for the first
202  * soc to come on line. The timeout in the soc firmware is 10 seconds.
203  * The timeout is to let any outstanding commands drain before
204  * coming back on line, after going off-line.
205  */
206 #define	SOC_INITIAL_ONLINE	30	/* secs for first online from soc */
207 
208 /*
209  * SOC state structure
210  */
211 
212 typedef struct socal_state {
213 	dev_info_t	*dip;
214 	caddr_t 	socal_eeprom;		/* pointer to soc+ eeprom */
215 	caddr_t 	socal_xrp;		/* pointer to soc+ xram */
216 	socal_reg_t	*socal_rp;		/* pointer to soc+ registers */
217 
218 	soc_cq_t	*xram_reqp;	/* addr of request descriptors */
219 	soc_cq_t	*xram_rspp;	/* addr of response descriptors */
220 
221 	socal_kcq_t	request[SOCAL_N_CQS];	/* request queues */
222 	socal_kcq_t	response[SOCAL_N_CQS];	/* response queues */
223 
224 	int32_t		socal_busy;		/* busy flag */
225 	uint32_t	socal_shutdown;
226 	uint32_t	socal_cfg;		/* copy of the config reg */
227 
228 	kmutex_t	k_imr_mtx;	/* mutex for interrupt masks */
229 	uint32_t	socal_k_imr;	/* copy of soc+'s mask register */
230 
231 	kmutex_t	abort_mtx;	/* Abort mutex. */
232 	kmutex_t	board_mtx;	/* Per board mutex */
233 	kmutex_t	ioctl_mtx;	/* mutex to serialize ioctls */
234 	kcondvar_t	board_cv;	/* Per board condition variable */
235 
236 	ddi_iblock_cookie_t	iblkc;	/* interrupt cookies */
237 	ddi_idevice_cookie_t	idevc;
238 
239 	uchar_t		*pool;	/* unsolicited buffer pool resources */
240 	ddi_dma_handle_t	pool_dhandle;
241 	ddi_dma_cookie_t	pool_dcookie;
242 	ddi_acc_handle_t	pool_acchandle;
243 
244 					/* handles to soc+ ports */
245 	socal_port_t	port_state[N_SOCAL_NPORTS];
246 	la_wwn_t	socal_n_wwn;	/* Our Node WorldWide Name */
247 	char		socal_service_params[SOCAL_SVC_LENGTH];	/* for login */
248 
249 	char			socal_name[MAXPATHLEN];
250 	kstat_t			*socal_ksp;
251 	struct socal_stats	socal_stats;	/* kstats */
252 	int		socal_on_intr;
253 } socal_state_t;
254 
255 /*
256  * Structure used when the soc driver needs to issue commands of its own
257  */
258 
259 typedef struct socal_priv_cmd {
260 	void			*fapktp;
261 	uint32_t		flags;
262 	caddr_t			cmd;
263 	caddr_t			rsp;
264 	ddi_dma_handle_t	cmd_handle;
265 	ddi_acc_handle_t	cmd_acchandle;
266 	ddi_dma_handle_t	rsp_handle;
267 	ddi_acc_handle_t	rsp_acchandle;
268 	void 			(*callback)();	/* callback to ULP, if any */
269 	void			*arg;		/* callback arg */
270 	caddr_t			*payload;	/* payload callback or stash */
271 } socal_priv_cmd_t;
272 
273 #ifdef __cplusplus
274 }
275 #endif
276 
277 #endif /* !_SYS_SOCALVAR_H */
278