Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / acpi / namespace / nsalloc.c
index bfd922c..9b871f3 100644 (file)
@@ -5,7 +5,7 @@
  ******************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2005, R. Byron Moore
+ * Copyright (C) 2000 - 2006, R. Byron Moore
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * POSSIBILITY OF SUCH DAMAGES.
  */
 
-
 #include <acpi/acpi.h>
 #include <acpi/acnamesp.h>
 
-
 #define _COMPONENT          ACPI_NAMESPACE
-        ACPI_MODULE_NAME    ("nsalloc")
+ACPI_MODULE_NAME("nsalloc")
 
+/* Local prototypes */
+static void acpi_ns_remove_reference(struct acpi_namespace_node *node);
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_create_node
  *
- * PARAMETERS:  acpi_name       - Name of the new node
+ * PARAMETERS:  Name            - Name of the new node (4 char ACPI name)
  *
- * RETURN:      None
+ * RETURN:      New namespace node (Null on failure)
  *
  * DESCRIPTION: Create a namespace node
  *
  ******************************************************************************/
 
-struct acpi_namespace_node *
-acpi_ns_create_node (
-       u32                             name)
+struct acpi_namespace_node *acpi_ns_create_node(u32 name)
 {
-       struct acpi_namespace_node      *node;
-
-
-       ACPI_FUNCTION_TRACE ("ns_create_node");
+       struct acpi_namespace_node *node;
 
+       ACPI_FUNCTION_TRACE("ns_create_node");
 
-       node = ACPI_MEM_CALLOCATE (sizeof (struct acpi_namespace_node));
+       node = ACPI_MEM_CALLOCATE(sizeof(struct acpi_namespace_node));
        if (!node) {
-               return_PTR (NULL);
+               return_PTR(NULL);
        }
 
-       ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_allocated++);
+       ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_allocated++);
 
-       node->name.integer   = name;
+       node->name.integer = name;
        node->reference_count = 1;
-       ACPI_SET_DESCRIPTOR_TYPE (node, ACPI_DESC_TYPE_NAMED);
+       ACPI_SET_DESCRIPTOR_TYPE(node, ACPI_DESC_TYPE_NAMED);
 
-       return_PTR (node);
+       return_PTR(node);
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_delete_node
@@ -99,19 +94,15 @@ acpi_ns_create_node (
  *
  ******************************************************************************/
 
-void
-acpi_ns_delete_node (
-       struct acpi_namespace_node      *node)
+void acpi_ns_delete_node(struct acpi_namespace_node *node)
 {
-       struct acpi_namespace_node      *parent_node;
-       struct acpi_namespace_node      *prev_node;
-       struct acpi_namespace_node      *next_node;
-
-
-       ACPI_FUNCTION_TRACE_PTR ("ns_delete_node", node);
+       struct acpi_namespace_node *parent_node;
+       struct acpi_namespace_node *prev_node;
+       struct acpi_namespace_node *next_node;
 
+       ACPI_FUNCTION_TRACE_PTR("ns_delete_node", node);
 
-       parent_node = acpi_ns_get_parent_node (node);
+       parent_node = acpi_ns_get_parent_node(node);
 
        prev_node = NULL;
        next_node = parent_node->child;
@@ -130,84 +121,29 @@ acpi_ns_delete_node (
                if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
                        prev_node->flags |= ANOBJ_END_OF_PEER_LIST;
                }
-       }
-       else {
+       } else {
                /* Node is first child (has no previous peer) */
 
                if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
                        /* No peers at all */
 
                        parent_node->child = NULL;
-               }
-               else {   /* Link peer list to parent */
+               } else {        /* Link peer list to parent */
 
                        parent_node->child = next_node->peer;
                }
        }
 
-
-       ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++);
+       ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
 
        /*
         * Detach an object if there is one then delete the node
         */
-       acpi_ns_detach_object (node);
-       ACPI_MEM_FREE (node);
+       acpi_ns_detach_object(node);
+       ACPI_MEM_FREE(node);
        return_VOID;
 }
 
