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