bmsearch.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: bmsearch.c
  4.  *   $Revision: 16 $
  5.  *
  6.  *****************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 Andrew Grover
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include <acpi.h>
  25. #include "bm.h"
  26. #define _COMPONENT ACPI_BUS
  27. MODULE_NAME ("bmsearch")
  28. /****************************************************************************
  29.  *                            External Functions
  30.  ****************************************************************************/
  31. /****************************************************************************
  32.  *
  33.  * FUNCTION:    bm_compare
  34.  *
  35.  * PARAMETERS:
  36.  *
  37.  * RETURN:
  38.  *
  39.  * DESCRIPTION:
  40.  *
  41.  ****************************************************************************/
  42. acpi_status
  43. bm_compare (
  44. BM_DEVICE               *device,
  45. BM_DEVICE_ID            *criteria)
  46. {
  47. if (!device || !criteria) {
  48. return AE_BAD_PARAMETER;
  49. }
  50. /*
  51.  * Present?
  52.  * --------
  53.  * We're only going to match on devices that are present.
  54.  * TBD: Optimize in bm_search (don't have to call here).
  55.  */
  56. if (!BM_DEVICE_PRESENT(device)) {
  57. return AE_NOT_FOUND;
  58. }
  59. /*
  60.  * Type?
  61.  */
  62. if (criteria->type && (criteria->type != device->id.type)) {
  63. return AE_NOT_FOUND;
  64. }
  65. /*
  66.  * HID?
  67.  */
  68. if ((criteria->hid[0]) && (0 != STRNCMP(criteria->hid,
  69. device->id.hid, sizeof(BM_DEVICE_HID)))) {
  70. return AE_NOT_FOUND;
  71. }
  72. /*
  73.  * ADR?
  74.  */
  75. if ((criteria->adr) && (criteria->adr != device->id.adr)) {
  76. return AE_NOT_FOUND;
  77. }
  78. return AE_OK;
  79. }
  80. /****************************************************************************
  81.  *
  82.  * FUNCTION:    bm_search
  83.  *
  84.  * PARAMETERS:
  85.  *
  86.  * RETURN:      AE_BAD_PARAMETER- invalid input parameter
  87.  *              AE_NOT_EXIST    - start_device_handle doesn't exist
  88.  *              AE_NOT_FOUND    - no matches to Search_info.criteria found
  89.  *              AE_OK           - success
  90.  *
  91.  * DESCRIPTION:
  92.  *
  93.  ****************************************************************************/
  94. acpi_status
  95. bm_search(
  96. BM_HANDLE               device_handle,
  97. BM_DEVICE_ID            *criteria,
  98. BM_HANDLE_LIST          *results)
  99. {
  100. acpi_status             status = AE_OK;
  101. BM_NODE *node = NULL;
  102. FUNCTION_TRACE("bm_search");
  103. if (!criteria || !results) {
  104. return_ACPI_STATUS(AE_BAD_PARAMETER);
  105. }
  106. results->count = 0;
  107. /*
  108.  * Locate Starting Point:
  109.  * ----------------------
  110.  * Locate the node in the hierarchy where we'll begin our search.
  111.  */
  112. status = bm_get_node(device_handle, 0, &node);
  113. if (ACPI_FAILURE(status)) {
  114. return_ACPI_STATUS(status);
  115. }
  116. /*
  117.  * Parse Hierarchy:
  118.  * ----------------
  119.  * Parse through the node hierarchy looking for matches.
  120.  */
  121. while (node && (results->count<=BM_HANDLES_MAX)) {
  122. /*
  123.  * Depth-first:
  124.  * ------------
  125.  * Searches are always performed depth-first.
  126.  */
  127. if (node->scope.head) {
  128. status = bm_compare(&(node->device), criteria);
  129. if (ACPI_SUCCESS(status)) {
  130. results->handles[results->count++] =
  131. node->device.handle;
  132. }
  133. node = node->scope.head;
  134. }
  135. /*
  136.  * Now Breadth:
  137.  * ------------
  138.  * Search all peers until scope is exhausted.
  139.  */
  140. else {
  141. status = bm_compare(&(node->device), criteria);
  142. if (ACPI_SUCCESS(status)) {
  143. results->handles[results->count++] =
  144. node->device.handle;
  145. }
  146. /*
  147.  * Locate Next Device:
  148.  * -------------------
  149.  * The next node is either a peer at this level
  150.  * (node->next is valid), or we work are way back
  151.  * up the tree until we either find a non-parsed
  152.  * peer or hit the top (node->parent is NULL).
  153.  */
  154. while (!node->next && node->parent) {
  155. node = node->parent;
  156. }
  157. node = node->next;
  158. }
  159. }
  160. if (results->count == 0) {
  161. return_ACPI_STATUS(AE_NOT_FOUND);
  162. }
  163. else {
  164. return_ACPI_STATUS(AE_OK);
  165. }
  166. }