diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath11k/pci.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath11k/pci.c | 44 | 
1 files changed, 37 insertions, 7 deletions
diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c index be9d2c69cc41..8d63b84d1261 100644 --- a/drivers/net/wireless/ath/ath11k/pci.c +++ b/drivers/net/wireless/ath/ath11k/pci.c @@ -638,7 +638,7 @@ static int ath11k_pci_power_up(struct ath11k_base *ab)  	return 0;  } -static void ath11k_pci_power_down(struct ath11k_base *ab) +static void ath11k_pci_power_down(struct ath11k_base *ab, bool is_suspend)  {  	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab); @@ -649,7 +649,7 @@ static void ath11k_pci_power_down(struct ath11k_base *ab)  	ath11k_pci_msi_disable(ab_pci); -	ath11k_mhi_stop(ab_pci); +	ath11k_mhi_stop(ab_pci, is_suspend);  	clear_bit(ATH11K_FLAG_DEVICE_INIT_DONE, &ab->dev_flags);  	ath11k_pci_sw_reset(ab_pci->ab, false);  } @@ -970,7 +970,7 @@ static void ath11k_pci_remove(struct pci_dev *pdev)  	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);  	if (test_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags)) { -		ath11k_pci_power_down(ab); +		ath11k_pci_power_down(ab, false);  		ath11k_debugfs_soc_destroy(ab);  		ath11k_qmi_deinit_service(ab);  		goto qmi_fail; @@ -998,7 +998,7 @@ static void ath11k_pci_shutdown(struct pci_dev *pdev)  	struct ath11k_pci *ab_pci = ath11k_pci_priv(ab);  	ath11k_pci_set_irq_affinity_hint(ab_pci, NULL); -	ath11k_pci_power_down(ab); +	ath11k_pci_power_down(ab, false);  }  static __maybe_unused int ath11k_pci_pm_suspend(struct device *dev) @@ -1035,9 +1035,39 @@ static __maybe_unused int ath11k_pci_pm_resume(struct device *dev)  	return ret;  } -static SIMPLE_DEV_PM_OPS(ath11k_pci_pm_ops, -			 ath11k_pci_pm_suspend, -			 ath11k_pci_pm_resume); +static __maybe_unused int ath11k_pci_pm_suspend_late(struct device *dev) +{ +	struct ath11k_base *ab = dev_get_drvdata(dev); +	int ret; + +	ret = ath11k_core_suspend_late(ab); +	if (ret) +		ath11k_warn(ab, "failed to late suspend core: %d\n", ret); + +	/* Similar to ath11k_pci_pm_suspend(), we return success here +	 * even error happens, to allow system suspend/hibernation survive. +	 */ +	return 0; +} + +static __maybe_unused int ath11k_pci_pm_resume_early(struct device *dev) +{ +	struct ath11k_base *ab = dev_get_drvdata(dev); +	int ret; + +	ret = ath11k_core_resume_early(ab); +	if (ret) +		ath11k_warn(ab, "failed to early resume core: %d\n", ret); + +	return ret; +} + +static const struct dev_pm_ops __maybe_unused ath11k_pci_pm_ops = { +	SET_SYSTEM_SLEEP_PM_OPS(ath11k_pci_pm_suspend, +				ath11k_pci_pm_resume) +	SET_LATE_SYSTEM_SLEEP_PM_OPS(ath11k_pci_pm_suspend_late, +				     ath11k_pci_pm_resume_early) +};  static struct pci_driver ath11k_pci_driver = {  	.name = "ath11k_pci",  |