xref: /illumos-gate/usr/src/uts/common/sys/scsi/impl/transport.h (revision 66582b606a8194f7f3ba5b3a3a6dca5b0d346361)
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 (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2014 Garrett D'Amore <garrett@damore.org>
24  */
25 
26 #ifndef	_SYS_SCSI_IMPL_TRANSPORT_H
27 #define	_SYS_SCSI_IMPL_TRANSPORT_H
28 
29 /*
30  * Include the loadable module wrapper.
31  */
32 #include <sys/modctl.h>
33 #include <sys/note.h>
34 
35 #ifdef	__cplusplus
36 extern "C" {
37 #endif
38 
39 #ifdef	_KERNEL
40 
41 /*
42  * Opaque  handles to address maps
43  */
44 typedef struct __scsi_iportmap	scsi_hba_iportmap_t;
45 typedef struct __scsi_tgtmap	scsi_hba_tgtmap_t;
46 
47 /*
48  * SCSI transport structures
49  *
50  *	As each Host Adapter makes itself known to the system,
51  *	it will create and register with the library the structure
52  *	described below. This is so that the library knows how to route
53  *	packets, resource control requests, and capability requests
54  *	for any particular host adapter. The 'a_hba_tran' field of a
55  *	scsi_address structure made known to a Target driver will
56  *	point to one of these transport structures.
57  */
58 
59 typedef struct scsi_hba_tran	scsi_hba_tran_t;
60 
61 struct scsi_hba_tran {
62 	/*
63 	 * Ptr to the device info structure for this particular HBA. If a SCSA
64 	 * HBA driver separates initiator port function from HBA function,
65 	 * this field still refers to the HBA and is used to manage DMA.
66 	 */
67 	dev_info_t	*tran_hba_dip;
68 
69 	/*
70 	 * Private fields for use by the HBA itself.
71 	 */
72 	void		*tran_hba_private;	/* HBA softstate */
73 
74 	/*
75 	 * The following two fields are only used in the deprecated
76 	 * SCSI_HBA_TRAN_CLONE case. Use SCSI_HBA_ADDR_COMPLEX instead.
77 	 */
78 	void			*tran_tgt_private;
79 	struct scsi_device	*tran_sd;
80 
81 	/*
82 	 * Vectors to point to specific HBA entry points
83 	 */
84 	int		(*tran_tgt_init)(
85 				dev_info_t		*hba_dip,
86 				dev_info_t		*tgt_dip,
87 				scsi_hba_tran_t		*tran,
88 				struct scsi_device	*sd);
89 
90 	int		(*tran_tgt_probe)(
91 				struct scsi_device	*sd,
92 				int			(*callback)(
93 								void));
94 	void		(*tran_tgt_free)(
95 				dev_info_t		*hba_dip,
96 				dev_info_t		*tgt_dip,
97 				scsi_hba_tran_t		*tran,
98 				struct scsi_device	*sd);
99 
100 	int		(*tran_start)(
101 				struct scsi_address	*ap,
102 				struct scsi_pkt		*pkt);
103 
104 	int		(*tran_reset)(
105 				struct scsi_address	*ap,
106 				int			level);
107 
108 	int		(*tran_abort)(
109 				struct scsi_address	*ap,
110 				struct scsi_pkt		*pkt);
111 
112 	int		(*tran_getcap)(
113 				struct scsi_address	*ap,
114 				char			*cap,
115 				int			whom);
116 
117 	int		(*tran_setcap)(
118 				struct scsi_address	*ap,
119 				char			*cap,
120 				int			value,
121 				int			whom);
122 
123 	struct scsi_pkt	*(*tran_init_pkt)(
124 				struct scsi_address	*ap,
125 				struct scsi_pkt		*pkt,
126 				struct buf		*bp,
127 				int			cmdlen,
128 				int			statuslen,
129 				int			tgtlen,
130 				int			flags,
131 				int			(*callback)(
132 								caddr_t	arg),
133 				caddr_t			callback_arg);
134 
135 	void		(*tran_destroy_pkt)(
136 				struct scsi_address	*ap,
137 				struct scsi_pkt		*pkt);
138 
139 	void		(*tran_dmafree)(
140 				struct scsi_address	*ap,
141 				struct scsi_pkt		*pkt);
142 
143 	void		(*tran_sync_pkt)(
144 				struct scsi_address	*ap,
145 				struct scsi_pkt		*pkt);
146 
147 	int		(*tran_reset_notify)(
148 				struct scsi_address	*ap,
149 				int			flag,
150 				void			(*callback)(caddr_t),
151 				caddr_t			arg);
152 
153 	int		(*tran_get_bus_addr)(
154 				struct scsi_device	*sd,
155 				char			*name,
156 				int			len);
157 
158 	int		(*tran_get_name)(
159 				struct scsi_device	*sd,
160 				char			*name,
161 				int			len);
162 
163 	int		(*tran_clear_aca)(
164 				struct scsi_address	*ap);
165 
166 	int		(*tran_clear_task_set)(
167 				struct scsi_address	*ap);
168 
169 	int		(*tran_terminate_task)(
170 				struct scsi_address	*ap,
171 				struct scsi_pkt		*pkt);
172 
173 	int		(*tran_get_eventcookie)(
174 				dev_info_t		*hba_dip,
175 				dev_info_t		*tgt_dip,
176 				char			*name,
177 				ddi_eventcookie_t	*eventp);
178 
179 	int		(*tran_add_eventcall)(
180 				dev_info_t		*hba_dip,
181 				dev_info_t		*tgt_dip,
182 				ddi_eventcookie_t	event,
183 				void			(*callback)(
184 						dev_info_t *tgt_dip,
185 						ddi_eventcookie_t event,
186 						void *arg,
187 						void *bus_impldata),
188 				void			*arg,
189 				ddi_callback_id_t *cb_id);
190 
191 	int		(*tran_remove_eventcall)(dev_info_t *devi,
192 			ddi_callback_id_t cb_id);
193 
194 	int		(*tran_post_event)(
195 				dev_info_t		*hba_dip,
196 				dev_info_t		*tgt_dip,
197 				ddi_eventcookie_t	event,
198 				void			*bus_impldata);
199 
200 	int		(*tran_quiesce)(
201 				dev_info_t		*hba_dip);
202 
203 	int		(*tran_unquiesce)(
204 				dev_info_t		*hba_dip);
205 
206 	int		(*tran_bus_reset)(
207 				dev_info_t		*hba_dip,
208 				int			level);
209 
210 	/*
211 	 * Implementation-private specifics.
212 	 * No HBA should refer to any of the fields below.
213 	 * This information can and will change.
214 	 */
215 	int			tran_hba_flags;		/* flag options */
216 
217 	uint_t			tran_obs1;
218 	uchar_t			tran_obs2;
219 	uchar_t			tran_obs3;
220 
221 	/*
222 	 * open_lock: protect tran_minor_isopen
223 	 * open_flag: bit field indicating which minor nodes are open.
224 	 *	0 = closed, 1 = shared open, all bits 1 = excl open.
225 	 *
226 	 * NOTE: Unused if HBA driver implements its own open(9e) entry point.
227 	 */
228 	kmutex_t		tran_open_lock;
229 	uint64_t		tran_open_flag;
230 
231 	/*
232 	 * bus_config vectors - ON Consolidation Private
233 	 * These interfaces are subject to change.
234 	 */
235 	int		(*tran_bus_config)(
236 				dev_info_t		*hba_dip,
237 				uint_t			flag,
238 				ddi_bus_config_op_t	op,
239 				void			*arg,
240 				dev_info_t		**tgt_dipp);
241 
242 	int		(*tran_bus_unconfig)(
243 				dev_info_t		*hba_dip,
244 				uint_t			flag,
245 				ddi_bus_config_op_t	op,
246 				void			*arg);
247 
248 	int		(*tran_bus_power)(
249 				dev_info_t		*dip,
250 				void			*impl_arg,
251 				pm_bus_power_op_t	op,
252 				void			*arg,
253 				void			*result);
254 
255 	/*
256 	 * Inter-Connect type of transport as defined in
257 	 * usr/src/uts/common/sys/scsi/impl/services.h
258 	 */
259 	int		tran_interconnect_type;
260 
261 	/* tran_setup_pkt(9E) related scsi_pkt fields */
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 	uint_t		tran_hba_len;
271 	int		(*tran_setup_pkt)(
272 				struct scsi_pkt		*pkt,
273 				int			(*callback)(
274 								caddr_t	arg),
275 				caddr_t			callback_arg);
276 	void		(*tran_teardown_pkt)(
277 				struct scsi_pkt		*pkt);
278 	ddi_dma_attr_t	tran_dma_attr;
279 
280 	void		*tran_extension;
281 
282 	/*
283 	 * An fm_capable HBA driver can set tran_fm_capable prior to
284 	 * scsi_hba_attach_setup(). If not set, SCSA provides a default
285 	 * implementation.
286 	 */
287 	int		tran_fm_capable;
288 
289 	/*
290 	 * Ptr to the device info structure for initiator port. If a SCSA HBA
291 	 * driver separates initiator port function from HBA function, this
292 	 * field still refers to the initiator port.
293 	 */
294 	dev_info_t	*tran_iport_dip;
295 
296 	/*
297 	 * map of initiator ports below HBA
298 	 */
299 	scsi_hba_iportmap_t	*tran_iportmap;
300 
301 	/*
302 	 * map of targets below initiator
303 	 */
304 	scsi_hba_tgtmap_t	*tran_tgtmap;
305 
306 #ifdef	SCSI_SIZE_CLEAN_VERIFY
307 	/*
308 	 * Must be last: Building a driver with-and-without
309 	 * -DSCSI_SIZE_CLEAN_VERIFY, and checking driver modules for
310 	 * differences with a tools like 'wsdiff' allows a developer to verify
311 	 * that their driver has no dependencies on scsi*(9S) size.
312 	 */
313 	int		_pad[8];
314 #endif	/* SCSI_SIZE_CLEAN_VERIFY */
315 };
316 size_t	scsi_hba_tran_size();			/* private */
317 
318 #ifdef __lock_lint
319 _NOTE(SCHEME_PROTECTS_DATA("stable data",
320 	scsi_hba_tran::tran_sd
321 	scsi_hba_tran::tran_hba_dip
322 	scsi_hba_tran::tran_hba_flags
323 	scsi_hba_tran::tran_open_flag
324 	scsi_hba_tran::tran_pkt_cache_ptr))
325 /*
326  * we only modify the dma attributes (like dma_attr_granular) upon
327  * attach and in response to a setcap. It is also up to the target
328  * driver to not have any outstanding I/Os when it is changing the
329  * capabilities of the transport.
330  */
331 _NOTE(SCHEME_PROTECTS_DATA("serialized by target driver", \
332 	scsi_hba_tran::tran_dma_attr.dma_attr_granular))
333 #endif
334 
335 /*
336  * Prototypes for SCSI HBA interface functions
337  *
338  * All these functions are public interfaces, with the
339  * exception of:
340  *	interface				called by
341  *	scsi_initialize_hba_interface()		_init() of scsi module
342  *	scsi_uninitialize_hba_interface()	_fini() of scsi module
343  */
344 
345 void		scsi_initialize_hba_interface(void);
346 
347 #ifdef	NO_SCSI_FINI_YET
348 void		scsi_uninitialize_hba_interface(void);
349 #endif	/* NO_SCSI_FINI_YET */
350 
351 int		scsi_hba_init(
352 				struct modlinkage	*modlp);
353 
354 void		scsi_hba_fini(
355 				struct modlinkage	*modlp);
356 
357 int		scsi_hba_attach_setup(
358 				dev_info_t		*hba_dip,
359 				ddi_dma_attr_t		*hba_dma_attr,
360 				scsi_hba_tran_t		*tran,
361 				int			flags);
362 
363 int		scsi_hba_detach(
364 				dev_info_t		*hba_dip);
365 
366 scsi_hba_tran_t	*scsi_hba_tran_alloc(
367 				dev_info_t		*hba_dip,
368 				int			flags);
369 
370 int		scsi_tran_ext_alloc(
371 				scsi_hba_tran_t		*tran,
372 				size_t			length,
373 				int			flags);
374 
375 void		scsi_tran_ext_free(
376 				scsi_hba_tran_t		*tran,
377 				size_t			length);
378 
379 void		scsi_hba_tran_free(
380 				scsi_hba_tran_t		*tran);
381 
382 int		scsi_hba_probe(
383 				struct scsi_device	*sd,
384 				int			(*callback)(void));
385 
386 int		scsi_hba_probe_pi(
387 				struct scsi_device	*sd,
388 				int			(*callback)(void),
389 				int			pi);
390 
391 int		scsi_hba_ua_get_reportdev(
392 				struct scsi_device	*sd,
393 				char			*ba,
394 				int			len);
395 
396 int		scsi_hba_ua_get(
397 				struct scsi_device	*sd,
398 				char			*ua,
399 				int			len);
400 
401 char		*scsi_get_device_type_string(
402 				char			*prop_name,
403 				dev_info_t		*hba_dip,
404 				struct scsi_device	*sd);
405 
406 int		scsi_get_scsi_maxluns(
407 				struct scsi_device	*sd);
408 
409 int		scsi_get_scsi_options(
410 				struct scsi_device	*sd,
411 				int			default_scsi_options);
412 
413 int		scsi_get_device_type_scsi_options(
414 				dev_info_t		*hba_dip,
415 				struct scsi_device	*sd,
416 				int			default_scsi_options);
417 
418 struct scsi_pkt	*scsi_hba_pkt_alloc(
419 				dev_info_t		*hba_dip,
420 				struct scsi_address	*ap,
421 				int			cmdlen,
422 				int			statuslen,
423 				int			tgtlen,
424 				int			hbalen,
425 				int			(*callback)(caddr_t),
426 				caddr_t			arg);
427 
428 void		scsi_hba_pkt_free(
429 				struct scsi_address	*ap,
430 				struct scsi_pkt		*pkt);
431 
432 
433 int		scsi_hba_lookup_capstr(
434 				char			*capstr);
435 
436 int		scsi_hba_in_panic(void);
437 
438 int		scsi_hba_open(
439 				dev_t			*devp,
440 				int			flags,
441 				int			otyp,
442 				cred_t			*credp);
443 
444 int		scsi_hba_close(
445 				dev_t			dev,
446 				int			flag,
447 				int			otyp,
448 				cred_t			*credp);
449 
450 int		scsi_hba_ioctl(
451 				dev_t			dev,
452 				int			cmd,
453 				intptr_t		arg,
454 				int			mode,
455 				cred_t			*credp,
456 				int			*rvalp);
457 
458 void		scsi_hba_nodename_compatible_get(
459 				struct scsi_inquiry	*inq,
460 				char			*binding_set,
461 				int			dtype_node,
462 				char			*compat0,
463 				char			**nodenamep,
464 				char			***compatiblep,
465 				int			*ncompatiblep);
466 
467 void		scsi_hba_nodename_compatible_free(
468 				char			*nodename,
469 				char			**compatible);
470 
471 int		scsi_device_prop_update_inqstring(
472 				struct scsi_device	*sd,
473 				char			*name,
474 				char			*data,
475 				size_t			len);
476 
477 void		scsi_hba_pkt_comp(
478 				struct scsi_pkt		*pkt);
479 
480 int		scsi_device_identity(
481 				struct scsi_device	*sd,
482 				int			(*callback)(void));
483 
484 char		*scsi_hba_iport_unit_address(
485 				dev_info_t		*dip);
486 
487 int		scsi_hba_iport_register(
488 				dev_info_t		*dip,
489 				char			*port);
490 
491 int		scsi_hba_iport_exist(
492 				dev_info_t		*dip);
493 
494 dev_info_t	*scsi_hba_iport_find(
495 				dev_info_t		*pdip,
496 				char			*portnm);
497 
498 
499 /*
500  * Flags for scsi_hba_attach
501  *
502  * SCSI_HBA_ADDR_SPI		The host adapter driver wants the
503  *				scsi_address(9S) structure to be maintained
504  *				in legacy SPI 'a_target'/'a_lun' form (default).
505  *
506  * SCSI_HBA_ADDR_COMPLEX	The host adapter has a complex unit-address
507  *				space, and the HBA driver wants to maintain
508  *				per-scsi_device(9S) HBA private data using
509  *				scsi_address_device(9F) and
510  *				scsi_device_hba_private_[gs]et(9F).  The HBA
511  *				driver must maintain a private representation
512  *				of the scsi_device(9S) unit-address - typically
513  *				established during tran_tgt_init(9F) based on
514  *				property values.
515  *
516  * SCSI_HBA_TRAN_PHCI		The host adapter is an mpxio/scsi_vhci pHCI.
517  *				The framework should take care of
518  *				mdi_phci_register() stuff.
519  *
520  * SCSI_HBA_HBA			The host adapter node (associated with a PCI
521  *				function) is just an HBA, all SCSI initiator
522  *				port function is provided by separate 'iport'
523  *				children of the host adapter node.  These iport
524  *				children bind to the same driver as the host
525  *				adapter node. Both nodes are managed by the
526  *				same driver. The driver can distinguish context
527  *				by calling scsi_hba_iport_unit_address().
528  *
529  * ::SCSI_HBA_TRAN_CLONE	Deprecated: use SCSI_HBA_ADDR_COMPLEX instead.
530  *				SCSI_HBA_TRAN_CLONE was a KLUDGE to address
531  *				limitations of the scsi_address(9S) structure
532  *				via duplication of scsi_hba_tran(9S) and
533  *				use of tran_tgt_private.
534  *
535  */
536 #define	SCSI_HBA_TRAN_CLONE	0x01	/* Deprecated */
537 #define	SCSI_HBA_TRAN_PHCI	0x02	/* treat HBA as mpxio 'pHCI' */
538 #define	SCSI_HBA_TRAN_CDB	0x04	/* allocate cdb */
539 #define	SCSI_HBA_TRAN_SCB	0x08	/* allocate sense */
540 #define	SCSI_HBA_HBA		0x10	/* all HBA children are iports */
541 
542 #define	SCSI_HBA_ADDR_SPI	0x20	/* scsi_address in SPI form */
543 #define	SCSI_HBA_ADDR_COMPLEX	0x40	/* scsi_address is COMPLEX */
544 
545 /* upper bits used to record SCSA configuration state */
546 #define	SCSI_HBA_SCSA_PHCI	0x10000	/* need mdi_phci_unregister */
547 #define	SCSI_HBA_SCSA_TA	0x20000	/* scsi_hba_tran_alloc used */
548 #define	SCSI_HBA_SCSA_FM	0x40000	/* using common ddi_fm_* */
549 
550 /*
551  * Flags for scsi_hba allocation functions
552  */
553 #define	SCSI_HBA_CANSLEEP	0x01		/* can sleep */
554 
555 /*
556  * Support extra flavors for SCSA children
557  */
558 #define	SCSA_FLAVOR_SCSI_DEVICE	NDI_FLAVOR_VANILLA
559 #define	SCSA_FLAVOR_SMP		1
560 #define	SCSA_FLAVOR_IPORT	2
561 #define	SCSA_NFLAVORS		3
562 
563 /*
564  * Maximum number of iport nodes under PCI function
565  */
566 #define	SCSI_HBA_MAX_IPORTS	32
567 
568 /*
569  * SCSI iport map interfaces
570  */
571 int	scsi_hba_iportmap_create(
572 				dev_info_t		*hba_dip,
573 				int			csync_usec,
574 				int			stable_usec,
575 				scsi_hba_iportmap_t	**iportmapp);
576 
577 int	scsi_hba_iportmap_iport_add(
578 				scsi_hba_iportmap_t	*iportmap,
579 				char			*iport_addr,
580 				void			*iport_priv);
581 
582 int	scsi_hba_iportmap_iport_remove(
583 				scsi_hba_iportmap_t	*iportmap,
584 				char			*iport_addr);
585 
586 void	scsi_hba_iportmap_destroy(scsi_hba_iportmap_t	*iportmap);
587 
588 /*
589  * SCSI target map interfaces
590  */
591 typedef enum {
592 	SCSI_TM_FULLSET = 0,
593 	SCSI_TM_PERADDR
594 } scsi_tgtmap_mode_t;
595 
596 typedef enum {
597 	SCSI_TGT_SCSI_DEVICE = 0,
598 	SCSI_TGT_SMP_DEVICE,
599 	SCSI_TGT_NTYPES
600 } scsi_tgtmap_tgt_type_t;
601 
602 typedef enum {
603 	SCSI_TGT_DEACT_RSN_GONE = 0,
604 	SCSI_TGT_DEACT_RSN_CFG_FAIL,
605 	SCSI_TGT_DEACT_RSN_UNSTBL
606 } scsi_tgtmap_deact_rsn_t;
607 
608 typedef void	(*scsi_tgt_activate_cb_t)(
609 				void			*tgtmap_priv,
610 				char			*tgt_addr,
611 				scsi_tgtmap_tgt_type_t	tgt_type,
612 				void			**tgt_privp);
613 typedef boolean_t	(*scsi_tgt_deactivate_cb_t)(
614 				void			*tgtmap_priv,
615 				char			*tgt_addr,
616 				scsi_tgtmap_tgt_type_t	tgt_type,
617 				void			*tgt_priv,
618 				scsi_tgtmap_deact_rsn_t tgt_deact_rsn);
619 int	scsi_hba_tgtmap_create(
620 				dev_info_t		*iport_dip,
621 				scsi_tgtmap_mode_t	rpt_mode,
622 				int			csync_usec,
623 				int			stable_usec,
624 				void			*tgtmap_priv,
625 				scsi_tgt_activate_cb_t	activate_cb,
626 				scsi_tgt_deactivate_cb_t deactivate_cb,
627 				scsi_hba_tgtmap_t	**tgtmapp);
628 
629 int	scsi_hba_tgtmap_set_begin(scsi_hba_tgtmap_t	*tgtmap);
630 
631 int	scsi_hba_tgtmap_set_add(
632 				scsi_hba_tgtmap_t	*tgtmap,
633 				scsi_tgtmap_tgt_type_t	tgt_type,
634 				char			*tgt_addr,
635 				void			*tgt_priv);
636 
637 int	scsi_hba_tgtmap_set_end(
638 				scsi_hba_tgtmap_t	*tgtmap,
639 				uint_t			flags);
640 
641 int	scsi_hba_tgtmap_set_flush(scsi_hba_tgtmap_t	*tgtmap);
642 
643 int	scsi_hba_tgtmap_tgt_add(
644 				scsi_hba_tgtmap_t	*tgtmap,
645 				scsi_tgtmap_tgt_type_t	tgt_type,
646 				char			*tgt_addr,
647 				void			*tgt_priv);
648 
649 int	scsi_hba_tgtmap_tgt_remove(
650 				scsi_hba_tgtmap_t	*tgtmap,
651 				scsi_tgtmap_tgt_type_t	tgt_type,
652 				char			*tgt_addr);
653 
654 void	scsi_hba_tgtmap_destroy(scsi_hba_tgtmap_t	*tgt_map);
655 
656 
657 /*
658  * For minor nodes created by the SCSA framework, minor numbers are
659  * formed by left-shifting instance by INST_MINOR_SHIFT and OR in a
660  * number less than 64.
661  *
662  * - Numbers 0 - 31 are reserved by the framework, part of the range are
663  *	in use, as defined below.
664  *
665  * - Numbers 32 - 63 are available for HBA driver use.
666  */
667 #define	INST_MINOR_SHIFT	6
668 #define	TRAN_MINOR_MASK		((1 << INST_MINOR_SHIFT) - 1)
669 #define	TRAN_OPEN_EXCL		(uint64_t)-1
670 
671 #define	DEVCTL_MINOR		0
672 #define	SCSI_MINOR		1
673 
674 #define	INST2DEVCTL(x)		(((x) << INST_MINOR_SHIFT) | DEVCTL_MINOR)
675 #define	INST2SCSI(x)		(((x) << INST_MINOR_SHIFT) | SCSI_MINOR)
676 #define	MINOR2INST(x)		((x) >> INST_MINOR_SHIFT)
677 
678 #define	SCSI_HBA_PROP_RECEPTACLE_LABEL	"receptacle-label"
679 
680 #endif	/* _KERNEL */
681 
682 #ifdef	__cplusplus
683 }
684 #endif
685 
686 #endif	/* _SYS_SCSI_IMPL_TRANSPORT_H */
687