Lines Matching refs:dip
99 dev_info_t *dip; member
221 static void ndi_devi_exit_and_wait(dev_info_t *dip,
223 static int ndi_devi_unbind_driver(dev_info_t *dip);
225 static int i_ddi_check_retire(dev_info_t *dip);
418 i_ddi_free_node(dev_info_t *dip) in i_ddi_free_node() argument
420 struct dev_info *devi = DEVI(dip); in i_ddi_free_node()
433 if (i_ndi_dev_is_auto_assigned_node(dip)) in i_ddi_free_node()
434 impl_ddi_free_nodeid(DEVI(dip)->devi_nodeid); in i_ddi_free_node()
436 if (ndi_dev_is_persistent_node(dip)) { 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()
452 ddi_prop_remove_all(dip); /* remove driver properties */ 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()
461 i_ddi_set_node_state(dip, DS_INVAL); in i_ddi_free_node()
462 da_log_enter(dip); in i_ddi_free_node()
475 "dip=%p", (void *)dip)); in i_ddi_free_node()
476 contract_device_remove_dip(dip); in i_ddi_free_node()
484 "dip=%p, name=%s", (void *)dip, devi->devi_node_name)); in i_ddi_free_node()
504 ndi_devi_set_nodename(dev_info_t *dip, char *name, int flags) in ndi_devi_set_nodename() argument
509 ASSERT(dip && name); in ndi_devi_set_nodename()
511 oname = DEVI(dip)->devi_node_name; in ndi_devi_set_nodename()
520 if (i_ddi_node_state(dip) >= DS_BOUND) { 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()
532 i_ddi_set_binding_name(dip, nname); in ndi_devi_set_nodename()
535 da_log_enter(dip); in ndi_devi_set_nodename()
540 i_ddi_add_devimap(dev_info_t *dip) in i_ddi_add_devimap() argument
544 ASSERT(dip); in i_ddi_add_devimap()
546 if (!ndi_dev_is_persistent_node(dip)) in i_ddi_add_devimap()
549 ASSERT(ddi_get_parent(dip) == NULL || (DEVI_VHCI_NODE(dip)) || in i_ddi_add_devimap()
550 DEVI_BUSY_OWNED(ddi_get_parent(dip))); 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()
570 i_ddi_remove_devimap(dev_info_t *dip) in i_ddi_remove_devimap() argument
575 ASSERT(dip); in i_ddi_remove_devimap()
577 if (!ndi_dev_is_persistent_node(dip)) in i_ddi_remove_devimap()
587 if (e_ddi_devi_holdcnt(dip)) { 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()
610 fcn, (void *)dip); in i_ddi_remove_devimap()
615 elem->dip = NULL; in i_ddi_remove_devimap()
630 link_node(dev_info_t *dip) in link_node() argument
632 struct dev_info *devi = DEVI(dip); in link_node()
653 while (*dipp && (*dipp != dip)) { in link_node()
661 i_ddi_add_devimap(dip); in link_node()
682 i_link_vhci_node(dip); in link_node()
685 *dipp = dip; in link_node()
686 DEVI(dip)->devi_sibling = NULL; in link_node()
697 if (ndi_dev_is_persistent_node(dip)) in link_node()
698 add_to_dn_list(&orphanlist, dip); in link_node()
705 unlink_node(dev_info_t *dip) in unlink_node() argument
707 struct dev_info *devi = DEVI(dip); in unlink_node()
716 ddi_node_name(dip))); in unlink_node()
719 if (devi->devi_ref || i_ddi_remove_devimap(dip) != DDI_SUCCESS) in unlink_node()
730 while (*dipp && (*dipp != dip)) { in unlink_node()
749 if (ndi_dev_is_persistent_node(dip)) { in unlink_node()
750 remove_from_dn_list(&orphanlist, dip); in unlink_node()
755 if (hdlp->cn_info.cn_child == dip) in unlink_node()
776 bind_node(dev_info_t *dip) in bind_node() argument
780 struct dev_info *devi = DEVI(dip); in bind_node()
781 dev_info_t *parent = ddi_get_parent(dip); in bind_node()
786 (void *)dip, ddi_node_name(dip))); 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()
796 major = ddi_compatible_driver_major(dip, &p); in bind_node()
802 i_ddi_set_binding_name(dip, p); in bind_node()
808 link_to_driver_list(dip); in bind_node()
813 if (ndi_dev_is_persistent_node(dip)) { in bind_node()
827 unbind_node(dev_info_t *dip) in unbind_node() argument
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()
837 (void *)dip, ddi_node_name(dip))); in unbind_node()
839 unlink_from_driver_list(dip); 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()
853 init_node(dev_info_t *dip) in init_node() argument
856 dev_info_t *pdip = ddi_get_parent(dip); in init_node()
862 ASSERT(i_ddi_node_state(dip) == DS_BOUND); in init_node()
868 (void) ddi_pathname(dip, path); in init_node()
870 path, (void *)dip)); in init_node()
881 add_global_props(dip); in init_node()
888 error = (*f)(pdip, pdip, DDI_CTLOPS_INITCHILD, dip, NULL); in init_node()
891 path, (void *)dip)); in init_node()
892 remove_global_props(dip); 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()
911 ddi_devid_unregister(dip); in init_node()
913 mutex_exit(&DEVI(dip)->devi_lock); in init_node()
916 ddi_set_name_addr(dip, NULL); in init_node()
924 (void) ddi_pathname(dip, path); in init_node()
927 if (find_duplicate_child(pdip, dip) != NULL) { in init_node()
932 if ((error = uninit_node(dip)) != DDI_SUCCESS) { in init_node()
938 "%s 0x%p%s\n", path, (void *)dip, in init_node()
949 if (!(DEVI(dip)->devi_flags & DEVI_CACHED_DEVID) && in init_node()
950 (ddi_devid_get(dip, &devid) == DDI_SUCCESS)) { in init_node()
951 if (e_devid_cache_register(dip, devid) == DDI_SUCCESS) { 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()
977 if (driver_active(major) && (major != DEVI(dip)->devi_major) && in init_node()
978 (ndi_dev_is_persistent_node(dip) || driver_conf_allow_path_alias)) { 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()
997 if ((error = uninit_node(dip)) != DDI_SUCCESS) { in init_node()
1006 if ((error = ndi_devi_unbind_driver(dip)) != DDI_SUCCESS) { in init_node()
1014 if (DEVI(dip)->devi_rebinding_name == NULL) in init_node()
1015 DEVI(dip)->devi_rebinding_name = in init_node()
1026 if ((error = ndi_devi_bind_driver(dip, 0)) != DDI_SUCCESS) { in init_node()
1037 if (ndi_dev_is_persistent_node(dip)) in init_node()
1044 error = ddi_initchild(pdip, dip); in init_node()
1046 "%s 0x%p\n", path, (void *)dip)); in init_node()
1059 DEVI(dip)->devi_instance = e_ddi_assign_instance(dip); in init_node()
1060 ddi_optimize_dtree(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()
1080 uninit_node(dev_info_t *dip) in uninit_node() argument
1093 node_state_entry = i_ddi_node_state(dip); in uninit_node()
1096 pdip = ddi_get_parent(dip); in uninit_node()
1100 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in uninit_node()
1113 addr = ddi_get_name_addr(dip); in uninit_node()
1120 error = (*f)(pdip, pdip, DDI_CTLOPS_UNINITCHILD, dip, (void *)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()
1127 ddi_devid_unregister(dip); in uninit_node()
1129 mutex_exit(&DEVI(dip)->devi_lock); in uninit_node()
1132 ddi_set_name_addr(dip, NULL); in uninit_node()
1141 e_ddi_free_instance(dip, addr); in uninit_node()
1142 DEVI(dip)->devi_instance = -1; in uninit_node()
1148 remove_global_props(dip); in uninit_node()
1173 if (!((ndi_dev_is_persistent_node(dip) == 0) && in uninit_node()
1174 (DEVI(dip)->devi_flags & DEVI_REBIND))) in uninit_node()
1175 e_ddi_prop_remove_all(dip); in uninit_node()
1178 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in uninit_node()
1193 probe_node(dev_info_t *dip) in probe_node() argument
1197 ASSERT(i_ddi_node_state(dip) == DS_INITIALIZED); in probe_node()
1200 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in probe_node()
1203 DEVI(dip)->devi_ops = ndi_hold_driver(dip); in probe_node()
1204 if (DEVI(dip)->devi_ops == NULL) { in probe_node()
1207 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in probe_node()
1212 (void) devi_identify(dip); in probe_node()
1214 rv = devi_probe(dip); in probe_node()
1217 ndi_rele_driver(dip); in probe_node()
1218 DEVI(dip)->devi_ops = NULL; in probe_node()
1223 e_ddi_keep_instance(dip); /* persist instance */ in probe_node()
1231 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip), in probe_node()
1239 ddi_driver_name(dip), ddi_get_instance(dip)); in probe_node()
1252 unprobe_node(dev_info_t *dip) in unprobe_node() argument
1254 ASSERT(i_ddi_node_state(dip) == DS_PROBED); in unprobe_node()
1262 (void *)dip, ddi_node_name(dip))); in unprobe_node()
1271 attach_node(dev_info_t *dip) in attach_node() argument
1275 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); in attach_node()
1276 ASSERT(i_ddi_node_state(dip) == DS_PROBED); in attach_node()
1279 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in attach_node()
1284 if ((rv = mdi_devi_online(dip, 0)) != NDI_SUCCESS) { in attach_node()
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()
1311 DEVI_SET_ATTACHING(dip); in attach_node()
1312 DEVI_SET_NEED_RESET(dip); in attach_node()
1313 mutex_exit(&(DEVI(dip)->devi_lock)); in attach_node()
1315 rv = devi_attach(dip, DDI_ATTACH); in attach_node()
1317 mutex_enter(&(DEVI(dip)->devi_lock)); in attach_node()
1318 DEVI_CLR_ATTACHING(dip); in attach_node()
1321 DEVI_CLR_NEED_RESET(dip); in attach_node()
1322 mutex_exit(&DEVI(dip)->devi_lock); in attach_node()
1328 dacf_clr_rsrvs(dip, DACF_OPID_POSTATTACH); in attach_node()
1329 dacf_clr_rsrvs(dip, DACF_OPID_PREDETACH); in attach_node()
1331 if (DEVI(dip)->devi_taskq) in attach_node()
1332 ddi_taskq_destroy(DEVI(dip)->devi_taskq); in attach_node()
1333 ddi_remove_minor_node(dip, NULL); in attach_node()
1336 ndi_rele_driver(dip); in attach_node()
1337 DEVI(dip)->devi_ops = NULL; in attach_node()
1339 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in attach_node()
1342 mutex_exit(&DEVI(dip)->devi_lock); in attach_node()
1354 detach_node(dev_info_t *dip, uint_t flag) in detach_node() argument
1359 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); in detach_node()
1360 ASSERT(i_ddi_node_state(dip) == DS_ATTACHED); in detach_node()
1363 if (DEVI(dip)->devi_ref) in detach_node()
1367 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in detach_node()
1377 ASSERT(!MDI_PHCI(dip) || in detach_node()
1378 (ddi_get_parent(mdi_devi_get_vdip(dip)) == ddi_get_parent(dip)) || in detach_node()
1379 DEVI_BUSY_OWNED(mdi_devi_get_vdip(dip))); in detach_node()
1382 if (mdi_devi_offline(dip, flag) != NDI_SUCCESS) { in detach_node()
1387 if (DEVI(dip)->devi_taskq) in detach_node()
1388 ddi_taskq_wait(DEVI(dip)->devi_taskq); in detach_node()
1390 rv = devi_detach(dip, DDI_DETACH); in detach_node()
1395 (void *)dip, ddi_driver_name(dip), ddi_get_instance(dip))); in detach_node()
1399 mutex_enter(&(DEVI(dip)->devi_lock)); in detach_node()
1400 DEVI_CLR_NEED_RESET(dip); in detach_node()
1401 mutex_exit(&(DEVI(dip)->devi_lock)); in detach_node()
1407 if (IOMMU_USED(dip)) in detach_node()
1408 iommulib_nex_close(dip); 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()
1419 dacf_clr_rsrvs(dip, DACF_OPID_POSTATTACH); in detach_node()
1420 dacf_clr_rsrvs(dip, DACF_OPID_PREDETACH); 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()
1431 ddi_remove_minor_node(dip, NULL); in detach_node()
1432 ddi_prop_remove_all(dip); 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()
1452 ndi_rele_driver(dip); in detach_node()
1453 DEVI(dip)->devi_ops = NULL; in detach_node()
1461 postattach_node(dev_info_t *dip) in postattach_node() argument
1473 if (DEVI_IS_DEVICE_REMOVED(dip)) in postattach_node()
1481 rval = dacfc_postattach(dip); in postattach_node()
1492 ddi_driver_name(dip), ddi_get_instance(dip)); in postattach_node()
1503 predetach_node(dev_info_t *dip, uint_t flag) in predetach_node() argument
1515 if ((ddi_prop_get_int(DDI_DEV_T_ANY, dip, in predetach_node()
1517 (ddi_prop_get_int(DDI_DEV_T_ANY, dip, in predetach_node()
1522 dnp = &devnamesp[DEVI(dip)->devi_major]; in predetach_node()
1532 ret = dacfc_predetach(dip); in predetach_node()
1549 i_ndi_config_node(dev_info_t *dip, ddi_node_state_t state, uint_t flag) in i_ndi_config_node() argument
1554 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); in i_ndi_config_node()
1556 while ((i_ddi_node_state(dip) < state) && (rv == DDI_SUCCESS)) { in i_ndi_config_node()
1564 switch (i_ddi_node_state(dip)) { in i_ndi_config_node()
1570 link_node(dip); in i_ndi_config_node()
1571 translate_devid((dev_info_t *)dip); in i_ndi_config_node()
1572 i_ddi_set_node_state(dip, DS_LINKED); in i_ndi_config_node()
1586 if ((rv = bind_node(dip)) == DDI_SUCCESS) in i_ndi_config_node()
1587 i_ddi_set_node_state(dip, DS_BOUND); in i_ndi_config_node()
1596 if ((rv = init_node(dip)) == DDI_SUCCESS) in i_ndi_config_node()
1597 i_ddi_set_node_state(dip, DS_INITIALIZED); in i_ndi_config_node()
1600 if ((rv = probe_node(dip)) == DDI_SUCCESS) in i_ndi_config_node()
1601 i_ddi_set_node_state(dip, DS_PROBED); in i_ndi_config_node()
1609 if (i_ddi_check_retire(dip) == 1 && in i_ndi_config_node()
1610 ndi_dev_is_persistent_node(dip) && in i_ndi_config_node()
1616 if ((rv = attach_node(dip)) == DDI_SUCCESS) in i_ndi_config_node()
1617 i_ddi_set_node_state(dip, DS_ATTACHED); in i_ndi_config_node()
1621 if ((rv = postattach_node(dip)) == DDI_SUCCESS) in i_ndi_config_node()
1622 i_ddi_set_node_state(dip, DS_READY); in i_ndi_config_node()
1633 da_log_enter(dip); in i_ndi_config_node()
1641 i_ndi_unconfig_node(dev_info_t *dip, ddi_node_state_t state, uint_t flag) in i_ndi_unconfig_node() argument
1645 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); in i_ndi_unconfig_node()
1647 while ((i_ddi_node_state(dip) > state) && (rv == DDI_SUCCESS)) { in i_ndi_unconfig_node()
1655 switch (i_ddi_node_state(dip)) { in i_ndi_unconfig_node()
1663 if ((rv = unlink_node(dip)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1664 i_ddi_set_node_state(dip, DS_PROTO); in i_ndi_unconfig_node()
1672 if ((rv = unbind_node(dip)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1673 i_ddi_set_node_state(dip, DS_LINKED); in i_ndi_unconfig_node()
1676 if ((rv = uninit_node(dip)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1677 i_ddi_set_node_state(dip, DS_BOUND); in i_ndi_unconfig_node()
1680 if ((rv = unprobe_node(dip)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1681 i_ddi_set_node_state(dip, DS_INITIALIZED); in i_ndi_unconfig_node()
1686 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1687 DEVI_SET_DETACHING(dip); in i_ndi_unconfig_node()
1688 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1692 if ((rv = detach_node(dip, flag)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1693 i_ddi_set_node_state(dip, DS_PROBED); in i_ndi_unconfig_node()
1695 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1696 DEVI_CLR_DETACHING(dip); in i_ndi_unconfig_node()
1697 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_unconfig_node()
1702 if ((rv = predetach_node(dip, flag)) == DDI_SUCCESS) in i_ndi_unconfig_node()
1703 i_ddi_set_node_state(dip, DS_ATTACHED); in i_ndi_unconfig_node()
1709 da_log_enter(dip); in i_ndi_unconfig_node()
1732 ddi_uninitchild(dev_info_t *dip) in ddi_uninitchild() argument
1735 dev_info_t *parent = ddi_get_parent(dip); in ddi_uninitchild()
1739 ret = i_ndi_unconfig_node(dip, DS_BOUND, 0); in ddi_uninitchild()
1749 i_ddi_attachchild(dev_info_t *dip) in i_ddi_attachchild() argument
1751 dev_info_t *parent = ddi_get_parent(dip); in i_ddi_attachchild()
1756 if ((i_ddi_node_state(dip) < DS_BOUND) || DEVI_IS_DEVICE_OFFLINE(dip)) in i_ddi_attachchild()
1759 ret = i_ndi_config_node(dip, DS_READY, 0); in i_ddi_attachchild()
1767 (void) i_ndi_unconfig_node(dip, DS_INITIALIZED, 0); in i_ddi_attachchild()
1782 i_ddi_detachchild(dev_info_t *dip, uint_t flags) in i_ddi_detachchild() argument
1784 dev_info_t *parent = ddi_get_parent(dip); in i_ddi_detachchild()
1789 ret = i_ndi_unconfig_node(dip, DS_PROBED, flags); in i_ddi_detachchild()
1791 (void) i_ndi_config_node(dip, DS_READY, 0); in i_ddi_detachchild()
1794 (void) i_ndi_unconfig_node(dip, DS_INITIALIZED, 0); in i_ddi_detachchild()
1805 dev_info_t *dip; in ddi_add_child() local
1808 dip = i_ddi_alloc_node(pdip, name, nodeid, (int)unit, NULL, KM_SLEEP); in ddi_add_child()
1811 (void) i_ndi_config_node(dip, DS_BOUND, 0); in ddi_add_child()
1813 return (dip); in ddi_add_child()
1820 ddi_remove_child(dev_info_t *dip, int dummy) in ddi_remove_child() argument
1824 dev_info_t *parent = ddi_get_parent(dip); in ddi_remove_child()
1833 if (DEVI(dip)->devi_child) { in ddi_remove_child()
1834 ret = ndi_devi_unconfig(dip, NDI_DEVI_REMOVE); in ddi_remove_child()
1839 ASSERT(DEVI(dip)->devi_child == NULL); in ddi_remove_child()
1842 ret = i_ndi_unconfig_node(dip, DS_PROTO, 0); in ddi_remove_child()
1848 ASSERT(i_ddi_node_state(dip) == DS_PROTO); in ddi_remove_child()
1849 i_ddi_free_node(dip); in ddi_remove_child()
1862 ndi_hold_devi(dev_info_t *dip) in ndi_hold_devi() argument
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()
1872 ndi_rele_devi(dev_info_t *dip) in ndi_rele_devi() argument
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()
1883 e_ddi_devi_holdcnt(dev_info_t *dip) in e_ddi_devi_holdcnt() argument
1885 return (DEVI(dip)->devi_ref); in e_ddi_devi_holdcnt()
1892 ndi_hold_driver(dev_info_t *dip) in ndi_hold_driver() argument
1894 if (i_ddi_node_state(dip) < DS_BOUND) in ndi_hold_driver()
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()
1902 ndi_rele_driver(dev_info_t *dip) in ndi_rele_driver() argument
1904 ASSERT(i_ddi_node_state(dip) >= DS_BOUND); in ndi_rele_driver()
1905 mod_rele_dev_by_major(DEVI(dip)->devi_major); in ndi_rele_driver()
1913 ndi_devi_enter(dev_info_t *dip, int *circular) in ndi_devi_enter() argument
1915 struct dev_info *devi = DEVI(dip); in ndi_devi_enter()
1916 ASSERT(dip != NULL); in ndi_devi_enter()
1919 ASSERT(!MDI_VHCI(dip) || (mdi_devi_pdip_entered(dip) == 0) || in ndi_devi_enter()
1920 DEVI_BUSY_OWNED(dip)); in ndi_devi_enter()
1943 ndi_devi_exit(dev_info_t *dip, int circular) in ndi_devi_exit() argument
1945 struct dev_info *devi = DEVI(dip); in ndi_devi_exit()
1947 ASSERT(dip != NULL); in ndi_devi_exit()
1967 if (MDI_PHCI(dip)) { in ndi_devi_exit()
1968 vdevi = DEVI(mdi_devi_get_vdip(dip)); in ndi_devi_exit()
1985 ndi_devi_exit_and_wait(dev_info_t *dip, int circular, clock_t end_time) in ndi_devi_exit_and_wait() argument
1987 struct dev_info *devi = DEVI(dip); in ndi_devi_exit_and_wait()
1988 ASSERT(dip != NULL); in ndi_devi_exit_and_wait()
2015 ndi_devi_tryenter(dev_info_t *dip, int *circular) in ndi_devi_tryenter() argument
2018 struct dev_info *devi = DEVI(dip); in ndi_devi_tryenter()
2019 ASSERT(dip != NULL); in ndi_devi_tryenter()
2081 ndi_devi_free(dev_info_t *dip) in ndi_devi_free() argument
2083 ASSERT(dip != NULL); in ndi_devi_free()
2085 if (i_ddi_node_state(dip) >= DS_INITIALIZED) in ndi_devi_free()
2089 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip)); in ndi_devi_free()
2091 (void) ddi_remove_child(dip, 0); in ndi_devi_free()
2102 ndi_devi_bind_driver(dev_info_t *dip, uint_t flags) in ndi_devi_bind_driver() argument
2106 dev_info_t *pdip = ddi_get_parent(dip); in ndi_devi_bind_driver()
2111 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in ndi_devi_bind_driver()
2114 if (i_ndi_config_node(dip, DS_BOUND, flags) == DDI_SUCCESS) in ndi_devi_bind_driver()
2125 ndi_devi_unbind_driver(dev_info_t *dip) in ndi_devi_unbind_driver() argument
2127 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); in ndi_devi_unbind_driver()
2129 return (i_ndi_unconfig_node(dip, DS_LINKED, 0)); in ndi_devi_unbind_driver()
2140 i_ddi_node_state(dev_info_t *dip) in i_ddi_node_state() argument
2142 return (DEVI(dip)->devi_node_state); in i_ddi_node_state()
2149 i_ddi_set_node_state(dev_info_t *dip, ddi_node_state_t state) in i_ddi_set_node_state() argument
2151 DEVI(dip)->devi_node_state = state; in i_ddi_set_node_state()
2162 i_ddi_devi_attached(dev_info_t *dip) in i_ddi_devi_attached() argument
2164 return (DEVI(dip)->devi_node_state >= DS_ATTACHED); in i_ddi_devi_attached()
2202 dev_info_t *dip; in find_sibling() local
2232 for (dip = head; dip; dip = ddi_get_next_sibling(dip)) { in find_sibling()
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()
2246 if (ddi_initchild(ddi_get_parent(dip), dip) in find_sibling()
2249 addr = DEVI(dip)->devi_addr; in find_sibling()
2252 dip, buf, MAXNAMELEN) != DDI_SUCCESS)) in find_sibling()
2268 return (dip); in find_sibling()
2276 find_duplicate_child(dev_info_t *pdip, dev_info_t *dip) in find_duplicate_child() argument
2279 char *cname = DEVI(dip)->devi_node_name; in find_duplicate_child()
2280 char *caddr = DEVI(dip)->devi_addr; in find_duplicate_child()
2285 if (dup != dip) in find_duplicate_child()
2291 return (find_sibling(ddi_get_next_sibling(dip), cname, caddr, in find_duplicate_child()
2317 dev_info_t *dip; in find_child_by_name() local
2320 dip = find_sibling(ddi_get_child(pdip), cname, caddr, in find_child_by_name()
2322 if (dip) in find_child_by_name()
2323 return (dip); in find_child_by_name()
2336 dev_info_t *dip; in find_child_by_driver() local
2339 dip = find_sibling(ddi_get_child(pdip), cname, caddr, in find_child_by_driver()
2341 if (dip) in find_child_by_driver()
2342 return (dip); in find_child_by_driver()
2363 dev_info_t *dip; in find_child_by_addr() local
2370 dip = find_sibling(ddi_get_child(pdip), NULL, caddr, in find_child_by_addr()
2372 if (dip) in find_child_by_addr()
2373 return (dip); in find_child_by_addr()
2497 i_ddi_get_exported_classes(dev_info_t *dip, char ***classes) in i_ddi_get_exported_classes() argument
2507 ASSERT(i_ddi_node_state(dip) >= DS_BOUND); in i_ddi_get_exported_classes()
2509 if (dip == ddi_root_node()) /* rootnode exports class "root" */ in i_ddi_get_exported_classes()
2512 nclass += get_class(ddi_driver_name(dip), NULL); in i_ddi_get_exported_classes()
2519 if (dip == ddi_root_node()) { in i_ddi_get_exported_classes()
2523 n += get_class(ddi_driver_name(dip), buf); in i_ddi_get_exported_classes()
2623 ndi_merge_node(dev_info_t *dip, int (*make_ua)(dev_info_t *, char *, int)) in ndi_merge_node() argument
2627 ASSERT(ndi_dev_is_persistent_node(dip) == 0); in ndi_merge_node()
2628 ASSERT(ddi_get_name_addr(dip) != NULL); in ndi_merge_node()
2630 hwdip = ndi_devi_findchild_by_callback(ddi_get_parent(dip), in ndi_merge_node()
2631 ddi_binding_name(dip), ddi_get_name_addr(dip), make_ua); in ndi_merge_node()
2637 if ((hwdip == NULL) || (hwdip == dip)) { in ndi_merge_node()
2640 ddi_deviname(dip, buf))); in ndi_merge_node()
2660 ddi_deviname(dip, buf))); in ndi_merge_node()
2679 ddi_deviname(dip, buf), (void *)hwdip)); 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()
2704 ndi_merge_wildcard_node(dev_info_t *dip) in ndi_merge_wildcard_node() argument
2707 dev_info_t *pdip = ddi_get_parent(dip); in ndi_merge_wildcard_node()
2708 major_t major = ddi_driver_major(dip); in ndi_merge_wildcard_node()
2711 ASSERT(ndi_dev_is_persistent_node(dip) == 0); in ndi_merge_wildcard_node()
2719 mutex_enter(&DEVI(dip)->devi_lock); in ndi_merge_wildcard_node()
2745 (void *)hwdip, ddi_node_name(dip))); in ndi_merge_wildcard_node()
2750 i_ddi_prop_list_dup(DEVI(dip)->devi_sys_prop_ptr, KM_SLEEP); in ndi_merge_wildcard_node()
2752 i_ddi_prop_list_dup(DEVI(dip)->devi_drv_prop_ptr, KM_SLEEP); in ndi_merge_wildcard_node()
2755 mutex_exit(&DEVI(dip)->devi_lock); in ndi_merge_wildcard_node()
2766 ddi_compatible_driver_major(dev_info_t *dip, char **formp) in ddi_compatible_driver_major() argument
2768 struct dev_info *devi = DEVI(dip); in ddi_compatible_driver_major()
2777 if (ddi_prop_exists(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS, in ddi_compatible_driver_major()
2811 (void) lookup_compatible(dip, KM_SLEEP); in ddi_compatible_driver_major()
2829 major = ddi_name_to_major(ddi_node_name(dip)); in ddi_compatible_driver_major()
2846 lookup_compatible(dev_info_t *dip, uint_t flag) in lookup_compatible() argument
2855 if (DEVI(dip)->devi_compat_names) { in lookup_compatible()
2865 if (ndi_dev_is_prom_node(dip) == 0) { in lookup_compatible()
2869 rv = ddi_prop_lookup_common(DDI_DEV_T_ANY, dip, prop_flags, 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()
2942 link_to_driver_list(dev_info_t *dip) in link_to_driver_list() argument
2944 major_t major = DEVI(dip)->devi_major; in link_to_driver_list()
2952 if (ndi_dev_is_persistent_node(dip)) { in link_to_driver_list()
2954 remove_from_dn_list(dnp, dip); in link_to_driver_list()
2961 add_to_dn_list(dnp, dip); in link_to_driver_list()
2965 unlink_from_driver_list(dev_info_t *dip) in unlink_from_driver_list() argument
2967 major_t major = DEVI(dip)->devi_major; in unlink_from_driver_list()
2976 remove_from_dn_list(dnp, dip); in unlink_from_driver_list()
2981 if (ndi_dev_is_persistent_node(dip)) { in unlink_from_driver_list()
2983 add_to_dn_list(dnp, dip); in unlink_from_driver_list()
2991 in_dn_list(struct devnames *dnp, dev_info_t *dip) in in_dn_list() argument
2999 if (idevi == DEVI(dip)) in in_dn_list()
3000 return (dip); in in_dn_list()
3014 add_to_ordered_dn_list(struct devnames *dnp, dev_info_t *dip) in add_to_ordered_dn_list() argument
3021 if (ndi_dev_is_prom_node(dip)) { in add_to_ordered_dn_list()
3028 } else if (ndi_dev_is_persistent_node(dip)) { in add_to_ordered_dn_list()
3044 DEVI(dip)->devi_next = DEVI(*dipp); in add_to_ordered_dn_list()
3045 *dipp = dip; in add_to_ordered_dn_list()
3053 add_to_dn_list(struct devnames *dnp, dev_info_t *dip) in add_to_dn_list() argument
3059 if (in_dn_list(dnp, dip)) { in add_to_dn_list()
3061 DEVI(dip)->devi_node_name); in add_to_dn_list()
3063 add_to_ordered_dn_list(dnp, dip); in add_to_dn_list()
3069 remove_from_dn_list(struct devnames *dnp, dev_info_t *dip) in remove_from_dn_list() argument
3076 while (*plist && (*plist != dip)) { in remove_from_dn_list()
3081 ASSERT(*plist == dip); 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()
3097 add_global_props(dev_info_t *dip) in add_global_props() argument
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()
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()
3121 remove_global_props(dev_info_t *dip) in remove_global_props() argument
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()
3134 major = ddi_driver_major(dip); in remove_global_props()
3298 da_log_enter(dev_info_t *dip) in da_log_enter() argument
3300 devinfo_audit_t *da_log, *da = DEVI(dip)->devi_audit; in da_log_enter()
3308 da->da_devinfo = dip; 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()
3432 dev_info_t *dip; member
3446 append_node(struct walk_elem **list, dev_info_t *dip) in append_node() argument
3452 elem->dip = dip; in append_node()
3470 walk_devs(dev_info_t *dip, int (*f)(dev_info_t *, void *), void *arg, in walk_devs() argument
3480 while (dip) { in walk_devs()
3481 switch ((*f)(dip, arg)) { in walk_devs()
3488 append_node(&head, dip); in walk_devs()
3489 dip = NULL; in walk_devs()
3494 dip = ddi_get_next_sibling(dip); in walk_devs()
3499 append_node(&head, dip); in walk_devs()
3500 dip = ddi_get_next_sibling(dip); 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()
3562 ddi_walk_devs(dev_info_t *dip, int (*f)(dev_info_t *, void *), void *arg) in ddi_walk_devs() argument
3565 ASSERT(dip == NULL || ddi_get_parent(dip) == NULL || in ddi_walk_devs()
3566 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in ddi_walk_devs()
3568 (void) walk_devs(dip, f, arg, 1); in ddi_walk_devs()
3586 dev_info_t *dip; in e_ddi_walk_driver() local
3594 dip = dnp->dn_head; in e_ddi_walk_driver()
3595 while (dip) { in e_ddi_walk_driver()
3596 ndi_hold_devi(dip); in e_ddi_walk_driver()
3598 if ((*f)(dip, arg) == DDI_WALK_TERMINATE) { in e_ddi_walk_driver()
3599 ndi_rele_devi(dip); in e_ddi_walk_driver()
3603 ndi_rele_devi(dip); in e_ddi_walk_driver()
3604 dip = ddi_get_next(dip); in e_ddi_walk_driver()
3613 dev_info_t *dip; /* result */ member
3620 i_find_devi(dev_info_t *dip, void *arg) in i_find_devi() argument
3625 (strcmp(ddi_node_name(dip), info->nodename) == 0)) && 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()
3630 ndi_hold_devi(dip); in i_find_devi()
3648 info.dip = NULL; in ddi_find_devinfo()
3651 return (info.dip); in ddi_find_devinfo()
3762 ddi_is_pci_dip(dev_info_t *dip) in ddi_is_pci_dip() argument
3766 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, in ddi_is_pci_dip()
4020 dev_info_t *dip = NULL; in i_ddi_prompath_to_devfspath() local
4026 error = resolve_pathname(prompath, &dip, &devt, &spectype); in i_ddi_prompath_to_devfspath()
4029 ASSERT(dip && devt != NODEV); in i_ddi_prompath_to_devfspath()
4034 (void) ddi_pathname(dip, devfspath); in i_ddi_prompath_to_devfspath()
4036 ndi_devi_enter(dip, &circ); in i_ddi_prompath_to_devfspath()
4037 minor_name = i_ddi_devtspectype_to_minorname(dip, devt, spectype); in i_ddi_prompath_to_devfspath()
4047 CLONE_PATH, ddi_driver_name(dip)); in i_ddi_prompath_to_devfspath()
4049 ndi_devi_exit(dip, circ); in i_ddi_prompath_to_devfspath()
4052 ndi_rele_devi(dip); in i_ddi_prompath_to_devfspath()
4067 should_implement_quiesce(dev_info_t *dip) in should_implement_quiesce() argument
4069 struct dev_info *devi = DEVI(dip); in should_implement_quiesce()
4077 strncmp(ddi_binding_name(dip), "pseudo", sizeof ("pseudo")) == 0) in should_implement_quiesce()
4084 if (skip_pseudo && (pdip = ddi_get_parent(dip)) != NULL && in should_implement_quiesce()
4091 if (!i_ddi_devi_attached(dip)) in should_implement_quiesce()
4119 check_driver_quiesce(dev_info_t *dip, void *arg) in check_driver_quiesce() argument
4123 if (!should_implement_quiesce(dip)) in check_driver_quiesce()
4126 if ((ops = ddi_get_driver(dip)) == NULL) in check_driver_quiesce()
4133 "quiesced", ddi_driver_name(dip)); in check_driver_quiesce()
4136 ddi_driver_name(dip)); in check_driver_quiesce()
4141 cmn_err(CE_WARN, "%s has no quiesce()", ddi_driver_name(dip)); in check_driver_quiesce()
4151 quiesce_one_device(dev_info_t *dip, void *arg) in quiesce_one_device() argument
4159 if (!i_ddi_devi_attached(dip)) in quiesce_one_device()
4162 if ((ops = ddi_get_driver(dip)) == NULL) in quiesce_one_device()
4165 should_quiesce = should_implement_quiesce(dip); in quiesce_one_device()
4179 rc = devi_quiesce(dip); in quiesce_one_device()
4184 ddi_driver_name(dip), ddi_get_instance(dip)); in quiesce_one_device()
4199 quiesce_devices(dev_info_t *dip, void *arg) in quiesce_devices() argument
4207 for (; dip != NULL; dip = ddi_get_next_sibling(dip)) { in quiesce_devices()
4208 quiesce_devices(ddi_get_child(dip), arg); in quiesce_devices()
4210 quiesce_one_device(dip, arg); in quiesce_devices()
4218 reset_leaf_device(dev_info_t *dip, void *arg) in reset_leaf_device() argument
4224 if (!DEVI_NEED_RESET(dip)) in reset_leaf_device()
4231 ops = ddi_get_driver(dip); in reset_leaf_device()
4237 if (DEVI_IS_ATTACHING(dip) || DEVI_IS_DETACHING(dip)) { in reset_leaf_device()
4246 ddi_pathname(dip, path)); in reset_leaf_device()
4251 ddi_driver_name(dip), ddi_get_instance(dip))); in reset_leaf_device()
4253 (void) devi_reset(dip, DDI_RESET_FORCE); in reset_leaf_device()
4312 bind_dip(dev_info_t *dip, void *arg) in bind_dip() argument
4322 if (i_ddi_node_state(dip) >= DS_BOUND) { in bind_dip()
4323 major = ddi_compatible_driver_major(dip, NULL); in bind_dip()
4324 if ((DEVI(dip)->devi_major == major) && in bind_dip()
4325 (i_ddi_node_state(dip) >= DS_INITIALIZED)) { in bind_dip()
4331 (void) ddi_pathname(dip, path); in bind_dip()
4340 (major != DEVI(dip)->devi_major)) in bind_dip()
4341 (void) ndi_devi_unbind_driver(dip); in bind_dip()
4345 if (i_ddi_node_state(dip) < DS_BOUND) in bind_dip()
4346 (void) ndi_devi_bind_driver(dip, 0); in bind_dip()
4374 unbind_alias_dev_in_use(dev_info_t *dip, char *alias) in unbind_alias_dev_in_use() argument
4378 ddi_driver_name(dip), ddi_get_instance(dip), in unbind_alias_dev_in_use()
4379 i_ddi_node_state(dip), alias); in unbind_alias_dev_in_use()
4388 unbind_children_by_alias(dev_info_t *dip, void *arg) in unbind_children_by_alias() argument
4404 ndi_devi_enter(dip, &circ); in unbind_children_by_alias()
4405 for (cdip = ddi_get_child(dip); cdip; cdip = next) { in unbind_children_by_alias()
4422 ndi_devi_exit(dip, circ); in unbind_children_by_alias()
4458 unbind_children_by_driver(dev_info_t *dip, void *arg) in unbind_children_by_driver() argument
4474 ndi_devi_enter(dip, &circ); in unbind_children_by_driver()
4475 for (cdip = ddi_get_child(dip); cdip; cdip = next) { in unbind_children_by_driver()
4488 ndi_devi_exit(dip, circ); in unbind_children_by_driver()
4517 dev_info_t *dip; in init_spec_child()
4531 dip = i_ddi_alloc_node(pdip, node_name, (pnode_t)DEVI_PSEUDO_NODEID, in init_spec_child()
4534 if (dip == NULL) in init_spec_child()
4537 if (ddi_initchild(pdip, dip) != DDI_SUCCESS) in init_spec_child()
4538 (void) ddi_remove_child(dip, 0); in init_spec_child()
4583 dev_info_t *dip; in i_ndi_init_hw_children() local
4589 dip = ddi_get_child(pdip); in i_ndi_init_hw_children()
4590 while (dip) { in i_ndi_init_hw_children()
4591 if (ndi_dev_is_persistent_node(dip)) in i_ndi_init_hw_children()
4592 (void) i_ndi_config_node(dip, DS_INITIALIZED, flags); in i_ndi_init_hw_children()
4593 dip = ddi_get_next_sibling(dip); in i_ndi_init_hw_children()
4602 i_ndi_devi_report_status_change(dev_info_t *dip, char *path) in i_ndi_devi_report_status_change() argument
4606 if (!DEVI_NEED_REPORT(dip) || in i_ndi_devi_report_status_change()
4607 (i_ddi_node_state(dip) < DS_INITIALIZED) || in i_ndi_devi_report_status_change()
4608 ndi_dev_is_hidden_node(dip)) { in i_ndi_devi_report_status_change()
4615 if (DEVI_IS_DEVICE_REMOVED(dip)) { in i_ndi_devi_report_status_change()
4617 } else if (DEVI_IS_DEVICE_OFFLINE(dip)) { in i_ndi_devi_report_status_change()
4619 } else if (DEVI_IS_DEVICE_DOWN(dip)) { in i_ndi_devi_report_status_change()
4621 } else if (DEVI_IS_BUS_QUIESCED(dip)) { in i_ndi_devi_report_status_change()
4623 } else if (DEVI_IS_BUS_DOWN(dip)) { in i_ndi_devi_report_status_change()
4625 } else if (i_ddi_devi_attached(dip)) { in i_ndi_devi_report_status_change()
4634 ddi_pathname(dip, path), ddi_driver_name(dip), in i_ndi_devi_report_status_change()
4635 ddi_get_instance(dip), status); in i_ndi_devi_report_status_change()
4639 path, ddi_driver_name(dip), in i_ndi_devi_report_status_change()
4640 ddi_get_instance(dip), status); in i_ndi_devi_report_status_change()
4643 mutex_enter(&(DEVI(dip)->devi_lock)); in i_ndi_devi_report_status_change()
4644 DEVI_REPORT_DONE(dip); in i_ndi_devi_report_status_change()
4645 mutex_exit(&(DEVI(dip)->devi_lock)); in i_ndi_devi_report_status_change()
4652 i_log_devfs_add_devinfo(dev_info_t *dip, uint_t flags) in i_log_devfs_add_devinfo() argument
4663 ASSERT(dip && ddi_get_parent(dip) && in i_log_devfs_add_devinfo()
4664 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in i_log_devfs_add_devinfo()
4677 (void) ddi_pathname(dip, pathname); in i_log_devfs_add_devinfo()
4688 if ((class_name = i_ddi_devi_class(dip)) != NULL) { in i_log_devfs_add_devinfo()
4741 ddi_driver_name(dip), ddi_driver_name(dip)); in i_log_devfs_add_devinfo()
4847 i_ddi_log_devfs_device_remove(dev_info_t *dip) in i_ddi_log_devfs_device_remove() argument
4851 ASSERT(dip && ddi_get_parent(dip) && in i_ddi_log_devfs_device_remove()
4852 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in i_ddi_log_devfs_device_remove()
4853 ASSERT(DEVI_IS_DEVICE_REMOVED(dip)); in i_ddi_log_devfs_device_remove()
4855 ASSERT(i_ddi_node_state(dip) >= DS_INITIALIZED); in i_ddi_log_devfs_device_remove()
4856 if (i_ddi_node_state(dip) < DS_INITIALIZED) in i_ddi_log_devfs_device_remove()
4860 ldi_invoke_finalize(dip, DDI_DEV_T_ANY, 0, LDI_EV_DEVICE_REMOVE, in i_ddi_log_devfs_device_remove()
4865 (void) i_log_devfs_remove_devinfo(ddi_pathname(dip, path), in i_ddi_log_devfs_device_remove()
4866 i_ddi_devi_class(dip), (char *)ddi_driver_name(dip), in i_ddi_log_devfs_device_remove()
4867 ddi_get_instance(dip), 0); in i_ddi_log_devfs_device_remove()
4872 i_ddi_log_devfs_device_insert(dev_info_t *dip) in i_ddi_log_devfs_device_insert() argument
4874 ASSERT(dip && ddi_get_parent(dip) && in i_ddi_log_devfs_device_insert()
4875 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in i_ddi_log_devfs_device_insert()
4876 ASSERT(!DEVI_IS_DEVICE_REMOVED(dip)); in i_ddi_log_devfs_device_insert()
4878 (void) i_log_devfs_add_devinfo(dip, 0); in i_ddi_log_devfs_device_insert()
4939 i_log_devfs_branch_add(dev_info_t *dip) in i_log_devfs_branch_add() argument
4945 (void) ddi_pathname(dip, node_path); in i_log_devfs_branch_add()
4965 brevq_enqueue(struct brevq_node **brevqp, dev_info_t *dip, in brevq_enqueue() argument
4972 (void) ddi_deviname(dip, deviname); in brevq_enqueue()
5027 log_and_free_brevq_dip(dev_info_t *dip, struct brevq_node *brevq) in log_and_free_brevq_dip() argument
5032 (void) ddi_pathname(dip, path); in log_and_free_brevq_dip()
5042 log_and_free_br_events_on_grand_children(dev_info_t *dip, in log_and_free_br_events_on_grand_children() argument
5050 (void) ddi_pathname(dip, path); in log_and_free_br_events_on_grand_children()
5067 cleanup_br_events_on_grand_children(dev_info_t *dip, struct brevq_node **brevqp) in cleanup_br_events_on_grand_children() argument
5078 ndi_devi_enter(dip, &circ); in cleanup_br_events_on_grand_children()
5081 for (child = ddi_get_child(dip); child != NULL; in cleanup_br_events_on_grand_children()
5099 (void) ddi_pathname(dip, path); in cleanup_br_events_on_grand_children()
5126 ndi_devi_exit(dip, circ); in cleanup_br_events_on_grand_children()
5131 need_remove_event(dev_info_t *dip, int flags) in need_remove_event() argument
5135 !(DEVI_EVREMOVE(dip))) in need_remove_event()
5150 devi_unconfig_branch(dev_info_t *dip, dev_info_t **dipp, int flags, in devi_unconfig_branch() argument
5157 if ((!(flags & NDI_BRANCH_EVENT_OP)) && need_remove_event(dip, flags)) in devi_unconfig_branch()
5161 rval = devi_unconfig_common(dip, dipp, flags, DDI_MAJOR_T_NONE, in devi_unconfig_branch()
5165 log_and_free_brevq_dip(dip, *brevqp); in devi_unconfig_branch()
5169 rval = devi_unconfig_common(dip, dipp, flags, DDI_MAJOR_T_NONE, in devi_unconfig_branch()
5182 init_bound_node_ev(dev_info_t *pdip, dev_info_t *dip, int flags) in init_bound_node_ev() argument
5184 if (need_remove_event(dip, flags) && in init_bound_node_ev()
5185 i_ddi_node_state(dip) == DS_BOUND && in init_bound_node_ev()
5186 i_ddi_devi_attached(pdip) && !DEVI_IS_DEVICE_OFFLINE(dip)) in init_bound_node_ev()
5187 (void) ddi_initchild(pdip, dip); in init_bound_node_ev()
5194 devi_attach_node(dev_info_t *dip, uint_t flags) in devi_attach_node() argument
5196 dev_info_t *pdip = ddi_get_parent(dip); in devi_attach_node()
5200 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5202 if (!i_ddi_devi_attached(dip)) in devi_attach_node()
5203 DEVI_SET_REPORT(dip); in devi_attach_node()
5204 DEVI_SET_DEVICE_ONLINE(dip); in devi_attach_node()
5206 if (DEVI_IS_DEVICE_OFFLINE(dip)) { 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()
5212 if (i_ddi_attachchild(dip) != DDI_SUCCESS) { in devi_attach_node()
5213 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5214 DEVI_SET_EVUNINIT(dip); in devi_attach_node()
5215 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5217 if (ndi_dev_is_persistent_node(dip)) in devi_attach_node()
5218 (void) ddi_uninitchild(dip); in devi_attach_node()
5224 (void) ddi_remove_child(dip, 0); in devi_attach_node()
5229 i_ndi_devi_report_status_change(dip, NULL); in devi_attach_node()
5235 if ((flags & NDI_NO_EVENT) == 0 && !(DEVI_EVADD(dip))) { in devi_attach_node()
5236 (void) i_log_devfs_add_devinfo(dip, flags); in devi_attach_node()
5238 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5239 DEVI_SET_EVADD(dip); 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()
5243 DEVI_SET_EVADD(dip); in devi_attach_node()
5244 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_attach_node()
5318 devi_config_common(dev_info_t *dip, int flags, major_t major) in devi_config_common() argument
5323 if (!i_ddi_devi_attached(dip)) in devi_config_common()
5326 if (pm_pre_config(dip, NULL) != DDI_SUCCESS) in devi_config_common()
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()
5332 error = config_immediate_children(dip, flags, major); in devi_config_common()
5337 error = (*f)(dip, in devi_config_common()
5342 pm_post_config(dip, NULL); in devi_config_common()
5351 (void) devfs_clean(dip, NULL, 0); in devi_config_common()
5354 (void) config_grand_children(dip, flags, major); in devi_config_common()
5356 pm_post_config(dip, NULL); in devi_config_common()
5365 ndi_devi_config(dev_info_t *dip, int flags) in ndi_devi_config() argument
5369 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in ndi_devi_config()
5371 return (devi_config_common(dip, flags, DDI_MAJOR_T_NONE)); in ndi_devi_config()
5378 ndi_devi_config_driver(dev_info_t *dip, int flags, major_t major) in ndi_devi_config_driver() argument
5385 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in ndi_devi_config_driver()
5387 return (devi_config_common(dip, flags, major)); in ndi_devi_config_driver()
5709 e_ddi_offline_notify(dev_info_t *dip) in e_ddi_offline_notify() argument
5716 (void *) dip)); in e_ddi_offline_notify()
5724 retval = contract_device_offline(dip, DDI_DEV_T_ANY, 0); in e_ddi_offline_notify()
5727 RIO_DEBUG((CE_NOTE, "Received NACK for dip=%p", (void *)dip)); in e_ddi_offline_notify()
5732 RIO_DEBUG((CE_NOTE, "Received ACK for dip=%p", (void *)dip)); in e_ddi_offline_notify()
5736 RIO_DEBUG((CE_NOTE, "No contracts on dip=%p", (void *)dip)); in e_ddi_offline_notify()
5745 retval = ldi_invoke_notify(dip, DDI_DEV_T_ANY, 0, LDI_EV_OFFLINE, NULL); in e_ddi_offline_notify()
5748 contract_device_negend(dip, DDI_DEV_T_ANY, 0, CT_EV_FAILURE); in e_ddi_offline_notify()
5750 (void *)dip)); in e_ddi_offline_notify()
5756 (void *)dip)); in e_ddi_offline_notify()
5761 (void *)dip)); 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()
5771 "BLOCKED flag. dip=%p", (void *)dip)); 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()
5776 (void *)dip)); 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()
5781 "CONSTRAINT flag. dip=%p", (void *)dip)); 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()
5789 "use. Setting CONSTRAINT flag. dip=%p", (void *)dip)); in e_ddi_offline_notify()
5790 DEVI(dip)->devi_flags |= DEVI_R_CONSTRAINT; in e_ddi_offline_notify()
5798 "constraint flag. dip=%p", (void *)dip)); in e_ddi_offline_notify()
5800 mutex_exit(&(DEVI(dip)->devi_lock)); in e_ddi_offline_notify()
5804 (void *) dip)); in e_ddi_offline_notify()
5810 e_ddi_offline_finalize(dev_info_t *dip, int result) in e_ddi_offline_finalize() argument
5814 (void *)dip)); in e_ddi_offline_finalize()
5816 contract_device_negend(dip, DDI_DEV_T_ANY, 0, result == DDI_SUCCESS ? in e_ddi_offline_finalize()
5819 ldi_invoke_finalize(dip, DDI_DEV_T_ANY, 0, in e_ddi_offline_finalize()
5824 (void *)dip)); in e_ddi_offline_finalize()
5828 e_ddi_degrade_finalize(dev_info_t *dip) in e_ddi_degrade_finalize() argument
5831 "result always = DDI_SUCCESS, dip=%p", (void *)dip)); in e_ddi_degrade_finalize()
5833 contract_device_degrade(dip, DDI_DEV_T_ANY, 0); in e_ddi_degrade_finalize()
5834 contract_device_negend(dip, DDI_DEV_T_ANY, 0, CT_EV_SUCCESS); in e_ddi_degrade_finalize()
5836 ldi_invoke_finalize(dip, DDI_DEV_T_ANY, 0, LDI_EV_DEGRADE, in e_ddi_degrade_finalize()
5840 (void *)dip)); in e_ddi_degrade_finalize()
5844 e_ddi_undegrade_finalize(dev_info_t *dip) in e_ddi_undegrade_finalize() argument
5847 "result always = DDI_SUCCESS, dip=%p", (void *)dip)); in e_ddi_undegrade_finalize()
5849 contract_device_undegrade(dip, DDI_DEV_T_ANY, 0); in e_ddi_undegrade_finalize()
5850 contract_device_negend(dip, DDI_DEV_T_ANY, 0, CT_EV_SUCCESS); in e_ddi_undegrade_finalize()
5853 (void *)dip)); in e_ddi_undegrade_finalize()
5860 devi_detach_node(dev_info_t *dip, uint_t flags) in devi_detach_node() argument
5862 dev_info_t *pdip = ddi_get_parent(dip); in devi_detach_node()
5878 (void *)dip)); in devi_detach_node()
5879 if (e_ddi_offline_notify(dip) != DDI_SUCCESS) { in devi_detach_node()
5881 "dip=%p", (void *)dip)); in devi_detach_node()
5888 if (ddi_get_eventcookie(dip, DDI_DEVI_REMOVE_EVENT, in devi_detach_node()
5890 (void) ndi_post_event(dip, dip, cookie, NULL); in devi_detach_node()
5901 if (i_ddi_detachchild(dip, flags) != DDI_SUCCESS) { in devi_detach_node()
5905 "dip=%p", DDI_FAILURE, (void *)dip)); in devi_detach_node()
5906 e_ddi_offline_finalize(dip, DDI_FAILURE); in devi_detach_node()
5914 "dip=%p", DDI_SUCCESS, (void *)dip)); in devi_detach_node()
5915 e_ddi_offline_finalize(dip, DDI_SUCCESS); in devi_detach_node()
5926 mutex_enter(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5927 DEVI_SET_DEVICE_OFFLINE(dip); in devi_detach_node()
5928 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5931 if (i_ddi_node_state(dip) == DS_INITIALIZED) { in devi_detach_node()
5932 struct dev_info *devi = DEVI(dip); in devi_detach_node()
5936 (void) ddi_pathname(dip, devi->devi_ev_path); in devi_detach_node()
5939 i_ndi_devi_report_status_change(dip, in devi_detach_node()
5942 if (need_remove_event(dip, flags)) { 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()
5950 DEVI_SET_EVREMOVE(dip); in devi_detach_node()
5951 mutex_exit(&(DEVI(dip)->devi_lock)); in devi_detach_node()
5956 ret = ddi_uninitchild(dip); in devi_detach_node()
5963 if (!ndi_dev_is_persistent_node(dip)) in devi_detach_node()
5973 if (DEVI_EVREMOVE(dip)) { in devi_detach_node()
5975 DEVI(dip)->devi_ev_path, in devi_detach_node()
5978 i_ddi_strdup(i_ddi_devi_class(dip), in devi_detach_node()
5982 (char *)ddi_driver_name(dip), in devi_detach_node()
5984 instance = DEVI(dip)->devi_ev_instance; in devi_detach_node()
5988 ret = ddi_remove_child(dip, 0); in devi_detach_node()
6014 dev_info_t *dip, in unconfig_immediate_children() argument
6033 ndi_devi_enter(dip, &circ); in unconfig_immediate_children()
6034 for (child = ddi_get_child(dip); child; in unconfig_immediate_children()
6048 if (vdip && (ddi_get_parent(vdip) != dip)) { in unconfig_immediate_children()
6049 ndi_devi_exit(dip, circ); in unconfig_immediate_children()
6053 ndi_devi_enter(dip, &circ); in unconfig_immediate_children()
6060 child = ddi_get_child(dip); in unconfig_immediate_children()
6090 ndi_devi_exit(dip, circ); in unconfig_immediate_children()
6102 dev_info_t *dip, in unconfig_grand_children() argument
6114 hdl = mt_config_init(dip, dipp, flags, major, MT_UNCONFIG_OP, brevqp); in unconfig_grand_children()
6128 dev_info_t *dip, in devi_unconfig_common() argument
6149 if (pm_pre_unconfig(dip, flags, &pm_cookie, NULL) != DDI_SUCCESS) in devi_unconfig_common()
6158 (void) devfs_clean(dip, NULL, 0); in devi_unconfig_common()
6160 rv = unconfig_grand_children(dip, dipp, flags, major, brevqp); in devi_unconfig_common()
6164 log_and_free_br_events_on_grand_children(dip, *brevqp); in devi_unconfig_common()
6168 pm_post_unconfig(dip, pm_cookie, NULL); in devi_unconfig_common()
6184 if (!i_ddi_devi_attached(dip) || in devi_unconfig_common()
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()
6188 rv = unconfig_immediate_children(dip, dipp, flags, major); in devi_unconfig_common()
6196 rv = (*f)(dip, flags, bus_op, (void *)(uintptr_t)major); in devi_unconfig_common()
6199 pm_post_unconfig(dip, pm_cookie, NULL); in devi_unconfig_common()
6202 cleanup_br_events_on_grand_children(dip, brevqp); in devi_unconfig_common()
6213 ndi_devi_unconfig_driver(dev_info_t *dip, int flags, major_t major) in ndi_devi_unconfig_driver() argument
6217 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in ndi_devi_unconfig_driver()
6219 return (devi_unconfig_common(dip, NULL, flags, major, NULL)); in ndi_devi_unconfig_driver()
6223 ndi_devi_unconfig(dev_info_t *dip, int flags) in ndi_devi_unconfig() argument
6227 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in ndi_devi_unconfig()
6229 return (devi_unconfig_common(dip, NULL, flags, DDI_MAJOR_T_NONE, NULL)); in ndi_devi_unconfig()
6233 e_ddi_devi_unconfig(dev_info_t *dip, dev_info_t **dipp, int flags) in e_ddi_devi_unconfig() argument
6237 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip, flags)); in e_ddi_devi_unconfig()
6239 return (devi_unconfig_common(dip, dipp, flags, DDI_MAJOR_T_NONE, NULL)); in e_ddi_devi_unconfig()
6387 dev_info_t *dip; member
6397 i_ndi_devi_async_common(dev_info_t *dip, uint_t flags, void (*func)()) in i_ndi_devi_async_common() argument
6402 dev_info_t *pdip = ddi_get_parent(dip); in i_ndi_devi_async_common()
6406 ASSERT(ndi_dev_is_persistent_node(dip)); in i_ndi_devi_async_common()
6421 arg->dip = dip; in i_ndi_devi_async_common()
6439 (void) ndi_devi_bind_driver(arg->dip, arg->flags); in i_ndi_devi_bind_driver_cb()
6444 ndi_devi_bind_driver_async(dev_info_t *dip, uint_t flags) in ndi_devi_bind_driver_async() argument
6446 return (i_ndi_devi_async_common(dip, flags, in ndi_devi_bind_driver_async()
6454 ndi_devi_online(dev_info_t *dip, uint_t flags) in ndi_devi_online() argument
6457 dev_info_t *pdip = ddi_get_parent(dip); in ndi_devi_online()
6463 ddi_driver_name(dip), ddi_get_instance(dip), (void *)dip)); in ndi_devi_online()
6467 rv = i_ndi_config_node(dip, DS_BOUND, flags); in ndi_devi_online()
6488 ((flags & NDI_CONFIG) || DEVI_NEED_NDI_CONFIG(dip))) { in ndi_devi_online()
6496 if ((rv = devi_attach_node(dip, flags)) == NDI_SUCCESS) { in ndi_devi_online()
6497 if ((flags & NDI_CONFIG) || DEVI_NEED_NDI_CONFIG(dip)) { in ndi_devi_online()
6503 ndi_hold_devi(dip); in ndi_devi_online()
6506 (void) ndi_devi_config(dip, flags); in ndi_devi_online()
6509 ndi_rele_devi(dip); in ndi_devi_online()
6513 (void) i_log_devfs_branch_add(dip); in ndi_devi_online()
6540 (void) ndi_devi_online(arg->dip, arg->flags); in i_ndi_devi_online_cb()
6545 ndi_devi_online_async(dev_info_t *dip, uint_t flags) in ndi_devi_online_async() argument
6549 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_online_async()
6550 DEVI_SET_NDI_CONFIG(dip); in ndi_devi_online_async()
6551 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_online_async()
6554 return (i_ndi_devi_async_common(dip, flags, in ndi_devi_online_async()
6569 ndi_devi_offline(dev_info_t *dip, uint_t flags) in ndi_devi_offline() argument
6572 dev_info_t *pdip = ddi_get_parent(dip); in ndi_devi_offline()
6586 if (MDI_PHCI(dip)) { in ndi_devi_offline()
6587 vdip = mdi_devi_get_vdip(dip); in ndi_devi_offline()
6595 if (i_ddi_devi_attached(dip)) { in ndi_devi_offline()
6603 (void) ddi_deviname(dip, devname); in ndi_devi_offline()
6627 rval = devi_unconfig_branch(dip, NULL, flags|NDI_UNCONFIG, in ndi_devi_offline()
6638 init_bound_node_ev(pdip, dip, flags); in ndi_devi_offline()
6640 rval = devi_detach_node(dip, flags); in ndi_devi_offline()
6643 log_and_free_brevq_dip(dip, brevq); in ndi_devi_offline()
6711 reset_nexus_flags(dev_info_t *dip, void *arg) in reset_nexus_flags() argument
6716 if (((DEVI(dip)->devi_flags & DEVI_MADE_CHILDREN) == 0) || in reset_nexus_flags()
6717 ((list = hwc_get_child_spec(dip, (major_t)(uintptr_t)arg)) == NULL)) in reset_nexus_flags()
6723 ndi_devi_enter(dip, &circ); 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()
6727 ndi_devi_exit(dip, circ); in reset_nexus_flags()
6754 dev_info_t *dip; in path_to_major() local
6770 dip = NULL; in path_to_major()
6777 dip = e_ddi_nodeid_to_dip(nodeid); in path_to_major()
6780 if (dip == NULL) { in path_to_major()
6790 p = ddi_binding_name(dip); in path_to_major()
6791 q = ddi_node_name(dip); in path_to_major()
6798 ndi_rele_devi(dip); /* release e_ddi_nodeid_to_dip hold */ in path_to_major()
6820 dev_info_t *dip; in hold_devi() local
6830 for (dip = dnp->dn_head; dip; in hold_devi()
6831 dip = (dev_info_t *)DEVI(dip)->devi_next) { in hold_devi()
6833 if (i_ddi_node_state(dip) < DS_INITIALIZED) in hold_devi()
6837 if (DEVI(dip)->devi_instance == instance) { in hold_devi()
6850 ndi_hold_devi(dip); in hold_devi()
6851 if (i_ddi_devi_attached(dip) && in hold_devi()
6852 !DEVI_IS_DETACHING(dip)) { in hold_devi()
6854 return (dip); /* fast-path with devi held */ in hold_devi()
6856 ndi_rele_devi(dip); in hold_devi()
6859 dip = NULL; in hold_devi()
6863 ASSERT(dip == NULL); in hold_devi()
6877 dip = e_ddi_hold_devi_by_path(path, flags); in hold_devi()
6887 if (dip && in hold_devi()
6888 ((DEVI(dip)->devi_major != major) || in hold_devi()
6889 ((DEVI(dip)->devi_instance != instance)) || in hold_devi()
6890 (strcmp(path, ddi_pathname(dip, vpath)) != 0))) { in hold_devi()
6891 ndi_rele_devi(dip); in hold_devi()
6892 dip = NULL; /* no answer better than wrong answer */ in hold_devi()
6897 return (dip); /* with devi held */ in hold_devi()
6921 dev_info_t *dip; in e_ddi_hold_devi_by_dev() local
6925 dip = hold_devi(major, dev_to_instance(dev), flags); in e_ddi_hold_devi_by_dev()
6952 if (ddip && (dip != ddip)) { in e_ddi_hold_devi_by_dev()
6958 if (dip) in e_ddi_hold_devi_by_dev()
6959 ndi_rele_devi(dip); in e_ddi_hold_devi_by_dev()
6960 dip = ddip; in e_ddi_hold_devi_by_dev()
6966 return (dip); in e_ddi_hold_devi_by_dev()
6975 dev_info_t *dip = NULL; in e_ddi_get_dev_info() local
6982 dip = e_ddi_hold_devi_by_dev(dev, 0); in e_ddi_get_dev_info()
6993 if (dip) { in e_ddi_get_dev_info()
6994 (void) ndi_hold_driver(dip); in e_ddi_get_dev_info()
6995 ndi_rele_devi(dip); in e_ddi_get_dev_info()
6997 return (dip); in e_ddi_get_dev_info()
7003 dev_info_t *dip; in e_ddi_hold_devi_by_path() local
7008 return (resolve_pathname(path, &dip, NULL, NULL) ? NULL : dip); in e_ddi_hold_devi_by_path()
7012 e_ddi_hold_devi(dev_info_t *dip) in e_ddi_hold_devi() argument
7014 ndi_hold_devi(dip); in e_ddi_hold_devi()
7018 ddi_release_devi(dev_info_t *dip) in ddi_release_devi() argument
7020 ndi_rele_devi(dip); in ddi_release_devi()
7029 ddi_assoc_queue_with_devi(queue_t *q, dev_info_t *dip) in ddi_assoc_queue_with_devi() argument
7046 spec_assoc_vp_with_devi(vp, dip); in ddi_assoc_queue_with_devi()
7087 i_ddi_attach_node_hierarchy(dev_info_t *dip) in i_ddi_attach_node_hierarchy() argument
7095 if (i_ddi_devi_attached(dip)) in i_ddi_attach_node_hierarchy()
7097 parent = ddi_get_parent(dip); in i_ddi_attach_node_hierarchy()
7107 ret = i_ddi_attachchild(dip); in i_ddi_attach_node_hierarchy()
7118 dev_info_t *dip; in attach_driver_nodes() local
7123 dip = dnp->dn_head; in attach_driver_nodes()
7124 while (dip) { in attach_driver_nodes()
7125 ndi_hold_devi(dip); in attach_driver_nodes()
7127 if (i_ddi_attach_node_hierarchy(dip) == DDI_SUCCESS) in attach_driver_nodes()
7137 dip, DDI_PROP_DONTPASS, "ddi-config-driver-node"))) { in attach_driver_nodes()
7138 (void) ndi_devi_config(dip, NDI_NO_EVENT); in attach_driver_nodes()
7141 ndi_rele_devi(dip); in attach_driver_nodes()
7142 dip = ddi_get_next(dip); in attach_driver_nodes()
7189 dev_info_t *dip; in i_ddi_attach_pseudo_node() local
7198 dip = devnamesp[major].dn_head; in i_ddi_attach_pseudo_node()
7199 ASSERT(dip && ddi_get_next(dip) == NULL); in i_ddi_attach_pseudo_node()
7200 ndi_hold_devi(dip); in i_ddi_attach_pseudo_node()
7201 return (dip); in i_ddi_attach_pseudo_node()
7208 dev_info_t *dip, *pdip; in diplist_to_parent_major() local
7210 for (dip = head; dip != NULL; dip = ddi_get_next(dip)) { in diplist_to_parent_major()
7211 pdip = ddi_get_parent(dip); in diplist_to_parent_major()
7251 dev_info_t *dip; in i_ddi_devs_attached() local
7258 for (dip = dnp->dn_head; dip != NULL; dip = ddi_get_next(dip)) { in i_ddi_devs_attached()
7259 if (i_ddi_devi_attached(dip)) { in i_ddi_devs_attached()
7478 impl_rem_dev_props(dev_info_t *dip) in impl_rem_dev_props() argument
7480 _NOTE(ARGUNUSED(dip)) in impl_rem_dev_props()
7488 is_leaf_node(dev_info_t *dip) in is_leaf_node() argument
7490 major_t major = ddi_driver_major(dip); in is_leaf_node()
7592 dev_info_t *dip = mcd->mtc_dip; in mt_config_thread() local
7608 rv = devi_config_common(dip, flags, major); in mt_config_thread()
7613 rv = devi_unconfig_common(dip, dipp, flags, major, in mt_config_thread()
7617 rv = devi_unconfig_common(dip, dipp, flags, major, in mt_config_thread()
7634 (void) ddi_pathname(dip, path); in mt_config_thread()
7653 ndi_rele_devi(dip); in mt_config_thread()
7669 dev_info_t *dip; in mt_config_children() local
7684 dip = ddi_get_child(pdip); in mt_config_children()
7685 while (dip) { in mt_config_children()
7687 !(DEVI_EVREMOVE(dip)) && in mt_config_children()
7688 i_ddi_node_state(dip) >= DS_INITIALIZED) { in mt_config_children()
7696 brn = brevq_enqueue(hdl->mtc_brevqp, dip, NULL); in mt_config_children()
7706 ndi_hold_devi(dip); in mt_config_children()
7712 if (is_leaf_node(dip) || in mt_config_children()
7714 i_ddi_node_state(dip) < DS_READY)) { in mt_config_children()
7715 ndi_rele_devi(dip); in mt_config_children()
7716 dip = ddi_get_next_sibling(dip); in mt_config_children()
7721 mcd->mtc_dip = dip; in mt_config_children()
7730 (major == ddi_driver_major(dip))) in mt_config_children()
7761 dip = ddi_get_next_sibling(dip); in mt_config_children()
7782 dev_info_t *dip; in mt_config_driver() local
7797 dip = devnamesp[par_major].dn_head; in mt_config_driver()
7798 while (dip) { in mt_config_driver()
7805 ndi_hold_devi(dip); in mt_config_driver()
7808 if (!i_ddi_devi_attached(dip) || is_leaf_node(dip)) { in mt_config_driver()
7809 ndi_rele_devi(dip); in mt_config_driver()
7810 dip = ddi_get_next(dip); in mt_config_driver()
7815 mcd->mtc_dip = dip; in mt_config_driver()
7835 dip = ddi_get_next(dip); in mt_config_driver()
7858 dev_info_t *dip = NULL; in e_ddi_nodeid_to_dip() local
7866 ndi_hold_devi(elem->dip); in e_ddi_nodeid_to_dip()
7867 dip = elem->dip; in e_ddi_nodeid_to_dip()
7883 return (dip); in e_ddi_nodeid_to_dip()
7984 i_bind_vhci_node(dev_info_t *dip) in i_bind_vhci_node() argument
7986 DEVI(dip)->devi_major = ddi_name_to_major(ddi_node_name(dip)); in i_bind_vhci_node()
7987 i_ddi_set_node_state(dip, DS_BOUND); in i_bind_vhci_node()
7993 i_init_vhci_node(dev_info_t *dip) in i_init_vhci_node() argument
7995 add_global_props(dip); in i_init_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()
8000 DEVI(dip)->devi_instance = e_ddi_assign_instance(dip); in i_init_vhci_node()
8001 e_ddi_keep_instance(dip); in i_init_vhci_node()
8003 ddi_set_name_addr(dip, vhci_node_addr); in i_init_vhci_node()
8004 i_ddi_set_node_state(dip, DS_INITIALIZED); in i_init_vhci_node()
8009 i_link_vhci_node(dev_info_t *dip) in i_link_vhci_node() argument
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()
8046 dev_info_t *dip; in ndi_devi_config_vhci() local
8056 dip = dnp->dn_head; in ndi_devi_config_vhci()
8058 return (dip); in ndi_devi_config_vhci()
8063 ndi_devi_alloc_sleep(top_devinfo, drvname, DEVI_SID_NODEID, &dip); in ndi_devi_config_vhci()
8064 ndi_hold_devi(dip); in ndi_devi_config_vhci()
8067 DEVI(dip)->devi_node_attributes |= DDI_VHCI_NODE; in ndi_devi_config_vhci()
8069 i_ddi_add_devimap(dip); in ndi_devi_config_vhci()
8070 i_bind_vhci_node(dip); in ndi_devi_config_vhci()
8071 if (i_init_vhci_node(dip) == -1) { in ndi_devi_config_vhci()
8072 ndi_rele_devi(dip); in ndi_devi_config_vhci()
8073 (void) ndi_devi_free(dip); in ndi_devi_config_vhci()
8077 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8078 DEVI_SET_ATTACHING(dip); in ndi_devi_config_vhci()
8079 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8081 if (devi_attach(dip, DDI_ATTACH) != DDI_SUCCESS) { in ndi_devi_config_vhci()
8083 e_ddi_free_instance(dip, vhci_node_addr); in ndi_devi_config_vhci()
8084 ndi_rele_devi(dip); in ndi_devi_config_vhci()
8085 (void) ndi_devi_free(dip); in ndi_devi_config_vhci()
8088 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8089 DEVI_CLR_ATTACHING(dip); in ndi_devi_config_vhci()
8090 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_config_vhci()
8093 i_link_vhci_node(dip); in ndi_devi_config_vhci()
8095 i_ddi_set_node_state(dip, DS_READY); in ndi_devi_config_vhci()
8099 dnp->dn_head = dip; in ndi_devi_config_vhci()
8102 i_ndi_devi_report_status_change(dip, NULL); in ndi_devi_config_vhci()
8104 return (dip); in ndi_devi_config_vhci()
8126 ndi_devi_device_isremoved(dev_info_t *dip) in ndi_devi_device_isremoved() argument
8128 return (DEVI_IS_DEVICE_REMOVED(dip)); in ndi_devi_device_isremoved()
8132 ndi_devi_device_remove(dev_info_t *dip) in ndi_devi_device_remove() argument
8134 ASSERT(dip && ddi_get_parent(dip) && in ndi_devi_device_remove()
8135 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in ndi_devi_device_remove()
8138 if (ndi_devi_device_isremoved(dip)) in ndi_devi_device_remove()
8142 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_device_remove()
8143 ndi_devi_set_hidden(dip); /* invisible: lookup/snapshot */ in ndi_devi_device_remove()
8144 DEVI_SET_DEVICE_REMOVED(dip); in ndi_devi_device_remove()
8145 DEVI_SET_EVREMOVE(dip); /* this clears EVADD too */ in ndi_devi_device_remove()
8146 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_device_remove()
8149 i_ndi_devi_report_status_change(dip, NULL); in ndi_devi_device_remove()
8163 i_ddi_log_devfs_device_remove(dip); in ndi_devi_device_remove()
8169 ndi_devi_device_insert(dev_info_t *dip) in ndi_devi_device_insert() argument
8171 ASSERT(dip && ddi_get_parent(dip) && in ndi_devi_device_insert()
8172 DEVI_BUSY_OWNED(ddi_get_parent(dip))); in ndi_devi_device_insert()
8175 if (!ndi_devi_device_isremoved(dip)) in ndi_devi_device_insert()
8179 mutex_enter(&(DEVI(dip)->devi_lock)); in ndi_devi_device_insert()
8180 ndi_devi_clr_hidden(dip); /* visible: lookup/snapshot */ in ndi_devi_device_insert()
8181 DEVI_SET_DEVICE_REINSERTED(dip); in ndi_devi_device_insert()
8182 DEVI_SET_EVADD(dip); /* this clears EVREMOVE too */ in ndi_devi_device_insert()
8183 mutex_exit(&(DEVI(dip)->devi_lock)); in ndi_devi_device_insert()
8186 i_ndi_devi_report_status_change(dip, NULL); in ndi_devi_device_insert()
8198 i_ddi_log_devfs_device_insert(dip); in ndi_devi_device_insert()
8221 e_ddi_mark_retiring(dev_info_t *dip, void *arg) in e_ddi_mark_retiring() argument
8231 (void) ddi_pathname(dip, path); in e_ddi_mark_retiring()
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()
8249 (void *)dip)); in e_ddi_mark_retiring()
8253 (void *)dip)); in e_ddi_mark_retiring()
8255 if (MDI_PHCI(dip)) in e_ddi_mark_retiring()
8256 mdi_phci_mark_retiring(dip, cons_array); in e_ddi_mark_retiring()
8280 e_ddi_retire_notify(dev_info_t *dip, void *arg) in e_ddi_retire_notify() argument
8284 RIO_DEBUG((CE_NOTE, "retire notify: dip = %p", (void *)dip)); in e_ddi_retire_notify()
8286 (void) e_ddi_offline_notify(dip); in e_ddi_retire_notify()
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()
8291 "subtree is not marked: dip = %p", (void *)dip)); 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()
8296 (void *)dip)); in e_ddi_retire_notify()
8298 } else if (!(DEVI(dip)->devi_flags & DEVI_R_CONSTRAINT)) { in e_ddi_retire_notify()
8300 "dip = %p", (void *)dip)); in e_ddi_retire_notify()
8304 "dip = %p", (void *)dip)); in e_ddi_retire_notify()
8306 mutex_exit(&DEVI(dip)->devi_lock); in e_ddi_retire_notify()
8308 if (MDI_PHCI(dip)) in e_ddi_retire_notify()
8309 mdi_phci_retire_notify(dip, constraint); in e_ddi_retire_notify()
8315 e_ddi_retire_finalize(dev_info_t *dip, void *arg) in e_ddi_retire_finalize() argument
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()
8325 (void *)dip)); 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()
8339 ASSERT(DEVI_BUSY_OWNED(ddi_get_parent(dip))); 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()
8347 (void) spec_fence_snode(dip, NULL); in e_ddi_retire_finalize()
8348 RIO_DEBUG((CE_NOTE, "Fenced off: dip = %p", (void *)dip)); in e_ddi_retire_finalize()
8349 e_ddi_offline_finalize(dip, DDI_SUCCESS); 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()
8370 (void *)dip)); in e_ddi_retire_finalize()
8372 e_ddi_offline_finalize(dip, DDI_FAILURE); in e_ddi_retire_finalize()
8381 if (MDI_PHCI(dip)) in e_ddi_retire_finalize()
8382 mdi_phci_retire_finalize(dip, phci_only, arg); in e_ddi_retire_finalize()
8397 dev_info_t *dip; in e_ddi_retire_device() local
8407 dip = e_ddi_hold_devi_by_path(path, 0); in e_ddi_retire_device()
8408 if (dip == NULL) { in e_ddi_retire_device()
8424 RIO_DEBUG((CE_NOTE, "Retire device: found dip = %p.", (void *)dip)); in e_ddi_retire_device()
8426 pdip = ddi_get_parent(dip); in e_ddi_retire_device()
8436 (void) ddi_deviname(dip, devnm); in e_ddi_retire_device()
8443 ndi_rele_devi(dip); in e_ddi_retire_device()
8449 (void) e_ddi_mark_retiring(dip, cons_array); in e_ddi_retire_device()
8450 if (!is_leaf_node(dip)) { in e_ddi_retire_device()
8451 ndi_devi_enter(dip, &circ2); in e_ddi_retire_device()
8452 ddi_walk_devs(ddi_get_child(dip), e_ddi_mark_retiring, in e_ddi_retire_device()
8454 ndi_devi_exit(dip, circ2); in e_ddi_retire_device()
8464 (void) e_ddi_retire_notify(dip, &constraint); in e_ddi_retire_device()
8465 if (!is_leaf_node(dip)) { in e_ddi_retire_device()
8466 ndi_devi_enter(dip, &circ2); in e_ddi_retire_device()
8467 ddi_walk_devs(ddi_get_child(dip), e_ddi_retire_notify, in e_ddi_retire_device()
8469 ndi_devi_exit(dip, circ2); in e_ddi_retire_device()
8475 (void) e_ddi_retire_finalize(dip, &constraint); in e_ddi_retire_device()
8476 if (!is_leaf_node(dip)) { in e_ddi_retire_device()
8477 ndi_devi_enter(dip, &circ2); in e_ddi_retire_device()
8478 ddi_walk_devs(ddi_get_child(dip), e_ddi_retire_finalize, in e_ddi_retire_device()
8480 ndi_devi_exit(dip, circ2); in e_ddi_retire_device()
8495 unmark_and_unfence(dev_info_t *dip, void *arg) in unmark_and_unfence() argument
8501 (void) ddi_pathname(dip, path); in unmark_and_unfence()
8503 mutex_enter(&DEVI(dip)->devi_lock); in unmark_and_unfence()
8504 DEVI(dip)->devi_flags &= ~DEVI_RETIRED; in unmark_and_unfence()
8505 DEVI_SET_DEVICE_ONLINE(dip); in unmark_and_unfence()
8506 mutex_exit(&DEVI(dip)->devi_lock); in unmark_and_unfence()
8509 (void *)dip, path)); in unmark_and_unfence()
8511 (void) spec_unfence_snode(dip); in unmark_and_unfence()
8514 if (MDI_PHCI(dip)) in unmark_and_unfence()
8515 mdi_phci_unretire(dip); in unmark_and_unfence()
8527 find_dip_fcn(dev_info_t *dip, void *arg) in find_dip_fcn() argument
8531 (void) ddi_pathname(dip, findp->fd_buf); in find_dip_fcn()
8536 ndi_hold_devi(dip); in find_dip_fcn()
8537 findp->fd_dip = dip; in find_dip_fcn()
8549 dev_info_t *dip; in e_ddi_unretire_device() local
8584 dip = find_dip.fd_dip; in e_ddi_unretire_device()
8586 pdip = ddi_get_parent(dip); in e_ddi_unretire_device()
8594 (void) unmark_and_unfence(dip, path2); in e_ddi_unretire_device()
8595 if (!is_leaf_node(dip)) { in e_ddi_unretire_device()
8596 ndi_devi_enter(dip, &circ2); in e_ddi_unretire_device()
8597 ddi_walk_devs(ddi_get_child(dip), unmark_and_unfence, path2); in e_ddi_unretire_device()
8598 ndi_devi_exit(dip, circ2); in e_ddi_unretire_device()
8604 ndi_rele_devi(dip); in e_ddi_unretire_device()
8617 mark_and_fence(dev_info_t *dip, void *arg) in mark_and_fence() argument
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()
8633 RIO_VERBOSE((CE_NOTE, "marked as RETIRED dip=%p", (void *)dip)); in mark_and_fence()
8636 (void) spec_fence_snode(dip, NULL); in mark_and_fence()
8638 ddi_pathname(dip, fencepath))); in mark_and_fence()
8655 i_ddi_check_retire(dev_info_t *dip) in i_ddi_check_retire() argument
8663 pdip = ddi_get_parent(dip); in i_ddi_check_retire()
8671 ASSERT(i_ddi_node_state(dip) < DS_ATTACHED); in i_ddi_check_retire()
8675 (void) ddi_pathname(dip, path); in i_ddi_check_retire()
8678 (void *)dip, path)); in i_ddi_check_retire()
8686 if (DEVI(dip)->devi_flags & DEVI_RETIRED) in i_ddi_check_retire()
8698 (void) mark_and_fence(dip, path); in i_ddi_check_retire()
8699 if (!is_leaf_node(dip)) { in i_ddi_check_retire()
8700 ndi_devi_enter(dip, &circ); in i_ddi_check_retire()
8701 ddi_walk_devs(ddi_get_child(dip), mark_and_fence, path); in i_ddi_check_retire()
8702 ndi_devi_exit(dip, circ); in i_ddi_check_retire()
8713 if (MDI_PHCI(dip)) in i_ddi_check_retire()
8714 mdi_phci_retire_finalize(dip, phci_only, &constraint); in i_ddi_check_retire()