17c478bd9Sstevel@tonic-gate /*******************************************************************************
27c478bd9Sstevel@tonic-gate  *
37c478bd9Sstevel@tonic-gate  * Module Name: nsalloc - Namespace allocation and deletion utilities
47c478bd9Sstevel@tonic-gate  *
57c478bd9Sstevel@tonic-gate  ******************************************************************************/
67c478bd9Sstevel@tonic-gate 
7*35786f68SRobert Mustacchi /******************************************************************************
8*35786f68SRobert Mustacchi  *
9*35786f68SRobert Mustacchi  * 1. Copyright Notice
10*35786f68SRobert Mustacchi  *
11*35786f68SRobert Mustacchi  * Some or all of this work - Copyright (c) 1999 - 2018, Intel Corp.
127c478bd9Sstevel@tonic-gate  * All rights reserved.
137c478bd9Sstevel@tonic-gate  *
14*35786f68SRobert Mustacchi  * 2. License
15*35786f68SRobert Mustacchi  *
16*35786f68SRobert Mustacchi  * 2.1. This is your license from Intel Corp. under its intellectual property
17*35786f68SRobert Mustacchi  * rights. You may have additional license terms from the party that provided
18*35786f68SRobert Mustacchi  * you this software, covering your right to use that party's intellectual
19*35786f68SRobert Mustacchi  * property rights.
20*35786f68SRobert Mustacchi  *
21*35786f68SRobert Mustacchi  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22*35786f68SRobert Mustacchi  * copy of the source code appearing in this file ("Covered Code") an
23*35786f68SRobert Mustacchi  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24*35786f68SRobert Mustacchi  * base code distributed originally by Intel ("Original Intel Code") to copy,
25*35786f68SRobert Mustacchi  * make derivatives, distribute, use and display any portion of the Covered
26*35786f68SRobert Mustacchi  * Code in any form, with the right to sublicense such rights; and
27*35786f68SRobert Mustacchi  *
28*35786f68SRobert Mustacchi  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29*35786f68SRobert Mustacchi  * license (with the right to sublicense), under only those claims of Intel
30*35786f68SRobert Mustacchi  * patents that are infringed by the Original Intel Code, to make, use, sell,
31*35786f68SRobert Mustacchi  * offer to sell, and import the Covered Code and derivative works thereof
32*35786f68SRobert Mustacchi  * solely to the minimum extent necessary to exercise the above copyright
33*35786f68SRobert Mustacchi  * license, and in no event shall the patent license extend to any additions
34*35786f68SRobert Mustacchi  * to or modifications of the Original Intel Code. No other license or right
35*35786f68SRobert Mustacchi  * is granted directly or by implication, estoppel or otherwise;
36*35786f68SRobert Mustacchi  *
37*35786f68SRobert Mustacchi  * The above copyright and patent license is granted only if the following
38*35786f68SRobert Mustacchi  * conditions are met:
39*35786f68SRobert Mustacchi  *
40*35786f68SRobert Mustacchi  * 3. Conditions
41*35786f68SRobert Mustacchi  *
42*35786f68SRobert Mustacchi  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
44*35786f68SRobert Mustacchi  * Code or modification with rights to further distribute source must include
45*35786f68SRobert Mustacchi  * the above Copyright Notice, the above License, this list of Conditions,
46*35786f68SRobert Mustacchi  * and the following Disclaimer and Export Compliance provision. In addition,
47*35786f68SRobert Mustacchi  * Licensee must cause all Covered Code to which Licensee contributes to
48*35786f68SRobert Mustacchi  * contain a file documenting the changes Licensee made to create that Covered
49*35786f68SRobert Mustacchi  * Code and the date of any change. Licensee must include in that file the
50*35786f68SRobert Mustacchi  * documentation of any changes made by any predecessor Licensee. Licensee
51*35786f68SRobert Mustacchi  * must include a prominent statement that the modification is derived,
52*35786f68SRobert Mustacchi  * directly or indirectly, from Original Intel Code.
53*35786f68SRobert Mustacchi  *
54*35786f68SRobert Mustacchi  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55*35786f68SRobert Mustacchi  * Redistribution of source code of any substantial portion of the Covered
56*35786f68SRobert Mustacchi  * Code or modification without rights to further distribute source must
57*35786f68SRobert Mustacchi  * include the following Disclaimer and Export Compliance provision in the
58*35786f68SRobert Mustacchi  * documentation and/or other materials provided with distribution. In
59*35786f68SRobert Mustacchi  * addition, Licensee may not authorize further sublicense of source of any
60*35786f68SRobert Mustacchi  * portion of the Covered Code, and must include terms to the effect that the
61*35786f68SRobert Mustacchi  * license from Licensee to its licensee is limited to the intellectual
62*35786f68SRobert Mustacchi  * property embodied in the software Licensee provides to its licensee, and
63*35786f68SRobert Mustacchi  * not to intellectual property embodied in modifications its licensee may
64*35786f68SRobert Mustacchi  * make.
65*35786f68SRobert Mustacchi  *
66*35786f68SRobert Mustacchi  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67*35786f68SRobert Mustacchi  * substantial portion of the Covered Code or modification must reproduce the
68*35786f68SRobert Mustacchi  * above Copyright Notice, and the following Disclaimer and Export Compliance
69*35786f68SRobert Mustacchi  * provision in the documentation and/or other materials provided with the
70*35786f68SRobert Mustacchi  * distribution.
71*35786f68SRobert Mustacchi  *
72*35786f68SRobert Mustacchi  * 3.4. Intel retains all right, title, and interest in and to the Original
73*35786f68SRobert Mustacchi  * Intel Code.
74*35786f68SRobert Mustacchi  *
75*35786f68SRobert Mustacchi  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76*35786f68SRobert Mustacchi  * Intel shall be used in advertising or otherwise to promote the sale, use or
77*35786f68SRobert Mustacchi  * other dealings in products derived from or relating to the Covered Code
78*35786f68SRobert Mustacchi  * without prior written authorization from Intel.
79*35786f68SRobert Mustacchi  *
80*35786f68SRobert Mustacchi  * 4. Disclaimer and Export Compliance
81*35786f68SRobert Mustacchi  *
82*35786f68SRobert Mustacchi  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83*35786f68SRobert Mustacchi  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84*35786f68SRobert Mustacchi  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85*35786f68SRobert Mustacchi  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86*35786f68SRobert Mustacchi  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87*35786f68SRobert Mustacchi  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88*35786f68SRobert Mustacchi  * PARTICULAR PURPOSE.
89*35786f68SRobert Mustacchi  *
90*35786f68SRobert Mustacchi  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91*35786f68SRobert Mustacchi  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92*35786f68SRobert Mustacchi  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93*35786f68SRobert Mustacchi  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94*35786f68SRobert Mustacchi  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95*35786f68SRobert Mustacchi  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96*35786f68SRobert Mustacchi  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97*35786f68SRobert Mustacchi  * LIMITED REMEDY.
98*35786f68SRobert Mustacchi  *
99*35786f68SRobert Mustacchi  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100*35786f68SRobert Mustacchi  * software or system incorporating such software without first obtaining any
101*35786f68SRobert Mustacchi  * required license or other approval from the U. S. Department of Commerce or
102*35786f68SRobert Mustacchi  * any other agency or department of the United States Government. In the
103*35786f68SRobert Mustacchi  * event Licensee exports any such software from the United States or
104*35786f68SRobert Mustacchi  * re-exports any such software from a foreign destination, Licensee shall
105*35786f68SRobert Mustacchi  * ensure that the distribution and export/re-export of the software is in
106*35786f68SRobert Mustacchi  * compliance with all laws, regulations, orders, or other restrictions of the
107*35786f68SRobert Mustacchi  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108*35786f68SRobert Mustacchi  * any of its subsidiaries will export/re-export any technical data, process,
109*35786f68SRobert Mustacchi  * software, or service, directly or indirectly, to any country for which the
110*35786f68SRobert Mustacchi  * United States government or any agency thereof requires an export license,
111*35786f68SRobert Mustacchi  * other governmental approval, or letter of assurance, without first obtaining
112*35786f68SRobert Mustacchi  * such license, approval or letter.
113*35786f68SRobert Mustacchi  *
114*35786f68SRobert Mustacchi  *****************************************************************************
115*35786f68SRobert Mustacchi  *
116*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
117*35786f68SRobert Mustacchi  * following license:
118*35786f68SRobert Mustacchi  *
11926f3cdf0SGordon Ross  * Redistribution and use in source and binary forms, with or without
12026f3cdf0SGordon Ross  * modification, are permitted provided that the following conditions
12126f3cdf0SGordon Ross  * are met:
12226f3cdf0SGordon Ross  * 1. Redistributions of source code must retain the above copyright
12326f3cdf0SGordon Ross  *    notice, this list of conditions, and the following disclaimer,
12426f3cdf0SGordon Ross  *    without modification.
12526f3cdf0SGordon Ross  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12626f3cdf0SGordon Ross  *    substantially similar to the "NO WARRANTY" disclaimer below
12726f3cdf0SGordon Ross  *    ("Disclaimer") and any redistribution must be conditioned upon
12826f3cdf0SGordon Ross  *    including a substantially similar Disclaimer requirement for further
12926f3cdf0SGordon Ross  *    binary redistribution.
13026f3cdf0SGordon Ross  * 3. Neither the names of the above-listed copyright holders nor the names
13126f3cdf0SGordon Ross  *    of any contributors may be used to endorse or promote products derived
13226f3cdf0SGordon Ross  *    from this software without specific prior written permission.
13326f3cdf0SGordon Ross  *
13426f3cdf0SGordon Ross  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
13526f3cdf0SGordon Ross  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136*35786f68SRobert Mustacchi  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
13726f3cdf0SGordon Ross  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138*35786f68SRobert Mustacchi  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139*35786f68SRobert Mustacchi  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140*35786f68SRobert Mustacchi  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141*35786f68SRobert Mustacchi  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142*35786f68SRobert Mustacchi  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143*35786f68SRobert Mustacchi  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144*35786f68SRobert Mustacchi  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145*35786f68SRobert Mustacchi  *
146*35786f68SRobert Mustacchi  * Alternatively, you may choose to be licensed under the terms of the
147*35786f68SRobert Mustacchi  * GNU General Public License ("GPL") version 2 as published by the Free
148*35786f68SRobert Mustacchi  * Software Foundation.
149*35786f68SRobert Mustacchi  *
150*35786f68SRobert Mustacchi  *****************************************************************************/
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate #include "acpi.h"
153aa2aa9a6SDana Myers #include "accommon.h"
1547c478bd9Sstevel@tonic-gate #include "acnamesp.h"
1557c478bd9Sstevel@tonic-gate 
1567c478bd9Sstevel@tonic-gate 
1577c478bd9Sstevel@tonic-gate #define _COMPONENT          ACPI_NAMESPACE
1587c478bd9Sstevel@tonic-gate         ACPI_MODULE_NAME    ("nsalloc")
1597c478bd9Sstevel@tonic-gate 
1607c478bd9Sstevel@tonic-gate 
1617c478bd9Sstevel@tonic-gate /*******************************************************************************
1627c478bd9Sstevel@tonic-gate  *
1637c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsCreateNode
1647c478bd9Sstevel@tonic-gate  *
1657c478bd9Sstevel@tonic-gate  * PARAMETERS:  Name            - Name of the new node (4 char ACPI name)
1667c478bd9Sstevel@tonic-gate  *
1677c478bd9Sstevel@tonic-gate  * RETURN:      New namespace node (Null on failure)
1687c478bd9Sstevel@tonic-gate  *
1697c478bd9Sstevel@tonic-gate  * DESCRIPTION: Create a namespace node
1707c478bd9Sstevel@tonic-gate  *
1717c478bd9Sstevel@tonic-gate  ******************************************************************************/
1727c478bd9Sstevel@tonic-gate 
1737c478bd9Sstevel@tonic-gate ACPI_NAMESPACE_NODE *
AcpiNsCreateNode(UINT32 Name)1747c478bd9Sstevel@tonic-gate AcpiNsCreateNode (
1757c478bd9Sstevel@tonic-gate     UINT32                  Name)
1767c478bd9Sstevel@tonic-gate {
1777c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node;
178db2bae30SDana Myers #ifdef ACPI_DBG_TRACK_ALLOCATIONS
179db2bae30SDana Myers     UINT32                  Temp;
180db2bae30SDana Myers #endif
1817c478bd9Sstevel@tonic-gate 
1827c478bd9Sstevel@tonic-gate 
18327f7c583Smyers     ACPI_FUNCTION_TRACE (NsCreateNode);
1847c478bd9Sstevel@tonic-gate 
1857c478bd9Sstevel@tonic-gate 
18627f7c583Smyers     Node = AcpiOsAcquireObject (AcpiGbl_NamespaceCache);
1877c478bd9Sstevel@tonic-gate     if (!Node)
1887c478bd9Sstevel@tonic-gate     {
1897c478bd9Sstevel@tonic-gate         return_PTR (NULL);
1907c478bd9Sstevel@tonic-gate     }
1917c478bd9Sstevel@tonic-gate 
192450d6964Smyers     ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalAllocated++);
1937c478bd9Sstevel@tonic-gate 
194db2bae30SDana Myers #ifdef ACPI_DBG_TRACK_ALLOCATIONS
195aa2aa9a6SDana Myers         Temp = AcpiGbl_NsNodeList->TotalAllocated -
1967b1019a6SJerry Jelinek             AcpiGbl_NsNodeList->TotalFreed;
197db2bae30SDana Myers         if (Temp > AcpiGbl_NsNodeList->MaxOccupied)
198db2bae30SDana Myers         {
199db2bae30SDana Myers             AcpiGbl_NsNodeList->MaxOccupied = Temp;
200db2bae30SDana Myers         }
201db2bae30SDana Myers #endif
202db2bae30SDana Myers 
20327f7c583Smyers     Node->Name.Integer = Name;
2047c478bd9Sstevel@tonic-gate     ACPI_SET_DESCRIPTOR_TYPE (Node, ACPI_DESC_TYPE_NAMED);
2057c478bd9Sstevel@tonic-gate     return_PTR (Node);
2067c478bd9Sstevel@tonic-gate }
2077c478bd9Sstevel@tonic-gate 
2087c478bd9Sstevel@tonic-gate 
2097c478bd9Sstevel@tonic-gate /*******************************************************************************
2107c478bd9Sstevel@tonic-gate  *
2117c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsDeleteNode
2127c478bd9Sstevel@tonic-gate  *
2137c478bd9Sstevel@tonic-gate  * PARAMETERS:  Node            - Node to be deleted
2147c478bd9Sstevel@tonic-gate  *
2157c478bd9Sstevel@tonic-gate  * RETURN:      None
2167c478bd9Sstevel@tonic-gate  *
21757190917SDana Myers  * DESCRIPTION: Delete a namespace node. All node deletions must come through
21857190917SDana Myers  *              here. Detaches any attached objects, including any attached
21957190917SDana Myers  *              data. If a handler is associated with attached data, it is
22057190917SDana Myers  *              invoked before the node is deleted.
2217c478bd9Sstevel@tonic-gate  *
2227c478bd9Sstevel@tonic-gate  ******************************************************************************/
2237c478bd9Sstevel@tonic-gate 
2247c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNode(ACPI_NAMESPACE_NODE * Node)2257c478bd9Sstevel@tonic-gate AcpiNsDeleteNode (
2267c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node)
22757190917SDana Myers {
22857190917SDana Myers     ACPI_OPERAND_OBJECT     *ObjDesc;
2297b1019a6SJerry Jelinek     ACPI_OPERAND_OBJECT     *NextDesc;
23057190917SDana Myers 
23157190917SDana Myers 
23257190917SDana Myers     ACPI_FUNCTION_NAME (NsDeleteNode);
23357190917SDana Myers 
23457190917SDana Myers 
23557190917SDana Myers     /* Detach an object if there is one */
23657190917SDana Myers 
23757190917SDana Myers     AcpiNsDetachObject (Node);
23857190917SDana Myers 
23957190917SDana Myers     /*
2407b1019a6SJerry Jelinek      * Delete an attached data object list if present (objects that were
2417b1019a6SJerry Jelinek      * attached via AcpiAttachData). Note: After any normal object is
2427b1019a6SJerry Jelinek      * detached above, the only possible remaining object(s) are data
2437b1019a6SJerry Jelinek      * objects, in a linked list.
24457190917SDana Myers      */
24557190917SDana Myers     ObjDesc = Node->Object;
2467b1019a6SJerry Jelinek     while (ObjDesc &&
24757190917SDana Myers         (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
24857190917SDana Myers     {
24957190917SDana Myers         /* Invoke the attached data deletion handler if present */
25057190917SDana Myers 
25157190917SDana Myers         if (ObjDesc->Data.Handler)
25257190917SDana Myers         {
25357190917SDana Myers             ObjDesc->Data.Handler (Node, ObjDesc->Data.Pointer);
25457190917SDana Myers         }
25557190917SDana Myers 
2567b1019a6SJerry Jelinek         NextDesc = ObjDesc->Common.NextObject;
25757190917SDana Myers         AcpiUtRemoveReference (ObjDesc);
2587b1019a6SJerry Jelinek         ObjDesc = NextDesc;
2597b1019a6SJerry Jelinek     }
2607b1019a6SJerry Jelinek 
2617b1019a6SJerry Jelinek     /* Special case for the statically allocated root node */
2627b1019a6SJerry Jelinek 
2637b1019a6SJerry Jelinek     if (Node == AcpiGbl_RootNode)
2647b1019a6SJerry Jelinek     {
2657b1019a6SJerry Jelinek         return;
26657190917SDana Myers     }
26757190917SDana Myers 
26857190917SDana Myers     /* Now we can delete the node */
26957190917SDana Myers 
27057190917SDana Myers     (void) AcpiOsReleaseObject (AcpiGbl_NamespaceCache, Node);
27157190917SDana Myers 
27257190917SDana Myers     ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalFreed++);
27357190917SDana Myers     ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Node %p, Remaining %X\n",
27457190917SDana Myers         Node, AcpiGbl_CurrentNodeCount));
27557190917SDana Myers }
27657190917SDana Myers 
27757190917SDana Myers 
27857190917SDana Myers /*******************************************************************************
27957190917SDana Myers  *
28057190917SDana Myers  * FUNCTION:    AcpiNsRemoveNode
28157190917SDana Myers  *
28257190917SDana Myers  * PARAMETERS:  Node            - Node to be removed/deleted
28357190917SDana Myers  *
28457190917SDana Myers  * RETURN:      None
28557190917SDana Myers  *
28657190917SDana Myers  * DESCRIPTION: Remove (unlink) and delete a namespace node
28757190917SDana Myers  *
28857190917SDana Myers  ******************************************************************************/
28957190917SDana Myers 
29057190917SDana Myers void
AcpiNsRemoveNode(ACPI_NAMESPACE_NODE * Node)29157190917SDana Myers AcpiNsRemoveNode (
29257190917SDana Myers     ACPI_NAMESPACE_NODE     *Node)
2937c478bd9Sstevel@tonic-gate {
2947c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ParentNode;
2957c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *PrevNode;
2967c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *NextNode;
2977c478bd9Sstevel@tonic-gate 
2987c478bd9Sstevel@tonic-gate 
29957190917SDana Myers     ACPI_FUNCTION_TRACE_PTR (NsRemoveNode, Node);
3007c478bd9Sstevel@tonic-gate 
3017c478bd9Sstevel@tonic-gate 
30226f3cdf0SGordon Ross     ParentNode = Node->Parent;
3037c478bd9Sstevel@tonic-gate 
3047c478bd9Sstevel@tonic-gate     PrevNode = NULL;
3057c478bd9Sstevel@tonic-gate     NextNode = ParentNode->Child;
3067c478bd9Sstevel@tonic-gate 
3077c478bd9Sstevel@tonic-gate     /* Find the node that is the previous peer in the parent's child list */
3087c478bd9Sstevel@tonic-gate 
3097c478bd9Sstevel@tonic-gate     while (NextNode != Node)
3107c478bd9Sstevel@tonic-gate     {
3117c478bd9Sstevel@tonic-gate         PrevNode = NextNode;
31226f3cdf0SGordon Ross         NextNode = NextNode->Peer;
3137c478bd9Sstevel@tonic-gate     }
3147c478bd9Sstevel@tonic-gate 
3157c478bd9Sstevel@tonic-gate     if (PrevNode)
3167c478bd9Sstevel@tonic-gate     {
3177c478bd9Sstevel@tonic-gate         /* Node is not first child, unlink it */
3187c478bd9Sstevel@tonic-gate 
31926f3cdf0SGordon Ross         PrevNode->Peer = Node->Peer;
3207c478bd9Sstevel@tonic-gate     }
3217c478bd9Sstevel@tonic-gate     else
3227c478bd9Sstevel@tonic-gate     {
32326f3cdf0SGordon Ross         /*
32426f3cdf0SGordon Ross          * Node is first child (has no previous peer).
32526f3cdf0SGordon Ross          * Link peer list to parent
32626f3cdf0SGordon Ross          */
32726f3cdf0SGordon Ross         ParentNode->Child = Node->Peer;
3287c478bd9Sstevel@tonic-gate     }
3297c478bd9Sstevel@tonic-gate 
33057190917SDana Myers     /* Delete the node and any attached objects */
331aa2aa9a6SDana Myers 
33257190917SDana Myers     AcpiNsDeleteNode (Node);
3337c478bd9Sstevel@tonic-gate     return_VOID;
3347c478bd9Sstevel@tonic-gate }
3357c478bd9Sstevel@tonic-gate 
3367c478bd9Sstevel@tonic-gate 
3377c478bd9Sstevel@tonic-gate /*******************************************************************************
3387c478bd9Sstevel@tonic-gate  *
3397c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsInstallNode
3407c478bd9Sstevel@tonic-gate  *
3417c478bd9Sstevel@tonic-gate  * PARAMETERS:  WalkState       - Current state of the walk
3427c478bd9Sstevel@tonic-gate  *              ParentNode      - The parent of the new Node
3437c478bd9Sstevel@tonic-gate  *              Node            - The new Node to install
3447c478bd9Sstevel@tonic-gate  *              Type            - ACPI object type of the new Node
3457c478bd9Sstevel@tonic-gate  *
3467c478bd9Sstevel@tonic-gate  * RETURN:      None
3477c478bd9Sstevel@tonic-gate  *
3487c478bd9Sstevel@tonic-gate  * DESCRIPTION: Initialize a new namespace node and install it amongst
3497c478bd9Sstevel@tonic-gate  *              its peers.
3507c478bd9Sstevel@tonic-gate  *
351186507a7Smyers  *              Note: Current namespace lookup is linear search. This appears
352186507a7Smyers  *              to be sufficient as namespace searches consume only a small
353186507a7Smyers  *              fraction of the execution time of the ACPI subsystem.
3547c478bd9Sstevel@tonic-gate  *
3557c478bd9Sstevel@tonic-gate  ******************************************************************************/
3567c478bd9Sstevel@tonic-gate 
3577c478bd9Sstevel@tonic-gate void
AcpiNsInstallNode(ACPI_WALK_STATE * WalkState,ACPI_NAMESPACE_NODE * ParentNode,ACPI_NAMESPACE_NODE * Node,ACPI_OBJECT_TYPE Type)3587c478bd9Sstevel@tonic-gate AcpiNsInstallNode (
3597c478bd9Sstevel@tonic-gate     ACPI_WALK_STATE         *WalkState,
3607c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ParentNode,    /* Parent */
3617c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *Node,          /* New Child*/
3627c478bd9Sstevel@tonic-gate     ACPI_OBJECT_TYPE        Type)
3637c478bd9Sstevel@tonic-gate {
364450d6964Smyers     ACPI_OWNER_ID           OwnerId = 0;
3657c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ChildNode;
3667c478bd9Sstevel@tonic-gate 
3677c478bd9Sstevel@tonic-gate 
36827f7c583Smyers     ACPI_FUNCTION_TRACE (NsInstallNode);
3697c478bd9Sstevel@tonic-gate 
3707c478bd9Sstevel@tonic-gate 
3717c478bd9Sstevel@tonic-gate     if (WalkState)
3727c478bd9Sstevel@tonic-gate     {
37326f3cdf0SGordon Ross         /*
37426f3cdf0SGordon Ross          * Get the owner ID from the Walk state. The owner ID is used to
37526f3cdf0SGordon Ross          * track table deletion and deletion of objects created by methods.
37626f3cdf0SGordon Ross          */
3777c478bd9Sstevel@tonic-gate         OwnerId = WalkState->OwnerId;
37826f3cdf0SGordon Ross 
37926f3cdf0SGordon Ross         if ((WalkState->MethodDesc) &&
38026f3cdf0SGordon Ross             (ParentNode != WalkState->MethodNode))
38126f3cdf0SGordon Ross         {
38226f3cdf0SGordon Ross             /*
38326f3cdf0SGordon Ross              * A method is creating a new node that is not a child of the
38426f3cdf0SGordon Ross              * method (it is non-local). Mark the executing method as having
38526f3cdf0SGordon Ross              * modified the namespace. This is used for cleanup when the
38626f3cdf0SGordon Ross              * method exits.
38726f3cdf0SGordon Ross              */
3887b1019a6SJerry Jelinek             WalkState->MethodDesc->Method.InfoFlags |=
3897b1019a6SJerry Jelinek                 ACPI_METHOD_MODIFIED_NAMESPACE;
39026f3cdf0SGordon Ross         }
3917c478bd9Sstevel@tonic-gate     }
3927c478bd9Sstevel@tonic-gate 
3937c478bd9Sstevel@tonic-gate     /* Link the new entry into the parent and existing children */
3947c478bd9Sstevel@tonic-gate 
39526f3cdf0SGordon Ross     Node->Peer = NULL;
39626f3cdf0SGordon Ross     Node->Parent = ParentNode;
3977c478bd9Sstevel@tonic-gate     ChildNode = ParentNode->Child;
39826f3cdf0SGordon Ross 
3997c478bd9Sstevel@tonic-gate     if (!ChildNode)
4007c478bd9Sstevel@tonic-gate     {
4017c478bd9Sstevel@tonic-gate         ParentNode->Child = Node;
4027c478bd9Sstevel@tonic-gate     }
4037c478bd9Sstevel@tonic-gate     else
4047c478bd9Sstevel@tonic-gate     {
40526f3cdf0SGordon Ross         /* Add node to the end of the peer list */
40626f3cdf0SGordon Ross 
40726f3cdf0SGordon Ross         while (ChildNode->Peer)
4087c478bd9Sstevel@tonic-gate         {
4097c478bd9Sstevel@tonic-gate             ChildNode = ChildNode->Peer;
4107c478bd9Sstevel@tonic-gate         }
4117c478bd9Sstevel@tonic-gate 
4127c478bd9Sstevel@tonic-gate         ChildNode->Peer = Node;
4137c478bd9Sstevel@tonic-gate     }
4147c478bd9Sstevel@tonic-gate 
4157c478bd9Sstevel@tonic-gate     /* Init the new entry */
4167c478bd9Sstevel@tonic-gate 
4177c478bd9Sstevel@tonic-gate     Node->OwnerId = OwnerId;
4187c478bd9Sstevel@tonic-gate     Node->Type = (UINT8) Type;
4197c478bd9Sstevel@tonic-gate 
4207c478bd9Sstevel@tonic-gate     ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
4217c478bd9Sstevel@tonic-gate         "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",
4227c478bd9Sstevel@tonic-gate         AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type), Node, OwnerId,
4237c478bd9Sstevel@tonic-gate         AcpiUtGetNodeName (ParentNode), AcpiUtGetTypeName (ParentNode->Type),
4247c478bd9Sstevel@tonic-gate         ParentNode));
4257c478bd9Sstevel@tonic-gate 
4267c478bd9Sstevel@tonic-gate     return_VOID;
4277c478bd9Sstevel@tonic-gate }
4287c478bd9Sstevel@tonic-gate 
4297c478bd9Sstevel@tonic-gate 
4307c478bd9Sstevel@tonic-gate /*******************************************************************************
4317c478bd9Sstevel@tonic-gate  *
4327c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsDeleteChildren
4337c478bd9Sstevel@tonic-gate  *
4347c478bd9Sstevel@tonic-gate  * PARAMETERS:  ParentNode      - Delete this objects children
4357c478bd9Sstevel@tonic-gate  *
4367c478bd9Sstevel@tonic-gate  * RETURN:      None.
4377c478bd9Sstevel@tonic-gate  *
4387c478bd9Sstevel@tonic-gate  * DESCRIPTION: Delete all children of the parent object. In other words,
4397c478bd9Sstevel@tonic-gate  *              deletes a "scope".
4407c478bd9Sstevel@tonic-gate  *
4417c478bd9Sstevel@tonic-gate  ******************************************************************************/
4427c478bd9Sstevel@tonic-gate 
4437c478bd9Sstevel@tonic-gate void
AcpiNsDeleteChildren(ACPI_NAMESPACE_NODE * ParentNode)4447c478bd9Sstevel@tonic-gate AcpiNsDeleteChildren (
4457c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ParentNode)
4467c478bd9Sstevel@tonic-gate {
4477c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *NextNode;
44826f3cdf0SGordon Ross     ACPI_NAMESPACE_NODE     *NodeToDelete;
4497c478bd9Sstevel@tonic-gate 
4507c478bd9Sstevel@tonic-gate 
45127f7c583Smyers     ACPI_FUNCTION_TRACE_PTR (NsDeleteChildren, ParentNode);
4527c478bd9Sstevel@tonic-gate 
4537c478bd9Sstevel@tonic-gate 
4547c478bd9Sstevel@tonic-gate     if (!ParentNode)
4557c478bd9Sstevel@tonic-gate     {
4567c478bd9Sstevel@tonic-gate         return_VOID;
4577c478bd9Sstevel@tonic-gate     }
4587c478bd9Sstevel@tonic-gate 
459aa2aa9a6SDana Myers     /* Deallocate all children at this level */
460aa2aa9a6SDana Myers 
46126f3cdf0SGordon Ross     NextNode = ParentNode->Child;
46226f3cdf0SGordon Ross     while (NextNode)
4637c478bd9Sstevel@tonic-gate     {
4647c478bd9Sstevel@tonic-gate         /* Grandchildren should have all been deleted already */
4657c478bd9Sstevel@tonic-gate 
46626f3cdf0SGordon Ross         if (NextNode->Child)
4677c478bd9Sstevel@tonic-gate         {
46830082d0cSmyers             ACPI_ERROR ((AE_INFO, "Found a grandchild! P=%p C=%p",
46926f3cdf0SGordon Ross                 ParentNode, NextNode));
4707c478bd9Sstevel@tonic-gate         }
4717c478bd9Sstevel@tonic-gate 
47257190917SDana Myers         /*
47357190917SDana Myers          * Delete this child node and move on to the next child in the list.
47457190917SDana Myers          * No need to unlink the node since we are deleting the entire branch.
47557190917SDana Myers          */
47626f3cdf0SGordon Ross         NodeToDelete = NextNode;
47726f3cdf0SGordon Ross         NextNode = NextNode->Peer;
47826f3cdf0SGordon Ross         AcpiNsDeleteNode (NodeToDelete);
47926f3cdf0SGordon Ross     };
4807c478bd9Sstevel@tonic-gate 
4817c478bd9Sstevel@tonic-gate     /* Clear the parent's child pointer */
4827c478bd9Sstevel@tonic-gate 
4837c478bd9Sstevel@tonic-gate     ParentNode->Child = NULL;
4847c478bd9Sstevel@tonic-gate     return_VOID;
4857c478bd9Sstevel@tonic-gate }
4867c478bd9Sstevel@tonic-gate 
4877c478bd9Sstevel@tonic-gate 
4887c478bd9Sstevel@tonic-gate /*******************************************************************************
4897c478bd9Sstevel@tonic-gate  *
4907c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsDeleteNamespaceSubtree
4917c478bd9Sstevel@tonic-gate  *
4927c478bd9Sstevel@tonic-gate  * PARAMETERS:  ParentNode      - Root of the subtree to be deleted
4937c478bd9Sstevel@tonic-gate  *
4947c478bd9Sstevel@tonic-gate  * RETURN:      None.
4957c478bd9Sstevel@tonic-gate  *
4967b1019a6SJerry Jelinek  * DESCRIPTION: Delete a subtree of the namespace. This includes all objects
4977c478bd9Sstevel@tonic-gate  *              stored within the subtree.
4987c478bd9Sstevel@tonic-gate  *
4997c478bd9Sstevel@tonic-gate  ******************************************************************************/
5007c478bd9Sstevel@tonic-gate 
5017c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNamespaceSubtree(ACPI_NAMESPACE_NODE * ParentNode)5027c478bd9Sstevel@tonic-gate AcpiNsDeleteNamespaceSubtree (
5037c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ParentNode)
5047c478bd9Sstevel@tonic-gate {
5057c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ChildNode = NULL;
5067c478bd9Sstevel@tonic-gate     UINT32                  Level = 1;
50726f3cdf0SGordon Ross     ACPI_STATUS             Status;
5087c478bd9Sstevel@tonic-gate 
5097c478bd9Sstevel@tonic-gate 
51027f7c583Smyers     ACPI_FUNCTION_TRACE (NsDeleteNamespaceSubtree);
5117c478bd9Sstevel@tonic-gate 
5127c478bd9Sstevel@tonic-gate 
5137c478bd9Sstevel@tonic-gate     if (!ParentNode)
5147c478bd9Sstevel@tonic-gate     {
5157c478bd9Sstevel@tonic-gate         return_VOID;
5167c478bd9Sstevel@tonic-gate     }
5177c478bd9Sstevel@tonic-gate 
51826f3cdf0SGordon Ross     /* Lock namespace for possible update */
51926f3cdf0SGordon Ross 
52026f3cdf0SGordon Ross     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
52126f3cdf0SGordon Ross     if (ACPI_FAILURE (Status))
52226f3cdf0SGordon Ross     {
52326f3cdf0SGordon Ross         return_VOID;
52426f3cdf0SGordon Ross     }
52526f3cdf0SGordon Ross 
5267c478bd9Sstevel@tonic-gate     /*
5277c478bd9Sstevel@tonic-gate      * Traverse the tree of objects until we bubble back up
5287c478bd9Sstevel@tonic-gate      * to where we started.
5297c478bd9Sstevel@tonic-gate      */
5307c478bd9Sstevel@tonic-gate     while (Level > 0)
5317c478bd9Sstevel@tonic-gate     {
5327c478bd9Sstevel@tonic-gate         /* Get the next node in this scope (NULL if none) */
5337c478bd9Sstevel@tonic-gate 
534aa2aa9a6SDana Myers         ChildNode = AcpiNsGetNextNode (ParentNode, ChildNode);
5357c478bd9Sstevel@tonic-gate         if (ChildNode)
5367c478bd9Sstevel@tonic-gate         {
5377c478bd9Sstevel@tonic-gate             /* Found a child node - detach any attached object */
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate             AcpiNsDetachObject (ChildNode);
5407c478bd9Sstevel@tonic-gate 
5417c478bd9Sstevel@tonic-gate             /* Check if this node has any children */
5427c478bd9Sstevel@tonic-gate 
543aa2aa9a6SDana Myers             if (ChildNode->Child)
5447c478bd9Sstevel@tonic-gate             {
5457c478bd9Sstevel@tonic-gate                 /*
5467c478bd9Sstevel@tonic-gate                  * There is at least one child of this node,
5477c478bd9Sstevel@tonic-gate                  * visit the node
5487c478bd9Sstevel@tonic-gate                  */
5497c478bd9Sstevel@tonic-gate                 Level++;
5507c478bd9Sstevel@tonic-gate                 ParentNode = ChildNode;
5517c478bd9Sstevel@tonic-gate                 ChildNode  = NULL;
5527c478bd9Sstevel@tonic-gate             }
5537c478bd9Sstevel@tonic-gate         }
5547c478bd9Sstevel@tonic-gate         else
5557c478bd9Sstevel@tonic-gate         {
5567c478bd9Sstevel@tonic-gate             /*
5577c478bd9Sstevel@tonic-gate              * No more children of this parent node.
5587c478bd9Sstevel@tonic-gate              * Move up to the grandparent.
5597c478bd9Sstevel@tonic-gate              */
5607c478bd9Sstevel@tonic-gate             Level--;
5617c478bd9Sstevel@tonic-gate 
5627c478bd9Sstevel@tonic-gate             /*
5637c478bd9Sstevel@tonic-gate              * Now delete all of the children of this parent
5647c478bd9Sstevel@tonic-gate              * all at the same time.
5657c478bd9Sstevel@tonic-gate              */
5667c478bd9Sstevel@tonic-gate             AcpiNsDeleteChildren (ParentNode);
5677c478bd9Sstevel@tonic-gate 
5687c478bd9Sstevel@tonic-gate             /* New "last child" is this parent node */
5697c478bd9Sstevel@tonic-gate 
5707c478bd9Sstevel@tonic-gate             ChildNode = ParentNode;
5717c478bd9Sstevel@tonic-gate 
5727c478bd9Sstevel@tonic-gate             /* Move up the tree to the grandparent */
5737c478bd9Sstevel@tonic-gate 
57426f3cdf0SGordon Ross             ParentNode = ParentNode->Parent;
5757c478bd9Sstevel@tonic-gate         }
5767c478bd9Sstevel@tonic-gate     }
5777c478bd9Sstevel@tonic-gate 
57826f3cdf0SGordon Ross     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
5797c478bd9Sstevel@tonic-gate     return_VOID;
5807c478bd9Sstevel@tonic-gate }
5817c478bd9Sstevel@tonic-gate 
5827c478bd9Sstevel@tonic-gate 
5837c478bd9Sstevel@tonic-gate /*******************************************************************************
5847c478bd9Sstevel@tonic-gate  *
5857c478bd9Sstevel@tonic-gate  * FUNCTION:    AcpiNsDeleteNamespaceByOwner
5867c478bd9Sstevel@tonic-gate  *
5877c478bd9Sstevel@tonic-gate  * PARAMETERS:  OwnerId     - All nodes with this owner will be deleted
5887c478bd9Sstevel@tonic-gate  *
5897c478bd9Sstevel@tonic-gate  * RETURN:      Status
5907c478bd9Sstevel@tonic-gate  *
5917c478bd9Sstevel@tonic-gate  * DESCRIPTION: Delete entries within the namespace that are owned by a
5927b1019a6SJerry Jelinek  *              specific ID. Used to delete entire ACPI tables. All
5937c478bd9Sstevel@tonic-gate  *              reference counts are updated.
5947c478bd9Sstevel@tonic-gate  *
59527f7c583Smyers  * MUTEX:       Locks namespace during deletion walk.
59627f7c583Smyers  *
5977c478bd9Sstevel@tonic-gate  ******************************************************************************/
5987c478bd9Sstevel@tonic-gate 
5997c478bd9Sstevel@tonic-gate void
AcpiNsDeleteNamespaceByOwner(ACPI_OWNER_ID OwnerId)6007c478bd9Sstevel@tonic-gate AcpiNsDeleteNamespaceByOwner (
601450d6964Smyers     ACPI_OWNER_ID            OwnerId)
6027c478bd9Sstevel@tonic-gate {
6037c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ChildNode;
6047c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *DeletionNode;
6057c478bd9Sstevel@tonic-gate     ACPI_NAMESPACE_NODE     *ParentNode;
60627f7c583Smyers     UINT32                  Level;
60727f7c583Smyers     ACPI_STATUS             Status;
6087c478bd9Sstevel@tonic-gate 
6097c478bd9Sstevel@tonic-gate 
61027f7c583Smyers     ACPI_FUNCTION_TRACE_U32 (NsDeleteNamespaceByOwner, OwnerId);
6117c478bd9Sstevel@tonic-gate 
6127c478bd9Sstevel@tonic-gate 
613186507a7Smyers     if (OwnerId == 0)
614186507a7Smyers     {
615186507a7Smyers         return_VOID;
616186507a7Smyers     }
617186507a7Smyers 
61827f7c583Smyers     /* Lock namespace for possible update */
61927f7c583Smyers 
62027f7c583Smyers     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
62127f7c583Smyers     if (ACPI_FAILURE (Status))
62227f7c583Smyers     {
62327f7c583Smyers         return_VOID;
62427f7c583Smyers     }
62527f7c583Smyers 
62627f7c583Smyers     DeletionNode = NULL;
62727f7c583Smyers     ParentNode = AcpiGbl_RootNode;
62827f7c583Smyers     ChildNode = NULL;
62927f7c583Smyers     Level = 1;
6307c478bd9Sstevel@tonic-gate 
6317c478bd9Sstevel@tonic-gate     /*
6327c478bd9Sstevel@tonic-gate      * Traverse the tree of nodes until we bubble back up
6337c478bd9Sstevel@tonic-gate      * to where we started.
6347c478bd9Sstevel@tonic-gate      */
6357c478bd9Sstevel@tonic-gate     while (Level > 0)
6367c478bd9Sstevel@tonic-gate     {
6377c478bd9Sstevel@tonic-gate         /*
6387c478bd9Sstevel@tonic-gate          * Get the next child of this parent node. When ChildNode is NULL,
6397c478bd9Sstevel@tonic-gate          * the first child of the parent is returned
6407c478bd9Sstevel@tonic-gate          */
641aa2aa9a6SDana Myers         ChildNode = AcpiNsGetNextNode (ParentNode, ChildNode);
6427c478bd9Sstevel@tonic-gate 
6437c478bd9Sstevel@tonic-gate         if (DeletionNode)
6447c478bd9Sstevel@tonic-gate         {
64527f7c583Smyers             AcpiNsDeleteChildren (DeletionNode);
64657190917SDana Myers             AcpiNsRemoveNode (DeletionNode);
6477c478bd9Sstevel@tonic-gate             DeletionNode = NULL;
6487c478bd9Sstevel@tonic-gate         }
6497c478bd9Sstevel@tonic-gate 
6507c478bd9Sstevel@tonic-gate         if (ChildNode)
6517c478bd9Sstevel@tonic-gate         {
6527c478bd9Sstevel@tonic-gate             if (ChildNode->OwnerId == OwnerId)
6537c478bd9Sstevel@tonic-gate             {
6547c478bd9Sstevel@tonic-gate                 /* Found a matching child node - detach any attached object */
6557c478bd9Sstevel@tonic-gate 
6567c478bd9Sstevel@tonic-gate                 AcpiNsDetachObject (ChildNode);
6577c478bd9Sstevel@tonic-gate             }
6587c478bd9Sstevel@tonic-gate 
6597c478bd9Sstevel@tonic-gate             /* Check if this node has any children */
6607c478bd9Sstevel@tonic-gate 
661aa2aa9a6SDana Myers             if (ChildNode->Child)
6627c478bd9Sstevel@tonic-gate             {
6637c478bd9Sstevel@tonic-gate                 /*
6647c478bd9Sstevel@tonic-gate                  * There is at least one child of this node,
6657c478bd9Sstevel@tonic-gate                  * visit the node
6667c478bd9Sstevel@tonic-gate                  */
6677c478bd9Sstevel@tonic-gate                 Level++;
6687c478bd9Sstevel@tonic-gate                 ParentNode = ChildNode;
6697c478bd9Sstevel@tonic-gate                 ChildNode  = NULL;
6707c478bd9Sstevel@tonic-gate             }
6717c478bd9Sstevel@tonic-gate             else if (ChildNode->OwnerId == OwnerId)
6727c478bd9Sstevel@tonic-gate             {
6737c478bd9Sstevel@tonic-gate                 DeletionNode = ChildNode;
6747c478bd9Sstevel@tonic-gate             }
6757c478bd9Sstevel@tonic-gate         }
6767c478bd9Sstevel@tonic-gate         else
6777c478bd9Sstevel@tonic-gate         {
6787c478bd9Sstevel@tonic-gate             /*
6797c478bd9Sstevel@tonic-gate              * No more children of this parent node.
6807c478bd9Sstevel@tonic-gate              * Move up to the grandparent.
6817c478bd9Sstevel@tonic-gate              */
6827c478bd9Sstevel@tonic-gate             Level--;
6837c478bd9Sstevel@tonic-gate             if (Level != 0)
6847c478bd9Sstevel@tonic-gate             {
6857c478bd9Sstevel@tonic-gate                 if (ParentNode->OwnerId == OwnerId)
6867c478bd9Sstevel@tonic-gate                 {
6877c478bd9Sstevel@tonic-gate                     DeletionNode = ParentNode;
6887c478bd9Sstevel@tonic-gate                 }
6897c478bd9Sstevel@tonic-gate             }
6907c478bd9Sstevel@tonic-gate 
6917c478bd9Sstevel@tonic-gate             /* New "last child" is this parent node */
6927c478bd9Sstevel@tonic-gate 
6937c478bd9Sstevel@tonic-gate             ChildNode = ParentNode;
6947c478bd9Sstevel@tonic-gate 
6957c478bd9Sstevel@tonic-gate             /* Move up the tree to the grandparent */
6967c478bd9Sstevel@tonic-gate 
69726f3cdf0SGordon Ross             ParentNode = ParentNode->Parent;
6987c478bd9Sstevel@tonic-gate         }
6997c478bd9Sstevel@tonic-gate     }
7007c478bd9Sstevel@tonic-gate 
70127f7c583Smyers     (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
7027c478bd9Sstevel@tonic-gate     return_VOID;
7037c478bd9Sstevel@tonic-gate }
704