1. 05 2月, 2015 2 次提交
  2. 03 12月, 2014 1 次提交
  3. 02 12月, 2014 1 次提交
    • R
      ACPICA: Save current masks of enabled GPEs after enable register writes · c50f13c6
      Rafael J. Wysocki 提交于
      There is a race condition between acpi_hw_disable_all_gpes() or
      acpi_enable_all_wakeup_gpes() and acpi_ev_asynch_enable_gpe() such
      that if the latter wins the race, it may mistakenly enable a GPE
      disabled by the former.  This may lead to premature system wakeups
      during system suspend and potentially to more serious consequences.
      
      The source of the problem is how acpi_hw_low_set_gpe() works when
      passed ACPI_GPE_CONDITIONAL_ENABLE as the second argument.  In that
      case, the GPE will be enabled if the corresponding bit is set in the
      enable_for_run mask of the GPE enable register containing that bit.
      However, acpi_hw_disable_all_gpes() and acpi_enable_all_wakeup_gpes()
      don't modify the enable_for_run masks of GPE registers when writing
      to them.  In consequence, if acpi_ev_asynch_enable_gpe(), which
      eventually calls acpi_hw_low_set_gpe() with the second argument
      equal to ACPI_GPE_CONDITIONAL_ENABLE, is executed in parallel with
      one of these functions, it may reverse changes made by them.
      
      To fix the problem, introduce a new enable_mask field in struct
      acpi_gpe_register_info in which to store the current mask of
      enabled GPEs and modify acpi_hw_low_set_gpe() to take this
      mask into account instead of enable_for_run when its second
      argument is equal to ACPI_GPE_CONDITIONAL_ENABLE.  Also modify
      the low-level routines called by acpi_hw_disable_all_gpes(),
      acpi_enable_all_wakeup_gpes() and acpi_enable_all_runtime_gpes()
      to update the enable_mask masks of GPE registers after all
      (successful) writes to those registers.
      Acked-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      c50f13c6
  4. 21 10月, 2014 1 次提交
  5. 07 7月, 2014 1 次提交
  6. 07 5月, 2014 1 次提交
  7. 11 2月, 2014 1 次提交
  8. 31 10月, 2013 1 次提交
  9. 30 10月, 2013 1 次提交
  10. 16 6月, 2013 1 次提交
  11. 02 6月, 2013 1 次提交
  12. 12 3月, 2013 1 次提交
  13. 25 1月, 2013 1 次提交
  14. 10 1月, 2013 3 次提交
  15. 15 11月, 2012 1 次提交
  16. 21 9月, 2012 2 次提交
  17. 14 7月, 2012 1 次提交
  18. 22 3月, 2012 1 次提交
  19. 17 1月, 2012 1 次提交
  20. 03 3月, 2011 1 次提交
  21. 25 2月, 2011 1 次提交
    • R
      ACPI / ACPICA: Implicit notify for multiple devices · 981858bd
      Rafael J. Wysocki 提交于
      Commit bba63a29 (ACPICA: Implicit notify support) introduced a
      mechanism that causes a notify request of type
      ACPI_NOTIFY_DEVICE_WAKE to be queued automatically by
      acpi_ev_asynch_execute_gpe_method() for the device whose _PRW points
      to the GPE being handled if that GPE is not associated with an
      _Lxx/_Exx method.  However, it turns out that on some systems there
      are multiple devices with _PRW pointing to the same GPE without
      _Lxx/_Exx and the mechanism introduced by commit bba63a29 needs to be
      extended so that "implicit" notify requests of type
      ACPI_NOTIFY_DEVICE_WAKE can be queued automatically for all those
      devices at the same time.
      Reported-and-tested-by: NMatthew Garrett <mjg@redhat.com>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      981858bd
  22. 19 1月, 2011 2 次提交
  23. 12 1月, 2011 6 次提交
  24. 07 8月, 2010 1 次提交
    • R
      ACPI / ACPICA: Fix reference counting problems with GPE handlers · 28f4f8a9
      Rafael J. Wysocki 提交于
      If a handler is installed for a GPE associated with an AML method and
      such that it cannot wake up the system from sleep states, the GPE
      remains enabled after the handler has been installed, although it
      should be disabled in that case to avoid spurious execution of the
      handler.
      
      Fix this issue by making acpi_install_gpe_handler() disable GPEs
      that were previously associated with AML methods and cannot wake up
      the system from sleep states.
      
      Analogously, make acpi_remove_gpe_handler() enable the GPEs that
      are associated with AML methods after their handlers have been
      removed and cannot wake up the system from sleep states.  In addition
      to that, fix a code ordering issue in acpi_remove_gpe_handler() that
      renders the locking ineffective (ACPI_MTX_EVENTS is released
      temporarily in the middle of the routine to wait for the completion
      of events already in progress).
      
      For this purpose introduce acpi_raw_disable_gpe() and
      acpi_raw_enable_gpe() to be called with acpi_gbl_gpe_lock held
      and rework acpi_disable_gpe() and acpi_enable_gpe(), respectively, to
      use them.  Also rework acpi_gpe_can_wake() to use
      acpi_raw_disable_gpe() instead of calling acpi_disable_gpe() after
      releasing the lock to avoid the possible theoretical race with
      acpi_install_gpe_handler().
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Cc: "Moore, Robert" <robert.moore@intel.com>
      Cc: Lin Ming <ming.m.lin@intel.com>
      Signed-off-by: NLen Brown <len.brown@intel.com>
      28f4f8a9
  25. 07 7月, 2010 4 次提交
  26. 12 6月, 2010 2 次提交
    • R
      ACPI / ACPICA: Fix low-level GPE manipulation code · fd247447
      Rafael J. Wysocki 提交于
      ACPICA uses acpi_ev_enable_gpe() for enabling GPEs at the low level,
      which is incorrect, because this function only enables the GPE if the
      corresponding bit in its enable register's enable_for_run mask is set.
      This causes acpi_set_gpe() to work incorrectly if used for enabling
      GPEs that were not previously enabled with acpi_enable_gpe().  As a
      result, among other things, wakeup-only GPEs are never enabled by
      acpi_enable_wakeup_device(), so the devices that use them are unable
      to wake up the system.
      
      To fix this issue remove acpi_ev_enable_gpe() and its counterpart
      acpi_ev_disable_gpe() and replace acpi_hw_low_disable_gpe() with
      acpi_hw_low_set_gpe() that will be used instead to manipulate GPE
      enable bits at the low level.  Make the users of acpi_ev_enable_gpe()
      and acpi_ev_disable_gpe() call acpi_hw_low_set_gpe() instead and
      make sure that GPE enable masks are only updated by acpi_enable_gpe()
      and acpi_disable_gpe() when GPE reference counters change from 0
      to 1 and from 1 to 0, respectively.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NLen Brown <len.brown@intel.com>
      fd247447
    • R
      ACPI / ACPICA: Use helper function for computing GPE masks · e4e9a735
      Rafael J. Wysocki 提交于
      In quite a few places ACPICA needs to compute a GPE enable mask with
      only one bit, corresponding to a given GPE, set.  Currently, that
      computation is always open coded which leads to unnecessary code
      duplication.  Fix this by introducing a helper function for computing
      one-bit GPE enable masks and using it where appropriate.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NLen Brown <len.brown@intel.com>
      e4e9a735