xref: /illumos-gate/usr/src/uts/common/sys/scsi/impl/transport.h (revision fbd1c0dae6f4a2ccc2ce0527c7f19d3dd5ea90b8)
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 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_SCSI_IMPL_TRANSPORT_H
27 #define	_SYS_SCSI_IMPL_TRANSPORT_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * Include the loadable module wrapper.
33  */
34 #include <sys/modctl.h>
35 #include <sys/note.h>
36 
37 
38 #ifdef	__cplusplus
39 extern "C" {
40 #endif
41 
42 #ifdef	_KERNEL
43 
44 /*
45  * SCSI transport structures
46  *
47  *	As each Host Adapter makes itself known to the system,
48  *	it will create and register with the library the structure
49  *	described below. This is so that the library knows how to route
50  *	packets, resource control requests, and capability requests
51  *	for any particular host adapter. The 'a_hba_tran' field of a
52  *	scsi_address structure made known to a Target driver will
53  *	point to one of these transport structures.
54  */
55 
56 typedef struct scsi_hba_tran	scsi_hba_tran_t;
57 
58 struct scsi_hba_tran {
59 	/*
60 	 * Ptr to the device info structure for this particular HBA.
61 	 */
62 	dev_info_t	*tran_hba_dip;
63 
64 	/*
65 	 * Private fields for use by the HBA itself.
66 	 */
67 	void		*tran_hba_private;	/* HBA softstate */
68 	void		*tran_tgt_private;	/* target-specific info */
69 
70 	/*
71 	 * Only used to refer to a particular scsi device
72 	 * if the entire scsi_hba_tran structure is "cloned"
73 	 * per target device, otherwise NULL.
74 	 */
75 	struct scsi_device	*tran_sd;
76 
77 	/*
78 	 * Vectors to point to specific HBA entry points
79 	 */
80 
81 	int		(*tran_tgt_init)(
82 				dev_info_t		*hba_dip,
83 				dev_info_t		*tgt_dip,
84 				scsi_hba_tran_t		*hba_tran,
85 				struct scsi_device	*sd);
86 
87 	int		(*tran_tgt_probe)(
88 				struct scsi_device	*sd,
89 				int			(*callback)(
90 								void));
91 	void		(*tran_tgt_free)(
92 				dev_info_t		*hba_dip,
93 				dev_info_t		*tgt_dip,
94 				scsi_hba_tran_t		*hba_tran,
95 				struct scsi_device	*sd);
96 
97 	int		(*tran_start)(
98 				struct scsi_address	*ap,
99 				struct scsi_pkt		*pkt);
100 
101 	int		(*tran_reset)(
102 				struct scsi_address	*ap,
103 				int			level);
104 
105 	int		(*tran_abort)(
106 				struct scsi_address	*ap,
107 				struct scsi_pkt		*pkt);
108 
109 	int		(*tran_getcap)(
110 				struct scsi_address	*ap,
111 				char			*cap,
112 				int			whom);
113 
114 	int		(*tran_setcap)(
115 				struct scsi_address	*ap,
116 				char			*cap,
117 				int			value,
118 				int			whom);
119 
120 	struct scsi_pkt	*(*tran_init_pkt)(
121 				struct scsi_address	*ap,
122 				struct scsi_pkt		*pkt,
123 				struct buf		*bp,
124 				int			cmdlen,
125 				int			statuslen,
126 				int			tgtlen,
127 				int			flags,
128 				int			(*callback)(
129 								caddr_t	arg),
130 				caddr_t			callback_arg);
131 
132 	void		(*tran_destroy_pkt)(
133 				struct scsi_address	*ap,
134 				struct scsi_pkt		*pkt);
135 
136 	void		(*tran_dmafree)(
137 				struct scsi_address	*ap,
138 				struct scsi_pkt		*pkt);
139 
140 	void		(*tran_sync_pkt)(
141 				struct scsi_address	*ap,
142 				struct scsi_pkt		*pkt);
143 
144 	int		(*tran_reset_notify)(
145 				struct scsi_address	*ap,
146 				int			flag,
147 				void			(*callback)(caddr_t),
148 				caddr_t			arg);
149 
150 	int		(*tran_get_bus_addr)(
151 				struct scsi_device	*devp,
152 				char			*name,
153 				int			len);
154 
155 	int		(*tran_get_name)(
156 				struct scsi_device	*devp,
157 				char			*name,
158 				int			len);
159 
160 	int		(*tran_clear_aca)(
161 				struct scsi_address	*ap);
162 
163 	int		(*tran_clear_task_set)(
164 				struct scsi_address	*ap);
165 
166 	int		(*tran_terminate_task)(
167 				struct scsi_address	*ap,
168 				struct scsi_pkt		*pkt);
169 
170 	int		(*tran_get_eventcookie)(
171 				dev_info_t		*hba_dip,
172 				dev_info_t		*tgt_dip,
173 				char			*name,
174 				ddi_eventcookie_t	*eventp);
175 
176 	int		(*tran_add_eventcall)(
177 				dev_info_t		*hba_dip,
178 				dev_info_t		*tgt_dip,
179 				ddi_eventcookie_t	event,
180 				void			(*callback)(
181 						dev_info_t *tgt_dip,
182 						ddi_eventcookie_t event,
183 						void *arg,
184 						void *bus_impldata),
185 				void			*arg,
186 				ddi_callback_id_t *cb_id);
187 
188 	int		(*tran_remove_eventcall)(dev_info_t *devi,
189 			ddi_callback_id_t cb_id);
190 
191 	int		(*tran_post_event)(
192 				dev_info_t		*hba_dip,
193 				dev_info_t		*tgt_dip,
194 				ddi_eventcookie_t	event,
195 				void			*bus_impldata);
196 
197 	int		(*tran_quiesce)(
198 				dev_info_t		*hba_dip);
199 
200 	int		(*tran_unquiesce)(
201 				dev_info_t		*hba_dip);
202 
203 	int		(*tran_bus_reset)(
204 				dev_info_t		*hba_dip,
205 				int			level);
206 
207 	/*
208 	 * Implementation-private specifics.
209 	 * No HBA should refer to any of the fields below.
210 	 * This information can and will change.
211 	 */
212 	int			tran_hba_flags;		/* flag options */
213 
214 	uint_t			tran_obs1;
215 	uchar_t			tran_obs2;
216 	uchar_t			tran_obs3;
217 
218 	/*
219 	 * open_lock: protect tran_minor_isopen
220 	 * open_flag: bit field indicating which minor nodes are open.
221 	 *	0 = closed, 1 = shared open, all bits 1 = excl open.
222 	 *
223 	 * XXX Unused if hba driver chooses to implement own
224 	 *	xxopen(9e) entry point
225 	 */
226 	kmutex_t		tran_open_lock;
227 	uint64_t		tran_open_flag;
228 
229 	/*
230 	 * bus_config vectors - ON Consolidation Private
231 	 * These interfaces are subject to change.
232 	 */
233 	int		(*tran_bus_config)(
234 				dev_info_t		*hba_dip,
235 				uint_t			flag,
236 				ddi_bus_config_op_t	op,
237 				void			*arg,
238 				dev_info_t		**tgt_dipp);
239 
240 	int		(*tran_bus_unconfig)(
241 				dev_info_t		*hba_dip,
242 				uint_t			flag,
243 				ddi_bus_config_op_t	op,
244 				void			*arg);
245 
246 	int		(*tran_bus_power)(
247 				dev_info_t		*dip,
248 				void			*impl_arg,
249 				pm_bus_power_op_t	op,
250 				void			*arg,
251 				void			*result);
252 
253 	/*
254 	 * Inter-Connect type of trasnport as defined in
255 	 * usr/src/uts/common/sys/scsi/impl/services.h
256 	 */
257 	int		tran_interconnect_type;
258 	int		(*tran_pkt_constructor)(
259 				struct scsi_pkt		*pkt,
260 				scsi_hba_tran_t		*tran,
261 				int			kmflag);
262 	void		(*tran_pkt_destructor)(
263 				struct scsi_pkt		*pkt,
264 				scsi_hba_tran_t		*tran);
265 	kmem_cache_t	*tran_pkt_cache_ptr;
266 
267 	uint_t		tran_hba_len;
268 	int		(*tran_setup_pkt)(
269 				struct scsi_pkt		*pkt,
270 				int			(*callback)(
271 								caddr_t	arg),
272 				caddr_t			callback_arg);
273 	void		(*tran_teardown_pkt)(
274 				struct scsi_pkt		*pkt);
275 	ddi_dma_attr_t	tran_dma_attr;
276 
277 };
278 
279 #ifdef __lock_lint
280 _NOTE(SCHEME_PROTECTS_DATA("stable data", scsi_hba_tran::tran_sd))
281 /*
282  * we only modify the dma atributes (like dma_attr_granular) upon
283  * attach and in response to a setcap.  It is also up to the target
284  * driver to not have any outstanding I/Os when it is changing the
285  * capabilities of the transport.
286  */
287 _NOTE(SCHEME_PROTECTS_DATA("serialized by target driver", \
288 	scsi_hba_tran::tran_dma_attr.dma_attr_granular))
289 #endif
290 
291 /*
292  * Prototypes for SCSI HBA interface functions
293  *
294  * All these functions are public interfaces, with the
295  * exception of scsi_initialize_hba_interface() and
296  * scsi_uninitialize_hba_interface(), called by the
297  * scsi module _init() and _fini(), respectively.
298  */
299 
300 extern void		scsi_initialize_hba_interface(void);
301 
302 #ifdef	NO_SCSI_FINI_YET
303 extern void		scsi_uninitialize_hba_interface(void);
304 #endif	/* NO_SCSI_FINI_YET */
305 
306 extern int		scsi_hba_init(
307 				struct modlinkage	*modlp);
308 
309 extern void		scsi_hba_fini(
310 				struct modlinkage	*modlp);
311 
312 extern int		scsi_hba_attach(
313 				dev_info_t		*hba_dip,
314 				ddi_dma_lim_t		*hba_lim,
315 				scsi_hba_tran_t		*hba_tran,
316 				int			flags,
317 				void			*hba_options);
318 
319 extern int		scsi_hba_attach_setup(
320 				dev_info_t		*hba_dip,
321 				ddi_dma_attr_t		*hba_dma_attr,
322 				scsi_hba_tran_t		*hba_tran,
323 				int			flags);
324 
325 extern int		scsi_hba_detach(
326 				dev_info_t		*hba_dip);
327 
328 extern scsi_hba_tran_t	*scsi_hba_tran_alloc(
329 				dev_info_t		*hba_dip,
330 				int			flags);
331 
332 extern void		scsi_hba_tran_free(
333 				scsi_hba_tran_t		*hba_tran);
334 
335 extern int		scsi_hba_probe(
336 				struct scsi_device	*sd,
337 				int			(*callback)(void));
338 
339 extern int		scsi_get_device_type_scsi_options(
340 				dev_info_t		*hba_dip,
341 				struct scsi_device	*devp,
342 				int			default_scsi_options);
343 
344 extern struct scsi_pkt	*scsi_hba_pkt_alloc(
345 				dev_info_t		*hba_dip,
346 				struct scsi_address	*ap,
347 				int			cmdlen,
348 				int			statuslen,
349 				int			tgtlen,
350 				int			hbalen,
351 				int			(*callback)(caddr_t),
352 				caddr_t			arg);
353 
354 extern void		scsi_hba_pkt_free(
355 				struct scsi_address	*ap,
356 				struct scsi_pkt		*pkt);
357 
358 
359 extern int		scsi_hba_lookup_capstr(
360 				char			*capstr);
361 
362 extern int		scsi_hba_in_panic(void);
363 
364 extern int		scsi_hba_open(
365 				dev_t			*devp,
366 				int			flags,
367 				int			otyp,
368 				cred_t			*credp);
369 
370 extern int		scsi_hba_close(
371 				dev_t			dev,
372 				int			flag,
373 				int			otyp,
374 				cred_t			*credp);
375 
376 extern int		scsi_hba_ioctl(
377 				dev_t			dev,
378 				int			cmd,
379 				intptr_t		arg,
380 				int			mode,
381 				cred_t			*credp,
382 				int			*rvalp);
383 
384 extern void		scsi_hba_nodename_compatible_get(
385 				struct scsi_inquiry	*inq,
386 				char			*binding_set,
387 				int			dtype_node,
388 				char			*compat0,
389 				char			**nodenamep,
390 				char			***compatiblep,
391 				int			*ncompatiblep);
392 
393 extern void		scsi_hba_nodename_compatible_free(
394 				char			*nodename,
395 				char			**compatible);
396 
397 
398 extern int		scsi_hba_prop_update_inqstring(
399 				struct scsi_device	*devp,
400 				char			*name,
401 				char			*data,
402 				size_t			len);
403 
404 /*
405  * Flags for scsi_hba_attach
406  */
407 #define	SCSI_HBA_TRAN_CLONE	0x01		/* clone scsi_hba_tran_t */
408 						/* structure per target */
409 #define	SCSI_HBA_TRAN_ALLOC	0x02		/* set if scsi_hba_tran_alloc */
410 						/* is called */
411 #define	SCSI_HBA_TRAN_CDB	0x04		/* allocate cdb */
412 #define	SCSI_HBA_TRAN_SCB	0x08		/* allocate sense */
413 
414 /*
415  * Flags for scsi_hba allocation functions
416  */
417 #define	SCSI_HBA_CANSLEEP	0x01		/* can sleep */
418 
419 /*
420  * For minor nodes created by the SCSA framework, minor numbers are
421  * formed by left-shifting instance by INST_MINOR_SHIFT and OR in a
422  * number less than 64.
423  *
424  * - Numbers 0 - 31 are reserved by the framework, part of the range are
425  *	in use, as defined below.
426  *
427  * - Numbers 32 - 63 are available for HBA driver use.
428  */
429 #define	INST_MINOR_SHIFT	6
430 #define	TRAN_MINOR_MASK		((1 << INST_MINOR_SHIFT) - 1)
431 #define	TRAN_OPEN_EXCL		(uint64_t)-1
432 
433 #define	DEVCTL_MINOR		0
434 #define	SCSI_MINOR		1
435 
436 #define	INST2DEVCTL(x)		(((x) << INST_MINOR_SHIFT) | DEVCTL_MINOR)
437 #define	INST2SCSI(x)		(((x) << INST_MINOR_SHIFT) | SCSI_MINOR)
438 #define	MINOR2INST(x)		((x) >> INST_MINOR_SHIFT)
439 
440 
441 #endif	/* _KERNEL */
442 
443 
444 #ifdef	__cplusplus
445 }
446 #endif
447 
448 #endif	/* _SYS_SCSI_IMPL_TRANSPORT_H */
449