-
-#ifdef ACPI_ALPHABETIC_NAMESPACE
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ns_compare_names
- *
- * PARAMETERS:  Name1           - First name to compare
- *              Name2           - Second name to compare
- *
- * RETURN:      value from strncmp
- *
- * DESCRIPTION: Compare two ACPI names.  Names that are prefixed with an
- *              underscore are forced to be alphabetically first.
- *
- ******************************************************************************/
-
-int
-acpi_ns_compare_names (
-       char                            *name1,
-       char                            *name2)
-{
-       char                            reversed_name1[ACPI_NAME_SIZE];
-       char                            reversed_name2[ACPI_NAME_SIZE];
-       u32                             i;
-       u32                             j;
-
-
-       /*
-        * Replace all instances of "underscore" with a value that is smaller so
-        * that all names that are prefixed with underscore(s) are alphabetically
-        * first.
-        *
-        * Reverse the name bytewise so we can just do a 32-bit compare instead
-        * of a strncmp.
-        */
-       for (i = 0, j= (ACPI_NAME_SIZE - 1); i < ACPI_NAME_SIZE; i++, j--) {
-               reversed_name1[j] = name1[i];
-               if (name1[i] == '_') {
-                       reversed_name1[j] = '*';
-               }
-
-               reversed_name2[j] = name2[i];
-               if (name2[i] == '_') {
-                       reversed_name2[j] = '*';
-               }
-       }
-
-       return (*(int *) reversed_name1 - *(int *) reversed_name2);
-}
-#endif
-
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_install_node
@@ -222,30 +158,20 @@ acpi_ns_compare_names (
  * DESCRIPTION: Initialize a new namespace node and install it amongst
  *              its peers.
  *
- *              Note: Current namespace lookup is linear search.  However, the
- *              nodes are linked in alphabetical order to 1) put all reserved
- *              names (start with underscore) first, and to 2) make a readable
- *              namespace dump.
+ *              Note: Current namespace lookup is linear search. This appears
+ *              to be sufficient as namespace searches consume only a small
+ *              fraction of the execution time of the ACPI subsystem.
  *
  ******************************************************************************/
 
-void
-acpi_ns_install_node (
-       struct acpi_walk_state          *walk_state,
-       struct acpi_namespace_node      *parent_node,   /* Parent */
-       struct acpi_namespace_node      *node,          /* New Child*/
-       acpi_object_type                type)
+void acpi_ns_install_node(struct acpi_walk_state *walk_state, struct acpi_namespace_node *parent_node, /* Parent */
+                         struct acpi_namespace_node *node,     /* New Child */
+                         acpi_object_type type)
 {
-       u16                             owner_id = 0;
-       struct acpi_namespace_node      *child_node;
-#ifdef ACPI_ALPHABETIC_NAMESPACE
-
-       struct acpi_namespace_node      *previous_child_node;
-#endif
-
-
-       ACPI_FUNCTION_TRACE ("ns_install_node");
+       acpi_owner_id owner_id = 0;
+       struct acpi_namespace_node *child_node;
 
+       ACPI_FUNCTION_TRACE("ns_install_node");
 
        /*
         * Get the owner ID from the Walk state
@@ -263,58 +189,7 @@ acpi_ns_install_node (
                parent_node->child = node;
                node->flags |= ANOBJ_END_OF_PEER_LIST;
                node->peer = parent_node;
-       }
-       else {
-#ifdef ACPI_ALPHABETIC_NAMESPACE
-               /*
-                * Walk the list whilst searching for the correct
-                * alphabetic placement.
-                */
-               previous_child_node = NULL;
-               while (acpi_ns_compare_names (acpi_ut_get_node_name (child_node), acpi_ut_get_node_name (node)) < 0) {
-                       if (child_node->flags & ANOBJ_END_OF_PEER_LIST) {
-                               /* Last peer;  Clear end-of-list flag */
-
-                               child_node->flags &= ~ANOBJ_END_OF_PEER_LIST;
-
-                               /* This node is the new peer to the child node */
-
-                               child_node->peer = node;
-
-                               /* This node is the new end-of-list */
-
-                               node->flags |= ANOBJ_END_OF_PEER_LIST;
-                               node->peer = parent_node;
-                               break;
-                       }
-
-                       /* Get next peer */
-
-                       previous_child_node = child_node;
-                       child_node = child_node->peer;
-               }
-
-               /* Did the node get inserted at the end-of-list? */
-
-               if (!(node->flags & ANOBJ_END_OF_PEER_LIST)) {
-                       /*
-                        * Loop above terminated without reaching the end-of-list.
-                        * Insert the new node at the current location
-                        */
-                       if (previous_child_node) {
-                               /* Insert node alphabetically */
-
-                               node->peer = child_node;
-                               previous_child_node->peer = node;
-                       }
-                       else {
-                               /* Insert node alphabetically at start of list */
-
-                               node->peer = child_node;
-                               parent_node->child = node;
-                       }
-               }
-#else
+       } else {
                while (!(child_node->flags & ANOBJ_END_OF_PEER_LIST)) {
                        child_node = child_node->peer;
                }
@@ -324,9 +199,8 @@ acpi_ns_install_node (
                /* Clear end-of-list flag */
 
                child_node->flags &= ~ANOBJ_END_OF_PEER_LIST;
-               node->flags     |= ANOBJ_END_OF_PEER_LIST;
+               node->flags |= ANOBJ_END_OF_PEER_LIST;
                node->peer = parent_node;
-#endif
        }
 
        /* Init the new entry */
@@ -334,24 +208,25 @@ acpi_ns_install_node (
        node->owner_id = owner_id;
        node->type = (u8) type;
 
-       ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
-               "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",
-               acpi_ut_get_node_name (node), acpi_ut_get_type_name (node->type), node, owner_id,
-               acpi_ut_get_node_name (parent_node), acpi_ut_get_type_name (parent_node->type),
-               parent_node));
+       ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
+                         "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",
+                         acpi_ut_get_node_name(node),
+                         acpi_ut_get_type_name(node->type), node, owner_id,
+                         acpi_ut_get_node_name(parent_node),
+                         acpi_ut_get_type_name(parent_node->type),
+                         parent_node));
 
        /*
         * Increment the reference count(s) of all parents up to
         * the root!
         */
