blob: 988b166ae433da37269ff0dbefd5d61154c2ddcc [file] [log] [blame]
Mukul Sharmad75a6672017-06-22 15:40:53 +05301/*
Srikanth Marepalli72213312019-12-20 16:11:02 +05302 * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
Jeff Johnsonb4c29962017-10-07 19:35:14 -07003 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
Mukul Sharmad75a6672017-06-22 15:40:53 +053018/**
19 * DOC: Define API's for wow pattern addition and deletion in fwr
20 */
21
22#include "wlan_pmo_wow.h"
23#include "wlan_pmo_tgt_api.h"
24#include "wlan_pmo_main.h"
25#include "wlan_pmo_obj_mgmt_public_struct.h"
26#include <wlan_scan_ucfg_api.h>
27#include "wlan_pmo_static_config.h"
28#include "wlan_reg_services_api.h"
Manikandan Mohandcd0fdf2018-08-02 18:13:37 -070029#include "cfg_nan_api.h"
Abhishek Singh5ad797d2018-09-05 17:20:46 +053030#include "wlan_utility.h"
Mukul Sharmad75a6672017-06-22 15:40:53 +053031
Nachiket Kukade107f6392018-05-25 19:15:16 +053032void pmo_set_wow_event_bitmap(WOW_WAKE_EVENT_TYPE event,
33 uint32_t wow_bitmap_size,
34 uint32_t *bitmask)
35{
36 uint32_t bit_idx = 0, idx = 0;
37
38 if (!bitmask || wow_bitmap_size < PMO_WOW_MAX_EVENT_BM_LEN) {
39 pmo_err("wow bitmask length shorter than %d",
40 PMO_WOW_MAX_EVENT_BM_LEN);
41 return;
42 }
43 pmo_get_event_bitmap_idx(event, wow_bitmap_size, &bit_idx, &idx);
44 bitmask[idx] |= 1 << bit_idx;
45}
46
Ashish Kumar Dhanotiya68ee2e42018-11-19 21:15:14 +053047QDF_STATUS pmo_core_del_wow_pattern(struct wlan_objmgr_vdev *vdev)
48{
49 QDF_STATUS status;
50 uint8_t id;
51 uint8_t pattern_count;
52 struct pmo_vdev_priv_obj *vdev_ctx;
53
54 pmo_enter();
55 status = pmo_vdev_get_ref(vdev);
56 if (QDF_IS_STATUS_ERROR(status))
57 goto out;
58
59 vdev_ctx = pmo_vdev_get_priv(vdev);
60 pattern_count = pmo_get_wow_default_ptrn(vdev_ctx);
61 /* clear all default patterns cofigured by pmo */
62 for (id = 0; id < pattern_count; id++)
63 status = pmo_tgt_del_wow_pattern(vdev, id, false);
64
65 /* clear all user patterns cofigured by pmo */
66 pattern_count = pmo_get_wow_user_ptrn(vdev_ctx);
67 for (id = 0; id < pattern_count; id++)
68 status = pmo_tgt_del_wow_pattern(vdev, id, true);
69
70 pmo_vdev_put_ref(vdev);
71out:
72 pmo_exit();
73 return status;
74}
75
Mukul Sharma0c1c3792017-11-02 17:08:23 +053076QDF_STATUS pmo_core_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
77 struct pmo_wow_add_pattern *ptrn)
Mukul Sharmad75a6672017-06-22 15:40:53 +053078{
Mukul Sharma0c1c3792017-11-02 17:08:23 +053079 QDF_STATUS status;
80 uint8_t id;
81 uint8_t bit_to_check, pos;
82 uint8_t new_mask[PMO_WOWL_BCAST_PATTERN_MAX_SIZE];
83 struct pmo_vdev_priv_obj *vdev_ctx;
Mukul Sharmad75a6672017-06-22 15:40:53 +053084
Mukul Sharma0c1c3792017-11-02 17:08:23 +053085 status = pmo_vdev_get_ref(vdev);
86 if (QDF_IS_STATUS_ERROR(status))
87 goto out;
88
89 vdev_ctx = pmo_vdev_get_priv(vdev);
90
91 /* clear all default patterns cofigured by pmo */
92 for (id = 0; id < pmo_get_wow_default_ptrn(vdev_ctx); id++)
93 pmo_tgt_del_wow_pattern(vdev, id, false);
94
95 pmo_set_wow_default_ptrn(vdev_ctx, 0);
96
97 pmo_debug("Add user passed wow pattern id %d vdev id %d",
Jeff Johnsone7239952019-02-25 08:17:31 -080098 ptrn->pattern_id, wlan_vdev_get_id(vdev));
Mukul Sharma0c1c3792017-11-02 17:08:23 +053099 /*
100 * Convert received pattern mask value from bit representation
101 * to byte representation.
102 *
103 * For example, received value from umac,
104 *
105 * Mask value : A1 (equivalent binary is "1010 0001")
106 * Pattern value : 12:00:13:00:00:00:00:44
107 *
108 * The value which goes to FW after the conversion from this
109 * function (1 in mask value will become FF and 0 will
110 * become 00),
111 *
Dustin Brown0b703ef2018-03-02 15:02:12 -0800112 * Mask value : FF:00:FF:00:00:00:00:FF
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530113 * Pattern value : 12:00:13:00:00:00:00:44
114 */
115 qdf_mem_zero(new_mask, sizeof(new_mask));
116 for (pos = 0; pos < ptrn->pattern_size; pos++) {
117 bit_to_check = (PMO_NUM_BITS_IN_BYTE - 1) -
118 (pos % PMO_NUM_BITS_IN_BYTE);
119 bit_to_check = 0x1 << bit_to_check;
120 if (ptrn->pattern_mask[pos / PMO_NUM_BITS_IN_BYTE] &
Arif Hussainee10f902017-12-27 16:30:17 -0800121 bit_to_check)
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530122 new_mask[pos] = PMO_WOW_PTRN_MASK_VALID;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530123 }
124
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530125 status = pmo_tgt_send_wow_patterns_to_fw(vdev,
Arif Hussainee10f902017-12-27 16:30:17 -0800126 ptrn->pattern_id,
127 ptrn->pattern,
128 ptrn->pattern_size,
129 ptrn->pattern_byte_offset,
130 new_mask,
131 ptrn->pattern_size, true);
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530132 if (status != QDF_STATUS_SUCCESS)
133 pmo_err("Failed to add wow pattern %d", ptrn->pattern_id);
134
135 pmo_vdev_put_ref(vdev);
136out:
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700137 pmo_exit();
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530138
139 return status;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530140}
141
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530142QDF_STATUS pmo_core_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
143 uint8_t pattern_id)
Mukul Sharmad75a6672017-06-22 15:40:53 +0530144{
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530145 QDF_STATUS status;
146 struct pmo_vdev_priv_obj *vdev_ctx;
147
148 status = pmo_vdev_get_ref(vdev);
149 if (QDF_IS_STATUS_ERROR(status))
150 goto out;
151
152 vdev_ctx = pmo_vdev_get_priv(vdev);
153 if (pmo_get_wow_user_ptrn(vdev_ctx) <= 0) {
154 pmo_err("No valid user pattern. Num user pattern %u",
155 pmo_get_wow_user_ptrn(vdev_ctx));
156 status = QDF_STATUS_E_INVAL;
157 goto rel_ref;
158 }
159
160 pmo_debug("Delete user passed wow pattern id %d total user pattern %d",
Arif Hussainee10f902017-12-27 16:30:17 -0800161 pattern_id, pmo_get_wow_user_ptrn(vdev_ctx));
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530162
163 pmo_tgt_del_wow_pattern(vdev, pattern_id, true);
164
165 /* configure default patterns once all user patterns are deleted */
166 if (!pmo_get_wow_user_ptrn(vdev_ctx))
167 pmo_register_wow_default_patterns(vdev);
168rel_ref:
169 pmo_vdev_put_ref(vdev);
170out:
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700171 pmo_exit();
Mukul Sharma0c1c3792017-11-02 17:08:23 +0530172
173 return status;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530174}
175
Mukul Sharmad75a6672017-06-22 15:40:53 +0530176void pmo_core_enable_wakeup_event(struct wlan_objmgr_psoc *psoc,
Nachiket Kukade107f6392018-05-25 19:15:16 +0530177 uint32_t vdev_id,
178 WOW_WAKE_EVENT_TYPE wow_event)
Mukul Sharmad75a6672017-06-22 15:40:53 +0530179{
180 QDF_STATUS status;
181 struct wlan_objmgr_vdev *vdev;
Nachiket Kukade107f6392018-05-25 19:15:16 +0530182 uint32_t bitmap[PMO_WOW_MAX_EVENT_BM_LEN] = {0};
Mukul Sharmad75a6672017-06-22 15:40:53 +0530183
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700184 pmo_enter();
Dustin Brownf2e2fac2018-03-02 15:34:22 -0800185
Mukul Sharmad75a6672017-06-22 15:40:53 +0530186 if (!psoc) {
187 pmo_err("psoc is null");
188 goto out;
189 }
190
191 vdev = pmo_psoc_get_vdev(psoc, vdev_id);
192 if (!vdev) {
193 pmo_err("vdev is NULL");
194 goto out;
195 }
196
197 status = pmo_vdev_get_ref(vdev);
198 if (QDF_IS_STATUS_ERROR(status))
199 goto out;
200
Nachiket Kukade107f6392018-05-25 19:15:16 +0530201 pmo_set_wow_event_bitmap(wow_event, PMO_WOW_MAX_EVENT_BM_LEN, bitmap);
202
Mukul Sharmad75a6672017-06-22 15:40:53 +0530203 pmo_tgt_enable_wow_wakeup_event(vdev, bitmap);
204
205 pmo_vdev_put_ref(vdev);
206
207out:
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700208 pmo_exit();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530209}
210
211void pmo_core_disable_wakeup_event(struct wlan_objmgr_psoc *psoc,
Nachiket Kukade107f6392018-05-25 19:15:16 +0530212 uint32_t vdev_id,
213 WOW_WAKE_EVENT_TYPE wow_event)
Mukul Sharmad75a6672017-06-22 15:40:53 +0530214{
215 QDF_STATUS status;
216 struct wlan_objmgr_vdev *vdev;
Nachiket Kukade107f6392018-05-25 19:15:16 +0530217 uint32_t bitmap[PMO_WOW_MAX_EVENT_BM_LEN] = {0};
Mukul Sharmad75a6672017-06-22 15:40:53 +0530218
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700219 pmo_enter();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530220 if (!psoc) {
221 pmo_err("psoc is null");
222 goto out;
223 }
224
225 vdev = pmo_psoc_get_vdev(psoc, vdev_id);
226 if (!vdev) {
227 pmo_err("vdev is NULL");
228 goto out;
229 }
230
231 status = pmo_vdev_get_ref(vdev);
232 if (QDF_IS_STATUS_ERROR(status))
233 goto out;
234
Nachiket Kukade107f6392018-05-25 19:15:16 +0530235 pmo_set_wow_event_bitmap(wow_event, PMO_WOW_MAX_EVENT_BM_LEN, bitmap);
236
Mukul Sharmad75a6672017-06-22 15:40:53 +0530237 pmo_tgt_disable_wow_wakeup_event(vdev, bitmap);
238
239 pmo_vdev_put_ref(vdev);
240
241out:
Dustin Brownb2cd2e02018-03-15 11:59:45 -0700242 pmo_exit();
Mukul Sharmad75a6672017-06-22 15:40:53 +0530243}
244
245/**
246 * pmo_is_beaconing_vdev_up(): check if a beaconning vdev is up
247 * @psoc: objmgr psoc handle
248 *
249 * Return TRUE if beaconning vdev is up
250 */
251static
252bool pmo_is_beaconing_vdev_up(struct wlan_objmgr_psoc *psoc)
253{
254 int vdev_id;
255 struct wlan_objmgr_vdev *vdev;
Jeff Johnsonc1e62782017-11-09 09:50:17 -0800256 enum QDF_OPMODE vdev_opmode;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530257 bool is_beaconing;
258 QDF_STATUS status;
259
260 /* Iterate through VDEV list */
261 for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
262 vdev = pmo_psoc_get_vdev(psoc, vdev_id);
263 if (!vdev)
264 continue;
265
266 status = pmo_vdev_get_ref(vdev);
267 if (QDF_IS_STATUS_ERROR(status))
268 continue;
269
270 vdev_opmode = pmo_get_vdev_opmode(vdev);
271 is_beaconing = pmo_is_vdev_in_beaconning_mode(vdev_opmode) &&
Abhishek Singhd5cf22d2019-01-08 19:51:09 +0530272 QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
Mukul Sharmad75a6672017-06-22 15:40:53 +0530273
274 pmo_vdev_put_ref(vdev);
275
276 if (is_beaconing)
277 return true;
278 }
279
280 return false;
281}
282
283/**
284 * pmo_support_wow_for_beaconing: wow query for beaconning
285 * @psoc: objmgr psoc handle
286 *
287 * Need to configure wow to enable beaconning offload when
288 * a beaconing vdev is up and beaonning offload is configured.
289 *
290 * Return: true if we need to enable wow for beaconning offload
291 */
292static
293bool pmo_support_wow_for_beaconing(struct wlan_objmgr_psoc *psoc)
294{
295 /*
Sourav Mohapatra89c85d12017-12-01 09:17:54 +0530296 * if (wmi_service_enabled(wma->wmi_handle,
297 * wmi_service_beacon_offload))
Mukul Sharmad75a6672017-06-22 15:40:53 +0530298 */
299 return pmo_is_beaconing_vdev_up(psoc);
300}
301
302bool pmo_core_is_wow_applicable(struct wlan_objmgr_psoc *psoc)
303{
304 int vdev_id;
305 struct wlan_objmgr_vdev *vdev;
Naveen Rawatb91e6eb2018-01-06 17:36:16 -0800306 bool is_wow_applicable = false;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530307 QDF_STATUS status;
308
309 if (!psoc) {
310 pmo_err("psoc is null");
311 return false;
312 }
313
314 if (pmo_support_wow_for_beaconing(psoc)) {
315 pmo_debug("one of vdev is in beaconning mode, enabling wow");
316 return true;
317 }
318
319 if (wlan_reg_is_11d_scan_inprogress(psoc)) {
320 pmo_debug("11d scan is in progress, enabling wow");
321 return true;
322 }
323
Rajeev Kumar1f97e102018-12-05 17:07:27 -0800324 if (pmo_core_is_lpass_enabled(psoc)) {
325 pmo_info("lpass enabled, enabling wow");
326 return true;
327 }
328
329 if (cfg_nan_get_enable(psoc)) {
330 pmo_debug("nan enabled, enabling wow");
331 return true;
332 }
333
Mukul Sharmad75a6672017-06-22 15:40:53 +0530334 /* Iterate through VDEV list */
335 for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
336 vdev = pmo_psoc_get_vdev(psoc, vdev_id);
337 if (!vdev)
338 continue;
339
340 status = pmo_vdev_get_ref(vdev);
341 if (QDF_IS_STATUS_ERROR(status))
342 continue;
343
Bala Venkatesh0f745452019-03-29 11:16:22 +0530344 if (wlan_vdev_is_up(vdev) == QDF_STATUS_SUCCESS) {
Mukul Sharmad75a6672017-06-22 15:40:53 +0530345 pmo_debug("STA is connected, enabling wow");
346 is_wow_applicable = true;
347 } else if (ucfg_scan_get_pno_in_progress(vdev)) {
348 pmo_debug("NLO is in progress, enabling wow");
349 is_wow_applicable = true;
350 } else if (pmo_core_is_extscan_in_progress(vdev)) {
351 pmo_debug("EXT is in progress, enabling wow");
352 is_wow_applicable = true;
353 } else if (pmo_core_is_p2plo_in_progress(vdev)) {
354 pmo_debug("P2P LO is in progress, enabling wow");
355 is_wow_applicable = true;
Mukul Sharmad75a6672017-06-22 15:40:53 +0530356 } else if (pmo_core_get_vdev_op_mode(vdev) == QDF_NDI_MODE) {
357 pmo_debug("vdev %d is in NAN data mode, enabling wow",
Arif Hussainee10f902017-12-27 16:30:17 -0800358 vdev_id);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530359 is_wow_applicable = true;
360 }
361
362 pmo_vdev_put_ref(vdev);
363
364 if (is_wow_applicable)
365 return true;
366 }
367
368 pmo_debug("All vdev are in disconnected state\n"
Arif Hussainee10f902017-12-27 16:30:17 -0800369 "and pno/extscan is not in progress, skipping wow");
Mukul Sharmad75a6672017-06-22 15:40:53 +0530370
371 return false;
372}
373
Mukul Sharmad75a6672017-06-22 15:40:53 +0530374void pmo_set_sta_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmap_size)
375{
376
377 pmo_set_wow_event_bitmap(WOW_CSA_IE_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800378 wow_bitmap_size,
379 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530380 pmo_set_wow_event_bitmap(WOW_CLIENT_KICKOUT_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800381 wow_bitmap_size,
382 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530383 pmo_set_wow_event_bitmap(WOW_PATTERN_MATCH_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800384 wow_bitmap_size,
385 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530386 pmo_set_wow_event_bitmap(WOW_MAGIC_PKT_RECVD_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800387 wow_bitmap_size,
388 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530389 pmo_set_wow_event_bitmap(WOW_DEAUTH_RECVD_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800390 wow_bitmap_size,
391 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530392 pmo_set_wow_event_bitmap(WOW_DISASSOC_RECVD_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800393 wow_bitmap_size,
394 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530395 pmo_set_wow_event_bitmap(WOW_BMISS_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800396 wow_bitmap_size,
397 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530398 pmo_set_wow_event_bitmap(WOW_GTK_ERR_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800399 wow_bitmap_size,
400 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530401 pmo_set_wow_event_bitmap(WOW_BETTER_AP_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800402 wow_bitmap_size,
403 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530404 pmo_set_wow_event_bitmap(WOW_HTT_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800405 wow_bitmap_size,
406 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530407 pmo_set_wow_event_bitmap(WOW_RA_MATCH_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800408 wow_bitmap_size,
409 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530410 pmo_set_wow_event_bitmap(WOW_NLO_DETECTED_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800411 wow_bitmap_size,
412 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530413 pmo_set_wow_event_bitmap(WOW_EXTSCAN_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800414 wow_bitmap_size,
415 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530416 pmo_set_wow_event_bitmap(WOW_OEM_RESPONSE_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800417 wow_bitmap_size,
418 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530419 pmo_set_wow_event_bitmap(WOW_TDLS_CONN_TRACKER_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800420 wow_bitmap_size,
421 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530422 pmo_set_wow_event_bitmap(WOW_11D_SCAN_EVENT,
423 wow_bitmap_size,
424 bitmask);
Yue Mace4879b2019-08-08 17:40:03 -0700425 pmo_set_wow_event_bitmap(WOW_NLO_SCAN_COMPLETE_EVENT,
426 wow_bitmap_size,
427 bitmask);
Pragaspathi Thilagaraj0c4489f2019-08-05 20:50:23 +0530428 /*
429 * WPA3 roaming offloads SAE authentication to wpa_supplicant
430 * Firmware will send WMI_ROAM_PREAUTH_STATUS_CMDID
431 */
432 pmo_set_wow_event_bitmap(WOW_ROAM_PREAUTH_START_EVENT,
433 wow_bitmap_size,
434 bitmask);
Srikanth Marepalli72213312019-12-20 16:11:02 +0530435 pmo_set_wow_event_bitmap(WOW_ROAM_PMKID_REQUEST_EVENT,
436 wow_bitmap_size,
437 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530438}
439
440void pmo_set_sap_wow_bitmask(uint32_t *bitmask, uint32_t wow_bitmap_size)
441{
Rajeev Kumarc80f9102019-03-05 14:27:45 -0800442 pmo_set_wow_event_bitmap(WOW_CLIENT_KICKOUT_EVENT,
443 wow_bitmap_size,
444 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530445 pmo_set_wow_event_bitmap(WOW_PROBE_REQ_WPS_IE_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800446 wow_bitmap_size,
447 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530448 pmo_set_wow_event_bitmap(WOW_PATTERN_MATCH_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800449 wow_bitmap_size,
450 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530451 pmo_set_wow_event_bitmap(WOW_AUTH_REQ_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800452 wow_bitmap_size,
453 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530454 pmo_set_wow_event_bitmap(WOW_ASSOC_REQ_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800455 wow_bitmap_size,
456 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530457 pmo_set_wow_event_bitmap(WOW_DEAUTH_RECVD_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800458 wow_bitmap_size,
459 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530460 pmo_set_wow_event_bitmap(WOW_DISASSOC_RECVD_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800461 wow_bitmap_size,
462 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530463 pmo_set_wow_event_bitmap(WOW_HTT_EVENT,
Arif Hussainee10f902017-12-27 16:30:17 -0800464 wow_bitmap_size,
465 bitmask);
466 pmo_set_wow_event_bitmap(WOW_SAP_OBSS_DETECTION_EVENT,
467 wow_bitmap_size,
468 bitmask);
Arif Hussain05fb4872018-01-03 16:02:55 -0800469 pmo_set_wow_event_bitmap(WOW_BSS_COLOR_COLLISION_DETECT_EVENT,
470 wow_bitmap_size,
471 bitmask);
Mukul Sharmad75a6672017-06-22 15:40:53 +0530472}
Dustin Brownb9987af2018-03-01 17:15:11 -0800473
474uint8_t pmo_get_num_wow_filters(struct wlan_objmgr_psoc *psoc)
475{
476 struct pmo_psoc_priv_obj *psoc_ctx;
Dustin Browned76c192018-03-07 17:29:33 -0800477 bool apf = false;
Dustin Browned76c192018-03-07 17:29:33 -0800478 bool pkt_filter = false;
Dustin Brownb9987af2018-03-01 17:15:11 -0800479
480 pmo_psoc_with_ctx(psoc, psoc_ctx) {
481 apf = pmo_intersect_apf(psoc_ctx);
Dustin Brownb9987af2018-03-01 17:15:11 -0800482 pkt_filter = pmo_intersect_packet_filter(psoc_ctx);
483 }
484
485 if (!apf && !pkt_filter)
486 return PMO_WOW_FILTERS_MAX;
487
Dustin Brownb9987af2018-03-01 17:15:11 -0800488 return PMO_WOW_FILTERS_PKT_OR_APF;
489}
490