|
@@ -635,20 +635,23 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Save current system state */
|
|
|
-
|
|
|
- if (acpi_gbl_system_awake_and_running) {
|
|
|
- ACPI_SET_BIT(gpe_event_info->flags, ACPI_GPE_SYSTEM_RUNNING);
|
|
|
- } else {
|
|
|
- ACPI_CLEAR_BIT(gpe_event_info->flags, ACPI_GPE_SYSTEM_RUNNING);
|
|
|
+ if (!acpi_gbl_system_awake_and_running) {
|
|
|
+ /*
|
|
|
+ * We just woke up because of a wake GPE. Disable any further GPEs
|
|
|
+ * until we are fully up and running (Only wake GPEs should be enabled
|
|
|
+ * at this time, but we just brute-force disable them all.)
|
|
|
+ * 1) We must disable this particular wake GPE so it won't fire again
|
|
|
+ * 2) We want to disable all wake GPEs, since we are now awake
|
|
|
+ */
|
|
|
+ (void)acpi_hw_disable_all_gpes();
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Dispatch the GPE to either an installed handler, or the control
|
|
|
- * method associated with this GPE (_Lxx or _Exx).
|
|
|
- * If a handler exists, we invoke it and do not attempt to run the method.
|
|
|
- * If there is neither a handler nor a method, we disable the level to
|
|
|
- * prevent further events from coming in here.
|
|
|
+ * Dispatch the GPE to either an installed handler, or the control method
|
|
|
+ * associated with this GPE (_Lxx or _Exx). If a handler exists, we invoke
|
|
|
+ * it and do not attempt to run the method. If there is neither a handler
|
|
|
+ * nor a method, we disable this GPE to prevent further such pointless
|
|
|
+ * events from firing.
|
|
|
*/
|
|
|
switch (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) {
|
|
|
case ACPI_GPE_DISPATCH_HANDLER:
|
|
@@ -679,8 +682,8 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
|
|
case ACPI_GPE_DISPATCH_METHOD:
|
|
|
|
|
|
/*
|
|
|
- * Disable GPE, so it doesn't keep firing before the method has a
|
|
|
- * chance to run.
|
|
|
+ * Disable the GPE, so it doesn't keep firing before the method has a
|
|
|
+ * chance to run (it runs asynchronously with interrupts enabled).
|
|
|
*/
|
|
|
status = acpi_ev_disable_gpe(gpe_event_info);
|
|
|
if (ACPI_FAILURE(status)) {
|
|
@@ -713,7 +716,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
|
|
gpe_number));
|
|
|
|
|
|
/*
|
|
|
- * Disable the GPE. The GPE will remain disabled until the ACPI
|
|
|
+ * Disable the GPE. The GPE will remain disabled until the ACPI
|
|
|
* Core Subsystem is restarted, or a handler is installed.
|
|
|
*/
|
|
|
status = acpi_ev_disable_gpe(gpe_event_info);
|
|
@@ -728,50 +731,3 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number)
|
|
|
|
|
|
return_UINT32(ACPI_INTERRUPT_HANDLED);
|
|
|
}
|
|
|
-
|
|
|
-#ifdef ACPI_GPE_NOTIFY_CHECK
|
|
|
-/*******************************************************************************
|
|
|
- * TBD: NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
|
|
|
- *
|
|
|
- * FUNCTION: acpi_ev_check_for_wake_only_gpe
|
|
|
- *
|
|
|
- * PARAMETERS: gpe_event_info - info for this GPE
|
|
|
- *
|
|
|
- * RETURN: Status
|
|
|
- *
|
|
|
- * DESCRIPTION: Determine if a a GPE is "wake-only".
|
|
|
- *
|
|
|
- * Called from Notify() code in interpreter when a "DeviceWake"
|
|
|
- * Notify comes in.
|
|
|
- *
|
|
|
- ******************************************************************************/
|
|
|
-
|
|
|
-acpi_status
|
|
|
-acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info)
|
|
|
-{
|
|
|
- acpi_status status;
|
|
|
-
|
|
|
- ACPI_FUNCTION_TRACE(ev_check_for_wake_only_gpe);
|
|
|
-
|
|
|
- if ((gpe_event_info) && /* Only >0 for _Lxx/_Exx */
|
|
|
- ((gpe_event_info->flags & ACPI_GPE_SYSTEM_MASK) == ACPI_GPE_SYSTEM_RUNNING)) { /* System state at GPE time */
|
|
|
- /* This must be a wake-only GPE, disable it */
|
|
|
-
|
|
|
- status = acpi_ev_disable_gpe(gpe_event_info);
|
|
|
-
|
|
|
- /* Set GPE to wake-only. Do not change wake disabled/enabled status */
|
|
|
-
|
|
|
- acpi_ev_set_gpe_type(gpe_event_info, ACPI_GPE_TYPE_WAKE);
|
|
|
-
|
|
|
- ACPI_INFO((AE_INFO,
|
|
|
- "GPE %p was updated from wake/run to wake-only",
|
|
|
- gpe_event_info));
|
|
|
-
|
|
|
- /* This was a wake-only GPE */
|
|
|
-
|
|
|
- return_ACPI_STATUS(AE_WAKE_ONLY_GPE);
|
|
|
- }
|
|
|
-
|
|
|
- return_ACPI_STATUS(AE_OK);
|
|
|
-}
|
|
|
-#endif
|