-       while ((node = acpi_ns_get_parent_node (node)) != NULL) {
+       while ((node = acpi_ns_get_parent_node(node)) != NULL) {
                node->reference_count++;
        }
 
        return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_delete_children
@@ -365,18 +240,14 @@ acpi_ns_install_node (
  *
  ******************************************************************************/
 
-void
-acpi_ns_delete_children (
-       struct acpi_namespace_node      *parent_node)
+void acpi_ns_delete_children(struct acpi_namespace_node *parent_node)
 {
-       struct acpi_namespace_node      *child_node;
-       struct acpi_namespace_node      *next_node;
-       struct acpi_namespace_node      *node;
-       u8                              flags;
-
-
-       ACPI_FUNCTION_TRACE_PTR ("ns_delete_children", parent_node);
+       struct acpi_namespace_node *child_node;
+       struct acpi_namespace_node *next_node;
+       struct acpi_namespace_node *node;
+       u8 flags;
 
+       ACPI_FUNCTION_TRACE_PTR("ns_delete_children", parent_node);
 
        if (!parent_node) {
                return_VOID;
@@ -395,47 +266,49 @@ acpi_ns_delete_children (
        do {
                /* Get the things we need */
 
-               next_node   = child_node->peer;
-               flags       = child_node->flags;
+               next_node = child_node->peer;
+               flags = child_node->flags;
 
                /* Grandchildren should have all been deleted already */
 
                if (child_node->child) {
-                       ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Found a grandchild! P=%p C=%p\n",
-                               parent_node, child_node));
+                       ACPI_ERROR((AE_INFO, "Found a grandchild! P=%p C=%p",
+                                   parent_node, child_node));
                }
 
                /* Now we can free this child object */
 
-               ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++);
+               ACPI_MEM_TRACKING(acpi_gbl_ns_node_list->total_freed++);
 
-               ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p, Remaining %X\n",
-                       child_node, acpi_gbl_current_node_count));
+               ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
+                                 "Object %p, Remaining %X\n", child_node,
+                                 acpi_gbl_current_node_count));
 
                /*
                 * Detach an object if there is one, then free the child node
                 */
-               acpi_ns_detach_object (child_node);
+               acpi_ns_detach_object(child_node);
 
                /*
                 * Decrement the reference count(s) of all parents up to
                 * the root! (counts were incremented when the node was created)
                 */
                node = child_node;
