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 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #include <sys/note.h> 27 28 /* 29 * Generic SCSI Host Bus Adapter interface implementation 30 */ 31 #include <sys/scsi/scsi.h> 32 #include <sys/file.h> 33 #include <sys/ddi_impldefs.h> 34 #include <sys/ndi_impldefs.h> 35 #include <sys/ddi.h> 36 #include <sys/epm.h> 37 38 extern struct scsi_pkt *scsi_init_cache_pkt(struct scsi_address *, 39 struct scsi_pkt *, struct buf *, int, int, int, int, 40 int (*)(caddr_t), caddr_t); 41 extern void scsi_free_cache_pkt(struct scsi_address *, 42 struct scsi_pkt *); 43 extern void scsi_cache_dmafree(struct scsi_address *, 44 struct scsi_pkt *); 45 extern void scsi_sync_cache_pkt(struct scsi_address *, 46 struct scsi_pkt *); 47 48 /* 49 * Round up all allocations so that we can guarantee 50 * long-long alignment. This is the same alignment 51 * provided by kmem_alloc(). 52 */ 53 #define ROUNDUP(x) (((x) + 0x07) & ~0x07) 54 55 /* Magic number to track correct allocations in wrappers */ 56 #define PKT_WRAPPER_MAGIC 0xa110ced /* alloced correctly */ 57 58 static kmutex_t scsi_hba_mutex; 59 60 kmutex_t scsi_log_mutex; 61 62 63 struct scsi_hba_inst { 64 dev_info_t *inst_dip; 65 scsi_hba_tran_t *inst_hba_tran; 66 struct scsi_hba_inst *inst_next; 67 struct scsi_hba_inst *inst_prev; 68 }; 69 70 static struct scsi_hba_inst *scsi_hba_list = NULL; 71 static struct scsi_hba_inst *scsi_hba_list_tail = NULL; 72 73 74 kmutex_t scsi_flag_nointr_mutex; 75 kcondvar_t scsi_flag_nointr_cv; 76 77 /* 78 * Prototypes for static functions 79 */ 80 static int scsi_hba_bus_ctl( 81 dev_info_t *dip, 82 dev_info_t *rdip, 83 ddi_ctl_enum_t op, 84 void *arg, 85 void *result); 86 87 static int scsi_hba_map_fault( 88 dev_info_t *dip, 89 dev_info_t *rdip, 90 struct hat *hat, 91 struct seg *seg, 92 caddr_t addr, 93 struct devpage *dp, 94 pfn_t pfn, 95 uint_t prot, 96 uint_t lock); 97 98 static int scsi_hba_get_eventcookie( 99 dev_info_t *dip, 100 dev_info_t *rdip, 101 char *name, 102 ddi_eventcookie_t *eventp); 103 104 static int scsi_hba_add_eventcall( 105 dev_info_t *dip, 106 dev_info_t *rdip, 107 ddi_eventcookie_t event, 108 void (*callback)( 109 dev_info_t *dip, 110 ddi_eventcookie_t event, 111 void *arg, 112 void *bus_impldata), 113 void *arg, 114 ddi_callback_id_t *cb_id); 115 116 static int scsi_hba_remove_eventcall( 117 dev_info_t *devi, 118 ddi_callback_id_t id); 119 120 static int scsi_hba_post_event( 121 dev_info_t *dip, 122 dev_info_t *rdip, 123 ddi_eventcookie_t event, 124 void *bus_impldata); 125 126 static int scsi_hba_info( 127 dev_info_t *dip, 128 ddi_info_cmd_t infocmd, 129 void *arg, 130 void **result); 131 132 static int scsi_hba_bus_config(dev_info_t *parent, uint_t flag, 133 ddi_bus_config_op_t op, void *arg, dev_info_t **childp); 134 static int scsi_hba_bus_unconfig(dev_info_t *parent, uint_t flag, 135 ddi_bus_config_op_t op, void *arg); 136 static int scsi_hba_fm_init_child(dev_info_t *self, dev_info_t *child, 137 int cap, ddi_iblock_cookie_t *ibc); 138 static int scsi_hba_bus_power(dev_info_t *parent, void *impl_arg, 139 pm_bus_power_op_t op, void *arg, void *result); 140 141 /* 142 * Busops vector for SCSI HBA's. 143 */ 144 static struct bus_ops scsi_hba_busops = { 145 BUSO_REV, 146 nullbusmap, /* bus_map */ 147 NULL, /* bus_get_intrspec */ 148 NULL, /* bus_add_intrspec */ 149 NULL, /* bus_remove_intrspec */ 150 scsi_hba_map_fault, /* bus_map_fault */ 151 ddi_dma_map, /* bus_dma_map */ 152 ddi_dma_allochdl, /* bus_dma_allochdl */ 153 ddi_dma_freehdl, /* bus_dma_freehdl */ 154 ddi_dma_bindhdl, /* bus_dma_bindhdl */ 155 ddi_dma_unbindhdl, /* bus_unbindhdl */ 156 ddi_dma_flush, /* bus_dma_flush */ 157 ddi_dma_win, /* bus_dma_win */ 158 ddi_dma_mctl, /* bus_dma_ctl */ 159 scsi_hba_bus_ctl, /* bus_ctl */ 160 ddi_bus_prop_op, /* bus_prop_op */ 161 scsi_hba_get_eventcookie, /* bus_get_eventcookie */ 162 scsi_hba_add_eventcall, /* bus_add_eventcall */ 163 scsi_hba_remove_eventcall, /* bus_remove_eventcall */ 164 scsi_hba_post_event, /* bus_post_event */ 165 NULL, /* bus_intr_ctl */ 166 scsi_hba_bus_config, /* bus_config */ 167 scsi_hba_bus_unconfig, /* bus_unconfig */ 168 scsi_hba_fm_init_child, /* bus_fm_init */ 169 NULL, /* bus_fm_fini */ 170 NULL, /* bus_fm_access_enter */ 171 NULL, /* bus_fm_access_exit */ 172 scsi_hba_bus_power /* bus_power */ 173 }; 174 175 176 static struct cb_ops scsi_hba_cbops = { 177 scsi_hba_open, 178 scsi_hba_close, 179 nodev, /* strategy */ 180 nodev, /* print */ 181 nodev, /* dump */ 182 nodev, /* read */ 183 nodev, /* write */ 184 scsi_hba_ioctl, /* ioctl */ 185 nodev, /* devmap */ 186 nodev, /* mmap */ 187 nodev, /* segmap */ 188 nochpoll, /* poll */ 189 ddi_prop_op, /* prop_op */ 190 NULL, /* stream */ 191 D_NEW|D_MP|D_HOTPLUG, /* cb_flag */ 192 CB_REV, /* rev */ 193 nodev, /* int (*cb_aread)() */ 194 nodev /* int (*cb_awrite)() */ 195 }; 196 197 198 /* 199 * Called from _init() when loading scsi module 200 */ 201 void 202 scsi_initialize_hba_interface() 203 { 204 mutex_init(&scsi_hba_mutex, NULL, MUTEX_DRIVER, NULL); 205 mutex_init(&scsi_flag_nointr_mutex, NULL, MUTEX_DRIVER, NULL); 206 cv_init(&scsi_flag_nointr_cv, NULL, CV_DRIVER, NULL); 207 mutex_init(&scsi_log_mutex, NULL, MUTEX_DRIVER, NULL); 208 } 209 210 #ifdef NO_SCSI_FINI_YET 211 /* 212 * Called from _fini() when unloading scsi module 213 */ 214 void 215 scsi_uninitialize_hba_interface() 216 { 217 mutex_destroy(&scsi_hba_mutex); 218 cv_destroy(&scsi_flag_nointr_cv); 219 mutex_destroy(&scsi_flag_nointr_mutex); 220 mutex_destroy(&scsi_log_mutex); 221 } 222 #endif /* NO_SCSI_FINI_YET */ 223 224 int 225 scsi_hba_pkt_constructor(void *buf, void *arg, int kmflag) 226 { 227 struct scsi_pkt_cache_wrapper *pktw; 228 struct scsi_pkt *pkt; 229 scsi_hba_tran_t *tran = (scsi_hba_tran_t *)arg; 230 int pkt_len; 231 char *ptr; 232 233 /* 234 * allocate a chunk of memory for the following: 235 * scsi_pkt 236 * pcw_* fields 237 * pkt_ha_private 238 * pkt_cdbp, if needed 239 * (pkt_private always null) 240 * pkt_scbp, if needed 241 */ 242 pkt_len = tran->tran_hba_len + sizeof (struct scsi_pkt_cache_wrapper); 243 if (tran->tran_hba_flags & SCSI_HBA_TRAN_CDB) 244 pkt_len += DEFAULT_CDBLEN; 245 if (tran->tran_hba_flags & SCSI_HBA_TRAN_SCB) 246 pkt_len += DEFAULT_SCBLEN; 247 bzero(buf, pkt_len); 248 249 ptr = buf; 250 pktw = buf; 251 ptr += sizeof (struct scsi_pkt_cache_wrapper); 252 pkt = &(pktw->pcw_pkt); 253 pkt->pkt_ha_private = (opaque_t)ptr; 254 255 pktw->pcw_magic = PKT_WRAPPER_MAGIC; /* alloced correctly */ 256 /* 257 * keep track of the granularity at the time this handle was 258 * allocated 259 */ 260 pktw->pcw_granular = tran->tran_dma_attr.dma_attr_granular; 261 262 if (ddi_dma_alloc_handle(tran->tran_hba_dip, 263 &tran->tran_dma_attr, 264 kmflag == KM_SLEEP ? SLEEP_FUNC: NULL_FUNC, NULL, 265 &pkt->pkt_handle) != DDI_SUCCESS) { 266 267 return (-1); 268 } 269 ptr += tran->tran_hba_len; 270 if (tran->tran_hba_flags & SCSI_HBA_TRAN_CDB) { 271 pkt->pkt_cdbp = (opaque_t)ptr; 272 ptr += DEFAULT_CDBLEN; 273 } 274 pkt->pkt_private = NULL; 275 if (tran->tran_hba_flags & SCSI_HBA_TRAN_SCB) 276 pkt->pkt_scbp = (opaque_t)ptr; 277 if (tran->tran_pkt_constructor) 278 return ((*tran->tran_pkt_constructor)(pkt, arg, kmflag)); 279 else 280 return (0); 281 } 282 283 #define P_TO_TRAN(pkt) ((pkt)->pkt_address.a_hba_tran) 284 285 void 286 scsi_hba_pkt_destructor(void *buf, void *arg) 287 { 288 struct scsi_pkt_cache_wrapper *pktw = buf; 289 struct scsi_pkt *pkt = &(pktw->pcw_pkt); 290 scsi_hba_tran_t *tran = (scsi_hba_tran_t *)arg; 291 292 ASSERT(pktw->pcw_magic == PKT_WRAPPER_MAGIC); 293 ASSERT((pktw->pcw_flags & PCW_BOUND) == 0); 294 if (tran->tran_pkt_destructor) 295 (*tran->tran_pkt_destructor)(pkt, arg); 296 297 /* make sure nobody messed with our pointers */ 298 ASSERT(pkt->pkt_ha_private == (opaque_t)((char *)pkt + 299 sizeof (struct scsi_pkt_cache_wrapper))); 300 ASSERT(((tran->tran_hba_flags & SCSI_HBA_TRAN_SCB) == 0) || 301 (pkt->pkt_scbp == (opaque_t)((char *)pkt + 302 tran->tran_hba_len + 303 (((tran->tran_hba_flags & SCSI_HBA_TRAN_CDB) == 0) ? 304 0 : DEFAULT_CDBLEN) + 305 DEFAULT_PRIVLEN + sizeof (struct scsi_pkt_cache_wrapper)))); 306 ASSERT(((tran->tran_hba_flags & SCSI_HBA_TRAN_CDB) == 0) || 307 (pkt->pkt_cdbp == (opaque_t)((char *)pkt + 308 tran->tran_hba_len + 309 sizeof (struct scsi_pkt_cache_wrapper)))); 310 ASSERT(pkt->pkt_handle); 311 ddi_dma_free_handle(&pkt->pkt_handle); 312 pkt->pkt_handle = NULL; 313 pkt->pkt_numcookies = 0; 314 pktw->pcw_total_xfer = 0; 315 pktw->pcw_totalwin = 0; 316 pktw->pcw_curwin = 0; 317 } 318 319 /* 320 * Called by an HBA from _init() 321 */ 322 int 323 scsi_hba_init(struct modlinkage *modlp) 324 { 325 struct dev_ops *hba_dev_ops; 326 327 /* 328 * Get the devops structure of the hba, 329 * and put our busops vector in its place. 330 */ 331 hba_dev_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops; 332 ASSERT(hba_dev_ops->devo_bus_ops == NULL); 333 hba_dev_ops->devo_bus_ops = &scsi_hba_busops; 334 335 /* 336 * Provide getinfo and hotplugging ioctl if driver 337 * does not provide them already 338 */ 339 if (hba_dev_ops->devo_cb_ops == NULL) { 340 hba_dev_ops->devo_cb_ops = &scsi_hba_cbops; 341 } 342 if (hba_dev_ops->devo_cb_ops->cb_open == scsi_hba_open) { 343 ASSERT(hba_dev_ops->devo_cb_ops->cb_close == scsi_hba_close); 344 hba_dev_ops->devo_getinfo = scsi_hba_info; 345 } 346 347 return (0); 348 } 349 350 351 /* 352 * Implement this older interface in terms of the new. 353 * This is hardly in the critical path, so avoiding 354 * unnecessary code duplication is more important. 355 */ 356 /*ARGSUSED*/ 357 int 358 scsi_hba_attach( 359 dev_info_t *dip, 360 ddi_dma_lim_t *hba_lim, 361 scsi_hba_tran_t *hba_tran, 362 int flags, 363 void *hba_options) 364 { 365 ddi_dma_attr_t hba_dma_attr; 366 367 bzero(&hba_dma_attr, sizeof (ddi_dma_attr_t)); 368 369 hba_dma_attr.dma_attr_burstsizes = hba_lim->dlim_burstsizes; 370 hba_dma_attr.dma_attr_minxfer = hba_lim->dlim_minxfer; 371 372 return (scsi_hba_attach_setup(dip, &hba_dma_attr, hba_tran, flags)); 373 } 374 375 376 /* 377 * Called by an HBA to attach an instance of the driver 378 */ 379 int 380 scsi_hba_attach_setup( 381 dev_info_t *dip, 382 ddi_dma_attr_t *hba_dma_attr, 383 scsi_hba_tran_t *hba_tran, 384 int flags) 385 { 386 struct dev_ops *hba_dev_ops; 387 struct scsi_hba_inst *elem; 388 int value; 389 int len; 390 char *prop_name; 391 const char *prop_value; 392 int capable; 393 static char *errmsg = 394 "scsi_hba_attach: cannot create property '%s' for %s%d\n"; 395 static const char *interconnect[] = INTERCONNECT_TYPE_ASCII; 396 397 /* 398 * Link this instance into the scsi_hba_list 399 */ 400 elem = kmem_alloc(sizeof (struct scsi_hba_inst), KM_SLEEP); 401 402 mutex_enter(&scsi_hba_mutex); 403 404 elem->inst_dip = dip; 405 elem->inst_hba_tran = hba_tran; 406 407 elem->inst_next = NULL; 408 elem->inst_prev = scsi_hba_list_tail; 409 if (scsi_hba_list == NULL) { 410 scsi_hba_list = elem; 411 } 412 if (scsi_hba_list_tail) { 413 scsi_hba_list_tail->inst_next = elem; 414 } 415 scsi_hba_list_tail = elem; 416 mutex_exit(&scsi_hba_mutex); 417 418 /* 419 * Save all the important HBA information that must be accessed 420 * later by scsi_hba_bus_ctl(), and scsi_hba_map(). 421 */ 422 hba_tran->tran_hba_dip = dip; 423 hba_tran->tran_hba_flags &= SCSI_HBA_TRAN_ALLOC; 424 hba_tran->tran_hba_flags |= (flags & ~SCSI_HBA_TRAN_ALLOC); 425 426 /* 427 * Note: we only need dma_attr_minxfer and dma_attr_burstsizes 428 * from the DMA attributes. scsi_hba_attach(9f) only 429 * guarantees that these two fields are initialized properly. 430 * If this changes, be sure to revisit the implementation 431 * of scsi_hba_attach(9F). 432 */ 433 (void) memcpy(&hba_tran->tran_dma_attr, hba_dma_attr, 434 sizeof (ddi_dma_attr_t)); 435 436 /* create kmem_cache, if needed */ 437 if (hba_tran->tran_setup_pkt) { 438 char tmp[96]; 439 int hbalen; 440 int cmdlen = 0; 441 int statuslen = 0; 442 443 ASSERT(hba_tran->tran_init_pkt == NULL); 444 ASSERT(hba_tran->tran_destroy_pkt == NULL); 445 446 hba_tran->tran_init_pkt = scsi_init_cache_pkt; 447 hba_tran->tran_destroy_pkt = scsi_free_cache_pkt; 448 hba_tran->tran_sync_pkt = scsi_sync_cache_pkt; 449 hba_tran->tran_dmafree = scsi_cache_dmafree; 450 451 hbalen = ROUNDUP(hba_tran->tran_hba_len); 452 if (flags & SCSI_HBA_TRAN_CDB) 453 cmdlen = ROUNDUP(DEFAULT_CDBLEN); 454 if (flags & SCSI_HBA_TRAN_SCB) 455 statuslen = ROUNDUP(DEFAULT_SCBLEN); 456 457 (void) snprintf(tmp, sizeof (tmp), "pkt_cache_%s_%d", 458 ddi_driver_name(dip), ddi_get_instance(dip)); 459 hba_tran->tran_pkt_cache_ptr = kmem_cache_create(tmp, 460 sizeof (struct scsi_pkt_cache_wrapper) + 461 hbalen + cmdlen + statuslen, 8, 462 scsi_hba_pkt_constructor, scsi_hba_pkt_destructor, 463 NULL, hba_tran, NULL, 0); 464 } 465 466 /* 467 * Attach scsi configuration property parameters 468 * to this instance of the hba. 469 */ 470 prop_name = "scsi-reset-delay"; 471 len = 0; 472 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 473 NULL, &len) == DDI_PROP_NOT_FOUND) { 474 value = scsi_reset_delay; 475 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 476 prop_name, value) != DDI_PROP_SUCCESS) { 477 cmn_err(CE_CONT, errmsg, prop_name, 478 ddi_driver_name(dip), ddi_get_instance(dip)); 479 } 480 } 481 482 prop_name = "scsi-tag-age-limit"; 483 len = 0; 484 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 485 NULL, &len) == DDI_PROP_NOT_FOUND) { 486 value = scsi_tag_age_limit; 487 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 488 prop_name, value) != DDI_PROP_SUCCESS) { 489 cmn_err(CE_CONT, errmsg, prop_name, 490 ddi_driver_name(dip), ddi_get_instance(dip)); 491 } 492 } 493 494 prop_name = "scsi-watchdog-tick"; 495 len = 0; 496 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 497 NULL, &len) == DDI_PROP_NOT_FOUND) { 498 value = scsi_watchdog_tick; 499 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 500 prop_name, value) != DDI_PROP_SUCCESS) { 501 cmn_err(CE_CONT, errmsg, prop_name, 502 ddi_driver_name(dip), ddi_get_instance(dip)); 503 } 504 } 505 506 prop_name = "scsi-options"; 507 len = 0; 508 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 509 NULL, &len) == DDI_PROP_NOT_FOUND) { 510 value = scsi_options; 511 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 512 prop_name, value) != DDI_PROP_SUCCESS) { 513 cmn_err(CE_CONT, errmsg, prop_name, 514 ddi_driver_name(dip), ddi_get_instance(dip)); 515 } 516 } 517 518 prop_name = "scsi-selection-timeout"; 519 len = 0; 520 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 521 NULL, &len) == DDI_PROP_NOT_FOUND) { 522 value = scsi_selection_timeout; 523 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 524 prop_name, value) != DDI_PROP_SUCCESS) { 525 cmn_err(CE_CONT, errmsg, prop_name, 526 ddi_driver_name(dip), ddi_get_instance(dip)); 527 } 528 } 529 if ((hba_tran->tran_hba_flags & SCSI_HBA_TRAN_ALLOC) && 530 (hba_tran->tran_interconnect_type > 0) && 531 (hba_tran->tran_interconnect_type < INTERCONNECT_MAX)) { 532 prop_name = "initiator-interconnect-type"; 533 len = 0; 534 if (ddi_prop_op(DDI_DEV_T_ANY, dip, PROP_LEN, 0, prop_name, 535 NULL, &len) == DDI_PROP_NOT_FOUND) { 536 value = hba_tran->tran_interconnect_type; 537 prop_value = interconnect[value]; 538 if (ddi_prop_update_string(DDI_DEV_T_NONE, dip, 539 prop_name, (char *)prop_value) 540 != DDI_PROP_SUCCESS) { 541 cmn_err(CE_CONT, errmsg, prop_name, 542 ddi_driver_name(dip), 543 ddi_get_instance(dip)); 544 } 545 } 546 } 547 548 ddi_set_driver_private(dip, hba_tran); 549 550 /* 551 * Create devctl minor node unless driver supplied its own 552 * open/close entry points 553 */ 554 hba_dev_ops = ddi_get_driver(dip); 555 ASSERT(hba_dev_ops != NULL); 556 if (hba_dev_ops->devo_cb_ops->cb_open == scsi_hba_open) { 557 /* 558 * Make sure that instance number doesn't overflow 559 * when forming minor numbers. 560 */ 561 ASSERT(ddi_get_instance(dip) <= 562 (L_MAXMIN >> INST_MINOR_SHIFT)); 563 564 if ((ddi_create_minor_node(dip, "devctl", S_IFCHR, 565 INST2DEVCTL(ddi_get_instance(dip)), 566 DDI_NT_SCSI_NEXUS, 0) != DDI_SUCCESS) || 567 (ddi_create_minor_node(dip, "scsi", S_IFCHR, 568 INST2SCSI(ddi_get_instance(dip)), 569 DDI_NT_SCSI_ATTACHMENT_POINT, 0) != DDI_SUCCESS)) { 570 ddi_remove_minor_node(dip, "devctl"); 571 ddi_remove_minor_node(dip, "scsi"); 572 cmn_err(CE_WARN, "scsi_hba_attach: " 573 "cannot create devctl/scsi minor nodes"); 574 } 575 } 576 577 /* 578 * NOTE: SCSA maintains an 'fm-capable' domain, in tran_fm_capable, 579 * that is not dependent (limited by) the capabilities of its parents. 580 * For example a dip in a branch that is not DDI_FM_EREPORT_CAPABLE 581 * may report as capable, via tran_fm_capable, to its scsi_device 582 * children. 583 * 584 * Get 'fm-capable' property from driver.conf, if present. If not 585 * present, default to the scsi_fm_capable global (which has 586 * DDI_FM_EREPORT_CAPABLE set by default). 587 */ 588 if (hba_tran->tran_fm_capable == DDI_FM_NOT_CAPABLE) 589 hba_tran->tran_fm_capable = ddi_getprop(DDI_DEV_T_ANY, dip, 590 DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP | DDI_PROP_NOTPROM, 591 "fm-capable", scsi_fm_capable); 592 593 /* 594 * If an HBA is *not* doing its own fma support by calling 595 * ddi_fm_init() prior to scsi_hba_attach_setup(), we provide a 596 * minimal common SCSA implementation so that scsi_device children 597 * can generate ereports via scsi_fm_ereport_post(). We use 598 * ddi_fm_capable() to detect an HBA calling ddi_fm_init() prior to 599 * scsi_hba_attach_setup(). 600 */ 601 if (hba_tran->tran_fm_capable && 602 (ddi_fm_capable(dip) == DDI_FM_NOT_CAPABLE)) { 603 /* 604 * We are capable of something, pass our capabilities up 605 * the tree, but use a local variable so our parent can't 606 * limit our capabilities (we don't want our parent to 607 * clear DDI_FM_EREPORT_CAPABLE). 608 * 609 * NOTE: iblock cookies are not important because scsi 610 * HBAs always interrupt below LOCK_LEVEL. 611 */ 612 capable = hba_tran->tran_fm_capable; 613 ddi_fm_init(dip, &capable, NULL); 614 615 /* 616 * Set SCSI_HBA_TRAN_FMSCSA bit to mark us as usiung the 617 * common minimal SCSA fm implementation - we called 618 * ddi_fm_init(), so we are responsible for calling 619 * ddi_fm_fini() in scsi_hba_detach(). 620 * NOTE: if ddi_fm_init fails in any reason, SKIP. 621 */ 622 if (DEVI(dip)->devi_fmhdl) 623 hba_tran->tran_hba_flags |= SCSI_HBA_TRAN_FMSCSA; 624 } 625 626 return (DDI_SUCCESS); 627 } 628 629 /* 630 * Called by an HBA to detach an instance of the driver 631 */ 632 int 633 scsi_hba_detach(dev_info_t *dip) 634 { 635 struct dev_ops *hba_dev_ops; 636 scsi_hba_tran_t *hba; 637 struct scsi_hba_inst *elem; 638 639 640 hba = ddi_get_driver_private(dip); 641 ddi_set_driver_private(dip, NULL); 642 ASSERT(hba != NULL); 643 ASSERT(hba->tran_open_flag == 0); 644 645 /* 646 * If we are taking care of mininal default fma implementation, 647 * call ddi_fm_fini(9F). 648 */ 649 if (hba->tran_hba_flags & SCSI_HBA_TRAN_FMSCSA) { 650 ddi_fm_fini(dip); 651 } 652 653 hba_dev_ops = ddi_get_driver(dip); 654 ASSERT(hba_dev_ops != NULL); 655 if (hba_dev_ops->devo_cb_ops->cb_open == scsi_hba_open) { 656 ddi_remove_minor_node(dip, "devctl"); 657 ddi_remove_minor_node(dip, "scsi"); 658 } 659 660 /* 661 * XXX - scsi_transport.h states that these data fields should not be 662 * referenced by the HBA. However, to be consistent with 663 * scsi_hba_attach(), they are being reset. 664 */ 665 hba->tran_hba_dip = (dev_info_t *)NULL; 666 hba->tran_hba_flags = 0; 667 (void) memset(&hba->tran_dma_attr, 0, sizeof (ddi_dma_attr_t)); 668 669 if (hba->tran_pkt_cache_ptr != NULL) { 670 kmem_cache_destroy(hba->tran_pkt_cache_ptr); 671 hba->tran_pkt_cache_ptr = NULL; 672 } 673 /* 674 * Remove HBA instance from scsi_hba_list 675 */ 676 mutex_enter(&scsi_hba_mutex); 677 for (elem = scsi_hba_list; elem != (struct scsi_hba_inst *)NULL; 678 elem = elem->inst_next) { 679 if (elem->inst_dip == dip) 680 break; 681 } 682 683 if (elem == (struct scsi_hba_inst *)NULL) { 684 cmn_err(CE_CONT, "scsi_hba_attach: unknown HBA instance\n"); 685 mutex_exit(&scsi_hba_mutex); 686 return (DDI_FAILURE); 687 } 688 if (elem == scsi_hba_list) { 689 scsi_hba_list = elem->inst_next; 690 if (scsi_hba_list) { 691 scsi_hba_list->inst_prev = (struct scsi_hba_inst *)NULL; 692 } 693 if (elem == scsi_hba_list_tail) { 694 scsi_hba_list_tail = NULL; 695 } 696 } else if (elem == scsi_hba_list_tail) { 697 scsi_hba_list_tail = elem->inst_prev; 698 if (scsi_hba_list_tail) { 699 scsi_hba_list_tail->inst_next = 700 (struct scsi_hba_inst *)NULL; 701 } 702 } else { 703 elem->inst_prev->inst_next = elem->inst_next; 704 elem->inst_next->inst_prev = elem->inst_prev; 705 } 706 mutex_exit(&scsi_hba_mutex); 707 708 kmem_free(elem, sizeof (struct scsi_hba_inst)); 709 710 return (DDI_SUCCESS); 711 } 712 713 /* 714 * Called by an HBA from _fini() 715 */ 716 void 717 scsi_hba_fini(struct modlinkage *modlp) 718 { 719 struct dev_ops *hba_dev_ops; 720 721 /* 722 * Get the devops structure of this module 723 * and clear bus_ops vector. 724 */ 725 hba_dev_ops = ((struct modldrv *)(modlp->ml_linkage[0]))->drv_dev_ops; 726 727 if (hba_dev_ops->devo_cb_ops == &scsi_hba_cbops) { 728 hba_dev_ops->devo_cb_ops = NULL; 729 } 730 731 if (hba_dev_ops->devo_getinfo == scsi_hba_info) { 732 hba_dev_ops->devo_getinfo = NULL; 733 } 734 735 hba_dev_ops->devo_bus_ops = (struct bus_ops *)NULL; 736 } 737 738 static int 739 smp_ctlops_reportdev(dev_info_t *dip, dev_info_t *rdip) 740 { 741 scsi_hba_tran_t *hba; 742 char *smp_wwn; 743 744 hba = ddi_get_driver_private(dip); 745 ASSERT(hba != NULL); 746 747 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, rdip, 748 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, 749 SMP_WWN, &smp_wwn) != DDI_SUCCESS) { 750 return (DDI_FAILURE); 751 } 752 cmn_err(CE_CONT, 753 "?%s%d at %s%d: wwn %s\n", 754 ddi_driver_name(rdip), ddi_get_instance(rdip), 755 ddi_driver_name(dip), ddi_get_instance(dip), 756 smp_wwn); 757 758 ddi_prop_free(smp_wwn); 759 return (DDI_SUCCESS); 760 } 761 762 763 static int 764 smp_ctlops_initchild(dev_info_t *dip, dev_info_t *rdip) 765 { 766 struct smp_device *smp; 767 char name[SCSI_MAXNAMELEN]; 768 scsi_hba_tran_t *hba; 769 dev_info_t *ndip; 770 char *smp_wwn; 771 uint64_t wwn; 772 773 hba = ddi_get_driver_private(dip); 774 775 if (hba == NULL) 776 return (DDI_FAILURE); 777 778 smp = kmem_zalloc(sizeof (struct smp_device), KM_SLEEP); 779 780 /* 781 * Clone transport structure if requested, so 782 * the HBA can maintain target-specific info, if 783 * necessary. 784 */ 785 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 786 scsi_hba_tran_t *clone = 787 kmem_alloc(sizeof (scsi_hba_tran_t), KM_SLEEP); 788 789 bcopy(hba, clone, sizeof (scsi_hba_tran_t)); 790 hba = clone; 791 } 792 793 smp->dip = rdip; 794 smp->smp_addr.a_hba_tran = hba; 795 796 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, rdip, 797 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, 798 SMP_WWN, &smp_wwn) != DDI_SUCCESS) { 799 return (DDI_FAILURE); 800 } 801 802 if (ddi_devid_str_to_wwn(smp_wwn, &wwn)) { 803 goto failure; 804 } 805 806 bcopy(&wwn, smp->smp_addr.a_wwn, SAS_WWN_BYTE_SIZE); 807 808 bzero(name, sizeof (SCSI_MAXNAMELEN)); 809 810 (void) sprintf(name, "w%s", smp_wwn); 811 812 /* 813 * Prevent duplicate nodes. 814 */ 815 ndip = ndi_devi_find(dip, ddi_node_name(rdip), name); 816 817 if (ndip && (ndip != rdip)) { 818 goto failure; 819 } 820 821 ddi_set_name_addr(rdip, name); 822 823 ddi_set_driver_private(rdip, smp); 824 825 ddi_prop_free(smp_wwn); 826 827 return (DDI_SUCCESS); 828 829 failure: 830 kmem_free(smp, sizeof (struct smp_device)); 831 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 832 kmem_free(hba, sizeof (scsi_hba_tran_t)); 833 } 834 ddi_prop_free(smp_wwn); 835 return (DDI_FAILURE); 836 } 837 838 static int 839 smp_ctlops_uninitchild(dev_info_t *dip, dev_info_t *rdip) 840 { 841 struct smp_device *smp; 842 scsi_hba_tran_t *hba; 843 844 hba = ddi_get_driver_private(dip); 845 ASSERT(hba != NULL); 846 847 smp = ddi_get_driver_private(rdip); 848 ASSERT(smp != NULL); 849 850 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 851 hba = smp->smp_addr.a_hba_tran; 852 kmem_free(hba, sizeof (scsi_hba_tran_t)); 853 } 854 kmem_free(smp, sizeof (*smp)); 855 856 ddi_set_driver_private(rdip, NULL); 857 ddi_set_name_addr(rdip, NULL); 858 859 return (DDI_SUCCESS); 860 } 861 862 /* 863 * Generic bus_ctl operations for SCSI HBA's, 864 * hiding the busctl interface from the HBA. 865 */ 866 /*ARGSUSED*/ 867 static int 868 scsi_hba_bus_ctl( 869 dev_info_t *dip, 870 dev_info_t *rdip, 871 ddi_ctl_enum_t op, 872 void *arg, 873 void *result) 874 { 875 switch (op) { 876 case DDI_CTLOPS_REPORTDEV: 877 { 878 struct scsi_device *devp; 879 scsi_hba_tran_t *hba; 880 881 hba = ddi_get_driver_private(dip); 882 ASSERT(hba != NULL); 883 884 if (ddi_prop_exists(DDI_DEV_T_ANY, rdip, 885 DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP | DDI_PROP_NOTPROM, 886 SMP_PROP)) { 887 return (smp_ctlops_reportdev(dip, rdip)); 888 } 889 890 devp = ddi_get_driver_private(rdip); 891 892 if ((hba->tran_get_bus_addr == NULL) || 893 (hba->tran_get_name == NULL)) { 894 cmn_err(CE_CONT, "?%s%d at %s%d: target %x lun %x\n", 895 ddi_driver_name(rdip), ddi_get_instance(rdip), 896 ddi_driver_name(dip), ddi_get_instance(dip), 897 devp->sd_address.a_target, devp->sd_address.a_lun); 898 } else { 899 char name[SCSI_MAXNAMELEN]; 900 char bus_addr[SCSI_MAXNAMELEN]; 901 902 if ((*hba->tran_get_name)(devp, name, 903 SCSI_MAXNAMELEN) != 1) { 904 return (DDI_FAILURE); 905 } 906 if ((*hba->tran_get_bus_addr)(devp, bus_addr, 907 SCSI_MAXNAMELEN) != 1) { 908 return (DDI_FAILURE); 909 } 910 cmn_err(CE_CONT, 911 "?%s%d at %s%d: name %s, bus address %s\n", 912 ddi_driver_name(rdip), ddi_get_instance(rdip), 913 ddi_driver_name(dip), ddi_get_instance(dip), 914 name, bus_addr); 915 } 916 return (DDI_SUCCESS); 917 } 918 919 case DDI_CTLOPS_IOMIN: 920 { 921 int val; 922 scsi_hba_tran_t *hba; 923 ddi_dma_attr_t *attr; 924 925 hba = ddi_get_driver_private(dip); 926 ASSERT(hba != NULL); 927 attr = &hba->tran_dma_attr; 928 929 val = *((int *)result); 930 val = maxbit(val, attr->dma_attr_minxfer); 931 /* 932 * The 'arg' value of nonzero indicates 'streaming' 933 * mode. If in streaming mode, pick the largest 934 * of our burstsizes available and say that that 935 * is our minimum value (modulo what minxfer is). 936 */ 937 *((int *)result) = maxbit(val, ((intptr_t)arg ? 938 (1<<ddi_ffs(attr->dma_attr_burstsizes)-1) : 939 (1<<(ddi_fls(attr->dma_attr_burstsizes)-1)))); 940 941 return (ddi_ctlops(dip, rdip, op, arg, result)); 942 } 943 944 case DDI_CTLOPS_INITCHILD: 945 { 946 dev_info_t *child_dip = (dev_info_t *)arg; 947 struct scsi_device *sd; 948 char name[SCSI_MAXNAMELEN]; 949 scsi_hba_tran_t *hba; 950 dev_info_t *ndip; 951 952 if (ddi_prop_exists(DDI_DEV_T_ANY, child_dip, 953 DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP | DDI_PROP_NOTPROM, 954 SMP_PROP)) { 955 return (smp_ctlops_initchild(dip, child_dip)); 956 } 957 958 hba = ddi_get_driver_private(dip); 959 960 /* 961 * For a driver like fp with multiple upper-layer-protocols 962 * it is possible for scsi_hba_init in _init to plumb SCSA 963 * and have the load of fcp (which does scsi_hba_attach_setup) 964 * to fail. In this case we may get here with a NULL hba. 965 */ 966 if (hba == NULL) 967 return (DDI_FAILURE); 968 969 sd = kmem_zalloc(sizeof (struct scsi_device), KM_SLEEP); 970 971 /* 972 * Clone transport structure if requested, so 973 * the HBA can maintain target-specific info, if 974 * necessary. At least all SCSI-3 HBAs will do this. 975 */ 976 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 977 scsi_hba_tran_t *clone = 978 kmem_alloc(sizeof (scsi_hba_tran_t), KM_SLEEP); 979 980 bcopy(hba, clone, sizeof (scsi_hba_tran_t)); 981 hba = clone; 982 hba->tran_sd = sd; 983 } else { 984 ASSERT(hba->tran_sd == NULL); 985 } 986 987 sd->sd_dev = child_dip; 988 sd->sd_address.a_hba_tran = hba; 989 990 /* 991 * Make sure that HBA either supports both or none 992 * of tran_get_name/tran_get_addr 993 */ 994 if ((hba->tran_get_name != NULL) || 995 (hba->tran_get_bus_addr != NULL)) { 996 if ((hba->tran_get_name == NULL) || 997 (hba->tran_get_bus_addr == NULL)) { 998 cmn_err(CE_CONT, 999 "%s%d: should support both or none of " 1000 "tran_get_name and tran_get_bus_addr\n", 1001 ddi_driver_name(dip), 1002 ddi_get_instance(dip)); 1003 goto failure; 1004 } 1005 } 1006 1007 /* 1008 * In case HBA doesn't support tran_get_name/tran_get_bus_addr 1009 * (e.g. most pre-SCSI-3 HBAs), we have to continue 1010 * to provide old semantics. In case a HBA driver does 1011 * support it, a_target and a_lun fields of scsi_address 1012 * are not defined and will be 0 except for parallel bus. 1013 */ 1014 { 1015 int t_len; 1016 int targ = 0; 1017 int lun = 0; 1018 1019 t_len = sizeof (targ); 1020 if (ddi_prop_op(DDI_DEV_T_ANY, child_dip, 1021 PROP_LEN_AND_VAL_BUF, DDI_PROP_DONTPASS | 1022 DDI_PROP_CANSLEEP, "target", (caddr_t)&targ, 1023 &t_len) != DDI_SUCCESS) { 1024 if (hba->tran_get_name == NULL) { 1025 kmem_free(sd, 1026 sizeof (struct scsi_device)); 1027 if (hba->tran_hba_flags & 1028 SCSI_HBA_TRAN_CLONE) { 1029 kmem_free(hba, 1030 sizeof (scsi_hba_tran_t)); 1031 } 1032 return (DDI_NOT_WELL_FORMED); 1033 } 1034 } 1035 1036 t_len = sizeof (lun); 1037 (void) ddi_prop_op(DDI_DEV_T_ANY, child_dip, 1038 PROP_LEN_AND_VAL_BUF, DDI_PROP_DONTPASS | 1039 DDI_PROP_CANSLEEP, "lun", (caddr_t)&lun, 1040 &t_len); 1041 1042 /* 1043 * If the HBA does not implement tran_get_name then it 1044 * doesn't have any hope of supporting a LUN >= 256. 1045 */ 1046 if (lun >= 256 && hba->tran_get_name == NULL) { 1047 goto failure; 1048 } 1049 1050 /* 1051 * This is also to make sure that if someone plugs in 1052 * a SCSI-2 disks to a SCSI-3 parallel bus HBA, 1053 * his SCSI-2 target driver still continue to work. 1054 */ 1055 sd->sd_address.a_target = (ushort_t)targ; 1056 sd->sd_address.a_lun = (uchar_t)lun; 1057 } 1058 1059 /* 1060 * In case HBA support tran_get_name (e.g. all SCSI-3 HBAs), 1061 * give it a chance to tell us the name. 1062 * If it doesn't support this entry point, a name will be 1063 * fabricated 1064 */ 1065 if (scsi_get_name(sd, name, SCSI_MAXNAMELEN) != 1) { 1066 goto failure; 1067 } 1068 1069 /* 1070 * Prevent duplicate nodes. 1071 */ 1072 ndip = ndi_devi_find(dip, ddi_node_name(child_dip), name); 1073 1074 if (ndip && (ndip != child_dip)) { 1075 goto failure; 1076 } 1077 1078 ddi_set_name_addr(child_dip, name); 1079 1080 /* 1081 * This is a grotty hack that allows direct-access 1082 * (non-scsi) drivers using this interface to 1083 * put its own vector in the 'a_hba_tran' field. 1084 * When the drivers are fixed, remove this hack. 1085 */ 1086 sd->sd_reserved = hba; 1087 1088 /* 1089 * call hba's target init entry point if it exists 1090 */ 1091 if (hba->tran_tgt_init != NULL) { 1092 if ((*hba->tran_tgt_init) 1093 (dip, child_dip, hba, sd) != DDI_SUCCESS) { 1094 ddi_set_name_addr(child_dip, NULL); 1095 goto failure; 1096 } 1097 1098 /* 1099 * Another grotty hack to undo initialization 1100 * some hba's think they have authority to 1101 * perform. 1102 * 1103 * XXX - Pending dadk_probe() semantics 1104 * change. (Re: 1171432) 1105 */ 1106 if (hba->tran_tgt_probe != NULL) 1107 sd->sd_inq = NULL; 1108 } 1109 1110 mutex_init(&sd->sd_mutex, NULL, MUTEX_DRIVER, NULL); 1111 1112 ddi_set_driver_private(child_dip, sd); 1113 1114 return (DDI_SUCCESS); 1115 1116 failure: 1117 kmem_free(sd, sizeof (struct scsi_device)); 1118 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 1119 kmem_free(hba, sizeof (scsi_hba_tran_t)); 1120 } 1121 return (DDI_FAILURE); 1122 } 1123 1124 case DDI_CTLOPS_UNINITCHILD: 1125 { 1126 struct scsi_device *sd; 1127 dev_info_t *child_dip = (dev_info_t *)arg; 1128 scsi_hba_tran_t *hba; 1129 1130 if (ddi_prop_exists(DDI_DEV_T_ANY, child_dip, 1131 DDI_PROP_DONTPASS | DDI_PROP_CANSLEEP | DDI_PROP_NOTPROM, 1132 SMP_PROP)) { 1133 return (smp_ctlops_uninitchild(dip, child_dip)); 1134 } 1135 1136 hba = ddi_get_driver_private(dip); 1137 ASSERT(hba != NULL); 1138 1139 sd = ddi_get_driver_private(child_dip); 1140 ASSERT(sd != NULL); 1141 1142 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 1143 /* 1144 * This is a grotty hack, continued. This 1145 * should be: 1146 * hba = sd->sd_address.a_hba_tran; 1147 */ 1148 hba = sd->sd_reserved; 1149 ASSERT(hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE); 1150 ASSERT(hba->tran_sd == sd); 1151 } else { 1152 ASSERT(hba->tran_sd == NULL); 1153 } 1154 1155 scsi_unprobe(sd); 1156 if (hba->tran_tgt_free != NULL) { 1157 (*hba->tran_tgt_free) (dip, child_dip, hba, sd); 1158 } 1159 mutex_destroy(&sd->sd_mutex); 1160 if (hba->tran_hba_flags & SCSI_HBA_TRAN_CLONE) { 1161 kmem_free(hba, sizeof (scsi_hba_tran_t)); 1162 } 1163 kmem_free(sd, sizeof (*sd)); 1164 1165 ddi_set_driver_private(child_dip, NULL); 1166 ddi_set_name_addr(child_dip, NULL); 1167 1168 return (DDI_SUCCESS); 1169 } 1170 case DDI_CTLOPS_SIDDEV: 1171 return (ndi_dev_is_persistent_node(rdip) ? 1172 DDI_SUCCESS : DDI_FAILURE); 1173 1174 /* XXX these should be handled */ 1175 case DDI_CTLOPS_POWER: 1176 case DDI_CTLOPS_ATTACH: 1177 case DDI_CTLOPS_DETACH: 1178 1179 return (DDI_SUCCESS); 1180 1181 /* 1182 * These ops correspond to functions that "shouldn't" be called 1183 * by a SCSI target driver. So we whine when we're called. 1184 */ 1185 case DDI_CTLOPS_DMAPMAPC: 1186 case DDI_CTLOPS_REPORTINT: 1187 case DDI_CTLOPS_REGSIZE: 1188 case DDI_CTLOPS_NREGS: 1189 case DDI_CTLOPS_SLAVEONLY: 1190 case DDI_CTLOPS_AFFINITY: 1191 case DDI_CTLOPS_POKE: 1192 case DDI_CTLOPS_PEEK: 1193 cmn_err(CE_CONT, "%s%d: invalid op (%d) from %s%d\n", 1194 ddi_driver_name(dip), ddi_get_instance(dip), 1195 op, ddi_driver_name(rdip), ddi_get_instance(rdip)); 1196 return (DDI_FAILURE); 1197 1198 /* 1199 * Everything else (e.g. PTOB/BTOP/BTOPR requests) we pass up 1200 */ 1201 default: 1202 return (ddi_ctlops(dip, rdip, op, arg, result)); 1203 } 1204 } 1205 1206 1207 /* 1208 * Called by an HBA to allocate a scsi_hba_tran structure 1209 */ 1210 /*ARGSUSED*/ 1211 scsi_hba_tran_t * 1212 scsi_hba_tran_alloc( 1213 dev_info_t *dip, 1214 int flags) 1215 { 1216 scsi_hba_tran_t *hba_tran; 1217 1218 hba_tran = kmem_zalloc(sizeof (scsi_hba_tran_t), 1219 (flags & SCSI_HBA_CANSLEEP) ? KM_SLEEP : KM_NOSLEEP); 1220 1221 hba_tran->tran_interconnect_type = INTERCONNECT_PARALLEL; 1222 hba_tran->tran_hba_flags |= SCSI_HBA_TRAN_ALLOC; 1223 1224 return (hba_tran); 1225 } 1226 1227 int 1228 scsi_tran_ext_alloc( 1229 scsi_hba_tran_t *hba_tran, 1230 size_t length, 1231 int flags) 1232 { 1233 void *hba_tran_ext; 1234 int ret = DDI_FAILURE; 1235 1236 hba_tran_ext = kmem_zalloc(length, (flags & SCSI_HBA_CANSLEEP) 1237 ? KM_SLEEP : KM_NOSLEEP); 1238 if (hba_tran_ext != NULL) { 1239 hba_tran->tran_extension = hba_tran_ext; 1240 ret = DDI_SUCCESS; 1241 } 1242 return (ret); 1243 } 1244 1245 void 1246 scsi_tran_ext_free( 1247 scsi_hba_tran_t *hba_tran, 1248 size_t length) 1249 { 1250 if (hba_tran->tran_extension != NULL) { 1251 kmem_free(hba_tran->tran_extension, length); 1252 hba_tran->tran_extension = NULL; 1253 } 1254 } 1255 1256 /* 1257 * Called by an HBA to free a scsi_hba_tran structure 1258 */ 1259 void 1260 scsi_hba_tran_free( 1261 scsi_hba_tran_t *hba_tran) 1262 { 1263 kmem_free(hba_tran, sizeof (scsi_hba_tran_t)); 1264 } 1265 1266 /* 1267 * Private wrapper for scsi_pkt's allocated via scsi_hba_pkt_alloc() 1268 */ 1269 struct scsi_pkt_wrapper { 1270 struct scsi_pkt scsi_pkt; 1271 int pkt_wrapper_magic; 1272 int pkt_wrapper_len; 1273 }; 1274 1275 #if !defined(lint) 1276 _NOTE(SCHEME_PROTECTS_DATA("unique per thread", scsi_pkt_wrapper)) 1277 _NOTE(SCHEME_PROTECTS_DATA("Unshared Data", dev_ops)) 1278 #endif 1279 1280 /* 1281 * Called by an HBA to allocate a scsi_pkt 1282 */ 1283 /*ARGSUSED*/ 1284 struct scsi_pkt * 1285 scsi_hba_pkt_alloc( 1286 dev_info_t *dip, 1287 struct scsi_address *ap, 1288 int cmdlen, 1289 int statuslen, 1290 int tgtlen, 1291 int hbalen, 1292 int (*callback)(caddr_t arg), 1293 caddr_t arg) 1294 { 1295 struct scsi_pkt *pkt; 1296 struct scsi_pkt_wrapper *hba_pkt; 1297 caddr_t p; 1298 int acmdlen, astatuslen, atgtlen, ahbalen; 1299 int pktlen; 1300 1301 /* 1302 * Sanity check 1303 */ 1304 if (callback != SLEEP_FUNC && callback != NULL_FUNC) { 1305 cmn_err(CE_PANIC, "scsi_hba_pkt_alloc: callback must be" 1306 " either SLEEP or NULL\n"); 1307 } 1308 1309 /* 1310 * Round up so everything gets allocated on long-word boundaries 1311 */ 1312 acmdlen = ROUNDUP(cmdlen); 1313 astatuslen = ROUNDUP(statuslen); 1314 atgtlen = ROUNDUP(tgtlen); 1315 ahbalen = ROUNDUP(hbalen); 1316 pktlen = sizeof (struct scsi_pkt_wrapper) + 1317 acmdlen + astatuslen + atgtlen + ahbalen; 1318 1319 hba_pkt = kmem_zalloc(pktlen, 1320 (callback == SLEEP_FUNC) ? KM_SLEEP : KM_NOSLEEP); 1321 if (hba_pkt == NULL) { 1322 ASSERT(callback == NULL_FUNC); 1323 return (NULL); 1324 } 1325 1326 /* 1327 * Set up our private info on this pkt 1328 */ 1329 hba_pkt->pkt_wrapper_len = pktlen; 1330 hba_pkt->pkt_wrapper_magic = PKT_WRAPPER_MAGIC; /* alloced correctly */ 1331 pkt = &hba_pkt->scsi_pkt; 1332 1333 /* 1334 * Set up pointers to private data areas, cdb, and status. 1335 */ 1336 p = (caddr_t)(hba_pkt + 1); 1337 if (hbalen > 0) { 1338 pkt->pkt_ha_private = (opaque_t)p; 1339 p += ahbalen; 1340 } 1341 if (tgtlen > 0) { 1342 pkt->pkt_private = (opaque_t)p; 1343 p += atgtlen; 1344 } 1345 if (statuslen > 0) { 1346 pkt->pkt_scbp = (uchar_t *)p; 1347 p += astatuslen; 1348 } 1349 if (cmdlen > 0) { 1350 pkt->pkt_cdbp = (uchar_t *)p; 1351 } 1352 1353 /* 1354 * Initialize the pkt's scsi_address 1355 */ 1356 pkt->pkt_address = *ap; 1357 1358 /* 1359 * NB: It may not be safe for drivers, esp target drivers, to depend 1360 * on the following fields being set until all the scsi_pkt 1361 * allocation violations discussed in scsi_pkt.h are all resolved. 1362 */ 1363 pkt->pkt_cdblen = cmdlen; 1364 pkt->pkt_tgtlen = tgtlen; 1365 pkt->pkt_scblen = statuslen; 1366 1367 return (pkt); 1368 } 1369 1370 /* 1371 * Called by an HBA to free a scsi_pkt 1372 */ 1373 /*ARGSUSED*/ 1374 void 1375 scsi_hba_pkt_free( 1376 struct scsi_address *ap, 1377 struct scsi_pkt *pkt) 1378 { 1379 kmem_free(pkt, ((struct scsi_pkt_wrapper *)pkt)->pkt_wrapper_len); 1380 } 1381 1382 /* 1383 * Return 1 if the scsi_pkt used a proper allocator. 1384 * 1385 * The DDI does not allow a driver to allocate it's own scsi_pkt(9S), a 1386 * driver should not have *any* compiled in dependencies on "sizeof (struct 1387 * scsi_pkt)". While this has been the case for many years, a number of 1388 * drivers have still not been fixed. This function can be used to detect 1389 * improperly allocated scsi_pkt structures, and produce messages identifying 1390 * drivers that need to be fixed. 1391 * 1392 * While drivers in violation are being fixed, this function can also 1393 * be used by the framework to detect packets that violated allocation 1394 * rules. 1395 * 1396 * NB: It is possible, but very unlikely, for this code to return a false 1397 * positive (finding correct magic, but for wrong reasons). Careful 1398 * consideration is needed for callers using this interface to condition 1399 * access to newer scsi_pkt fields (those after pkt_reason). 1400 * 1401 * NB: As an aid to minimizing the amount of work involved in 'fixing' legacy 1402 * drivers that violate scsi_*(9S) allocation rules, private 1403 * scsi_pkt_size()/scsi_size_clean() functions are available (see their 1404 * implementation for details). 1405 * 1406 * *** Non-legacy use of scsi_pkt_size() is discouraged. *** 1407 * 1408 * NB: When supporting broken HBA drivers is not longer a concern, this 1409 * code should be removed. 1410 */ 1411 int 1412 scsi_pkt_allocated_correctly(struct scsi_pkt *pkt) 1413 { 1414 struct scsi_pkt_wrapper *hba_pkt = (struct scsi_pkt_wrapper *)pkt; 1415 int magic; 1416 major_t major; 1417 #ifdef DEBUG 1418 int *pspwm, *pspcwm; 1419 1420 /* 1421 * We are getting scsi packets from two 'correct' wrapper schemes, 1422 * make sure we are looking at the same place in both to detect 1423 * proper allocation. 1424 */ 1425 pspwm = &((struct scsi_pkt_wrapper *)0)->pkt_wrapper_magic; 1426 pspcwm = &((struct scsi_pkt_cache_wrapper *)0)->pcw_magic; 1427 ASSERT(pspwm == pspcwm); 1428 #endif /* DEBUG */ 1429 1430 1431 /* 1432 * Check to see if driver is scsi_size_clean(), assume it 1433 * is using the scsi_pkt_size() interface everywhere it needs to 1434 * if the driver indicates it is scsi_size_clean(). 1435 */ 1436 major = ddi_driver_major(P_TO_TRAN(pkt)->tran_hba_dip); 1437 if (devnamesp[major].dn_flags & DN_SCSI_SIZE_CLEAN) 1438 return (1); /* ok */ 1439 1440 /* 1441 * Special case crossing a page boundary. If the scsi_pkt was not 1442 * allocated correctly, then accross a page boundary we have a 1443 * fault hazzard. 1444 */ 1445 if ((((uintptr_t)(&hba_pkt->scsi_pkt)) & MMU_PAGEMASK) == 1446 (((uintptr_t)(&hba_pkt->pkt_wrapper_magic)) & MMU_PAGEMASK)) { 1447 /* fastpath, no cross-page hazzard */ 1448 magic = hba_pkt->pkt_wrapper_magic; 1449 } else { 1450 /* add protection for cross-page hazzard */ 1451 if (ddi_peek32((dev_info_t *)NULL, 1452 &hba_pkt->pkt_wrapper_magic, &magic) == DDI_FAILURE) { 1453 return (0); /* violation */ 1454 } 1455 } 1456 1457 /* properly allocated packet always has correct magic */ 1458 return ((magic == PKT_WRAPPER_MAGIC) ? 1 : 0); 1459 } 1460 1461 /* 1462 * Private interfaces to simplify conversion of legacy drivers so they don't 1463 * depend on scsi_*(9S) size. Instead of using these private interface, HBA 1464 * drivers should use DDI sanctioned allocation methods: 1465 * 1466 * scsi_pkt Use scsi_hba_pkt_alloc(9F), or implement 1467 * tran_setup_pkt(9E). 1468 * 1469 * scsi_device You are doing something strange/special, a scsi_device 1470 * structure should only be allocated by scsi_hba.c 1471 * initchild code or scsi_vhci.c code. 1472 * 1473 * scsi_hba_tran Use scsi_hba_tran_alloc(9F). 1474 */ 1475 size_t 1476 scsi_pkt_size() 1477 { 1478 return (sizeof (struct scsi_pkt)); 1479 } 1480 1481 size_t 1482 scsi_hba_tran_size() 1483 { 1484 return (sizeof (scsi_hba_tran_t)); 1485 } 1486 1487 size_t 1488 scsi_device_size() 1489 { 1490 return (sizeof (struct scsi_device)); 1491 } 1492 1493 /* 1494 * Legacy compliance to scsi_pkt(9S) allocation rules through use of 1495 * scsi_pkt_size() is detected by the 'scsi-size-clean' driver.conf property 1496 * or an HBA driver calling to scsi_size_clean() from attach(9E). A driver 1497 * developer should only indicate that a legacy driver is clean after using 1498 * SCSI_SIZE_CLEAN_VERIFY to ensure compliance (see scsi_pkt.h). 1499 */ 1500 void 1501 scsi_size_clean(dev_info_t *dip) 1502 { 1503 major_t major; 1504 struct devnames *dnp; 1505 1506 ASSERT(dip); 1507 major = ddi_driver_major(dip); 1508 ASSERT(major < devcnt); 1509 if (major >= devcnt) { 1510 cmn_err(CE_WARN, "scsi_pkt_size: bogus major: %d", major); 1511 return; 1512 } 1513 1514 /* Set DN_SCSI_SIZE_CLEAN flag in dn_flags. */ 1515 dnp = &devnamesp[major]; 1516 if ((dnp->dn_flags & DN_SCSI_SIZE_CLEAN) == 0) { 1517 LOCK_DEV_OPS(&dnp->dn_lock); 1518 dnp->dn_flags |= DN_SCSI_SIZE_CLEAN; 1519 UNLOCK_DEV_OPS(&dnp->dn_lock); 1520 } 1521 } 1522 1523 1524 /* 1525 * Called by an HBA to map strings to capability indices 1526 */ 1527 int 1528 scsi_hba_lookup_capstr( 1529 char *capstr) 1530 { 1531 /* 1532 * Capability strings, masking the the '-' vs. '_' misery 1533 */ 1534 static struct cap_strings { 1535 char *cap_string; 1536 int cap_index; 1537 } cap_strings[] = { 1538 { "dma_max", SCSI_CAP_DMA_MAX }, 1539 { "dma-max", SCSI_CAP_DMA_MAX }, 1540 { "msg_out", SCSI_CAP_MSG_OUT }, 1541 { "msg-out", SCSI_CAP_MSG_OUT }, 1542 { "disconnect", SCSI_CAP_DISCONNECT }, 1543 { "synchronous", SCSI_CAP_SYNCHRONOUS }, 1544 { "wide_xfer", SCSI_CAP_WIDE_XFER }, 1545 { "wide-xfer", SCSI_CAP_WIDE_XFER }, 1546 { "parity", SCSI_CAP_PARITY }, 1547 { "initiator-id", SCSI_CAP_INITIATOR_ID }, 1548 { "untagged-qing", SCSI_CAP_UNTAGGED_QING }, 1549 { "tagged-qing", SCSI_CAP_TAGGED_QING }, 1550 { "auto-rqsense", SCSI_CAP_ARQ }, 1551 { "linked-cmds", SCSI_CAP_LINKED_CMDS }, 1552 { "sector-size", SCSI_CAP_SECTOR_SIZE }, 1553 { "total-sectors", SCSI_CAP_TOTAL_SECTORS }, 1554 { "geometry", SCSI_CAP_GEOMETRY }, 1555 { "reset-notification", SCSI_CAP_RESET_NOTIFICATION }, 1556 { "qfull-retries", SCSI_CAP_QFULL_RETRIES }, 1557 { "qfull-retry-interval", SCSI_CAP_QFULL_RETRY_INTERVAL }, 1558 { "scsi-version", SCSI_CAP_SCSI_VERSION }, 1559 { "interconnect-type", SCSI_CAP_INTERCONNECT_TYPE }, 1560 { "lun-reset", SCSI_CAP_LUN_RESET }, 1561 { "max-cdb-length", SCSI_CAP_CDB_LEN }, 1562 { "dma-max-arch", SCSI_CAP_DMA_MAX_ARCH }, 1563 { NULL, 0 } 1564 }; 1565 struct cap_strings *cp; 1566 1567 for (cp = cap_strings; cp->cap_string != NULL; cp++) { 1568 if (strcmp(cp->cap_string, capstr) == 0) { 1569 return (cp->cap_index); 1570 } 1571 } 1572 1573 return (-1); 1574 } 1575 1576 1577 /* 1578 * Called by an HBA to determine if the system is in 'panic' state. 1579 */ 1580 int 1581 scsi_hba_in_panic() 1582 { 1583 return (panicstr != NULL); 1584 } 1585 1586 1587 1588 /* 1589 * If a SCSI target driver attempts to mmap memory, 1590 * the buck stops here. 1591 */ 1592 /*ARGSUSED*/ 1593 static int 1594 scsi_hba_map_fault( 1595 dev_info_t *dip, 1596 dev_info_t *rdip, 1597 struct hat *hat, 1598 struct seg *seg, 1599 caddr_t addr, 1600 struct devpage *dp, 1601 pfn_t pfn, 1602 uint_t prot, 1603 uint_t lock) 1604 { 1605 return (DDI_FAILURE); 1606 } 1607 1608 1609 static int 1610 scsi_hba_get_eventcookie( 1611 dev_info_t *dip, 1612 dev_info_t *rdip, 1613 char *name, 1614 ddi_eventcookie_t *eventp) 1615 { 1616 scsi_hba_tran_t *hba; 1617 1618 hba = ddi_get_driver_private(dip); 1619 if (hba->tran_get_eventcookie && ((*hba->tran_get_eventcookie)(dip, 1620 rdip, name, eventp) == DDI_SUCCESS)) { 1621 return (DDI_SUCCESS); 1622 } 1623 1624 return (ndi_busop_get_eventcookie(dip, rdip, name, eventp)); 1625 } 1626 1627 1628 static int 1629 scsi_hba_add_eventcall( 1630 dev_info_t *dip, 1631 dev_info_t *rdip, 1632 ddi_eventcookie_t event, 1633 void (*callback)( 1634 dev_info_t *dip, 1635 ddi_eventcookie_t event, 1636 void *arg, 1637 void *bus_impldata), 1638 void *arg, 1639 ddi_callback_id_t *cb_id) 1640 { 1641 scsi_hba_tran_t *hba; 1642 1643 hba = ddi_get_driver_private(dip); 1644 if (hba->tran_add_eventcall && ((*hba->tran_add_eventcall)(dip, rdip, 1645 event, callback, arg, cb_id) == DDI_SUCCESS)) { 1646 return (DDI_SUCCESS); 1647 } 1648 1649 return (DDI_FAILURE); 1650 } 1651 1652 1653 static int 1654 scsi_hba_remove_eventcall(dev_info_t *devi, ddi_callback_id_t cb_id) 1655 { 1656 scsi_hba_tran_t *hba; 1657 ASSERT(cb_id); 1658 1659 hba = ddi_get_driver_private(devi); 1660 if (hba->tran_remove_eventcall && ((*hba->tran_remove_eventcall)( 1661 devi, cb_id) == DDI_SUCCESS)) { 1662 return (DDI_SUCCESS); 1663 } 1664 1665 return (DDI_FAILURE); 1666 } 1667 1668 1669 static int 1670 scsi_hba_post_event( 1671 dev_info_t *dip, 1672 dev_info_t *rdip, 1673 ddi_eventcookie_t event, 1674 void *bus_impldata) 1675 { 1676 scsi_hba_tran_t *hba; 1677 1678 hba = ddi_get_driver_private(dip); 1679 if (hba->tran_post_event && ((*hba->tran_post_event)(dip, 1680 rdip, event, bus_impldata) == DDI_SUCCESS)) { 1681 return (DDI_SUCCESS); 1682 } 1683 1684 return (DDI_FAILURE); 1685 } 1686 1687 /* 1688 * The attach/detach of individual instances is controlled by the DDI 1689 * framework, hence, DDI_DEVT2DEVINFO doesn't make much sense (because 1690 * it ask drivers to hold individual dips in memory. 1691 */ 1692 static dev_info_t * 1693 devt_to_devinfo(dev_t dev) 1694 { 1695 dev_info_t *dip; 1696 struct devnames *dnp; 1697 major_t major = getmajor(dev); 1698 int instance = MINOR2INST(getminor(dev)); 1699 1700 if (major >= devcnt) { 1701 return (NULL); 1702 } 1703 1704 dnp = &devnamesp[major]; 1705 LOCK_DEV_OPS(&(dnp->dn_lock)); 1706 dip = dnp->dn_head; 1707 while (dip && (ddi_get_instance(dip) != instance)) { 1708 dip = ddi_get_next(dip); 1709 } 1710 UNLOCK_DEV_OPS(&(dnp->dn_lock)); 1711 1712 return (dip); 1713 } 1714 1715 /* 1716 * Default getinfo(9e) for scsi_hba 1717 */ 1718 /* ARGSUSED */ 1719 static int 1720 scsi_hba_info(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, 1721 void **result) 1722 { 1723 int error = DDI_SUCCESS; 1724 1725 switch (infocmd) { 1726 case DDI_INFO_DEVT2DEVINFO: 1727 *result = (void *)devt_to_devinfo((dev_t)arg); 1728 if (*result == NULL) { 1729 error = DDI_FAILURE; 1730 } 1731 break; 1732 case DDI_INFO_DEVT2INSTANCE: 1733 *result = (void *)(intptr_t)(MINOR2INST(getminor((dev_t)arg))); 1734 break; 1735 default: 1736 error = DDI_FAILURE; 1737 } 1738 return (error); 1739 } 1740 1741 /* 1742 * Default open and close routine for scsi_hba 1743 */ 1744 1745 /* ARGSUSED */ 1746 int 1747 scsi_hba_open(dev_t *devp, int flags, int otyp, cred_t *credp) 1748 { 1749 int rv = 0; 1750 dev_info_t *dip; 1751 scsi_hba_tran_t *hba; 1752 1753 if (otyp != OTYP_CHR) 1754 return (EINVAL); 1755 1756 dip = devt_to_devinfo(*devp); 1757 if (dip == NULL) 1758 return (ENXIO); 1759 1760 if ((hba = ddi_get_driver_private(dip)) == NULL) 1761 return (ENXIO); 1762 1763 /* 1764 * tran_open_flag bit field: 1765 * 0: closed 1766 * 1: shared open by minor at bit position 1767 * 1 at 31st bit: exclusive open 1768 */ 1769 mutex_enter(&(hba->tran_open_lock)); 1770 if (flags & FEXCL) { 1771 if (hba->tran_open_flag != 0) { 1772 rv = EBUSY; /* already open */ 1773 } else { 1774 hba->tran_open_flag = TRAN_OPEN_EXCL; 1775 } 1776 } else { 1777 if (hba->tran_open_flag == TRAN_OPEN_EXCL) { 1778 rv = EBUSY; /* already excl. open */ 1779 } else { 1780 int minor = getminor(*devp) & TRAN_MINOR_MASK; 1781 hba->tran_open_flag |= (1 << minor); 1782 /* 1783 * Ensure that the last framework reserved minor 1784 * is unused. Otherwise, the exclusive open 1785 * mechanism may break. 1786 */ 1787 ASSERT(minor != 31); 1788 } 1789 } 1790 mutex_exit(&(hba->tran_open_lock)); 1791 1792 return (rv); 1793 } 1794 1795 /* ARGSUSED */ 1796 int 1797 scsi_hba_close(dev_t dev, int flag, int otyp, cred_t *credp) 1798 { 1799 dev_info_t *dip; 1800 scsi_hba_tran_t *hba; 1801 1802 if (otyp != OTYP_CHR) 1803 return (EINVAL); 1804 1805 dip = devt_to_devinfo(dev); 1806 if (dip == NULL) 1807 return (ENXIO); 1808 1809 if ((hba = ddi_get_driver_private(dip)) == NULL) 1810 return (ENXIO); 1811 1812 mutex_enter(&(hba->tran_open_lock)); 1813 if (hba->tran_open_flag == TRAN_OPEN_EXCL) { 1814 hba->tran_open_flag = 0; 1815 } else { 1816 int minor = getminor(dev) & TRAN_MINOR_MASK; 1817 hba->tran_open_flag &= ~(1 << minor); 1818 } 1819 mutex_exit(&(hba->tran_open_lock)); 1820 return (0); 1821 } 1822 1823 /* 1824 * standard ioctl commands for SCSI hotplugging 1825 */ 1826 1827 /* ARGSUSED */ 1828 int 1829 scsi_hba_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, 1830 int *rvalp) 1831 { 1832 dev_info_t *self; 1833 dev_info_t *child; 1834 struct scsi_device *sd; 1835 scsi_hba_tran_t *hba; 1836 struct devctl_iocdata *dcp; 1837 uint_t bus_state; 1838 int rv = 0; 1839 int circ; 1840 1841 self = devt_to_devinfo(dev); 1842 if (self == NULL) 1843 return (ENXIO); 1844 1845 if ((hba = ddi_get_driver_private(self)) == NULL) 1846 return (ENXIO); 1847 1848 /* 1849 * For these ioctls, the general implementation suffices 1850 */ 1851 switch (cmd) { 1852 case DEVCTL_DEVICE_GETSTATE: 1853 case DEVCTL_DEVICE_ONLINE: 1854 case DEVCTL_DEVICE_OFFLINE: 1855 case DEVCTL_DEVICE_REMOVE: 1856 case DEVCTL_BUS_GETSTATE: 1857 return (ndi_devctl_ioctl(self, cmd, arg, mode, 0)); 1858 } 1859 1860 switch (cmd) { 1861 1862 case DEVCTL_DEVICE_RESET: 1863 if (hba->tran_reset == NULL) { 1864 rv = ENOTSUP; 1865 break; 1866 } 1867 /* 1868 * read devctl ioctl data 1869 */ 1870 if (ndi_dc_allochdl((void *)arg, &dcp) != NDI_SUCCESS) 1871 return (EFAULT); 1872 if (ndi_dc_getname(dcp) == NULL || 1873 ndi_dc_getaddr(dcp) == NULL) { 1874 ndi_dc_freehdl(dcp); 1875 return (EINVAL); 1876 } 1877 1878 ndi_devi_enter(self, &circ); 1879 1880 child = ndi_devi_find(self, 1881 ndi_dc_getname(dcp), ndi_dc_getaddr(dcp)); 1882 if (child == NULL) { 1883 ndi_devi_exit(self, circ); 1884 ndi_dc_freehdl(dcp); 1885 return (ENXIO); 1886 } 1887 1888 ndi_hold_devi(child); 1889 ndi_devi_exit(self, circ); 1890 1891 /* 1892 * See DDI_CTLOPS_INITCHILD above 1893 */ 1894 sd = ddi_get_driver_private(child); 1895 if ((sd == NULL) || hba->tran_reset( 1896 &sd->sd_address, RESET_TARGET) == 0) { 1897 rv = EIO; 1898 } 1899 1900 ndi_devi_enter(self, &circ); 1901 ndi_rele_devi(child); 1902 ndi_devi_exit(self, circ); 1903 1904 ndi_dc_freehdl(dcp); 1905 1906 break; 1907 1908 1909 case DEVCTL_BUS_QUIESCE: 1910 if ((ndi_get_bus_state(self, &bus_state) == NDI_SUCCESS) && 1911 (bus_state == BUS_QUIESCED)) { 1912 rv = EALREADY; 1913 break; 1914 } 1915 1916 if (hba->tran_quiesce == NULL) { 1917 rv = ENOTSUP; 1918 } else if ((*hba->tran_quiesce)(self) != 0) { 1919 rv = EIO; 1920 } else { 1921 (void) ndi_set_bus_state(self, BUS_QUIESCED); 1922 } 1923 break; 1924 1925 case DEVCTL_BUS_UNQUIESCE: 1926 if ((ndi_get_bus_state(self, &bus_state) == NDI_SUCCESS) && 1927 (bus_state == BUS_ACTIVE)) { 1928 rv = EALREADY; 1929 break; 1930 } 1931 1932 if (hba->tran_unquiesce == NULL) { 1933 rv = ENOTSUP; 1934 } else if ((*hba->tran_unquiesce)(self) != 0) { 1935 rv = EIO; 1936 } else { 1937 (void) ndi_set_bus_state(self, BUS_ACTIVE); 1938 } 1939 break; 1940 1941 case DEVCTL_BUS_RESET: 1942 /* 1943 * Use tran_bus_reset 1944 */ 1945 if (hba->tran_bus_reset == NULL) { 1946 rv = ENOTSUP; 1947 } else if ((*hba->tran_bus_reset)(self, RESET_BUS) == 0) { 1948 rv = EIO; 1949 } 1950 break; 1951 1952 case DEVCTL_BUS_RESETALL: 1953 if (hba->tran_reset == NULL) { 1954 rv = ENOTSUP; 1955 break; 1956 } 1957 /* 1958 * Find a child's scsi_address and invoke tran_reset 1959 * 1960 * XXX If no child exists, one may to able to fake a child. 1961 * This will be a enhancement for the future. 1962 * For now, we fall back to BUS_RESET. 1963 */ 1964 ndi_devi_enter(self, &circ); 1965 child = ddi_get_child(self); 1966 sd = NULL; 1967 while (child) { 1968 if ((sd = ddi_get_driver_private(child)) != NULL) 1969 break; 1970 1971 child = ddi_get_next_sibling(child); 1972 } 1973 1974 if (sd != NULL) { 1975 ndi_hold_devi(child); 1976 ndi_devi_exit(self, circ); 1977 if ((*hba->tran_reset) 1978 (&sd->sd_address, RESET_ALL) == 0) { 1979 rv = EIO; 1980 } 1981 ndi_devi_enter(self, &circ); 1982 ndi_rele_devi(child); 1983 ndi_devi_exit(self, circ); 1984 } else { 1985 ndi_devi_exit(self, circ); 1986 if ((hba->tran_bus_reset == NULL) || 1987 ((*hba->tran_bus_reset)(self, RESET_BUS) == 0)) { 1988 rv = EIO; 1989 } 1990 } 1991 break; 1992 1993 case DEVCTL_BUS_CONFIGURE: 1994 if (ndi_devi_config(self, NDI_DEVFS_CLEAN| 1995 NDI_DEVI_PERSIST|NDI_CONFIG_REPROBE) != NDI_SUCCESS) { 1996 rv = EIO; 1997 } 1998 break; 1999 2000 case DEVCTL_BUS_UNCONFIGURE: 2001 if (ndi_devi_unconfig(self, 2002 NDI_DEVI_REMOVE|NDI_DEVFS_CLEAN) != NDI_SUCCESS) { 2003 rv = EBUSY; 2004 } 2005 break; 2006 2007 default: 2008 rv = ENOTTY; 2009 } /* end of outer switch */ 2010 2011 return (rv); 2012 } 2013 2014 static int 2015 scsi_hba_bus_config(dev_info_t *parent, uint_t flag, ddi_bus_config_op_t op, 2016 void *arg, dev_info_t **childp) 2017 { 2018 scsi_hba_tran_t *hba; 2019 2020 hba = ddi_get_driver_private(parent); 2021 if (hba && hba->tran_bus_config) { 2022 return (hba->tran_bus_config(parent, flag, op, arg, childp)); 2023 } 2024 2025 /* 2026 * Force reprobe for BUS_CONFIG_ONE or when manually reconfiguring 2027 * via devfsadm(1m) to emulate deferred attach. 2028 * Reprobe only discovers driver.conf enumerated nodes, more 2029 * dynamic implementations probably require their own bus_config. 2030 */ 2031 if ((op == BUS_CONFIG_ONE) || (flag & NDI_DRV_CONF_REPROBE)) 2032 flag |= NDI_CONFIG_REPROBE; 2033 2034 return (ndi_busop_bus_config(parent, flag, op, arg, childp, 0)); 2035 } 2036 2037 static int 2038 scsi_hba_bus_unconfig(dev_info_t *parent, uint_t flag, ddi_bus_config_op_t op, 2039 void *arg) 2040 { 2041 scsi_hba_tran_t *hba; 2042 2043 hba = ddi_get_driver_private(parent); 2044 if (hba && hba->tran_bus_unconfig) { 2045 return (hba->tran_bus_unconfig(parent, flag, op, arg)); 2046 } 2047 return (ndi_busop_bus_unconfig(parent, flag, op, arg)); 2048 } 2049 2050 /* 2051 * Convert scsi ascii string data to NULL terminated (semi) legal IEEE 1275 2052 * "compatible" (name) property form. 2053 * 2054 * For ASCII INQUIRY data, a one-way conversion algorithm is needed to take 2055 * SCSI_ASCII (20h - 7Eh) to a 1275-like compatible form. The 1275 spec allows 2056 * letters, digits, one ",", and ". _ + -", all limited by a maximum 31 2057 * character length. Since ", ." are used as separators in the compatible 2058 * string itself, they are converted to "_". All SCSI_ASCII characters that 2059 * are illegal in 1275, as well as any illegal SCSI_ASCII characters 2060 * encountered, are converted to "_". To reduce length, trailing blanks are 2061 * trimmed from SCSI_ASCII fields prior to conversion. 2062 * 2063 * Example: SCSI_ASCII "ST32550W SUN2.1G" -> "ST32550W_SUN2_1G" 2064 * 2065 * NOTE: the 1275 string form is always less than or equal to the scsi form. 2066 */ 2067 static char * 2068 string_scsi_to_1275(char *s_1275, char *s_scsi, int len) 2069 { 2070 (void) strncpy(s_1275, s_scsi, len); 2071 s_1275[len--] = '\0'; 2072 2073 while (len >= 0) { 2074 if (s_1275[len] == ' ') 2075 s_1275[len--] = '\0'; /* trim trailing " " */ 2076 else 2077 break; 2078 } 2079 2080 while (len >= 0) { 2081 if (((s_1275[len] >= 'a') && (s_1275[len] <= 'z')) || 2082 ((s_1275[len] >= 'A') && (s_1275[len] <= 'Z')) || 2083 ((s_1275[len] >= '0') && (s_1275[len] <= '9')) || 2084 (s_1275[len] == '_') || 2085 (s_1275[len] == '+') || 2086 (s_1275[len] == '-')) 2087 len--; /* legal 1275 */ 2088 else 2089 s_1275[len--] = '_'; /* illegal SCSI_ASCII | 1275 */ 2090 } 2091 2092 return (s_1275); 2093 } 2094 2095 /* 2096 * Given the inquiry data, binding_set, and dtype_node for a scsi device, 2097 * return the nodename and compatible property for the device. The "compatible" 2098 * concept comes from IEEE-1275. The compatible information is returned is in 2099 * the correct form for direct use defining the "compatible" string array 2100 * property. Internally, "compatible" is also used to determine the nodename 2101 * to return. 2102 * 2103 * This function is provided as a separate entry point for use by drivers that 2104 * currently issue their own non-SCSA inquiry command and perform their own 2105 * node creation based their own private compiled in tables. Converting these 2106 * drivers to use this interface provides a quick easy way of obtaining 2107 * consistency as well as the flexibility associated with the 1275 techniques. 2108 * 2109 * The dtype_node is passed as a separate argument (instead of having the 2110 * implementation use inq_dtype). It indicates that information about 2111 * a secondary function embedded service should be produced. 2112 * 2113 * Callers must always use scsi_hba_nodename_compatible_free, even if 2114 * *nodenamep is null, to free the nodename and compatible information 2115 * when done. 2116 * 2117 * If a nodename can't be determined then **compatiblep will point to a 2118 * diagnostic string containing all the compatible forms. 2119 * 2120 * NOTE: some compatible strings may violate the 31 character restriction 2121 * imposed by IEEE-1275. This is not a problem because Solaris does not care 2122 * about this 31 character limit. 2123 * 2124 * The following compatible forms, in high to low precedence 2125 * order, are defined for SCSI target device nodes. 2126 * 2127 * scsiclass,DDEEFFF.vVVVVVVVV.pPPPPPPPPPPPPPPPP.rRRRR (1 *1&2) 2128 * scsiclass,DDEE.vVVVVVVVV.pPPPPPPPPPPPPPPPP.rRRRR (2 *1) 2129 * scsiclass,DDFFF.vVVVVVVVV.pPPPPPPPPPPPPPPPP.rRRRR (3 *2) 2130 * scsiclass,DD.vVVVVVVVV.pPPPPPPPPPPPPPPPP.rRRRR (4) 2131 * scsiclass,DDEEFFF.vVVVVVVVV.pPPPPPPPPPPPPPPPP (5 *1&2) 2132 * scsiclass,DDEE.vVVVVVVVV.pPPPPPPPPPPPPPPPP (6 *1) 2133 * scsiclass,DDFFF.vVVVVVVVV.pPPPPPPPPPPPPPPPP (7 *2) 2134 * scsiclass,DD.vVVVVVVVV.pPPPPPPPPPPPPPPPP (8) 2135 * scsa,DD.bBBBBBBBB (8.5 *3) 2136 * scsiclass,DDEEFFF (9 *1&2) 2137 * scsiclass,DDEE (10 *1) 2138 * scsiclass,DDFFF (11 *2) 2139 * scsiclass,DD (12) 2140 * scsiclass (13) 2141 * 2142 * *1 only produced on a secondary function node 2143 * *2 only produced on a node with flags 2144 * *3 only produces when binding-set legacy support is needed 2145 * 2146 * where: 2147 * 2148 * v is the letter 'v'. Denotest the 2149 * beginning of VVVVVVVV. 2150 * 2151 * VVVVVVVV Translated scsi_vendor. 2152 * 2153 * p is the letter 'p'. Denotes the 2154 * beginning of PPPPPPPPPPPPPPPP. 2155 * 2156 * PPPPPPPPPPPPPPPP Translated scsi_product. 2157 * 2158 * r is the letter 'r'. Denotes the 2159 * beginning of RRRR. 2160 * 2161 * RRRR Translated scsi_revision. 2162 * 2163 * DD is a two digit ASCII hexadecimal 2164 * number. The value of the two digits is 2165 * based one the SCSI "Peripheral device 2166 * type" command set associated with the 2167 * node. On a primary node this is the 2168 * scsi_dtype of the primary command set, 2169 * on a secondary node this is the 2170 * scsi_dtype associated with the embedded 2171 * function command set. 2172 * 2173 * EE Same encoding used for DD. This form is 2174 * only generated on secondary function 2175 * nodes. The DD function is embedded in 2176 * an EE device. 2177 * 2178 * FFF Concatenation, in alphabetical order, 2179 * of the flag characters below. The 2180 * following flag characters are defined: 2181 * 2182 * R Removable media: Used when 2183 * scsi_rmb is set. 2184 * 2185 * Forms using FFF are only be generated 2186 * if there are applicable flag 2187 * characters. 2188 * 2189 * b is the letter 'b'. Denotes the 2190 * beginning of BBBBBBBB. 2191 * 2192 * BBBBBBBB Binding-set. Operating System Specific: 2193 * scsi-binding-set property of HBA. 2194 */ 2195 #define NCOMPAT (1 + (8 + 1 + 5) + 1) 2196 #define COMPAT_LONGEST (strlen( \ 2197 "scsiclass,DDEEFFF.vVVVVVVVV.pPPPPPPPPPPPPPPPP.rRRRR" + 1)) 2198 void 2199 scsi_hba_nodename_compatible_get(struct scsi_inquiry *inq, char *binding_set, 2200 int dtype_node, char *compat0, 2201 char **nodenamep, char ***compatiblep, int *ncompatiblep) 2202 { 2203 char vid[sizeof (inq->inq_vid) + 1 ]; 2204 char pid[sizeof (inq->inq_pid) + 1]; 2205 char rev[sizeof (inq->inq_revision) + 1]; 2206 char f[sizeof ("ER")]; 2207 int dtype_device; 2208 int ncompat; /* number of compatible */ 2209 char **compatp; /* compatible ptrs */ 2210 int i; 2211 char *nname; /* nodename */ 2212 char *dname; /* driver name */ 2213 char **csp; 2214 char *p; 2215 int tlen; 2216 int len; 2217 major_t major; 2218 2219 /* 2220 * Nodename_aliases: This table was originally designed to be 2221 * implemented via a new nodename_aliases file - a peer to the 2222 * driver_aliases that selects a nodename based on compatible 2223 * forms in much the same say driver_aliases is used to select 2224 * driver bindings from compatible forms. Each compatible form 2225 * is an 'alias'. Until a more general need for a 2226 * nodename_aliases file exists, which may never occur, the 2227 * scsi mappings are described here via a compiled in table. 2228 * 2229 * This table contains nodename mappings for self-identifying 2230 * scsi devices enumerated by the Solaris kernel. For a given 2231 * device, the highest precedence "compatible" form with a 2232 * mapping is used to select the nodename for the device. This 2233 * will typically be a generic nodename, however in some legacy 2234 * compatibility cases a driver nodename mapping may be selected. 2235 * 2236 * Because of possible breakage associated with switching SCSI 2237 * target devices from driver nodenames to generic nodenames, 2238 * we are currently unable to support generic nodenames for all 2239 * SCSI devices (binding-sets). Although /devices paths are 2240 * defined as unstable, avoiding possible breakage is 2241 * important. Some of the newer SCSI transports (USB) already 2242 * use generic nodenames. All new SCSI transports and target 2243 * devices should use generic nodenames. At times this decision 2244 * may be architecture dependent (sparc .vs. intel) based on when 2245 * a transport was supported on a particular architecture. 2246 * 2247 * We provide a base set of generic nodename mappings based on 2248 * scsiclass dtype and higher-precedence driver nodename 2249 * mappings based on scsa "binding-set" to cover legacy 2250 * issues. The binding-set is typically associated with 2251 * "scsi-binding-set" property value of the HBA. The legacy 2252 * mappings are provided independent of whether the driver they 2253 * refer to is installed. This allows a correctly named node 2254 * be created at discovery time, and binding to occur when/if 2255 * an add_drv of the legacy driver occurs. 2256 * 2257 * We also have mappings for legacy SUN hardware that 2258 * misidentifies itself (enclosure services which identify 2259 * themselves as processors). All future hardware should use 2260 * the correct dtype. 2261 * 2262 * As SCSI HBAs are modified to use the SCSA interfaces for 2263 * self-identifying SCSI target devices (PSARC/2004/116) the 2264 * nodename_aliases table (PSARC/2004/420) should be augmented 2265 * with legacy mappings in order to maintain compatibility with 2266 * existing /devices paths, especially for devices that house 2267 * an OS. Failure to do this may cause upgrade problems. 2268 * Additions for new target devices or transports should not 2269 * add scsa binding-set compatible mappings. 2270 */ 2271 static struct nodename_aliases { 2272 char *na_nodename; /* nodename */ 2273 char *na_alias; /* compatible form match */ 2274 } na[] = { 2275 /* # mapping to generic nodenames based on scsi dtype */ 2276 {"disk", "scsiclass,00"}, 2277 {"tape", "scsiclass,01"}, 2278 {"printer", "scsiclass,02"}, 2279 {"processor", "scsiclass,03"}, 2280 {"worm", "scsiclass,04"}, 2281 {"cdrom", "scsiclass,05"}, 2282 {"scanner", "scsiclass,06"}, 2283 {"optical-disk", "scsiclass,07"}, 2284 {"medium-changer", "scsiclass,08"}, 2285 {"obsolete", "scsiclass,09"}, 2286 {"prepress-a", "scsiclass,0a"}, 2287 {"prepress-b", "scsiclass,0b"}, 2288 {"array-controller", "scsiclass,0c"}, 2289 {"enclosure", "scsiclass,0d"}, 2290 {"disk", "scsiclass,0e"}, 2291 {"card-reader", "scsiclass,0f"}, 2292 {"bridge", "scsiclass,10"}, 2293 {"object-store", "scsiclass,11"}, 2294 {"reserved", "scsiclass,12"}, 2295 {"reserved", "scsiclass,13"}, 2296 {"reserved", "scsiclass,14"}, 2297 {"reserved", "scsiclass,15"}, 2298 {"reserved", "scsiclass,16"}, 2299 {"reserved", "scsiclass,17"}, 2300 {"reserved", "scsiclass,18"}, 2301 {"reserved", "scsiclass,19"}, 2302 {"reserved", "scsiclass,1a"}, 2303 {"reserved", "scsiclass,1b"}, 2304 {"reserved", "scsiclass,1c"}, 2305 {"reserved", "scsiclass,1d"}, 2306 {"well-known-lun", "scsiclass,1e"}, 2307 {"unknown", "scsiclass,1f"}, 2308 2309 #ifdef sparc 2310 /* # legacy mapping to driver nodenames for fcp binding-set */ 2311 {"ssd", "scsa,00.bfcp"}, 2312 {"st", "scsa,01.bfcp"}, 2313 {"sgen", "scsa,08.bfcp"}, 2314 {"ses", "scsa,0d.bfcp"}, 2315 2316 /* # legacy mapping to driver nodenames for vhci binding-set */ 2317 {"ssd", "scsa,00.bvhci"}, 2318 {"st", "scsa,01.bvhci"}, 2319 {"sgen", "scsa,08.bvhci"}, 2320 {"ses", "scsa,0d.bvhci"}, 2321 #else /* sparc */ 2322 /* # for x86 fcp and vhci use generic nodenames */ 2323 #endif /* sparc */ 2324 2325 #ifdef notdef 2326 /* 2327 * The following binding-set specific mappings are not being 2328 * delivered at this time, but are listed here as an examples of 2329 * the type of mappings needed. 2330 */ 2331 2332 /* # legacy mapping to driver nodenames for spi binding-set */ 2333 {"sd", "scsa,00.bspi"}, 2334 {"sd", "scsa,05.bspi"}, 2335 {"sd", "scsa,07.bspi"}, 2336 {"st", "scsa,01.bspi"}, 2337 {"ses", "scsa,0d.bspi"}, 2338 2339 /* # SUN misidentified spi hardware */ 2340 {"ses", "scsiclass,03.vSUN.pD2"}, 2341 {"ses", "scsiclass,03.vSYMBIOS.pD1000"}, 2342 2343 /* # legacy mapping to driver nodenames for atapi binding-set */ 2344 {"sd", "scsa,00.batapi"}, 2345 {"sd", "scsa,05.batapi"}, 2346 {"sd", "scsa,07.batapi"}, 2347 {"st", "scsa,01.batapi"}, 2348 {"unknown", "scsa,0d.batapi"}, 2349 2350 /* # legacy mapping to generic nodenames for usb binding-set */ 2351 {"disk", "scsa,05.busb"}, 2352 {"disk", "scsa,07.busb"}, 2353 {"changer", "scsa,08.busb"}, 2354 {"comm", "scsa,09.busb"}, 2355 {"array_ctlr", "scsa,0c.busb"}, 2356 {"esi", "scsa,0d.busb"}, 2357 #endif /* notdef */ 2358 2359 /* 2360 * mapping nodenames for mpt based on scsi dtype 2361 * for being compatible with the original node names 2362 * under mpt controller 2363 */ 2364 {"sd", "scsa,00.bmpt"}, 2365 {"sd", "scsa,05.bmpt"}, 2366 {"sd", "scsa,07.bmpt"}, 2367 {"st", "scsa,01.bmpt"}, 2368 {"ses", "scsa,0d.bmpt"}, 2369 {"sgen", "scsa,08.bmpt"}, 2370 {NULL, NULL} 2371 }; 2372 struct nodename_aliases *nap; 2373 2374 ASSERT(nodenamep && compatiblep && ncompatiblep && 2375 (binding_set == NULL || (strlen(binding_set) <= 8))); 2376 if ((nodenamep == NULL) || (compatiblep == NULL) || 2377 (ncompatiblep == NULL)) 2378 return; 2379 2380 /* 2381 * In order to reduce runtime we allocate one block of memory that 2382 * contains both the NULL terminated array of pointers to compatible 2383 * forms and the individual compatible strings. This block is 2384 * somewhat larger than needed, but is short lived - it only exists 2385 * until the caller can transfer the information into the "compatible" 2386 * string array property and call scsi_hba_nodename_compatible_free. 2387 */ 2388 tlen = NCOMPAT * COMPAT_LONGEST; 2389 compatp = kmem_alloc((NCOMPAT * sizeof (char *)) + tlen, KM_SLEEP); 2390 2391 /* convert inquiry data from SCSI ASCII to 1275 string */ 2392 (void) string_scsi_to_1275(vid, inq->inq_vid, 2393 sizeof (inq->inq_vid)); 2394 (void) string_scsi_to_1275(pid, inq->inq_pid, 2395 sizeof (inq->inq_pid)); 2396 (void) string_scsi_to_1275(rev, inq->inq_revision, 2397 sizeof (inq->inq_revision)); 2398 ASSERT((strlen(vid) <= sizeof (inq->inq_vid)) && 2399 (strlen(pid) <= sizeof (inq->inq_pid)) && 2400 (strlen(rev) <= sizeof (inq->inq_revision))); 2401 2402 /* 2403 * Form flags alphabetically: 2404 * R - removable: 2405 * Set when inq_rmb is set and for well known scsi dtypes. For a 2406 * bus where the entire device is removable (like USB), we expect 2407 * the HBA to intercept the inquiry data and set inq_rmb. 2408 * Since OBP does not distinguish removable media in its generic 2409 * name selection we avoid setting the 'R' flag if the root is not 2410 * yet mounted. 2411 */ 2412 dtype_device = inq->inq_dtype & DTYPE_MASK; 2413 i = 0; 2414 if (rootvp && (inq->inq_rmb || 2415 (dtype_device == DTYPE_WORM) || 2416 (dtype_device == DTYPE_RODIRECT) || 2417 (dtype_device == DTYPE_OPTICAL))) 2418 f[i++] = 'R'; 2419 f[i] = '\0'; 2420 2421 /* 2422 * Construct all applicable compatible forms. See comment at the 2423 * head of the function for a description of the compatible forms. 2424 */ 2425 csp = compatp; 2426 p = (char *)(compatp + NCOMPAT); 2427 2428 2429 /* ( 0) driver (optional, not documented in scsi(4)) */ 2430 if (compat0) { 2431 *csp++ = p; 2432 (void) snprintf(p, tlen, "%s", compat0); 2433 len = strlen(p) + 1; 2434 p += len; 2435 tlen -= len; 2436 } 2437 2438 /* ( 1) scsiclass,DDEEF.vV.pP.rR */ 2439 if ((dtype_device != dtype_node) && *f && *vid && *pid && *rev) { 2440 *csp++ = p; 2441 (void) snprintf(p, tlen, "scsiclass,%02x%02x%s.v%s.p%s.r%s", 2442 dtype_node, dtype_device, f, vid, pid, rev); 2443 len = strlen(p) + 1; 2444 p += len; 2445 tlen -= len; 2446 } 2447 2448 /* ( 2) scsiclass,DDEE.vV.pP.rR */ 2449 if ((dtype_device != dtype_node) && *vid && *pid && *rev) { 2450 *csp++ = p; 2451 (void) snprintf(p, tlen, "scsiclass,%02x%02x.v%s.p%s.r%s", 2452 dtype_node, dtype_device, vid, pid, rev); 2453 len = strlen(p) + 1; 2454 p += len; 2455 tlen -= len; 2456 } 2457 2458 /* ( 3) scsiclass,DDF.vV.pP.rR */ 2459 if (*f && *vid && *pid && *rev) { 2460 *csp++ = p; 2461 (void) snprintf(p, tlen, "scsiclass,%02x%s.v%s.p%s.r%s", 2462 dtype_node, f, vid, pid, rev); 2463 len = strlen(p) + 1; 2464 p += len; 2465 tlen -= len; 2466 } 2467 2468 /* ( 4) scsiclass,DD.vV.pP.rR */ 2469 if (*vid && *pid && rev) { 2470 *csp++ = p; 2471 (void) snprintf(p, tlen, "scsiclass,%02x.v%s.p%s.r%s", 2472 dtype_node, vid, pid, rev); 2473 len = strlen(p) + 1; 2474 p += len; 2475 tlen -= len; 2476 } 2477 2478 /* ( 5) scsiclass,DDEEF.vV.pP */ 2479 if ((dtype_device != dtype_node) && *f && *vid && *pid) { 2480 *csp++ = p; 2481 (void) snprintf(p, tlen, "scsiclass,%02x%02x%s.v%s.p%s", 2482 dtype_node, dtype_device, f, vid, pid); 2483 len = strlen(p) + 1; 2484 p += len; 2485 tlen -= len; 2486 } 2487 2488 /* ( 6) scsiclass,DDEE.vV.pP */ 2489 if ((dtype_device != dtype_node) && *vid && *pid) { 2490 *csp++ = p; 2491 (void) snprintf(p, tlen, "scsiclass,%02x%02x.v%s.p%s", 2492 dtype_node, dtype_device, vid, pid); 2493 len = strlen(p) + 1; 2494 p += len; 2495 tlen -= len; 2496 } 2497 2498 /* ( 7) scsiclass,DDF.vV.pP */ 2499 if (*f && *vid && *pid) { 2500 *csp++ = p; 2501 (void) snprintf(p, tlen, "scsiclass,%02x%s.v%s.p%s", 2502 dtype_node, f, vid, pid); 2503 len = strlen(p) + 1; 2504 p += len; 2505 tlen -= len; 2506 } 2507 2508 /* ( 8) scsiclass,DD.vV.pP */ 2509 if (*vid && *pid) { 2510 *csp++ = p; 2511 (void) snprintf(p, tlen, "scsiclass,%02x.v%s.p%s", 2512 dtype_node, vid, pid); 2513 len = strlen(p) + 1; 2514 p += len; 2515 tlen -= len; 2516 } 2517 2518 /* (8.5) scsa,DD.bB (not documented in scsi(4)) */ 2519 if (binding_set) { 2520 *csp++ = p; 2521 (void) snprintf(p, tlen, "scsa,%02x.b%s", 2522 dtype_node, binding_set); 2523 len = strlen(p) + 1; 2524 p += len; 2525 tlen -= len; 2526 } 2527 2528 /* ( 9) scsiclass,DDEEF */ 2529 if ((dtype_device != dtype_node) && *f) { 2530 *csp++ = p; 2531 (void) snprintf(p, tlen, "scsiclass,%02x%02x%s", 2532 dtype_node, dtype_device, f); 2533 len = strlen(p) + 1; 2534 p += len; 2535 tlen -= len; 2536 } 2537 2538 /* (10) scsiclass,DDEEF */ 2539 if (dtype_device != dtype_node) { 2540 *csp++ = p; 2541 (void) snprintf(p, tlen, "scsiclass,%02x%02x", 2542 dtype_node, dtype_device); 2543 len = strlen(p) + 1; 2544 p += len; 2545 tlen -= len; 2546 } 2547 2548 /* (11) scsiclass,DDF */ 2549 if (*f) { 2550 *csp++ = p; 2551 (void) snprintf(p, tlen, "scsiclass,%02x%s", 2552 dtype_node, f); 2553 len = strlen(p) + 1; 2554 p += len; 2555 tlen -= len; 2556 } 2557 2558 /* (12) scsiclass,DD */ 2559 *csp++ = p; 2560 (void) snprintf(p, tlen, "scsiclass,%02x", dtype_node); 2561 len = strlen(p) + 1; 2562 p += len; 2563 tlen -= len; 2564 2565 /* (13) scsiclass */ 2566 *csp++ = p; 2567 (void) snprintf(p, tlen, "scsiclass"); 2568 len = strlen(p) + 1; 2569 p += len; 2570 tlen -= len; 2571 ASSERT(tlen >= 0); 2572 2573 *csp = NULL; /* NULL terminate array of pointers */ 2574 ncompat = csp - compatp; 2575 2576 /* 2577 * When determining a nodename, a nodename_aliases specified 2578 * mapping has precedence over using a driver_aliases specified 2579 * driver binding as a nodename. 2580 * 2581 * See if any of the compatible forms have a nodename_aliases 2582 * specified nodename. These mappings are described by 2583 * nodename_aliases entries like: 2584 * 2585 * disk "scsiclass,00" 2586 * enclosure "scsiclass,03.vSYMBIOS.pD1000" 2587 * ssd "scsa,00.bfcp" 2588 * 2589 * All nodename_aliases mappings should idealy be to generic 2590 * names, however a higher precedence legacy mapping to a 2591 * driver name may exist. The highest precedence mapping 2592 * provides the nodename, so legacy driver nodename mappings 2593 * (if they exist) take precedence over generic nodename 2594 * mappings. 2595 */ 2596 for (nname = NULL, csp = compatp; (nname == NULL) && *csp; csp++) { 2597 for (nap = na; nap->na_nodename; nap++) { 2598 if (strcmp(*csp, nap->na_alias) == 0) { 2599 nname = nap->na_nodename; 2600 break; 2601 } 2602 } 2603 } 2604 2605 /* 2606 * If no nodename_aliases mapping exists then use the 2607 * driver_aliases specified driver binding as a nodename. 2608 * Determine the driver based on compatible (which may 2609 * have the passed in compat0 as the first item). The 2610 * driver_aliases file has entries like 2611 * 2612 * sd "scsiclass,00" 2613 * 2614 * that map compatible forms to specific drivers. These 2615 * entries are established by add_drv. We use the most specific 2616 * driver binding as the nodename. This matches the eventual 2617 * ddi_driver_compatible_major() binding that will be 2618 * established by bind_node() 2619 */ 2620 if (nname == NULL) { 2621 for (dname = NULL, csp = compatp; *csp; csp++) { 2622 major = ddi_name_to_major(*csp); 2623 if ((major == (major_t)-1) || 2624 (devnamesp[major].dn_flags & DN_DRIVER_REMOVED)) 2625 continue; 2626 if (dname = ddi_major_to_name(major)) 2627 break; 2628 } 2629 nname = dname; 2630 } 2631 2632 /* return results */ 2633 if (nname) { 2634 *nodenamep = kmem_alloc(strlen(nname) + 1, KM_SLEEP); 2635 (void) strcpy(*nodenamep, nname); 2636 } else { 2637 *nodenamep = NULL; 2638 2639 /* 2640 * If no nodename could be determined return a special 2641 * 'compatible' to be used for a diagnostic message. This 2642 * compatible contains all compatible forms concatenated 2643 * into a single string pointed to by the first element. 2644 */ 2645 if (nname == NULL) { 2646 for (csp = compatp; *(csp + 1); csp++) 2647 *((*csp) + strlen(*csp)) = ' '; 2648 *(compatp + 1) = NULL; 2649 ncompat = 1; 2650 } 2651 2652 } 2653 *compatiblep = compatp; 2654 *ncompatiblep = ncompat; 2655 } 2656 2657 /* Free allocations associated with scsi_hba_nodename_compatible_get use. */ 2658 void 2659 scsi_hba_nodename_compatible_free(char *nodename, char **compatible) 2660 { 2661 if (nodename) 2662 kmem_free(nodename, strlen(nodename) + 1); 2663 2664 if (compatible) 2665 kmem_free(compatible, (NCOMPAT * sizeof (char *)) + 2666 (NCOMPAT * COMPAT_LONGEST)); 2667 } 2668 2669 /*ARGSUSED*/ 2670 static int 2671 scsi_hba_fm_init_child(dev_info_t *self, dev_info_t *child, int cap, 2672 ddi_iblock_cookie_t *ibc) 2673 { 2674 scsi_hba_tran_t *hba = ddi_get_driver_private(self); 2675 2676 return (hba ? hba->tran_fm_capable : scsi_fm_capable); 2677 } 2678 2679 static int 2680 scsi_hba_bus_power(dev_info_t *parent, void *impl_arg, pm_bus_power_op_t op, 2681 void *arg, void *result) 2682 { 2683 scsi_hba_tran_t *hba; 2684 2685 hba = ddi_get_driver_private(parent); 2686 if (hba && hba->tran_bus_power) { 2687 return (hba->tran_bus_power(parent, impl_arg, op, arg, result)); 2688 } 2689 2690 return (pm_busop_bus_power(parent, impl_arg, op, arg, result)); 2691 } 2692