]> Git Repo - linux.git/blob - drivers/net/wireless/ath/ath11k/wow.c
Merge tag 'net-5.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux.git] / drivers / net / wireless / ath / ath11k / wow.c
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2020 The Linux Foundation. All rights reserved.
4  */
5
6 #include <linux/delay.h>
7
8 #include "mac.h"
9 #include "core.h"
10 #include "hif.h"
11 #include "debug.h"
12 #include "wmi.h"
13 #include "wow.h"
14
15 int ath11k_wow_enable(struct ath11k_base *ab)
16 {
17         struct ath11k *ar = ath11k_ab_to_ar(ab, 0);
18         int i, ret;
19
20         clear_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
21
22         for (i = 0; i < ATH11K_WOW_RETRY_NUM; i++) {
23                 reinit_completion(&ab->htc_suspend);
24
25                 ret = ath11k_wmi_wow_enable(ar);
26                 if (ret) {
27                         ath11k_warn(ab, "failed to issue wow enable: %d\n", ret);
28                         return ret;
29                 }
30
31                 ret = wait_for_completion_timeout(&ab->htc_suspend, 3 * HZ);
32                 if (ret == 0) {
33                         ath11k_warn(ab,
34                                     "timed out while waiting for htc suspend completion\n");
35                         return -ETIMEDOUT;
36                 }
37
38                 if (test_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags))
39                         /* success, suspend complete received */
40                         return 0;
41
42                 ath11k_warn(ab, "htc suspend not complete, retrying (try %d)\n",
43                             i);
44                 msleep(ATH11K_WOW_RETRY_WAIT_MS);
45         }
46
47         ath11k_warn(ab, "htc suspend not complete, failing after %d tries\n", i);
48
49         return -ETIMEDOUT;
50 }
51
52 int ath11k_wow_wakeup(struct ath11k_base *ab)
53 {
54         struct ath11k *ar = ath11k_ab_to_ar(ab, 0);
55         int ret;
56
57         reinit_completion(&ab->wow.wakeup_completed);
58
59         ret = ath11k_wmi_wow_host_wakeup_ind(ar);
60         if (ret) {
61                 ath11k_warn(ab, "failed to send wow wakeup indication: %d\n",
62                             ret);
63                 return ret;
64         }
65
66         ret = wait_for_completion_timeout(&ab->wow.wakeup_completed, 3 * HZ);
67         if (ret == 0) {
68                 ath11k_warn(ab, "timed out while waiting for wow wakeup completion\n");
69                 return -ETIMEDOUT;
70         }
71
72         return 0;
73 }
This page took 0.038268 seconds and 4 git commands to generate.