Print this page
5045 use atomic_{inc,dec}_* instead of atomic_add_*


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;