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 */