transport.h revision 4851:5e98cf4c2164
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
39extern "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
56typedef struct scsi_hba_tran	scsi_hba_tran_t;
57
58struct 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
300extern void		scsi_initialize_hba_interface(void);
301
302#ifdef	NO_SCSI_FINI_YET
303extern void		scsi_uninitialize_hba_interface(void);
304#endif	/* NO_SCSI_FINI_YET */
305
306extern int		scsi_hba_init(
307				struct modlinkage	*modlp);
308
309extern void		scsi_hba_fini(
310				struct modlinkage	*modlp);
311
312extern 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
319extern 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
325extern int		scsi_hba_detach(
326				dev_info_t		*hba_dip);
327
328extern scsi_hba_tran_t	*scsi_hba_tran_alloc(
329				dev_info_t		*hba_dip,
330				int			flags);
331
332extern void		scsi_hba_tran_free(
333				scsi_hba_tran_t		*hba_tran);
334
335extern int		scsi_hba_probe(
336				struct scsi_device	*sd,
337				int			(*callback)(void));
338
339char			*scsi_get_device_type_string(
340				char			*prop_name,
341				dev_info_t		*hba_dip,
342				struct scsi_device	*devp);
343
344extern int		scsi_get_device_type_scsi_options(
345				dev_info_t		*hba_dip,
346				struct scsi_device	*devp,
347				int			default_scsi_options);
348
349extern struct scsi_pkt	*scsi_hba_pkt_alloc(
350				dev_info_t		*hba_dip,
351				struct scsi_address	*ap,
352				int			cmdlen,
353				int			statuslen,
354				int			tgtlen,
355				int			hbalen,
356				int			(*callback)(caddr_t),
357				caddr_t			arg);
358
359extern void		scsi_hba_pkt_free(
360				struct scsi_address	*ap,
361				struct scsi_pkt		*pkt);
362
363
364extern int		scsi_hba_lookup_capstr(
365				char			*capstr);
366
367extern int		scsi_hba_in_panic(void);
368
369extern int		scsi_hba_open(
370				dev_t			*devp,
371				int			flags,
372				int			otyp,
373				cred_t			*credp);
374
375extern int		scsi_hba_close(
376				dev_t			dev,
377				int			flag,
378				int			otyp,
379				cred_t			*credp);
380
381extern int		scsi_hba_ioctl(
382				dev_t			dev,
383				int			cmd,
384				intptr_t		arg,
385				int			mode,
386				cred_t			*credp,
387				int			*rvalp);
388
389extern void		scsi_hba_nodename_compatible_get(
390				struct scsi_inquiry	*inq,
391				char			*binding_set,
392				int			dtype_node,
393				char			*compat0,
394				char			**nodenamep,
395				char			***compatiblep,
396				int			*ncompatiblep);
397
398extern void		scsi_hba_nodename_compatible_free(
399				char			*nodename,
400				char			**compatible);
401
402
403extern int		scsi_hba_prop_update_inqstring(
404				struct scsi_device	*devp,
405				char			*name,
406				char			*data,
407				size_t			len);
408
409/*
410 * Flags for scsi_hba_attach
411 */
412#define	SCSI_HBA_TRAN_CLONE	0x01		/* clone scsi_hba_tran_t */
413						/* structure per target */
414#define	SCSI_HBA_TRAN_ALLOC	0x02		/* set if scsi_hba_tran_alloc */
415						/* is called */
416#define	SCSI_HBA_TRAN_CDB	0x04		/* allocate cdb */
417#define	SCSI_HBA_TRAN_SCB	0x08		/* allocate sense */
418
419/*
420 * Flags for scsi_hba allocation functions
421 */
422#define	SCSI_HBA_CANSLEEP	0x01		/* can sleep */
423
424/*
425 * For minor nodes created by the SCSA framework, minor numbers are
426 * formed by left-shifting instance by INST_MINOR_SHIFT and OR in a
427 * number less than 64.
428 *
429 * - Numbers 0 - 31 are reserved by the framework, part of the range are
430 *	in use, as defined below.
431 *
432 * - Numbers 32 - 63 are available for HBA driver use.
433 */
434#define	INST_MINOR_SHIFT	6
435#define	TRAN_MINOR_MASK		((1 << INST_MINOR_SHIFT) - 1)
436#define	TRAN_OPEN_EXCL		(uint64_t)-1
437
438#define	DEVCTL_MINOR		0
439#define	SCSI_MINOR		1
440
441#define	INST2DEVCTL(x)		(((x) << INST_MINOR_SHIFT) | DEVCTL_MINOR)
442#define	INST2SCSI(x)		(((x) << INST_MINOR_SHIFT) | SCSI_MINOR)
443#define	MINOR2INST(x)		((x) >> INST_MINOR_SHIFT)
444
445
446#endif	/* _KERNEL */
447
448
449#ifdef	__cplusplus
450}
451#endif
452
453#endif	/* _SYS_SCSI_IMPL_TRANSPORT_H */
454