wifi: ath11k: introduce ath11k_core_continue_suspend_resume()
Currently ath11k_core_suspend() and ath11k_core_resume() have the same check before going on. In upcoming patches the check is needed by some newly added functions as well. To avoid duplicate code, introduce a new helper ath11k_core_continue_suspend_resume() which does such check internally. Callers can decide whether to go on based on its return value. Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30 Tested-by: Muhammad Usama Anjum <usama.anjum@collabora.com> Tested-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com> Link: https://patch.msgid.link/20250328-ath11k-bring-hibernation-back-v3-2-23405ae23431@quicinc.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
committed by
Jeff Johnson
parent
ce8669a270
commit
3d2ce6ad91
@@ -953,13 +953,6 @@ static const struct dmi_system_id ath11k_pm_quirk_table[] = {
|
||||
{}
|
||||
};
|
||||
|
||||
static inline struct ath11k_pdev *ath11k_core_get_single_pdev(struct ath11k_base *ab)
|
||||
{
|
||||
WARN_ON(!ab->hw_params.single_pdev_only);
|
||||
|
||||
return &ab->pdevs[0];
|
||||
}
|
||||
|
||||
void ath11k_fw_stats_pdevs_free(struct list_head *head)
|
||||
{
|
||||
struct ath11k_fw_stats_pdev *i, *tmp;
|
||||
@@ -1018,23 +1011,37 @@ bool ath11k_core_coldboot_cal_support(struct ath11k_base *ab)
|
||||
return ab->hw_params.coldboot_cal_mm;
|
||||
}
|
||||
|
||||
int ath11k_core_suspend(struct ath11k_base *ab)
|
||||
/* Check if we need to continue with suspend/resume operation.
|
||||
* Return:
|
||||
* a negative value: error happens and don't continue.
|
||||
* 0: no error but don't continue.
|
||||
* positive value: no error and do continue.
|
||||
*/
|
||||
static int ath11k_core_continue_suspend_resume(struct ath11k_base *ab)
|
||||
{
|
||||
int ret;
|
||||
struct ath11k_pdev *pdev;
|
||||
struct ath11k *ar;
|
||||
|
||||
if (!ab->hw_params.supports_suspend)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* so far single_pdev_only chips have supports_suspend as true
|
||||
* and only the first pdev is valid.
|
||||
* so pass 0 as a dummy pdev_id here.
|
||||
*/
|
||||
pdev = ath11k_core_get_single_pdev(ab);
|
||||
ar = pdev->ar;
|
||||
ar = ab->pdevs[0].ar;
|
||||
if (!ar || ar->state != ATH11K_STATE_OFF)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ath11k_core_suspend(struct ath11k_base *ab)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ath11k_core_continue_suspend_resume(ab);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
ret = ath11k_dp_rx_pktlog_stop(ab, true);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to stop dp rx (and timer) pktlog during suspend: %d\n",
|
||||
@@ -1042,7 +1049,10 @@ int ath11k_core_suspend(struct ath11k_base *ab)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ath11k_mac_wait_tx_complete(ar);
|
||||
/* So far only single_pdev_only devices can reach here,
|
||||
* so it is valid to handle the first, and the only, pdev.
|
||||
*/
|
||||
ret = ath11k_mac_wait_tx_complete(ab->pdevs[0].ar);
|
||||
if (ret) {
|
||||
ath11k_warn(ab, "failed to wait tx complete: %d\n", ret);
|
||||
return ret;
|
||||
@@ -1080,19 +1090,10 @@ EXPORT_SYMBOL(ath11k_core_suspend);
|
||||
int ath11k_core_resume(struct ath11k_base *ab)
|
||||
{
|
||||
int ret;
|
||||
struct ath11k_pdev *pdev;
|
||||
struct ath11k *ar;
|
||||
|
||||
if (!ab->hw_params.supports_suspend)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* so far signle_pdev_only chips have supports_suspend as true
|
||||
* and only the first pdev is valid.
|
||||
*/
|
||||
pdev = ath11k_core_get_single_pdev(ab);
|
||||
ar = pdev->ar;
|
||||
if (!ar || ar->state != ATH11K_STATE_OFF)
|
||||
return 0;
|
||||
ret = ath11k_core_continue_suspend_resume(ab);
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
|
||||
ret = ath11k_hif_resume(ab);
|
||||
if (ret) {
|
||||
|
||||
Reference in New Issue
Block a user