1595 */
1596 if ((rv = init_node(dip)) == DDI_SUCCESS)
1597 i_ddi_set_node_state(dip, DS_INITIALIZED);
1598 break;
1599 case DS_INITIALIZED:
1600 if ((rv = probe_node(dip)) == DDI_SUCCESS)
1601 i_ddi_set_node_state(dip, DS_PROBED);
1602 break;
1603 case DS_PROBED:
1604 /*
1605 * If node is retired and persistent, then prevent
1606 * attach. We can't do this for non-persistent nodes
1607 * as we would lose evidence that the node existed.
1608 */
1609 if (i_ddi_check_retire(dip) == 1 &&
1610 ndi_dev_is_persistent_node(dip) &&
1611 retire_prevents_attach == 1) {
1612 rv = DDI_FAILURE;
1613 break;
1614 }
1615 atomic_add_long(&devinfo_attach_detach, 1);
1616 if ((rv = attach_node(dip)) == DDI_SUCCESS)
1617 i_ddi_set_node_state(dip, DS_ATTACHED);
1618 atomic_add_long(&devinfo_attach_detach, -1);
1619 break;
1620 case DS_ATTACHED:
1621 if ((rv = postattach_node(dip)) == DDI_SUCCESS)
1622 i_ddi_set_node_state(dip, DS_READY);
1623 break;
1624 case DS_READY:
1625 break;
1626 default:
1627 /* should never reach here */
1628 ASSERT("unknown devinfo state");
1629 }
1630 }
1631
1632 if (ddidebug & DDI_AUDIT)
1633 da_log_enter(dip);
1634 return (rv);
1635 }
1636
1637 /*
1638 * i_ndi_unconfig_node: downgrade dev_info node into a specified state.
1664 i_ddi_set_node_state(dip, DS_PROTO);
1665 break;
1666 case DS_BOUND:
1667 /*
1668 * The following transitions synchronizes on the
1669 * per-driver busy changing flag, since we already
1670 * have a driver.
1671 */
1672 if ((rv = unbind_node(dip)) == DDI_SUCCESS)
1673 i_ddi_set_node_state(dip, DS_LINKED);
1674 break;
1675 case DS_INITIALIZED:
1676 if ((rv = uninit_node(dip)) == DDI_SUCCESS)
1677 i_ddi_set_node_state(dip, DS_BOUND);
1678 break;
1679 case DS_PROBED:
1680 if ((rv = unprobe_node(dip)) == DDI_SUCCESS)
1681 i_ddi_set_node_state(dip, DS_INITIALIZED);
1682 break;
1683 case DS_ATTACHED:
1684 atomic_add_long(&devinfo_attach_detach, 1);
1685
1686 mutex_enter(&(DEVI(dip)->devi_lock));
1687 DEVI_SET_DETACHING(dip);
1688 mutex_exit(&(DEVI(dip)->devi_lock));
1689
1690 membar_enter(); /* ensure visibility for hold_devi */
1691
1692 if ((rv = detach_node(dip, flag)) == DDI_SUCCESS)
1693 i_ddi_set_node_state(dip, DS_PROBED);
1694
1695 mutex_enter(&(DEVI(dip)->devi_lock));
1696 DEVI_CLR_DETACHING(dip);
1697 mutex_exit(&(DEVI(dip)->devi_lock));
1698
1699 atomic_add_long(&devinfo_attach_detach, -1);
1700 break;
1701 case DS_READY:
1702 if ((rv = predetach_node(dip, flag)) == DDI_SUCCESS)
1703 i_ddi_set_node_state(dip, DS_ATTACHED);
1704 break;
1705 default:
1706 ASSERT("unknown devinfo state");
1707 }
1708 }
1709 da_log_enter(dip);
1710 return (rv);
1711 }
1712
1713 /*
1714 * ddi_initchild: transform node to DS_INITIALIZED state
1715 */
1716 int
1717 ddi_initchild(dev_info_t *parent, dev_info_t *proto)
1718 {
1719 int ret, circ;
|
1595 */
1596 if ((rv = init_node(dip)) == DDI_SUCCESS)
1597 i_ddi_set_node_state(dip, DS_INITIALIZED);
1598 break;
1599 case DS_INITIALIZED:
1600 if ((rv = probe_node(dip)) == DDI_SUCCESS)
1601 i_ddi_set_node_state(dip, DS_PROBED);
1602 break;
1603 case DS_PROBED:
1604 /*
1605 * If node is retired and persistent, then prevent
1606 * attach. We can't do this for non-persistent nodes
1607 * as we would lose evidence that the node existed.
1608 */
1609 if (i_ddi_check_retire(dip) == 1 &&
1610 ndi_dev_is_persistent_node(dip) &&
1611 retire_prevents_attach == 1) {
1612 rv = DDI_FAILURE;
1613 break;
1614 }
1615 atomic_inc_ulong(&devinfo_attach_detach);
1616 if ((rv = attach_node(dip)) == DDI_SUCCESS)
1617 i_ddi_set_node_state(dip, DS_ATTACHED);
1618 atomic_dec_ulong(&devinfo_attach_detach);
1619 break;
1620 case DS_ATTACHED:
1621 if ((rv = postattach_node(dip)) == DDI_SUCCESS)
1622 i_ddi_set_node_state(dip, DS_READY);
1623 break;
1624 case DS_READY:
1625 break;
1626 default:
1627 /* should never reach here */
1628 ASSERT("unknown devinfo state");
1629 }
1630 }
1631
1632 if (ddidebug & DDI_AUDIT)
1633 da_log_enter(dip);
1634 return (rv);
1635 }
1636
1637 /*
1638 * i_ndi_unconfig_node: downgrade dev_info node into a specified state.
1664 i_ddi_set_node_state(dip, DS_PROTO);
1665 break;
1666 case DS_BOUND:
1667 /*
1668 * The following transitions synchronizes on the
1669 * per-driver busy changing flag, since we already
1670 * have a driver.
1671 */
1672 if ((rv = unbind_node(dip)) == DDI_SUCCESS)
1673 i_ddi_set_node_state(dip, DS_LINKED);
1674 break;
1675 case DS_INITIALIZED:
1676 if ((rv = uninit_node(dip)) == DDI_SUCCESS)
1677 i_ddi_set_node_state(dip, DS_BOUND);
1678 break;
1679 case DS_PROBED:
1680 if ((rv = unprobe_node(dip)) == DDI_SUCCESS)
1681 i_ddi_set_node_state(dip, DS_INITIALIZED);
1682 break;
1683 case DS_ATTACHED:
1684 atomic_inc_ulong(&devinfo_attach_detach);
1685
1686 mutex_enter(&(DEVI(dip)->devi_lock));
1687 DEVI_SET_DETACHING(dip);
1688 mutex_exit(&(DEVI(dip)->devi_lock));
1689
1690 membar_enter(); /* ensure visibility for hold_devi */
1691
1692 if ((rv = detach_node(dip, flag)) == DDI_SUCCESS)
1693 i_ddi_set_node_state(dip, DS_PROBED);
1694
1695 mutex_enter(&(DEVI(dip)->devi_lock));
1696 DEVI_CLR_DETACHING(dip);
1697 mutex_exit(&(DEVI(dip)->devi_lock));
1698
1699 atomic_dec_ulong(&devinfo_attach_detach);
1700 break;
1701 case DS_READY:
1702 if ((rv = predetach_node(dip, flag)) == DDI_SUCCESS)
1703 i_ddi_set_node_state(dip, DS_ATTACHED);
1704 break;
1705 default:
1706 ASSERT("unknown devinfo state");
1707 }
1708 }
1709 da_log_enter(dip);
1710 return (rv);
1711 }
1712
1713 /*
1714 * ddi_initchild: transform node to DS_INITIALIZED state
1715 */
1716 int
1717 ddi_initchild(dev_info_t *parent, dev_info_t *proto)
1718 {
1719 int ret, circ;
|