-               while ((node = acpi_ns_get_parent_node (node)) != NULL) {
+               while ((node = acpi_ns_get_parent_node(node)) != NULL) {
                        node->reference_count--;
                }
 
                /* There should be only one reference remaining on this node */
 
                if (child_node->reference_count != 1) {
-                       ACPI_REPORT_WARNING (("Existing references (%d) on node being deleted (%p)\n",
-                               child_node->reference_count, child_node));
+                       ACPI_WARNING((AE_INFO,
+                                     "Existing references (%d) on node being deleted (%p)",
+                                     child_node->reference_count, child_node));
                }
 
                /* Now we can delete the node */
 
-               ACPI_MEM_FREE (child_node);
+               ACPI_MEM_FREE(child_node);
 
                /* And move on to the next child in the list */
 
@@ -443,7 +316,6 @@ acpi_ns_delete_children (
 
        } while (!(flags & ANOBJ_END_OF_PEER_LIST));
 
-
        /* Clear the parent's child pointer */
 
        parent_node->child = NULL;
@@ -451,7 +323,6 @@ acpi_ns_delete_children (
        return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_delete_namespace_subtree
@@ -465,16 +336,12 @@ acpi_ns_delete_children (
  *
  ******************************************************************************/
 
-void
-acpi_ns_delete_namespace_subtree (
-       struct acpi_namespace_node      *parent_node)
+void acpi_ns_delete_namespace_subtree(struct acpi_namespace_node *parent_node)
 {
-       struct acpi_namespace_node      *child_node = NULL;
-       u32                             level = 1;
-
-
-       ACPI_FUNCTION_TRACE ("ns_delete_namespace_subtree");
+       struct acpi_namespace_node *child_node = NULL;
+       u32 level = 1;
 
+       ACPI_FUNCTION_TRACE("ns_delete_namespace_subtree");
 
        if (!parent_node) {
                return_VOID;
@@ -487,16 +354,17 @@ acpi_ns_delete_namespace_subtree (
        while (level > 0) {
                /* Get the next node in this scope (NULL if none) */
 
-               child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node,
-                                child_node);
+               child_node = acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
+                                                  child_node);
                if (child_node) {
                        /* Found a child node - detach any attached object */
 
-                       acpi_ns_detach_object (child_node);
+                       acpi_ns_detach_object(child_node);
 
                        /* Check if this node has any children */
 
-                       if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, NULL)) {
+                       if (acpi_ns_get_next_node
+                           (ACPI_TYPE_ANY, child_node, NULL)) {
                                /*
                                 * There is at least one child of this node,
                                 * visit the node
@@ -505,8 +373,7 @@ acpi_ns_delete_namespace_subtree (
                                parent_node = child_node;
                                child_node = NULL;
                        }
-               }
-               else {
+               } else {
                        /*
                         * No more children of this parent node.
                         * Move up to the grandparent.
@@ -517,7 +384,7 @@ acpi_ns_delete_namespace_subtree (
                         * Now delete all of the children of this parent
                         * all at the same time.
                         */
-                       acpi_ns_delete_children (parent_node);
+                       acpi_ns_delete_children(parent_node);
 
                        /* New "last child" is this parent node */
 
@@ -525,14 +392,13 @@ acpi_ns_delete_namespace_subtree (
 
                        /* Move up the tree to the grandparent */
 
-                       parent_node = acpi_ns_get_parent_node (parent_node);
+                       parent_node = acpi_ns_get_parent_node(parent_node);
                }
        }
 
        return_VOID;
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_remove_reference
@@ -548,16 +414,12 @@ acpi_ns_delete_namespace_subtree (
  *
  ******************************************************************************/
 
-void
-acpi_ns_remove_reference (
-       struct acpi_namespace_node      *node)
+static void acpi_ns_remove_reference(struct acpi_namespace_node *node)
 {
-       struct acpi_namespace_node      *parent_node;
-       struct acpi_namespace_node      *this_node;
-
-
-       ACPI_FUNCTION_ENTRY ();
+       struct acpi_namespace_node *parent_node;
+       struct acpi_namespace_node *this_node;
 
+       ACPI_FUNCTION_ENTRY();
 
        /*
         * Decrement the reference count(s) of this node and all
@@ -567,7 +429,7 @@ acpi_ns_remove_reference (
        while (this_node) {
                /* Prepare to move up to parent */
 
-               parent_node = acpi_ns_get_parent_node (this_node);
+               parent_node = acpi_ns_get_parent_node(this_node);
 
                /* Decrement the reference count on this node */
 
@@ -578,15 +440,14 @@ acpi_ns_remove_reference (
                if (!this_node->reference_count) {
                        /* Delete all children and delete the node */
 
-                       acpi_ns_delete_children (this_node);
-                       acpi_ns_delete_node (this_node);
+                       acpi_ns_delete_children(this_node);
+                       acpi_ns_delete_node(this_node);
                }
 
                this_node = parent_node;
        }
 }
 
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ns_delete_namespace_by_owner
@@ -601,23 +462,23 @@ acpi_ns_remove_reference (
  *
  ******************************************************************************/
 
-void
-acpi_ns_delete_namespace_by_owner (
-       u16                             owner_id)
+void acpi_ns_delete_namespace_by_owner(acpi_owner_id owner_id)
 {
-       struct acpi_namespace_node      *child_node;
-       struct acpi_namespace_node      *deletion_node;
-       u32                             level;
-       struct acpi_namespace_node      *parent_node;
-
+       struct acpi_namespace_node *child_node;
+       struct acpi_namespace_node *deletion_node;
+       u32 level;
+       struct acpi_namespace_node *parent_node;
 
-       ACPI_FUNCTION_TRACE_U32 ("ns_delete_namespace_by_owner", owner_id);
+       ACPI_FUNCTION_TRACE_U32("ns_delete_namespace_by_owner", owner_id);
 
+       if (owner_id == 0) {
+               return_VOID;
+       }
 
-       parent_node   = acpi_gbl_root_node;
-       child_node    = NULL;
+       parent_node = acpi_gbl_root_node;
+       child_node = NULL;
        deletion_node = NULL;
-       level         = 1;
+       level = 1;
 
        /*
         * Traverse the tree of nodes until we bubble back up
@@ -628,10 +489,12 @@ acpi_ns_delete_namespace_by_owner (
                 * Get the next child of this parent node. When child_node is NULL,
                 * the first child of the parent is returned
                 */
-               child_node = acpi_ns_get_next_node (ACPI_TYPE_ANY, parent_node, child_node);
+               child_node =
+                   acpi_ns_get_next_node(ACPI_TYPE_ANY, parent_node,
+                                         child_node);
 
                if (deletion_node) {
-                       acpi_ns_remove_reference (deletion_node);
+                       acpi_ns_remove_reference(deletion_node);
                        deletion_node = NULL;
                }
 
@@ -639,12 +502,13 @@ acpi_ns_delete_namespace_by_owner (
                        if (child_node->owner_id == owner_id) {
                                /* Found a matching child node - detach any attached object */
 
-                               acpi_ns_detach_object (child_node);
+                               acpi_ns_detach_object(child_node);
                        }
 
                        /* Check if this node has any children */
 
-                       if (acpi_ns_get_next_node (ACPI_TYPE_ANY, child_node, NULL)) {
+                       if (acpi_ns_get_next_node
+                           (ACPI_TYPE_ANY, child_node, NULL)) {
                                /*
                                 * There is at least one child of this node,
                                 * visit the node
@@ -652,12 +516,10 @@ acpi_ns_delete_namespace_by_owner (
                                level++;
                                parent_node = child_node;
                                child_node = NULL;
-                       }
-                       else if (child_node->owner_id == owner_id) {
+                       } else if (child_node->owner_id == owner_id) {
                                deletion_node = child_node;
                        }
-               }
-               else {
+               } else {
                        /*
                         * No more children of this parent node.
                         * Move up to the grandparent.
@@ -675,11 +537,9 @@ acpi_ns_delete_namespace_by_owner (
 
                        /* Move up the tree to the grandparent */
 
-                       parent_node = acpi_ns_get_parent_node (parent_node);
+                       parent_node = acpi_ns_get_parent_node(parent_node);
                }
        }
 
        return_VOID;
 }
-
-