]> err.no Git - linux-2.6/blobdiff - drivers/acpi/namespace/nsinit.c
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer...
[linux-2.6] / drivers / acpi / namespace / nsinit.c
index 326af8fc0ce7e83fd91d9d7fee21f6d854f25694..6d6d930c8e1820d21d0bc40441065dddf9ba0ef9 100644 (file)
@@ -5,7 +5,7 @@
  *****************************************************************************/
 
 /*
- * Copyright (C) 2000 - 2007, R. Byron Moore
+ * Copyright (C) 2000 - 2008, Intel Corp.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,6 +45,7 @@
 #include <acpi/acnamesp.h>
 #include <acpi/acdispat.h>
 #include <acpi/acinterp.h>
+#include <linux/nmi.h>
 
 #define _COMPONENT          ACPI_NAMESPACE
 ACPI_MODULE_NAME("nsinit")
@@ -243,6 +244,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
                info->field_count++;
                break;
 
+       case ACPI_TYPE_LOCAL_BANK_FIELD:
+               info->field_count++;
+               break;
+
        case ACPI_TYPE_BUFFER:
                info->buffer_count++;
                break;
@@ -286,6 +291,12 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
                status = acpi_ds_get_buffer_field_arguments(obj_desc);
                break;
 
+       case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+               info->field_init++;
+               status = acpi_ds_get_bank_field_arguments(obj_desc);
+               break;
+
        case ACPI_TYPE_BUFFER:
 
                info->buffer_init++;
@@ -534,7 +545,15 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
        info->parameter_type = ACPI_PARAM_ARGS;
        info->flags = ACPI_IGNORE_RETURN_VALUE;
 
+       /*
+        * Some hardware relies on this being executed as atomically
+        * as possible (without an NMI being received in the middle of
+        * this) - so disable NMIs and initialize the device:
+        */
+       acpi_nmi_disable();
        status = acpi_ns_evaluate(info);
+       acpi_nmi_enable();
+
        if (ACPI_SUCCESS(status)) {
                walk_info->num_INI++;