Commit 863eac30 authored by Luca Coelho's avatar Luca Coelho Committed by Emmanuel Grumbach

iwlwifi: pcie: add pm_prepare and pm_complete ops

With these ops, we can know when we are about to enter system suspend.
This allows us to exit D0i3 state before entering suspend.
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 88076015
...@@ -836,6 +836,7 @@ struct iwl_trans { ...@@ -836,6 +836,7 @@ struct iwl_trans {
enum iwl_plat_pm_mode system_pm_mode; enum iwl_plat_pm_mode system_pm_mode;
enum iwl_plat_pm_mode runtime_pm_mode; enum iwl_plat_pm_mode runtime_pm_mode;
bool suspending;
/* pointer to trans specific struct */ /* pointer to trans specific struct */
/*Ensure that this pointer will always be aligned to sizeof pointer */ /*Ensure that this pointer will always be aligned to sizeof pointer */
......
...@@ -811,6 +811,45 @@ static int iwl_pci_runtime_resume(struct device *device) ...@@ -811,6 +811,45 @@ static int iwl_pci_runtime_resume(struct device *device)
return 0; return 0;
} }
static int iwl_pci_system_prepare(struct device *device)
{
struct pci_dev *pdev = to_pci_dev(device);
struct iwl_trans *trans = pci_get_drvdata(pdev);
IWL_DEBUG_RPM(trans, "preparing for system suspend\n");
/* This is called before entering system suspend and before
* the runtime resume is called. Set the suspending flag to
* prevent the wakelock from being taken.
*/
trans->suspending = true;
/* Wake the device up from runtime suspend before going to
* platform suspend. This is needed because we don't know
* whether wowlan any is set and, if it's not, mac80211 will
* disconnect (in which case, we can't be in D0i3).
*/
pm_runtime_resume(device);
return 0;
}
static void iwl_pci_system_complete(struct device *device)
{
struct pci_dev *pdev = to_pci_dev(device);
struct iwl_trans *trans = pci_get_drvdata(pdev);
IWL_DEBUG_RPM(trans, "completing system suspend\n");
/* This is called as a counterpart to the prepare op. It is
* called either when suspending fails or when suspend
* completed successfully. Now there's no risk of grabbing
* the wakelock anymore, so we can release the suspending
* flag.
*/
trans->suspending = false;
}
#endif /* CONFIG_IWLWIFI_PCIE_RTPM */ #endif /* CONFIG_IWLWIFI_PCIE_RTPM */
static const struct dev_pm_ops iwl_dev_pm_ops = { static const struct dev_pm_ops iwl_dev_pm_ops = {
...@@ -820,6 +859,8 @@ static const struct dev_pm_ops iwl_dev_pm_ops = { ...@@ -820,6 +859,8 @@ static const struct dev_pm_ops iwl_dev_pm_ops = {
SET_RUNTIME_PM_OPS(iwl_pci_runtime_suspend, SET_RUNTIME_PM_OPS(iwl_pci_runtime_suspend,
iwl_pci_runtime_resume, iwl_pci_runtime_resume,
NULL) NULL)
.prepare = iwl_pci_system_prepare,
.complete = iwl_pci_system_complete,
#endif /* CONFIG_IWLWIFI_PCIE_RTPM */ #endif /* CONFIG_IWLWIFI_PCIE_RTPM */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment