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