Skip to content

Commit

Permalink
ath10k: refactor suspend/resume functions
Browse files Browse the repository at this point in the history
Suspend/resume callbacks are not protected by configuration mutex
so adding such protection. Also in order to simplify implemetation
of suspend function wait queue is replaced by completion.

Signed-off-by: Marek Puzyniak <marek.puzyniak@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
  • Loading branch information
Marek Puzyniak authored and Kalle Valo committed Feb 13, 2014
1 parent fc36e3f commit 9042e17
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 20 deletions.
6 changes: 2 additions & 4 deletions drivers/net/wireless/ath/ath10k/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ static void ath10k_send_suspend_complete(struct ath10k *ar)
{
ath10k_dbg(ATH10K_DBG_BOOT, "boot suspend complete\n");

ar->is_target_paused = true;
wake_up(&ar->event_queue);
complete(&ar->target_suspend);
}

static int ath10k_init_connect_htc(struct ath10k *ar)
Expand Down Expand Up @@ -703,6 +702,7 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
init_completion(&ar->scan.started);
init_completion(&ar->scan.completed);
init_completion(&ar->scan.on_channel);
init_completion(&ar->target_suspend);

init_completion(&ar->install_key_done);
init_completion(&ar->vdev_setup_done);
Expand All @@ -726,8 +726,6 @@ struct ath10k *ath10k_core_create(void *hif_priv, struct device *dev,
INIT_WORK(&ar->wmi_mgmt_tx_work, ath10k_mgmt_over_wmi_tx_work);
skb_queue_head_init(&ar->wmi_mgmt_tx_queue);

init_waitqueue_head(&ar->event_queue);

INIT_WORK(&ar->restart_work, ath10k_core_restart);

return ar;
Expand Down
3 changes: 1 addition & 2 deletions drivers/net/wireless/ath/ath10k/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -375,8 +375,7 @@ struct ath10k {
const struct ath10k_hif_ops *ops;
} hif;

wait_queue_head_t event_queue;
bool is_target_paused;
struct completion target_suspend;

struct ath10k_bmi bmi;
struct ath10k_wmi wmi;
Expand Down
39 changes: 25 additions & 14 deletions drivers/net/wireless/ath/ath10k/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -3440,21 +3440,20 @@ static int ath10k_suspend(struct ieee80211_hw *hw,
struct ath10k *ar = hw->priv;
int ret;

ar->is_target_paused = false;
mutex_lock(&ar->conf_mutex);

reinit_completion(&ar->target_suspend);

ret = ath10k_wmi_pdev_suspend_target(ar);
if (ret) {
ath10k_warn("could not suspend target (%d)\n", ret);
return 1;
ret = 1;
goto exit;
}

ret = wait_event_interruptible_timeout(ar->event_queue,
ar->is_target_paused == true,
1 * HZ);
if (ret < 0) {
ath10k_warn("suspend interrupted (%d)\n", ret);
goto resume;
} else if (ret == 0) {
ret = wait_for_completion_timeout(&ar->target_suspend, 1 * HZ);

if (ret == 0) {
ath10k_warn("suspend timed out - target pause event never came\n");
goto resume;
}
Expand All @@ -3465,32 +3464,44 @@ static int ath10k_suspend(struct ieee80211_hw *hw,
goto resume;
}

return 0;
ret = 0;
goto exit;
resume:
ret = ath10k_wmi_pdev_resume_target(ar);
if (ret)
ath10k_warn("could not resume target (%d)\n", ret);
return 1;

ret = 1;
exit:
mutex_unlock(&ar->conf_mutex);
return ret;
}

static int ath10k_resume(struct ieee80211_hw *hw)
{
struct ath10k *ar = hw->priv;
int ret;

mutex_lock(&ar->conf_mutex);

ret = ath10k_hif_resume(ar);
if (ret) {
ath10k_warn("could not resume hif (%d)\n", ret);
return 1;
ret = 1;
goto exit;
}

ret = ath10k_wmi_pdev_resume_target(ar);
if (ret) {
ath10k_warn("could not resume target (%d)\n", ret);
return 1;
ret = 1;
goto exit;
}

return 0;
ret = 0;
exit:
mutex_unlock(&ar->conf_mutex);
return ret;
}
#endif

Expand Down

0 comments on commit 9042e17

Please sign in to comment.