Lines Matching +full:multi +full:- +full:functional
78 /* Multi-threaded configuration */
131 * A non-global zone's /dev is derived from the device tree.
146 /* bitset of DS_SYSAVAIL & DS_RECONFIG - no races, no lock */
153 * (MUTEX_DEFAULT) - it is automatically initialized by being allocated
163 /* Allow path-oriented alias driver binding on driver.conf enumerated nodes */
272 devi->devi_audit = kmem_zalloc(sizeof (devinfo_audit_t), flag); in i_ddi_alloc_node()
273 if (devi->devi_audit == NULL) in i_ddi_alloc_node()
277 if ((devi->devi_node_name = i_ddi_strdup(node_name, flag)) == NULL) in i_ddi_alloc_node()
281 devi->devi_binding_name = devi->devi_node_name; in i_ddi_alloc_node()
282 devi->devi_major = DDI_MAJOR_T_NONE; /* unbound by default */ in i_ddi_alloc_node()
288 (devi->devi_sys_prop_ptr = i_ddi_prop_list_dup(sys_prop, flag)) in i_ddi_alloc_node()
305 * Where A = DDI_AUTO_ASSIGNED_NODEID (auto-assign a nodeid) in i_ddi_alloc_node()
310 * auto-assigned nodeids are also auto-freed. in i_ddi_alloc_node()
312 devi->devi_node_attributes = 0; in i_ddi_alloc_node()
315 devi->devi_node_attributes |= DDI_HIDDEN_NODE; in i_ddi_alloc_node()
319 devi->devi_node_attributes |= DDI_HOTPLUG_NODE; in i_ddi_alloc_node()
323 devi->devi_node_attributes |= DDI_HIDDEN_NODE; in i_ddi_alloc_node()
324 devi->devi_node_attributes |= DDI_HOTPLUG_NODE; in i_ddi_alloc_node()
328 sid: devi->devi_node_attributes |= DDI_PERSISTENT; in i_ddi_alloc_node()
334 devi->devi_node_attributes |= DDI_AUTO_ASSIGNED_NODEID; in i_ddi_alloc_node()
335 devi->devi_node_class = DDI_NC_PSEUDO; in i_ddi_alloc_node()
336 if (impl_ddi_alloc_nodeid(&devi->devi_nodeid)) { in i_ddi_alloc_node()
355 devi->devi_nodeid = nodeid; in i_ddi_alloc_node()
356 devi->devi_node_class = DDI_NC_PROM; in i_ddi_alloc_node()
357 devi->devi_node_attributes = DDI_PERSISTENT; in i_ddi_alloc_node()
362 mutex_enter(&devimap->dno_lock); in i_ddi_alloc_node()
363 elem->next = devimap->dno_free; in i_ddi_alloc_node()
364 devimap->dno_free = elem; in i_ddi_alloc_node()
365 mutex_exit(&devimap->dno_lock); in i_ddi_alloc_node()
369 * Instance is normally initialized to -1. In a few special in i_ddi_alloc_node()
372 devi->devi_instance = instance; in i_ddi_alloc_node()
377 devi->devi_parent = DEVI(pdip); in i_ddi_alloc_node()
378 devi->devi_bus_ctl = DEVI(pdip); in i_ddi_alloc_node()
381 "i_ddi_alloc_node: name=%s id=%d\n", node_name, devi->devi_nodeid)); in i_ddi_alloc_node()
383 cv_init(&(devi->devi_cv), NULL, CV_DEFAULT, NULL); in i_ddi_alloc_node()
384 mutex_init(&(devi->devi_lock), NULL, MUTEX_DEFAULT, NULL); in i_ddi_alloc_node()
385 mutex_init(&(devi->devi_pm_lock), NULL, MUTEX_DEFAULT, NULL); in i_ddi_alloc_node()
386 mutex_init(&(devi->devi_pm_busy_lock), NULL, MUTEX_DEFAULT, NULL); in i_ddi_alloc_node()
391 mutex_init(&(devi->devi_ct_lock), NULL, MUTEX_DEFAULT, NULL); in i_ddi_alloc_node()
392 cv_init(&(devi->devi_ct_cv), NULL, CV_DEFAULT, NULL); in i_ddi_alloc_node()
393 devi->devi_ct_count = -1; /* counter not in use if -1 */ in i_ddi_alloc_node()
394 list_create(&(devi->devi_ct), sizeof (cont_device_t), in i_ddi_alloc_node()
402 if (devi->devi_sys_prop_ptr) in i_ddi_alloc_node()
403 i_ddi_prop_list_delete(devi->devi_sys_prop_ptr); in i_ddi_alloc_node()
404 if (devi->devi_node_name) in i_ddi_alloc_node()
405 kmem_free(devi->devi_node_name, strlen(node_name) + 1); in i_ddi_alloc_node()
406 if (devi->devi_audit) in i_ddi_alloc_node()
407 kmem_free(devi->devi_audit, sizeof (devinfo_audit_t)); in i_ddi_alloc_node()
423 ASSERT(devi->devi_ref == 0); in i_ddi_free_node()
424 ASSERT(devi->devi_addr == NULL); in i_ddi_free_node()
425 ASSERT(devi->devi_node_state == DS_PROTO); in i_ddi_free_node()
426 ASSERT(devi->devi_child == NULL); in i_ddi_free_node()
427 ASSERT(devi->devi_hp_hdlp == NULL); in i_ddi_free_node()
430 if (devi->devi_addr_buf) in i_ddi_free_node()
431 kmem_free(devi->devi_addr_buf, 2 * MAXNAMELEN); in i_ddi_free_node()
434 impl_ddi_free_nodeid(DEVI(dip)->devi_nodeid); in i_ddi_free_node()
437 mutex_enter(&devimap->dno_lock); in i_ddi_free_node()
438 ASSERT(devimap->dno_free); in i_ddi_free_node()
439 elem = devimap->dno_free; in i_ddi_free_node()
440 devimap->dno_free = elem->next; in i_ddi_free_node()
441 mutex_exit(&devimap->dno_lock); in i_ddi_free_node()
445 if (DEVI(dip)->devi_compat_names) in i_ddi_free_node()
446 kmem_free(DEVI(dip)->devi_compat_names, in i_ddi_free_node()
447 DEVI(dip)->devi_compat_length); in i_ddi_free_node()
448 if (DEVI(dip)->devi_rebinding_name) in i_ddi_free_node()
449 kmem_free(DEVI(dip)->devi_rebinding_name, in i_ddi_free_node()
450 strlen(DEVI(dip)->devi_rebinding_name) + 1); in i_ddi_free_node()
453 if (devi->devi_sys_prop_ptr) in i_ddi_free_node()
454 i_ddi_prop_list_delete(devi->devi_sys_prop_ptr); in i_ddi_free_node()
455 if (devi->devi_hw_prop_ptr) in i_ddi_free_node()
456 i_ddi_prop_list_delete(devi->devi_hw_prop_ptr); in i_ddi_free_node()
458 if (DEVI(dip)->devi_devid_str) in i_ddi_free_node()
459 ddi_devid_str_free(DEVI(dip)->devi_devid_str); in i_ddi_free_node()
463 if (devi->devi_audit) { in i_ddi_free_node()
464 kmem_free(devi->devi_audit, sizeof (devinfo_audit_t)); in i_ddi_free_node()
466 if (devi->devi_device_class) in i_ddi_free_node()
467 kmem_free(devi->devi_device_class, in i_ddi_free_node()
468 strlen(devi->devi_device_class) + 1); in i_ddi_free_node()
469 cv_destroy(&(devi->devi_cv)); in i_ddi_free_node()
470 mutex_destroy(&(devi->devi_lock)); in i_ddi_free_node()
471 mutex_destroy(&(devi->devi_pm_lock)); in i_ddi_free_node()
472 mutex_destroy(&(devi->devi_pm_busy_lock)); in i_ddi_free_node()
477 ASSERT(devi->devi_ct_count == -1); in i_ddi_free_node()
478 ASSERT(list_is_empty(&(devi->devi_ct))); in i_ddi_free_node()
479 cv_destroy(&(devi->devi_ct_cv)); in i_ddi_free_node()
480 list_destroy(&(devi->devi_ct)); in i_ddi_free_node()
482 mutex_destroy(&(devi->devi_ct_lock)); in i_ddi_free_node()
484 "dip=%p, name=%s", (void *)dip, devi->devi_node_name)); in i_ddi_free_node()
486 kmem_free(devi->devi_node_name, strlen(devi->devi_node_name) + 1); in i_ddi_free_node()
489 if (devi->devi_ev_path) in i_ddi_free_node()
490 kmem_free(devi->devi_ev_path, MAXPATHLEN); in i_ddi_free_node()
511 oname = DEVI(dip)->devi_node_name; in ndi_devi_set_nodename()
526 " %s -> %s", (void *)dip, ddi_node_name(dip), name); in ndi_devi_set_nodename()
531 DEVI(dip)->devi_node_name = nname; in ndi_devi_set_nodename()
552 mutex_enter(&devimap->dno_lock); in i_ddi_add_devimap()
554 ASSERT(devimap->dno_free); in i_ddi_add_devimap()
556 elem = devimap->dno_free; in i_ddi_add_devimap()
557 devimap->dno_free = elem->next; in i_ddi_add_devimap()
559 elem->nodeid = ddi_get_nodeid(dip); in i_ddi_add_devimap()
560 elem->dip = dip; in i_ddi_add_devimap()
561 elem->next = devimap->dno_head; in i_ddi_add_devimap()
562 devimap->dno_head = elem; in i_ddi_add_devimap()
564 devimap->dno_list_length++; in i_ddi_add_devimap()
566 mutex_exit(&devimap->dno_lock); in i_ddi_add_devimap()
580 mutex_enter(&devimap->dno_lock); in i_ddi_remove_devimap()
588 mutex_exit(&devimap->dno_lock); in i_ddi_remove_devimap()
592 ASSERT(devimap->dno_head); in i_ddi_remove_devimap()
593 ASSERT(devimap->dno_list_length > 0); in i_ddi_remove_devimap()
596 for (elem = devimap->dno_head; elem; elem = elem->next) { in i_ddi_remove_devimap()
597 if (elem->dip == dip) { in i_ddi_remove_devimap()
598 ASSERT(elem->nodeid == ddi_get_nodeid(dip)); in i_ddi_remove_devimap()
605 prev->next = elem->next; in i_ddi_remove_devimap()
607 devimap->dno_head = elem->next; in i_ddi_remove_devimap()
612 devimap->dno_list_length--; in i_ddi_remove_devimap()
614 elem->nodeid = 0; in i_ddi_remove_devimap()
615 elem->dip = NULL; in i_ddi_remove_devimap()
617 elem->next = devimap->dno_free; in i_ddi_remove_devimap()
618 devimap->dno_free = elem; in i_ddi_remove_devimap()
620 mutex_exit(&devimap->dno_lock); in i_ddi_remove_devimap()
633 struct dev_info *parent = devi->devi_parent; in link_node()
639 parent->devi_node_name, devi->devi_node_name)); in link_node()
652 dipp = (dev_info_t **)(&DEVI(parent)->devi_child); in link_node()
654 dipp = (dev_info_t **)(&DEVI(*dipp)->devi_sibling); in link_node()
659 * Now that we are in the tree, update the devi-nodeid map. in link_node()
670 * that system PM and CPR both traverse the tree left-to-right during in link_node()
671 * SUSPEND and right-to-left during RESUME. in link_node()
675 if (strcmp(devi->devi_binding_name, "scsi_vhci") == 0) { in link_node()
679 devi->devi_sibling = parent->devi_child; in link_node()
680 parent->devi_child = devi; in link_node()
681 } else if (strcmp(devi->devi_binding_name, "ib") == 0) { in link_node()
686 DEVI(dip)->devi_sibling = NULL; in link_node()
708 struct dev_info *parent = devi->devi_parent; in unlink_node()
713 ASSERT(devi->devi_node_state == DS_LINKED); in unlink_node()
719 if (devi->devi_ref || i_ddi_remove_devimap(dip) != DDI_SUCCESS) in unlink_node()
729 dipp = (dev_info_t **)(&DEVI(parent)->devi_child); in unlink_node()
731 dipp = (dev_info_t **)(&DEVI(*dipp)->devi_sibling); in unlink_node()
734 *dipp = (dev_info_t *)(devi->devi_sibling); in unlink_node()
735 devi->devi_sibling = NULL; in unlink_node()
738 devi->devi_node_name)); in unlink_node()
754 for (hdlp = DEVI(parent)->devi_hp_hdlp; hdlp; hdlp = hdlp->next) { in unlink_node()
755 if (hdlp->cn_info.cn_child == dip) in unlink_node()
756 hdlp->cn_info.cn_child = NULL; in unlink_node()
762 * Bind this devinfo node to a driver. If compat is NON-NULL, try that first.
763 * Else, use the node-name.
769 * - set the binding name to the string,
770 * - set major number to driver major
773 * - return failure
783 ASSERT(devi->devi_node_state == DS_LINKED); in bind_node()
788 mutex_enter(&DEVI(dip)->devi_lock); in bind_node()
789 if (DEVI(dip)->devi_flags & DEVI_NO_BIND) { in bind_node()
790 mutex_exit(&DEVI(dip)->devi_lock); in bind_node()
793 mutex_exit(&DEVI(dip)->devi_lock); in bind_node()
800 devi->devi_major = major; in bind_node()
804 devi->devi_node_name, p)); in bind_node()
807 /* Link node to per-driver list */ in bind_node()
814 mutex_enter(&DEVI(parent)->devi_lock); in bind_node()
815 DEVI(parent)->devi_flags &= in bind_node()
817 mutex_exit(&DEVI(parent)->devi_lock); in bind_node()
829 ASSERT(DEVI(dip)->devi_node_state == DS_BOUND); in unbind_node()
830 ASSERT(DEVI(dip)->devi_major != DDI_MAJOR_T_NONE); in unbind_node()
833 if (DEVI(dip)->devi_ref) in unbind_node()
841 DEVI(dip)->devi_major = DDI_MAJOR_T_NONE; in unbind_node()
842 DEVI(dip)->devi_binding_name = DEVI(dip)->devi_node_name; in unbind_node()
848 * Must hold parent and per-driver list while calling this function.
875 if ((DEVI(pdip)->devi_ops->devo_bus_ops == NULL) || in init_node()
876 (f = DEVI(pdip)->devi_ops->devo_bus_ops->bus_ctl) == NULL) { in init_node()
903 * the cache even if DEVI_CACHED_DEVID is not set - if only in init_node()
906 mutex_enter(&DEVI(dip)->devi_lock); in init_node()
907 if ((DEVI(dip)->devi_flags & DEVI_CACHED_DEVID) || in init_node()
908 DEVI(dip)->devi_devid_str) { in init_node()
909 DEVI(dip)->devi_flags &= ~DEVI_CACHED_DEVID; in init_node()
910 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
913 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
929 * uninit_node() the duplicate - a successful uninit_node() in init_node()
949 if (!(DEVI(dip)->devi_flags & DEVI_CACHED_DEVID) && in init_node()
952 mutex_enter(&DEVI(dip)->devi_lock); in init_node()
953 DEVI(dip)->devi_flags |= DEVI_CACHED_DEVID; in init_node()
954 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
961 * Check to see if we have a path-oriented driver alias that overrides in init_node()
964 * so the unit-address is established on the last component of the path. in init_node()
966 * NOTE: Allowing a path-oriented alias to change the driver binding in init_node()
967 * of a driver.conf node results in non-intuitive property behavior. in init_node()
971 * NOTE: If you are adding a path-oriented alias for the boot device, in init_node()
974 * to add a path-oriented alias for both paths. in init_node()
977 if (driver_active(major) && (major != DEVI(dip)->devi_major) && in init_node()
981 mutex_enter(&DEVI(dip)->devi_lock); in init_node()
982 DEVI(dip)->devi_flags |= DEVI_REBIND; in init_node()
983 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
994 * uninit_node() current binding - a successful uninit_node() in init_node()
1014 if (DEVI(dip)->devi_rebinding_name == NULL) in init_node()
1015 DEVI(dip)->devi_rebinding_name = in init_node()
1022 * after we are rebound to the path-bound driver. in init_node()
1024 * Start by rebinding node to the path-bound driver. in init_node()
1035 * driver.conf properties from new path-bound driver.conf. in init_node()
1057 * Apply multi-parent/deep-nexus optimization to the new node in init_node()
1059 DEVI(dip)->devi_instance = e_ddi_assign_instance(dip); in init_node()
1065 mutex_enter(&DEVI(dip)->devi_lock); in init_node()
1066 DEVI(dip)->devi_flags &= ~DEVI_REBIND; in init_node()
1067 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
1075 * The per-driver list must be held busy during the call.
1090 * Don't check for references here or else a ref-counted in uninit_node()
1103 (ops->devo_bus_ops == NULL) || in uninit_node()
1104 ((f = ops->devo_bus_ops->bus_ctl) == NULL)) { in uninit_node()
1123 mutex_enter(&DEVI(dip)->devi_lock); in uninit_node()
1124 if ((DEVI(dip)->devi_flags & DEVI_CACHED_DEVID)) { in uninit_node()
1125 DEVI(dip)->devi_flags &= ~DEVI_CACHED_DEVID; in uninit_node()
1126 mutex_exit(&DEVI(dip)->devi_lock); in uninit_node()
1129 mutex_exit(&DEVI(dip)->devi_lock); in uninit_node()
1135 * Free instance number. This is a no-op if instance has in uninit_node()
1142 DEVI(dip)->devi_instance = -1; in uninit_node()
1151 * NOTE: The decision on whether to allow a path-oriented in uninit_node()
1158 * on rebound driver.conf file is non-intuitive. For a in uninit_node()
1159 * driver.conf node, the unit-address properties come from in uninit_node()
1162 * useless (we get node without unit-address properties) - so in uninit_node()
1167 * that the path-oriented alias driver.conf file defined a in uninit_node()
1169 * that node and avoid the non-intuitive property behavior. in uninit_node()
1171 * this, so we live with the non-intuitive property behavior. in uninit_node()
1174 (DEVI(dip)->devi_flags & DEVI_REBIND))) in uninit_node()
1190 * Per-driver list must be held busy while calling this function.
1203 DEVI(dip)->devi_ops = ndi_hold_driver(dip); in probe_node()
1204 if (DEVI(dip)->devi_ops == NULL) { in probe_node()
1218 DEVI(dip)->devi_ops = NULL; in probe_node()
1249 * Per-driver list must be held busy while calling this function.
1257 * Don't check for references here or else a ref-counted in unprobe_node()
1268 * Per-driver list must be held busy.
1289 ASSERT(DEVI(dip)->devi_ops == NULL); in attach_node()
1294 DEVI(dip)->devi_ops = ndi_hold_driver(dip); in attach_node()
1295 if (DEVI(dip)->devi_ops == NULL) { in attach_node()
1301 DEVI(dip)->devi_major); in attach_node()
1305 if (NEXUS_DRV(DEVI(dip)->devi_ops)) in attach_node()
1306 DEVI(dip)->devi_taskq = ddi_taskq_create(dip, in attach_node()
1310 mutex_enter(&(DEVI(dip)->devi_lock)); in attach_node()
1313 mutex_exit(&(DEVI(dip)->devi_lock)); in attach_node()
1317 mutex_enter(&(DEVI(dip)->devi_lock)); in attach_node()
1322 mutex_exit(&DEVI(dip)->devi_lock); in attach_node()
1331 if (DEVI(dip)->devi_taskq) in attach_node()
1332 ddi_taskq_destroy(DEVI(dip)->devi_taskq); in attach_node()
1337 DEVI(dip)->devi_ops = NULL; in attach_node()
1342 mutex_exit(&DEVI(dip)->devi_lock); in attach_node()
1351 * Per-driver list must be held busy.
1363 if (DEVI(dip)->devi_ref) in detach_node()
1387 if (DEVI(dip)->devi_taskq) in detach_node()
1388 ddi_taskq_wait(DEVI(dip)->devi_taskq); in detach_node()
1399 mutex_enter(&(DEVI(dip)->devi_lock)); in detach_node()
1401 mutex_exit(&(DEVI(dip)->devi_lock)); in detach_node()
1412 if (DEVI(dip)->devi_taskq) { in detach_node()
1413 ddi_taskq_destroy(DEVI(dip)->devi_taskq); in detach_node()
1414 DEVI(dip)->devi_taskq = NULL; in detach_node()
1424 if (DEVI(dip)->devi_flavorv_n > 1 && DEVI(dip)->devi_flavorv != NULL) { in detach_node()
1425 kmem_free(DEVI(dip)->devi_flavorv, in detach_node()
1426 (DEVI(dip)->devi_flavorv_n - 1) * sizeof (void *)); in detach_node()
1427 DEVI(dip)->devi_flavorv = NULL; in detach_node()
1435 mutex_enter(&DEVI(dip)->devi_lock); in detach_node()
1436 DEVI(dip)->devi_flags &= ~(DEVI_MADE_CHILDREN|DEVI_ATTACHED_CHILDREN); in detach_node()
1437 mutex_exit(&DEVI(dip)->devi_lock); in detach_node()
1445 dnp = &(devnamesp[DEVI(dip)->devi_major]); in detach_node()
1446 LOCK_DEV_OPS(&dnp->dn_lock); in detach_node()
1447 dnp->dn_flags &= ~DN_DRIVER_HELD; in detach_node()
1448 UNLOCK_DEV_OPS(&dnp->dn_lock); in detach_node()
1453 DEVI(dip)->devi_ops = NULL; in detach_node()
1500 * Run dacf pre-detach routines
1508 * Don't auto-detach if DDI_FORCEATTACH or DDI_NO_AUTODETACH in predetach_node()
1522 dnp = &devnamesp[DEVI(dip)->devi_major]; in predetach_node()
1523 LOCK_DEV_OPS(&dnp->dn_lock); in predetach_node()
1524 if (dnp->dn_flags & DN_NO_AUTODETACH) { in predetach_node()
1525 UNLOCK_DEV_OPS(&dnp->dn_lock); in predetach_node()
1528 UNLOCK_DEV_OPS(&dnp->dn_lock); in predetach_node()
1577 * - boot code in i_ndi_config_node()
1578 * - add_drv in i_ndi_config_node()
1579 * - hotplug thread in i_ndi_config_node()
1584 * conversion to top-down loading. in i_ndi_config_node()
1593 * per-driver busy changing flag, since we already in i_ndi_config_node()
1606 * attach. We can't do this for non-persistent nodes in i_ndi_config_node()
1661 * .conf nodes synchronizes on per-driver list. in i_ndi_unconfig_node()
1669 * per-driver busy changing flag, since we already in i_ndi_unconfig_node()
1686 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1688 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1695 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1697 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1778 * of DS_READY for a small amount of time - this is the source of
1779 * transient DS_READY->DS_ATTACHED->DS_READY state changes.
1833 if (DEVI(dip)->devi_child) { in ddi_remove_child()
1839 ASSERT(DEVI(dip)->devi_child == NULL); in ddi_remove_child()
1864 mutex_enter(&DEVI(dip)->devi_lock); in ndi_hold_devi()
1865 ASSERT(DEVI(dip)->devi_ref >= 0); in ndi_hold_devi()
1866 DEVI(dip)->devi_ref++; in ndi_hold_devi()
1868 mutex_exit(&DEVI(dip)->devi_lock); in ndi_hold_devi()
1874 ASSERT(DEVI(dip)->devi_ref > 0); in ndi_rele_devi()
1876 mutex_enter(&DEVI(dip)->devi_lock); in ndi_rele_devi()
1877 DEVI(dip)->devi_ref--; in ndi_rele_devi()
1879 mutex_exit(&DEVI(dip)->devi_lock); in ndi_rele_devi()
1885 return (DEVI(dip)->devi_ref); in e_ddi_devi_holdcnt()
1897 ASSERT(DEVI(dip)->devi_major != -1); in ndi_hold_driver()
1898 return (mod_hold_dev_by_major(DEVI(dip)->devi_major)); in ndi_hold_driver()
1905 mod_rele_dev_by_major(DEVI(dip)->devi_major); in ndi_rele_driver()
1922 mutex_enter(&devi->devi_lock); in ndi_devi_enter()
1923 if (devi->devi_busy_thread == curthread) { in ndi_devi_enter()
1924 devi->devi_circular++; in ndi_devi_enter()
1927 cv_wait(&(devi->devi_cv), &(devi->devi_lock)); in ndi_devi_enter()
1929 mutex_exit(&devi->devi_lock); in ndi_devi_enter()
1932 devi->devi_flags |= DEVI_BUSY; in ndi_devi_enter()
1933 devi->devi_busy_thread = curthread; in ndi_devi_enter()
1935 *circular = devi->devi_circular; in ndi_devi_enter()
1936 mutex_exit(&devi->devi_lock); in ndi_devi_enter()
1952 mutex_enter(&(devi->devi_lock)); in ndi_devi_exit()
1954 devi->devi_circular--; in ndi_devi_exit()
1956 devi->devi_flags &= ~DEVI_BUSY; in ndi_devi_exit()
1957 ASSERT(devi->devi_busy_thread == curthread); in ndi_devi_exit()
1958 devi->devi_busy_thread = NULL; in ndi_devi_exit()
1959 cv_broadcast(&(devi->devi_cv)); in ndi_devi_exit()
1961 mutex_exit(&(devi->devi_lock)); in ndi_devi_exit()
1970 mutex_enter(&(vdevi->devi_lock)); in ndi_devi_exit()
1971 if (vdevi->devi_flags & DEVI_PHCI_SIGNALS_VHCI) { in ndi_devi_exit()
1972 vdevi->devi_flags &= ~DEVI_PHCI_SIGNALS_VHCI; in ndi_devi_exit()
1973 cv_broadcast(&(vdevi->devi_cv)); in ndi_devi_exit()
1975 mutex_exit(&(vdevi->devi_lock)); in ndi_devi_exit()
2000 mutex_enter(&(devi->devi_lock)); in ndi_devi_exit_and_wait()
2001 devi->devi_flags &= ~DEVI_BUSY; in ndi_devi_exit_and_wait()
2002 ASSERT(devi->devi_busy_thread == curthread); in ndi_devi_exit_and_wait()
2003 devi->devi_busy_thread = NULL; in ndi_devi_exit_and_wait()
2004 cv_broadcast(&(devi->devi_cv)); in ndi_devi_exit_and_wait()
2007 (void) cv_timedwait(&devi->devi_cv, &(devi->devi_lock), end_time); in ndi_devi_exit_and_wait()
2008 mutex_exit(&(devi->devi_lock)); in ndi_devi_exit_and_wait()
2021 mutex_enter(&devi->devi_lock); in ndi_devi_tryenter()
2022 if (devi->devi_busy_thread == (void *)curthread) { in ndi_devi_tryenter()
2023 devi->devi_circular++; in ndi_devi_tryenter()
2026 devi->devi_flags |= DEVI_BUSY; in ndi_devi_tryenter()
2027 devi->devi_busy_thread = (void *)curthread; in ndi_devi_tryenter()
2032 *circular = devi->devi_circular; in ndi_devi_tryenter()
2033 mutex_exit(&devi->devi_lock); in ndi_devi_tryenter()
2051 *ret_dip = i_ddi_alloc_node(parent, node_name, nodeid, -1, NULL, in ndi_devi_alloc()
2071 *ret_dip = i_ddi_alloc_node(parent, node_name, nodeid, -1, NULL, in ndi_devi_alloc_sleep()
2142 return (DEVI(dip)->devi_node_state); in i_ddi_node_state()
2151 DEVI(dip)->devi_node_state = state; in i_ddi_set_node_state()
2157 * DS_READY->DS_ATTACHED->DS_READY state changes. Outside this file, this
2164 return (DEVI(dip)->devi_node_state >= DS_ATTACHED); in i_ddi_devi_attached()
2173 * FIND_NODE_BY_NODENAME: Match on node name - typical use.
2183 * a node bound via a path-based driver alias.
2190 * (3) FIND_ADDR_BY_CALLBACK: use a caller-supplied callback function
2235 if (strcmp(cname, DEVI(dip)->devi_node_name) != 0) in find_sibling()
2239 if (DEVI(dip)->devi_major != major) in find_sibling()
2243 if ((addr = DEVI(dip)->devi_addr) == NULL) { in find_sibling()
2249 addr = DEVI(dip)->devi_addr; in find_sibling()
2279 char *cname = DEVI(dip)->devi_node_name; in find_duplicate_child()
2280 char *caddr = DEVI(dip)->devi_addr; in find_duplicate_child()
2353 * unique sibling unit-addresses on hardware branches of the tree would
2357 * Until unit-address uniqueness of siblings is guaranteed, use of this
2365 /* return NULL if called without a unit-address */ in find_child_by_addr()
2387 ddi_prop_t *next = prop->prop_next; in i_ddi_prop_list_delete()
2388 if (prop->prop_name) in i_ddi_prop_list_delete()
2389 kmem_free(prop->prop_name, strlen(prop->prop_name) + 1); in i_ddi_prop_list_delete()
2390 if ((prop->prop_len != 0) && prop->prop_val) in i_ddi_prop_list_delete()
2391 kmem_free(prop->prop_val, prop->prop_len); in i_ddi_prop_list_delete()
2409 for (; prop != NULL; prop = prop->prop_next) { in i_ddi_prop_list_dup()
2410 ASSERT(prop->prop_name != NULL); in i_ddi_prop_list_dup()
2415 copy->prop_dev = prop->prop_dev; in i_ddi_prop_list_dup()
2416 copy->prop_flags = prop->prop_flags; in i_ddi_prop_list_dup()
2417 copy->prop_name = i_ddi_strdup(prop->prop_name, flag); in i_ddi_prop_list_dup()
2418 if (copy->prop_name == NULL) in i_ddi_prop_list_dup()
2421 if ((copy->prop_len = prop->prop_len) != 0) { in i_ddi_prop_list_dup()
2422 copy->prop_val = kmem_zalloc(prop->prop_len, flag); in i_ddi_prop_list_dup()
2423 if (copy->prop_val == NULL) in i_ddi_prop_list_dup()
2426 bcopy(prop->prop_val, copy->prop_val, prop->prop_len); in i_ddi_prop_list_dup()
2432 prev->prop_next = copy; in i_ddi_prop_list_dup()
2450 list->prop_list = props; in i_ddi_prop_list_create()
2451 list->prop_ref = 1; in i_ddi_prop_list_create()
2463 ASSERT(prop_list->prop_ref >= 0); in i_ddi_prop_list_hold()
2464 ASSERT(mutex_owned(&dnp->dn_lock)); in i_ddi_prop_list_hold()
2465 prop_list->prop_ref++; in i_ddi_prop_list_hold()
2471 ASSERT(prop_list->prop_ref > 0); in i_ddi_prop_list_rele()
2472 ASSERT(mutex_owned(&dnp->dn_lock)); in i_ddi_prop_list_rele()
2473 prop_list->prop_ref--; in i_ddi_prop_list_rele()
2475 if (prop_list->prop_ref == 0) { in i_ddi_prop_list_rele()
2476 i_ddi_prop_list_delete(prop_list->prop_list); in i_ddi_prop_list_rele()
2550 * Load driver.conf file for major. Load all if major == -1.
2553 * - early in boot after devnames array is initialized
2554 * - from vfs code when certain file systems are mounted
2555 * - from add_drv when a new driver is added
2566 high = devcnt - 1; in i_ddi_load_drvconf()
2575 LOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_load_drvconf()
2576 dnp->dn_flags &= ~(DN_DRIVER_HELD|DN_DRIVER_INACTIVE); in i_ddi_load_drvconf()
2578 UNLOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_load_drvconf()
2605 * Take the per-driver lock while unloading driver.conf in i_ddi_unload_drvconf()
2608 LOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_unload_drvconf()
2610 UNLOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_unload_drvconf()
2653 mutex_enter(&DEVI(hwdip)->devi_lock); in ndi_merge_node()
2656 mutex_exit(&DEVI(hwdip)->devi_lock); in ndi_merge_node()
2670 (DEVI(hwdip)->devi_sys_prop_ptr != NULL) || in ndi_merge_node()
2671 (DEVI(hwdip)->devi_drv_prop_ptr != NULL)) { in ndi_merge_node()
2673 mutex_exit(&DEVI(hwdip)->devi_lock); in ndi_merge_node()
2678 "-- not in proper state", in ndi_merge_node()
2684 mutex_enter(&DEVI(dip)->devi_lock); in ndi_merge_node()
2685 DEVI(hwdip)->devi_sys_prop_ptr = DEVI(dip)->devi_sys_prop_ptr; in ndi_merge_node()
2686 DEVI(hwdip)->devi_drv_prop_ptr = DEVI(dip)->devi_drv_prop_ptr; in ndi_merge_node()
2687 DEVI(dip)->devi_sys_prop_ptr = NULL; in ndi_merge_node()
2688 DEVI(dip)->devi_drv_prop_ptr = NULL; in ndi_merge_node()
2689 mutex_exit(&DEVI(dip)->devi_lock); in ndi_merge_node()
2690 mutex_exit(&DEVI(hwdip)->devi_lock); in ndi_merge_node()
2719 mutex_enter(&DEVI(dip)->devi_lock); in ndi_merge_wildcard_node()
2738 mutex_enter(&DEVI(hwdip)->devi_lock); in ndi_merge_wildcard_node()
2740 (DEVI(hwdip)->devi_sys_prop_ptr != NULL) || in ndi_merge_wildcard_node()
2741 (DEVI(hwdip)->devi_drv_prop_ptr != NULL)) { in ndi_merge_wildcard_node()
2742 mutex_exit(&DEVI(hwdip)->devi_lock); in ndi_merge_wildcard_node()
2749 DEVI(hwdip)->devi_sys_prop_ptr = in ndi_merge_wildcard_node()
2750 i_ddi_prop_list_dup(DEVI(dip)->devi_sys_prop_ptr, KM_SLEEP); in ndi_merge_wildcard_node()
2751 DEVI(hwdip)->devi_drv_prop_ptr = in ndi_merge_wildcard_node()
2752 i_ddi_prop_list_dup(DEVI(dip)->devi_drv_prop_ptr, KM_SLEEP); in ndi_merge_wildcard_node()
2753 mutex_exit(&DEVI(hwdip)->devi_lock); in ndi_merge_wildcard_node()
2755 mutex_exit(&DEVI(dip)->devi_lock); in ndi_merge_wildcard_node()
2762 * a non-NULL formp is specified and the binding was based on compatible then
2778 "ddi-assigned")) { in ddi_compatible_driver_major()
2784 * Highest precedence binding is a path-oriented alias. Since this in ddi_compatible_driver_major()
2786 * 'rebind'. The need for a path-oriented alias 'rebind' is detected in ddi_compatible_driver_major()
2788 * is the first point at which the unit-address (or instance) of the in ddi_compatible_driver_major()
2792 if (devi->devi_flags & DEVI_REBIND) { in ddi_compatible_driver_major()
2793 p = devi->devi_rebinding_name; in ddi_compatible_driver_major()
2805 mutex_enter(&devi->devi_lock); in ddi_compatible_driver_major()
2806 devi->devi_flags &= ~DEVI_REBIND; in ddi_compatible_driver_major()
2807 mutex_exit(&devi->devi_lock); in ddi_compatible_driver_major()
2812 compat = (void *)(devi->devi_compat_names); in ddi_compatible_driver_major()
2813 len = devi->devi_compat_length; in ddi_compatible_driver_major()
2855 if (DEVI(dip)->devi_compat_names) { in lookup_compatible()
2889 DEVI(dip)->devi_compat_names = di_compat_strp; in lookup_compatible()
2890 DEVI(dip)->devi_compat_length = di_compat_strlen; in lookup_compatible()
2944 major_t major = DEVI(dip)->devi_major; in link_to_driver_list()
2967 major_t major = DEVI(dip)->devi_major; in unlink_from_driver_list()
2973 * Remove from per-driver list in unlink_from_driver_list()
2988 * scan the per-driver list looking for dev_info "dip"
2995 if ((idevi = DEVI(dnp->dn_head)) == NULL) in in_dn_list()
3001 idevi = idevi->devi_next; in in_dn_list()
3007 * insert devinfo node 'dip' into the per-driver instance list
3010 * Nodes on the per-driver list are ordered: HW - SID - PSEUDO. The order is
3018 ASSERT(mutex_owned(&(dnp->dn_lock))); in add_to_ordered_dn_list()
3020 dipp = &dnp->dn_head; in add_to_ordered_dn_list()
3023 * Find the first non-prom node or end of list in add_to_ordered_dn_list()
3026 dipp = (dev_info_t **)&DEVI(*dipp)->devi_next; in add_to_ordered_dn_list()
3030 * Find the first non-persistent node in add_to_ordered_dn_list()
3033 dipp = (dev_info_t **)&DEVI(*dipp)->devi_next; in add_to_ordered_dn_list()
3040 dipp = (dev_info_t **)&DEVI(*dipp)->devi_next; in add_to_ordered_dn_list()
3044 DEVI(dip)->devi_next = DEVI(*dipp); in add_to_ordered_dn_list()
3058 LOCK_DEV_OPS(&(dnp->dn_lock)); in add_to_dn_list()
3061 DEVI(dip)->devi_node_name); in add_to_dn_list()
3065 UNLOCK_DEV_OPS(&(dnp->dn_lock)); in add_to_dn_list()
3073 LOCK_DEV_OPS(&(dnp->dn_lock)); in remove_from_dn_list()
3075 plist = (dev_info_t **)&dnp->dn_head; in remove_from_dn_list()
3077 plist = (dev_info_t **)&DEVI(*plist)->devi_next; in remove_from_dn_list()
3082 *plist = (dev_info_t *)(DEVI(dip)->devi_next); in remove_from_dn_list()
3083 DEVI(dip)->devi_next = NULL; in remove_from_dn_list()
3087 DEVI(dip)->devi_node_name)); in remove_from_dn_list()
3090 UNLOCK_DEV_OPS(&(dnp->dn_lock)); in remove_from_dn_list()
3102 ASSERT(DEVI(dip)->devi_global_prop_list == NULL); in add_global_props()
3103 ASSERT(DEVI(dip)->devi_major != DDI_MAJOR_T_NONE); in add_global_props()
3105 dnp = &devnamesp[DEVI(dip)->devi_major]; in add_global_props()
3106 LOCK_DEV_OPS(&dnp->dn_lock); in add_global_props()
3107 plist = dnp->dn_global_prop_ptr; in add_global_props()
3109 UNLOCK_DEV_OPS(&dnp->dn_lock); in add_global_props()
3113 UNLOCK_DEV_OPS(&dnp->dn_lock); in add_global_props()
3115 mutex_enter(&DEVI(dip)->devi_lock); in add_global_props()
3116 DEVI(dip)->devi_global_prop_list = plist; in add_global_props()
3117 mutex_exit(&DEVI(dip)->devi_lock); in add_global_props()
3125 mutex_enter(&DEVI(dip)->devi_lock); in remove_global_props()
3126 proplist = DEVI(dip)->devi_global_prop_list; in remove_global_props()
3127 DEVI(dip)->devi_global_prop_list = NULL; in remove_global_props()
3128 mutex_exit(&DEVI(dip)->devi_lock); in remove_global_props()
3137 LOCK_DEV_OPS(&dnp->dn_lock); in remove_global_props()
3139 UNLOCK_DEV_OPS(&dnp->dn_lock); in remove_global_props()
3166 cmn_err(CE_CONT, "%s %s -> %s\n", in debug_dtree()
3181 pdevi = DEVI(devi)->devi_parent; in ddi_optimize_dtree()
3187 DEVI(devi)->devi_bus_map_fault = pdevi; in ddi_optimize_dtree()
3188 DEVI(devi)->devi_bus_dma_allochdl = pdevi; in ddi_optimize_dtree()
3189 DEVI(devi)->devi_bus_dma_freehdl = pdevi; in ddi_optimize_dtree()
3190 DEVI(devi)->devi_bus_dma_bindhdl = pdevi; in ddi_optimize_dtree()
3191 DEVI(devi)->devi_bus_dma_bindfunc = in ddi_optimize_dtree()
3192 pdevi->devi_ops->devo_bus_ops->bus_dma_bindhdl; in ddi_optimize_dtree()
3193 DEVI(devi)->devi_bus_dma_unbindhdl = pdevi; in ddi_optimize_dtree()
3194 DEVI(devi)->devi_bus_dma_unbindfunc = in ddi_optimize_dtree()
3195 pdevi->devi_ops->devo_bus_ops->bus_dma_unbindhdl; in ddi_optimize_dtree()
3196 DEVI(devi)->devi_bus_dma_flush = pdevi; in ddi_optimize_dtree()
3197 DEVI(devi)->devi_bus_dma_win = pdevi; in ddi_optimize_dtree()
3198 DEVI(devi)->devi_bus_dma_ctl = pdevi; in ddi_optimize_dtree()
3199 DEVI(devi)->devi_bus_ctl = pdevi; in ddi_optimize_dtree()
3206 b = pdevi->devi_ops->devo_bus_ops; in ddi_optimize_dtree()
3208 if (i_ddi_map_fault == b->bus_map_fault) { in ddi_optimize_dtree()
3209 DEVI(devi)->devi_bus_map_fault = pdevi->devi_bus_map_fault; in ddi_optimize_dtree()
3210 debug_dtree(devi, DEVI(devi)->devi_bus_map_fault, in ddi_optimize_dtree()
3214 if (ddi_dma_allochdl == b->bus_dma_allochdl) { in ddi_optimize_dtree()
3215 DEVI(devi)->devi_bus_dma_allochdl = in ddi_optimize_dtree()
3216 pdevi->devi_bus_dma_allochdl; in ddi_optimize_dtree()
3217 debug_dtree(devi, DEVI(devi)->devi_bus_dma_allochdl, in ddi_optimize_dtree()
3221 if (ddi_dma_freehdl == b->bus_dma_freehdl) { in ddi_optimize_dtree()
3222 DEVI(devi)->devi_bus_dma_freehdl = pdevi->devi_bus_dma_freehdl; in ddi_optimize_dtree()
3223 debug_dtree(devi, DEVI(devi)->devi_bus_dma_freehdl, in ddi_optimize_dtree()
3227 if (ddi_dma_bindhdl == b->bus_dma_bindhdl) { in ddi_optimize_dtree()
3228 DEVI(devi)->devi_bus_dma_bindhdl = pdevi->devi_bus_dma_bindhdl; in ddi_optimize_dtree()
3229 DEVI(devi)->devi_bus_dma_bindfunc = in ddi_optimize_dtree()
3230 pdevi->devi_bus_dma_bindhdl->devi_ops-> in ddi_optimize_dtree()
3231 devo_bus_ops->bus_dma_bindhdl; in ddi_optimize_dtree()
3232 debug_dtree(devi, DEVI(devi)->devi_bus_dma_bindhdl, in ddi_optimize_dtree()
3236 if (ddi_dma_unbindhdl == b->bus_dma_unbindhdl) { in ddi_optimize_dtree()
3237 DEVI(devi)->devi_bus_dma_unbindhdl = in ddi_optimize_dtree()
3238 pdevi->devi_bus_dma_unbindhdl; in ddi_optimize_dtree()
3239 DEVI(devi)->devi_bus_dma_unbindfunc = in ddi_optimize_dtree()
3240 pdevi->devi_bus_dma_unbindhdl->devi_ops-> in ddi_optimize_dtree()
3241 devo_bus_ops->bus_dma_unbindhdl; in ddi_optimize_dtree()
3242 debug_dtree(devi, DEVI(devi)->devi_bus_dma_unbindhdl, in ddi_optimize_dtree()
3246 if (ddi_dma_flush == b->bus_dma_flush) { in ddi_optimize_dtree()
3247 DEVI(devi)->devi_bus_dma_flush = pdevi->devi_bus_dma_flush; in ddi_optimize_dtree()
3248 debug_dtree(devi, DEVI(devi)->devi_bus_dma_flush, in ddi_optimize_dtree()
3252 if (ddi_dma_win == b->bus_dma_win) { in ddi_optimize_dtree()
3253 DEVI(devi)->devi_bus_dma_win = pdevi->devi_bus_dma_win; in ddi_optimize_dtree()
3254 debug_dtree(devi, DEVI(devi)->devi_bus_dma_win, in ddi_optimize_dtree()
3258 if (ddi_dma_mctl == b->bus_dma_ctl) { in ddi_optimize_dtree()
3259 DEVI(devi)->devi_bus_dma_ctl = pdevi->devi_bus_dma_ctl; in ddi_optimize_dtree()
3260 debug_dtree(devi, DEVI(devi)->devi_bus_dma_ctl, "bus_dma_ctl"); in ddi_optimize_dtree()
3263 if (ddi_ctlops == b->bus_ctl) { in ddi_optimize_dtree()
3264 DEVI(devi)->devi_bus_ctl = pdevi->devi_bus_ctl; in ddi_optimize_dtree()
3265 debug_dtree(devi, DEVI(devi)->devi_bus_ctl, "bus_ctl"); in ddi_optimize_dtree()
3284 mutex_init(&dh->dh_lock, NULL, MUTEX_DEFAULT, NULL); in da_log_init()
3285 dh->dh_max = ((logsize * PAGESIZE) - sizeof (*dh)) / in da_log_init()
3287 dh->dh_curr = -1; in da_log_init()
3288 dh->dh_hits = 0; in da_log_init()
3294 * Log the stack trace in per-devinfo audit structure and also enter
3300 devinfo_audit_t *da_log, *da = DEVI(dip)->devi_audit; in da_log_enter()
3308 da->da_devinfo = dip; in da_log_enter()
3309 da->da_timestamp = gethrtime(); in da_log_enter()
3310 da->da_thread = curthread; in da_log_enter()
3311 da->da_node_state = DEVI(dip)->devi_node_state; in da_log_enter()
3312 da->da_device_state = DEVI(dip)->devi_state; in da_log_enter()
3313 da->da_depth = getpcstack(da->da_stack, DDI_STACK_DEPTH); in da_log_enter()
3318 mutex_enter(&dh->dh_lock); in da_log_enter()
3319 dh->dh_hits++; in da_log_enter()
3320 dh->dh_curr++; in da_log_enter()
3321 if (dh->dh_curr >= dh->dh_max) in da_log_enter()
3322 dh->dh_curr -= dh->dh_max; in da_log_enter()
3323 da_log = &dh->dh_entry[dh->dh_curr]; in da_log_enter()
3324 mutex_exit(&dh->dh_lock); in da_log_enter()
3327 da->da_lastlog = da_log; in da_log_enter()
3336 if ((dnp->dn_flags & DN_FORCE_ATTACH) && in attach_drivers()
3350 * Attach IB VHCI driver before the force-attach thread attaches the in i_ddi_forceattach_drivers()
3439 struct walk_elem *next = list->next; in free_list()
3451 elem->next = NULL; in append_node()
3452 elem->dip = dip; in append_node()
3460 while (tail->next) in append_node()
3461 tail = tail->next; in append_node()
3463 tail->next = elem; in append_node()
3509 struct walk_elem *next = head->next; in walk_devs()
3512 ndi_devi_enter(head->dip, &circ); in walk_devs()
3513 if (walk_devs(ddi_get_child(head->dip), f, arg, do_locking) == in walk_devs()
3516 ndi_devi_exit(head->dip, circ); in walk_devs()
3521 ndi_devi_exit(head->dip, circ); in walk_devs()
3530 * This general-purpose routine traverses the tree of dev_info nodes,
3536 * It does the walk a layer at a time, not depth-first. The given function
3550 * ndi_devi_enter() done by (*f)() must occur 'at-or-below' the
3552 * does any multi-threading (in framework *or* in driver) then the
3554 * 'strictly-below'.
3572 * This is a general-purpose routine traverses the per-driver list
3593 LOCK_DEV_OPS(&dnp->dn_lock); in e_ddi_walk_driver()
3594 dip = dnp->dn_head; in e_ddi_walk_driver()
3597 UNLOCK_DEV_OPS(&dnp->dn_lock); in e_ddi_walk_driver()
3602 LOCK_DEV_OPS(&dnp->dn_lock); in e_ddi_walk_driver()
3606 UNLOCK_DEV_OPS(&dnp->dn_lock); in e_ddi_walk_driver()
3614 char *nodename; /* if non-null, nodename must match */
3615 int instance; /* if != -1, instance must match */
3624 if (((info->nodename == NULL) || in i_find_devi()
3625 (strcmp(ddi_node_name(dip), info->nodename) == 0)) && in i_find_devi()
3626 ((info->instance == -1) || in i_find_devi()
3627 (ddi_get_instance(dip) == info->instance)) && in i_find_devi()
3628 ((info->attached == 0) || i_ddi_devi_attached(dip))) { in i_find_devi()
3629 info->dip = dip; in i_find_devi()
3725 * we'll just default to using the node-name that in child_path_to_driver()
3769 if (strncmp(prop, PCI_EX_CLASS, sizeof (PCI_EX_CLASS) - 1) in ddi_is_pci_dip()
3771 strncmp(prop, PCI_EX, sizeof (PCI_EX)- 1) in ddi_is_pci_dip()
3773 strncmp(prop, PCI_CLASS, sizeof (PCI_CLASS) - 1) in ddi_is_pci_dip()
3775 strncmp(prop, PCI, sizeof (PCI) - 1) in ddi_is_pci_dip()
3791 * dev_t value and/or the spectype, depending on which parameters are non-NULL.
3792 * If there is an error, this function returns -1.
3802 * (2) if no DDM_DEFAULT minor exists, then the first non-alias minor is chosen.
3807 * drivers support Style-2 only, so only DDM_ALIAS minor exists.
3859 (strcmp((DEVI(parent)->devi_node_name), "iscsi") == 0)) { in resolve_pathname()
3884 return (-1); in resolve_pathname()
3908 return (-1); in resolve_pathname()
3923 for (dmn = DEVI(parent)->devi_minor; dmn; in resolve_pathname()
3924 dmn = dmn->next) { in resolve_pathname()
3925 if (dmn->type == DDM_DEFAULT) { in resolve_pathname()
3926 devt = dmn->ddm_dev; in resolve_pathname()
3927 spectype = dmn->ddm_spec_type; in resolve_pathname()
3935 * else, assume 1-1 instance-minor mapping in resolve_pathname()
3937 dmn = DEVI(parent)->devi_minor; in resolve_pathname()
3938 if (dmn && ((dmn->type == DDM_MINOR) || in resolve_pathname()
3939 (dmn->type == DDM_INTERNAL_PATH))) { in resolve_pathname()
3940 devt = dmn->ddm_dev; in resolve_pathname()
3941 spectype = dmn->ddm_spec_type; in resolve_pathname()
3944 DEVI(parent)->devi_major, in resolve_pathname()
3971 * the dip allows detaches to occur - which can cause problems in resolve_pathname()
3974 * Instead of holding the dip, we place a ddi-no-autodetach in resolve_pathname()
4032 * Get in-kernel devfs pathname in i_ddi_prompath_to_devfspath()
4098 if (skip_non_hw && devi->devi_hw_prop_ptr == NULL) in should_implement_quiesce()
4107 if ((ops->devo_rev >= 4) && (ops->devo_quiesce != nodev) && in driver_has_quiesce()
4108 (ops->devo_quiesce != NULL) && (ops->devo_quiesce != nulldev) && in driver_has_quiesce()
4109 (ops->devo_quiesce != ddi_quiesce_not_supported)) in driver_has_quiesce()
4131 if (ops->devo_quiesce == ddi_quiesce_not_needed) in check_driver_quiesce()
4140 *((int *)arg) = -1; in check_driver_quiesce()
4176 if (ops->devo_quiesce == ddi_quiesce_not_needed) in quiesce_one_device()
4187 *((int *)arg) = -1; in quiesce_one_device()
4190 *((int *)arg) = -1; in quiesce_one_device()
4195 * Traverse the dev info tree in a breadth-first manner so that we quiesce
4232 if ((ops == NULL) || (ops->devo_cb_ops == NULL) || in reset_leaf_device()
4233 (ops->devo_reset == nodev) || (ops->devo_reset == nulldev) || in reset_leaf_device()
4234 (ops->devo_reset == NULL)) in reset_leaf_device()
4275 * single-threaded because device attach and detach are multi-threaded
4277 * become single-thread since other threads still exist, but the shutdown thread
4279 * cpus in the system there by effectively making the system single-threaded.)
4294 * if we're not panicing and there are on-going attach or detach in devtree_freeze()
4297 * - 3 seconds is very small relative to the deadman timer. in devtree_freeze()
4298 * - normal attach and detach operations should be very quick. in devtree_freeze()
4299 * - attach and detach operations are fairly rare. in devtree_freeze()
4324 if ((DEVI(dip)->devi_major == major) && in bind_dip()
4327 * Check for a path-oriented driver alias that in bind_dip()
4340 (major != DEVI(dip)->devi_major)) in bind_dip()
4370 * Called for each device during an upgrade_drv -d bound to the alias
4385 * and alias. Invoked within the context of update_drv -d <alias>.
4402 * the case of -f. in unbind_children_by_alias()
4407 if ((ddi_driver_major(cdip) != ub->drv_major) || in unbind_children_by_alias()
4408 (strcmp(DEVI(cdip)->devi_node_name, ub->drv_alias) != 0)) in unbind_children_by_alias()
4414 unbind_alias_dev_in_use(cdip, ub->drv_alias); in unbind_children_by_alias()
4415 ub->ndevs_bound++; in unbind_children_by_alias()
4429 * Context: update_drv [-f] -d -i <alias> <driver>
4438 ub->drv_major = major; in i_ddi_unbind_devs_by_alias()
4439 ub->drv_alias = alias; in i_ddi_unbind_devs_by_alias()
4440 ub->ndevs_bound = 0; in i_ddi_unbind_devs_by_alias()
4441 ub->unbind_errors = 0; in i_ddi_unbind_devs_by_alias()
4449 rv = ub->ndevs_bound + ub->unbind_errors; in i_ddi_unbind_devs_by_alias()
4471 * may be invoked later to re-enumerate (new) driver.conf rebind in unbind_children_by_driver()
4520 if (((node_name = specp->hwc_devi_name) == NULL) || in init_spec_child()
4532 -1, specp->hwc_devi_sys_prop_ptr, KM_SLEEP); in init_spec_child()
4556 if (DEVI(pdip)->devi_flags & DEVI_MADE_CHILDREN) { in i_ndi_make_spec_children()
4562 for (spec = list; spec != NULL; spec = spec->hwc_next) { in i_ndi_make_spec_children()
4567 mutex_enter(&DEVI(pdip)->devi_lock); in i_ndi_make_spec_children()
4568 DEVI(pdip)->devi_flags |= DEVI_MADE_CHILDREN; in i_ndi_make_spec_children()
4569 mutex_exit(&DEVI(pdip)->devi_lock); in i_ndi_make_spec_children()
4585 ASSERT(DEVI(pdip)->devi_flags & DEVI_MADE_CHILDREN); in i_ndi_init_hw_children()
4643 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_devi_report_status_change()
4645 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_devi_report_status_change()
4740 "Run devfsadm -i %s", in i_log_devfs_add_devinfo()
4975 brn->brn_deviname = i_ddi_strdup(deviname, KM_SLEEP); in brevq_enqueue()
4977 brn->brn_child = child; in brevq_enqueue()
4978 brn->brn_sibling = *brevqp; in brevq_enqueue()
4993 next_brn = brn->brn_sibling; in free_brevq()
4994 ASSERT(brn->brn_child == NULL); in free_brevq()
4995 kmem_free(brn->brn_deviname, strlen(brn->brn_deviname) + 1); in free_brevq()
5013 for (brn = brevq; brn != NULL; brn = brn->brn_sibling) { in log_and_free_brevq()
5014 (void) strcpy(p, brn->brn_deviname); in log_and_free_brevq()
5052 for (brn = brevq; brn != NULL; brn = brn->brn_sibling) { in log_and_free_br_events_on_grand_children()
5053 if (brn->brn_child) { in log_and_free_br_events_on_grand_children()
5054 (void) strcpy(p, brn->brn_deviname); in log_and_free_br_events_on_grand_children()
5056 log_and_free_brevq(path, brn->brn_child); in log_and_free_br_events_on_grand_children()
5057 brn->brn_child = NULL; in log_and_free_br_events_on_grand_children()
5080 next_brn = brn->brn_sibling; in cleanup_br_events_on_grand_children()
5085 if (strcmp(path, brn->brn_deviname) == 0) in cleanup_br_events_on_grand_children()
5093 * is not going be generated on brn->brn_child. in cleanup_br_events_on_grand_children()
5095 * brn->brn_child log them and remove the brn in cleanup_br_events_on_grand_children()
5098 if (brn->brn_child) { in cleanup_br_events_on_grand_children()
5100 (void) strcat(path, brn->brn_deviname); in cleanup_br_events_on_grand_children()
5101 log_and_free_brevq(path, brn->brn_child); in cleanup_br_events_on_grand_children()
5105 prev_brn->brn_sibling = next_brn; in cleanup_br_events_on_grand_children()
5109 kmem_free(brn->brn_deviname, in cleanup_br_events_on_grand_children()
5110 strlen(brn->brn_deviname) + 1); in cleanup_br_events_on_grand_children()
5115 * queued on brn->brn_child since brn->brn_child in cleanup_br_events_on_grand_children()
5118 if (brn->brn_child) { in cleanup_br_events_on_grand_children()
5119 free_brevq(brn->brn_child); in cleanup_br_events_on_grand_children()
5120 brn->brn_child = NULL; in cleanup_br_events_on_grand_children()
5200 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5207 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5210 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5213 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5215 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5238 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5240 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5242 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5244 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5270 mutex_enter(&DEVI(pdip)->devi_lock); in config_immediate_children()
5271 DEVI(pdip)->devi_flags &= ~DEVI_MADE_CHILDREN; in config_immediate_children()
5272 mutex_exit(&DEVI(pdip)->devi_lock); in config_immediate_children()
5304 /* multi-threaded configuration of child nexus */ in config_grand_children()
5329 if ((DEVI(dip)->devi_ops->devo_bus_ops == NULL) || in devi_config_common()
5330 (DEVI(dip)->devi_ops->devo_bus_ops->busops_rev < BUSO_REV_5) || in devi_config_common()
5331 (f = DEVI(dip)->devi_ops->devo_bus_ops->bus_config) == NULL) { in devi_config_common()
5437 * constant non-zero timeout argument, the caller should be adjusting in devi_config_one()
5447 * child - break out of for(;;) loop if child found. in devi_config_one()
5468 probed = (DEVI(pdip)->devi_flags & DEVI_MADE_CHILDREN); in devi_config_one()
5474 * child found. To support path-oriented aliases in devi_config_one()
5475 * binding on boot-device, we do a search_by_addr too. in devi_config_one()
5496 mutex_enter(&DEVI(pdip)->devi_lock); in devi_config_one()
5497 DEVI(pdip)->devi_flags &= ~DEVI_MADE_CHILDREN; in devi_config_one()
5498 mutex_exit(&DEVI(pdip)->devi_lock); in devi_config_one()
5523 mutex_enter(&DEVI(vdip)->devi_lock); in devi_config_one()
5524 DEVI(vdip)->devi_flags |= in devi_config_one()
5526 mutex_exit(&DEVI(vdip)->devi_lock); in devi_config_one()
5542 /* done with paddr, fixup i_ddi_parse_name '@'->'\0' change */ in devi_config_one()
5544 *(addr - 1) = '@'; in devi_config_one()
5599 if ((DEVI(pdip)->devi_ops->devo_bus_ops == NULL) || in ndi_devi_config_one()
5600 (DEVI(pdip)->devi_ops->devo_bus_ops->busops_rev < BUSO_REV_5) || in ndi_devi_config_one()
5601 (f = DEVI(pdip)->devi_ops->devo_bus_ops->bus_config) == NULL) { in ndi_devi_config_one()
5675 if ((DEVI(parent)->devi_ops->devo_bus_ops == NULL) || in ndi_devi_config_obp_args()
5676 (DEVI(parent)->devi_ops->devo_bus_ops->busops_rev < BUSO_REV_5) || in ndi_devi_config_obp_args()
5677 (f = DEVI(parent)->devi_ops->devo_bus_ops->bus_config) == NULL) { in ndi_devi_config_obp_args()
5691 * - A constraint is applied and the offline is disallowed.
5694 * - A constraint is applied and the offline is allowed.
5698 * - A constraint is not applied. Allow the offline to proceed for now.
5722 * Start with userland constraints first - applied via device contracts in e_ddi_offline_notify()
5768 mutex_enter(&(DEVI(dip)->devi_lock)); in e_ddi_offline_notify()
5769 if ((DEVI(dip)->devi_flags & DEVI_RETIRING) && failure) { in e_ddi_offline_notify()
5772 DEVI(dip)->devi_flags |= DEVI_R_BLOCKED; in e_ddi_offline_notify()
5773 if (DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT) { in e_ddi_offline_notify()
5777 DEVI(dip)->devi_flags &= ~DEVI_R_CONSTRAINT; in e_ddi_offline_notify()
5779 } else if ((DEVI(dip)->devi_flags & DEVI_RETIRING) && constraint) { in e_ddi_offline_notify()
5782 DEVI(dip)->devi_flags |= DEVI_R_CONSTRAINT; in e_ddi_offline_notify()
5783 } else if ((DEVI(dip)->devi_flags & DEVI_RETIRING) && in e_ddi_offline_notify()
5784 ((DEVI(dip)->devi_ops != NULL && in e_ddi_offline_notify()
5785 DEVI(dip)->devi_ops->devo_bus_ops != NULL) || in e_ddi_offline_notify()
5786 DEVI(dip)->devi_ref == 0)) { in e_ddi_offline_notify()
5790 DEVI(dip)->devi_flags |= DEVI_R_CONSTRAINT; in e_ddi_offline_notify()
5800 mutex_exit(&(DEVI(dip)->devi_lock)); in e_ddi_offline_notify()
5868 int instance = -1; in devi_detach_node()
5926 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5928 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5934 if (devi->devi_ev_path == NULL) { in devi_detach_node()
5935 devi->devi_ev_path = kmem_alloc(MAXPATHLEN, KM_SLEEP); in devi_detach_node()
5936 (void) ddi_pathname(dip, devi->devi_ev_path); in devi_detach_node()
5940 devi->devi_ev_path); in devi_detach_node()
5947 devi->devi_ev_instance = ddi_get_instance(dip); in devi_detach_node()
5949 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5951 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5975 DEVI(dip)->devi_ev_path, in devi_detach_node()
5984 instance = DEVI(dip)->devi_ev_instance; in devi_detach_node()
6085 * Continue upon failure--best effort algorithm in unconfig_immediate_children()
6113 /* multi-threaded configuration of child nexus */ in unconfig_grand_children()
6185 (DEVI(dip)->devi_ops->devo_bus_ops == NULL) || in devi_unconfig_common()
6186 (DEVI(dip)->devi_ops->devo_bus_ops->busops_rev < BUSO_REV_5) || in devi_unconfig_common()
6187 (f = DEVI(dip)->devi_ops->devo_bus_ops->bus_unconfig) == NULL) { in devi_unconfig_common()
6210 * moduninstall daemon or the modunload -i 0 command.
6354 if ((DEVI(pdip)->devi_ops->devo_bus_ops == NULL) || in ndi_devi_unconfig_one()
6355 (DEVI(pdip)->devi_ops->devo_bus_ops->busops_rev < BUSO_REV_5) || in ndi_devi_unconfig_one()
6356 (f = DEVI(pdip)->devi_ops->devo_bus_ops->bus_unconfig) == NULL) { in ndi_devi_unconfig_one()
6405 ASSERT(DEVI(pdip)->devi_taskq); in i_ndi_devi_async_common()
6420 arg->flags = flags; in i_ndi_devi_async_common()
6421 arg->dip = dip; in i_ndi_devi_async_common()
6422 if (ddi_taskq_dispatch(DEVI(pdip)->devi_taskq, func, arg, tqflag) == in i_ndi_devi_async_common()
6439 (void) ndi_devi_bind_driver(arg->dip, arg->flags); in i_ndi_devi_bind_driver_cb()
6540 (void) ndi_devi_online(arg->dip, arg->flags); in i_ndi_devi_online_cb()
6549 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_online_async()
6551 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_online_async()
6561 * the driver and prevent devfs requests from re-attaching the device
6716 if (((DEVI(dip)->devi_flags & DEVI_MADE_CHILDREN) == 0) || in reset_nexus_flags()
6724 mutex_enter(&DEVI(dip)->devi_lock); in reset_nexus_flags()
6725 DEVI(dip)->devi_flags &= ~(DEVI_MADE_CHILDREN | DEVI_ATTACHED_CHILDREN); in reset_nexus_flags()
6726 mutex_exit(&DEVI(dip)->devi_lock); in reset_nexus_flags()
6744 * nodenames and unit-addresses without the drivers participation)
6759 /* check for path-oriented alias */ in path_to_major()
6807 * a non-NULL value is returned.
6811 * open-from-attach code in consconfig_dacf.c). Such special-case callers
6824 if ((major >= devcnt) || (instance == -1)) in hold_devi()
6829 LOCK_DEV_OPS(&(dnp->dn_lock)); in hold_devi()
6830 for (dip = dnp->dn_head; dip; in hold_devi()
6831 dip = (dev_info_t *)DEVI(dip)->devi_next) { in hold_devi()
6837 if (DEVI(dip)->devi_instance == instance) { in hold_devi()
6845 * ndi_devi_enter() while driving attach top-down). in hold_devi()
6853 UNLOCK_DEV_OPS(&(dnp->dn_lock)); in hold_devi()
6854 return (dip); /* fast-path with devi held */ in hold_devi()
6858 /* try slow-path */ in hold_devi()
6864 UNLOCK_DEV_OPS(&(dnp->dn_lock)); in hold_devi()
6869 /* slow-path may block, so it should not occur from interrupt */ in hold_devi()
6880 * Verify that we got the correct device - a path_to_inst file in hold_devi()
6882 * unit-address format) could result in an incorrect answer in hold_devi()
6888 ((DEVI(dip)->devi_major != major) || in hold_devi()
6889 ((DEVI(dip)->devi_instance != instance)) || in hold_devi()
6930 * functional DDI_INFO_DEVT2DEVINFO implementations. This code will in e_ddi_hold_devi_by_dev()
6945 CB_DRV_INSTALLED(ops) && ops->devo_getinfo) { in e_ddi_hold_devi_by_dev()
6946 if ((*ops->devo_getinfo)(NULL, DDI_INFO_DEVT2DEVINFO, in e_ddi_hold_devi_by_dev()
6990 * For certain broken third-party software, we are willing in e_ddi_get_dev_info()
7037 rq->q_flag |= _QASSOCIATED; in ddi_assoc_queue_with_devi()
7042 vp = stp->sd_vnode; in ddi_assoc_queue_with_devi()
7102 * Come top-down, expanding .conf nodes under this parent in i_ddi_attach_node_hierarchy()
7122 LOCK_DEV_OPS(&dnp->dn_lock); in attach_driver_nodes()
7123 dip = dnp->dn_head; in attach_driver_nodes()
7126 UNLOCK_DEV_OPS(&dnp->dn_lock); in attach_driver_nodes()
7130 * Set the 'ddi-config-driver-node' property on a nexus in attach_driver_nodes()
7137 dip, DDI_PROP_DONTPASS, "ddi-config-driver-node"))) { in attach_driver_nodes()
7140 LOCK_DEV_OPS(&dnp->dn_lock); in attach_driver_nodes()
7145 dnp->dn_flags |= DN_NO_AUTODETACH; in attach_driver_nodes()
7146 UNLOCK_DEV_OPS(&dnp->dn_lock); in attach_driver_nodes()
7159 * platform-specific hardware nodes, such as ppm nodes on xcal
7239 hdl->mtc_parmajor = par_major; in attach_driver_by_parent()
7257 LOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_devs_attached()
7258 for (dip = dnp->dn_head; dip != NULL; dip = ddi_get_next(dip)) { in i_ddi_devs_attached()
7264 UNLOCK_DEV_OPS(&dnp->dn_lock); in i_ddi_devs_attached()
7277 for (dp = DEVI(ddip)->devi_minor; dp != NULL; dp = dp->next) { in i_ddi_minor_node_count()
7278 if (strcmp(dp->ddm_node_type, node_type) == 0) in i_ddi_minor_node_count()
7298 mutex_enter(&dnp->dn_lock); in enter_driver()
7299 ASSERT(dnp->dn_busy_thread != curthread); in enter_driver()
7300 while (dnp->dn_flags & DN_DRIVER_BUSY) in enter_driver()
7301 cv_wait(&dnp->dn_wait, &dnp->dn_lock); in enter_driver()
7302 dnp->dn_flags |= DN_DRIVER_BUSY; in enter_driver()
7303 dnp->dn_busy_thread = curthread; in enter_driver()
7304 mutex_exit(&dnp->dn_lock); in enter_driver()
7310 mutex_enter(&dnp->dn_lock); in exit_driver()
7311 ASSERT(dnp->dn_busy_thread == curthread); in exit_driver()
7312 dnp->dn_flags &= ~DN_DRIVER_BUSY; in exit_driver()
7313 dnp->dn_busy_thread = NULL; in exit_driver()
7314 cv_broadcast(&dnp->dn_wait); in exit_driver()
7315 mutex_exit(&dnp->dn_lock); in exit_driver()
7338 if (dnp->dn_flags & DN_DRIVER_HELD) { in ddi_hold_installed_driver()
7346 LOCK_DEV_OPS(&dnp->dn_lock); in ddi_hold_installed_driver()
7347 dnp->dn_flags |= (DN_DRIVER_HELD | DN_NO_AUTODETACH); in ddi_hold_installed_driver()
7348 UNLOCK_DEV_OPS(&dnp->dn_lock); in ddi_hold_installed_driver()
7351 "ddi_hold_installed_driver: %s\n", dnp->dn_name)); in ddi_hold_installed_driver()
7358 if (dnp->dn_pl == NULL) { in ddi_hold_installed_driver()
7377 LOCK_DEV_OPS(&dnp->dn_lock); in ddi_hold_installed_driver()
7379 (void) impl_parlist_to_major(dnp->dn_pl, parents); in ddi_hold_installed_driver()
7381 diplist_to_parent_major(dnp->dn_head, parents); in ddi_hold_installed_driver()
7382 UNLOCK_DEV_OPS(&dnp->dn_lock); in ddi_hold_installed_driver()
7507 mutex_init(&hdl->mtc_lock, NULL, MUTEX_DEFAULT, NULL); in mt_config_init()
7508 cv_init(&hdl->mtc_cv, NULL, CV_DEFAULT, NULL); in mt_config_init()
7509 hdl->mtc_pdip = pdip; in mt_config_init()
7510 hdl->mtc_fdip = dipp; in mt_config_init()
7511 hdl->mtc_parmajor = DDI_MAJOR_T_NONE; in mt_config_init()
7512 hdl->mtc_flags = flags; in mt_config_init()
7513 hdl->mtc_major = major; in mt_config_init()
7514 hdl->mtc_thr_count = 0; in mt_config_init()
7515 hdl->mtc_op = op; in mt_config_init()
7516 hdl->mtc_error = 0; in mt_config_init()
7517 hdl->mtc_brevqp = brevqp; in mt_config_init()
7520 gethrestime(&hdl->start_time); in mt_config_init()
7521 hdl->total_time = 0; in mt_config_init()
7533 sec = end.tv_sec - start.tv_sec; in time_diff_in_msec()
7534 nsec = end.tv_nsec - start.tv_nsec; in time_diff_in_msec()
7537 sec -= 1; in time_diff_in_msec()
7554 mutex_enter(&hdl->mtc_lock); in mt_config_fini()
7555 while (hdl->mtc_thr_count > 0) in mt_config_fini()
7556 cv_wait(&hdl->mtc_cv, &hdl->mtc_lock); in mt_config_fini()
7557 rv = hdl->mtc_error; in mt_config_fini()
7558 mutex_exit(&hdl->mtc_lock); in mt_config_fini()
7562 real_time = time_diff_in_msec(hdl->start_time, end_time); in mt_config_fini()
7563 if ((ddidebug & DDI_MTCONFIG) && hdl->mtc_pdip) in mt_config_fini()
7566 ddi_driver_name(hdl->mtc_pdip), in mt_config_fini()
7567 ddi_get_instance(hdl->mtc_pdip), in mt_config_fini()
7568 hdl->total_time, real_time); in mt_config_fini()
7571 cv_destroy(&hdl->mtc_cv); in mt_config_fini()
7572 mutex_destroy(&hdl->mtc_lock); in mt_config_fini()
7591 struct mt_config_handle *hdl = mcd->mtc_hdl; in mt_config_thread()
7592 dev_info_t *dip = mcd->mtc_dip; in mt_config_thread()
7594 major_t major = mcd->mtc_major; in mt_config_thread()
7595 int flags = mcd->mtc_flags; in mt_config_thread()
7604 dipp = hdl->mtc_fdip ? &rdip : NULL; in mt_config_thread()
7606 switch (hdl->mtc_op) { in mt_config_thread()
7611 if (mcd->mtc_brn) { in mt_config_thread()
7615 mcd->mtc_brn->brn_child = brevq; in mt_config_thread()
7622 mutex_enter(&hdl->mtc_lock); in mt_config_thread()
7625 hdl->total_time += time_diff_in_msec(start_time, end_time); in mt_config_thread()
7628 if ((rv != NDI_SUCCESS) && (hdl->mtc_error == 0)) { in mt_config_thread()
7629 hdl->mtc_error = rv; in mt_config_thread()
7637 hdl->mtc_op, major, flags, path, rv); in mt_config_thread()
7643 if (hdl->mtc_fdip && *hdl->mtc_fdip == NULL) { in mt_config_thread()
7644 *hdl->mtc_fdip = rdip; in mt_config_thread()
7655 if (--hdl->mtc_thr_count == 0) in mt_config_thread()
7656 cv_broadcast(&hdl->mtc_cv); in mt_config_thread()
7657 mutex_exit(&hdl->mtc_lock); in mt_config_thread()
7662 * Multi-threaded config/unconfig of child nexus
7667 dev_info_t *pdip = hdl->mtc_pdip; in mt_config_children()
7668 major_t major = hdl->mtc_major; in mt_config_children()
7680 hdl->total_time += time_diff_in_msec(hdl->start_time, end_time); in mt_config_children()
7686 if (hdl->mtc_op == MT_UNCONFIG_OP && hdl->mtc_brevqp && in mt_config_children()
7696 brn = brevq_enqueue(hdl->mtc_brevqp, dip, NULL); in mt_config_children()
7713 (hdl->mtc_op == MT_CONFIG_OP && in mt_config_children()
7721 mcd->mtc_dip = dip; in mt_config_children()
7722 mcd->mtc_hdl = hdl; in mt_config_children()
7723 mcd->mtc_brn = brn; in mt_config_children()
7731 mcd->mtc_major = DDI_MAJOR_T_NONE; in mt_config_children()
7733 mcd->mtc_major = major; in mt_config_children()
7736 * The unconfig-driver to unconfig-all conversion above in mt_config_children()
7740 mcd->mtc_flags = hdl->mtc_flags; in mt_config_children()
7741 if ((mcd->mtc_flags & NDI_DETACH_DRIVER) && in mt_config_children()
7742 (hdl->mtc_op == MT_UNCONFIG_OP) && in mt_config_children()
7744 mcd->mtc_flags |= NDI_AUTODETACH; in mt_config_children()
7746 mutex_enter(&hdl->mtc_lock); in mt_config_children()
7747 hdl->mtc_thr_count++; in mt_config_children()
7748 mutex_exit(&hdl->mtc_lock); in mt_config_children()
7754 mcd->mtc_next = NULL; in mt_config_children()
7758 mcd_tail->mtc_next = mcd; in mt_config_children()
7767 mcd_head = mcd->mtc_next; in mt_config_children()
7768 if (mtc_off || (mcd->mtc_flags & NDI_MTC_OFF)) in mt_config_children()
7779 major_t par_major = hdl->mtc_parmajor; in mt_config_driver()
7780 major_t major = hdl->mtc_major; in mt_config_driver()
7791 hdl->total_time += time_diff_in_msec(hdl->start_time, end_time); in mt_config_driver()
7796 LOCK_DEV_OPS(&dnp->dn_lock); in mt_config_driver()
7815 mcd->mtc_dip = dip; in mt_config_driver()
7816 mcd->mtc_hdl = hdl; in mt_config_driver()
7817 mcd->mtc_major = major; in mt_config_driver()
7818 mcd->mtc_flags = hdl->mtc_flags; in mt_config_driver()
7820 mutex_enter(&hdl->mtc_lock); in mt_config_driver()
7821 hdl->mtc_thr_count++; in mt_config_driver()
7822 mutex_exit(&hdl->mtc_lock); in mt_config_driver()
7828 mcd->mtc_next = NULL; in mt_config_driver()
7832 mcd_tail->mtc_next = mcd; in mt_config_driver()
7837 UNLOCK_DEV_OPS(&dnp->dn_lock); in mt_config_driver()
7841 mcd_head = mcd->mtc_next; in mt_config_driver()
7842 if (mtc_off || (mcd->mtc_flags & NDI_MTC_OFF)) in mt_config_driver()
7861 mutex_enter(&devimap->dno_lock); in e_ddi_nodeid_to_dip()
7864 for (elem = devimap->dno_head; elem; elem = elem->next) { in e_ddi_nodeid_to_dip()
7865 if (elem->nodeid == nodeid) { in e_ddi_nodeid_to_dip()
7866 ndi_hold_devi(elem->dip); in e_ddi_nodeid_to_dip()
7867 dip = elem->dip; in e_ddi_nodeid_to_dip()
7877 prev->next = elem->next; in e_ddi_nodeid_to_dip()
7878 elem->next = devimap->dno_head; in e_ddi_nodeid_to_dip()
7879 devimap->dno_head = elem; in e_ddi_nodeid_to_dip()
7882 mutex_exit(&devimap->dno_lock); in e_ddi_nodeid_to_dip()
7916 ASSERT(mutex_owned(&cache->cache_lock)); in i_ddi_di_cache_free()
7918 if (cache->cache_size) { in i_ddi_di_cache_free()
7919 ASSERT(cache->cache_size > 0); in i_ddi_di_cache_free()
7920 ASSERT(cache->cache_data); in i_ddi_di_cache_free()
7922 kmem_free(cache->cache_data, cache->cache_size); in i_ddi_di_cache_free()
7923 cache->cache_data = NULL; in i_ddi_di_cache_free()
7924 cache->cache_size = 0; in i_ddi_di_cache_free()
7929 ASSERT(cache->cache_data == NULL); in i_ddi_di_cache_free()
7964 /* Invalidate the in-core cache and dispatch free on valid->invalid */ in i_ddi_di_cache_invalidate()
7986 DEVI(dip)->devi_major = ddi_name_to_major(ddi_node_name(dip)); in i_bind_vhci_node()
7996 DEVI(dip)->devi_ops = ndi_hold_driver(dip); in i_init_vhci_node()
7997 if (DEVI(dip)->devi_ops == NULL) in i_init_vhci_node()
7998 return (-1); in i_init_vhci_node()
8000 DEVI(dip)->devi_instance = e_ddi_assign_instance(dip); in i_init_vhci_node()
8017 DEVI(dip)->devi_sibling = DEVI(scsi_vhci_dip)->devi_sibling; in i_link_vhci_node()
8018 DEVI(scsi_vhci_dip)->devi_sibling = DEVI(dip); in i_link_vhci_node()
8020 DEVI(dip)->devi_sibling = DEVI(top_devinfo)->devi_child; in i_link_vhci_node()
8021 DEVI(top_devinfo)->devi_child = DEVI(dip); in i_link_vhci_node()
8038 * that occurs while trying to enumerate node in a different sub-tree
8049 if (major == -1) in ndi_devi_config_vhci()
8054 LOCK_DEV_OPS(&dnp->dn_lock); in ndi_devi_config_vhci()
8055 if (dnp->dn_head) { in ndi_devi_config_vhci()
8056 dip = dnp->dn_head; in ndi_devi_config_vhci()
8057 UNLOCK_DEV_OPS(&dnp->dn_lock); in ndi_devi_config_vhci()
8060 UNLOCK_DEV_OPS(&dnp->dn_lock); in ndi_devi_config_vhci()
8067 DEVI(dip)->devi_node_attributes |= DDI_VHCI_NODE; in ndi_devi_config_vhci()
8071 if (i_init_vhci_node(dip) == -1) { in ndi_devi_config_vhci()
8077 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8079 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8088 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8090 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8097 LOCK_DEV_OPS(&dnp->dn_lock); in ndi_devi_config_vhci()
8098 dnp->dn_flags |= DN_DRIVER_HELD; in ndi_devi_config_vhci()
8099 dnp->dn_head = dip; in ndi_devi_config_vhci()
8100 UNLOCK_DEV_OPS(&dnp->dn_lock); in ndi_devi_config_vhci()
8142 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_device_remove()
8146 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_device_remove()
8179 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_device_insert()
8183 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_device_insert()
8241 mutex_enter(&DEVI(dip)->devi_lock); in e_ddi_mark_retiring()
8242 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)); in e_ddi_mark_retiring()
8243 DEVI(dip)->devi_flags |= DEVI_RETIRING; in e_ddi_mark_retiring()
8245 DEVI(dip)->devi_flags |= DEVI_R_CONSTRAINT; in e_ddi_mark_retiring()
8246 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_mark_retiring()
8288 mutex_enter(&(DEVI(dip)->devi_lock)); in e_ddi_retire_notify()
8289 if (!(DEVI(dip)->devi_flags & DEVI_RETIRING)) { in e_ddi_retire_notify()
8293 } else if (DEVI(dip)->devi_flags & DEVI_R_BLOCKED) { in e_ddi_retire_notify()
8294 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)); in e_ddi_retire_notify()
8298 } else if (!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)) { in e_ddi_retire_notify()
8306 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_retire_notify()
8321 mutex_enter(&DEVI(dip)->devi_lock); in e_ddi_retire_finalize()
8322 if (!(DEVI(dip)->devi_flags & DEVI_RETIRING)) { in e_ddi_retire_finalize()
8326 ASSERT(!(DEVI(dip)->devi_flags & DEVI_RETIRED)); in e_ddi_retire_finalize()
8327 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)); in e_ddi_retire_finalize()
8328 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_BLOCKED)); in e_ddi_retire_finalize()
8329 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_retire_finalize()
8341 ASSERT(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT); in e_ddi_retire_finalize()
8342 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_BLOCKED)); in e_ddi_retire_finalize()
8343 DEVI(dip)->devi_flags &= ~DEVI_R_CONSTRAINT; in e_ddi_retire_finalize()
8344 DEVI(dip)->devi_flags &= ~DEVI_RETIRING; in e_ddi_retire_finalize()
8345 DEVI(dip)->devi_flags |= DEVI_RETIRED; in e_ddi_retire_finalize()
8346 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_retire_finalize()
8351 if (DEVI(dip)->devi_flags & DEVI_R_BLOCKED) { in e_ddi_retire_finalize()
8352 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)); in e_ddi_retire_finalize()
8353 DEVI(dip)->devi_flags &= ~DEVI_R_BLOCKED; in e_ddi_retire_finalize()
8354 DEVI(dip)->devi_flags &= ~DEVI_RETIRING; in e_ddi_retire_finalize()
8356 } else if (DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT) { in e_ddi_retire_finalize()
8357 DEVI(dip)->devi_flags &= ~DEVI_R_CONSTRAINT; in e_ddi_retire_finalize()
8358 DEVI(dip)->devi_flags &= ~DEVI_RETIRING; in e_ddi_retire_finalize()
8361 DEVI(dip)->devi_flags &= ~DEVI_RETIRING; in e_ddi_retire_finalize()
8368 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_retire_finalize()
8432 * ref-count on the dip. Note that devfs_clean() always returns in e_ddi_retire_device()
8503 mutex_enter(&DEVI(dip)->devi_lock); in unmark_and_unfence()
8504 DEVI(dip)->devi_flags &= ~DEVI_RETIRED; in unmark_and_unfence()
8506 mutex_exit(&DEVI(dip)->devi_lock); in unmark_and_unfence()
8531 (void) ddi_pathname(dip, findp->fd_buf); in find_dip_fcn()
8533 if (strcmp(findp->fd_path, findp->fd_buf) != 0) in find_dip_fcn()
8537 findp->fd_dip = dip; in find_dip_fcn()
8625 * fenced -> detach -> fenced transitions. in mark_and_fence()
8627 mutex_enter(&DEVI(dip)->devi_lock); in mark_and_fence()
8628 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)); in mark_and_fence()
8629 ASSERT(!(DEVI(dip)->devi_flags & DEVI_R_BLOCKED)); in mark_and_fence()
8630 ASSERT(!(DEVI(dip)->devi_flags & DEVI_RETIRING)); in mark_and_fence()
8631 DEVI(dip)->devi_flags |= DEVI_RETIRED; in mark_and_fence()
8632 mutex_exit(&DEVI(dip)->devi_lock); in mark_and_fence()
8647 * - if device is present in the retire database, marks the device retired
8649 * - if device is not in retire database, allows the device to attach normally
8686 if (DEVI(dip)->devi_flags & DEVI_RETIRED) in i_ddi_check_retire()
8731 int i = start - 1; in partition_curr()
8737 j--; in partition_curr()
8754 int i = start - 1; in partition_aliases()
8760 j--; in partition_aliases()
8813 cmn_err(CE_PANIC, "alias path-pair alloc failed"); in create_sorted_pairs()
8820 cmn_err(CE_PANIC, "curr path-pair alloc failed"); in create_sorted_pairs()
8840 sort_alias_pairs(ddi_aliases.dali_alias_pairs, 0, count - 1); in create_sorted_pairs()
8841 sort_curr_pairs(ddi_aliases.dali_curr_pairs, 0, count - 1); in create_sorted_pairs()
8861 "ddi-alias-tlb", DDI_ALIAS_HASH_SIZE, mod_hash_null_valdtor); in ddi_register_aliases()
8868 "ddi-curr-tlb", DDI_ALIAS_HASH_SIZE, mod_hash_null_valdtor); in ddi_register_aliases()
8911 len = strlen(pair->pair_alias); in ddi_alias_to_currdip()
8920 if (strncmp(alias, pair->pair_alias, len) != 0) in ddi_alias_to_currdip()
8931 (void) strlcpy(curr, pair->pair_curr, MAXPATHLEN); in ddi_alias_to_currdip()
8971 len = strlen(pair->pair_curr); in ddi_curr_to_alias()
8981 if (strncmp(curr, pair->pair_curr, len) != 0) in ddi_curr_to_alias()
8993 (void) strlcpy(alias, pair->pair_alias, MAXPATHLEN); in ddi_curr_to_alias()
9041 for (i = ddi_aliases.dali_num_pairs - 1; i >= 0; i--) { in ddi_alias_redirect()
9078 for (i = ddi_aliases.dali_num_pairs - 1; i >= 0; i--) { in ddi_curr_redirect()
9122 buflen = sizeof (strbuf) - tlen; in ddi_err()
9124 if (rdip && ddi_get_instance(rdip) == -1) { in ddi_err()
9134 buflen = sizeof (strbuf) - tlen; in ddi_err()
9164 (void) vsnprintf(buf + tlen, buflen - tlen, fmt, ap); in ddi_err()
9175 (void) vsnprintf(buf + tlen, buflen - tlen, fmt, ap); in ddi_err()