]> err.no Git - linux-2.6/blobdiff - drivers/acpi/namespace/nsinit.c
Merge branch 'for-2.6.21' of master.kernel.org:/pub/scm/linux/kernel/git/davej/agpgart
[linux-2.6] / drivers / acpi / namespace / nsinit.c
index 326af8fc0ce7e83fd91d9d7fee21f6d854f25694..c4ab615f77fea6a133f2f1cf9865217e9d02b0d5 100644 (file)
@@ -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")
@@ -213,7 +214,7 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
                        u32 level, void *context, void **return_value)
 {
        acpi_object_type type;
-       acpi_status status = AE_OK;
+       acpi_status status;
        struct acpi_init_walk_info *info =
            (struct acpi_init_walk_info *)context;
        struct acpi_namespace_node *node =
@@ -267,7 +268,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
        /*
         * Must lock the interpreter before executing AML code
         */
-       acpi_ex_enter_interpreter();
+       status = acpi_ex_enter_interpreter();
+       if (ACPI_FAILURE(status)) {
+               return (status);
+       }
 
        /*
         * Each of these types can contain executable AML code within the
@@ -534,7 +538,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++;