1  /*
2   * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4   *
5   * Permission to use, copy, modify, and/or distribute this software for
6   * any purpose with or without fee is hereby granted, provided that the
7   * above copyright notice and this permission notice appear in all
8   * copies.
9   *
10   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11   * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12   * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13   * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14   * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15   * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17   * PERFORMANCE OF THIS SOFTWARE.
18   */
19  /**
20   * DOC: Declare API's for wow pattern addition and deletion in fwr
21   */
22  
23  #ifndef _WLAN_PMO_WOW_H_
24  #define _WLAN_PMO_WOW_H_
25  
26  #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
27  
28  #include "wlan_pmo_main.h"
29  #include "wlan_pmo_wow_public_struct.h"
30  #include "wlan_pmo_tgt_api.h"
31  #include "wlan_pmo_common_public_struct.h"
32  #include "wlan_pmo_obj_mgmt_public_struct.h"
33  
34  /**
35   * DOC: wlan_pmo_wowl
36   *
37   * This module houses all the logic for WOW(wake on wireless) in
38   * PMO(Power Management and Offload).
39   *
40   * It provides the following APIs
41   *
42   * - Ability to enable/disable following WoWL modes
43   *  1) Magic packet (MP) mode
44   *  2) Pattern Byte Matching (PBM) mode
45   * - Ability to add/remove patterns for PBM
46   *
47   * A Magic Packet is a packet that contains 6 0xFFs followed by 16
48   * contiguous copies of the receiving NIC's Ethernet address. There is
49   * no API to configure Magic Packet Pattern.
50   *
51   * Wakeup pattern (used for PBM) is defined as following:
52   * struct
53   * {
54   *  U8  PatternSize;                  // Non-Zero pattern size
55   *  U8  PatternMaskSize;              // Non-zero pattern mask size
56   *  U8  PatternMask[PatternMaskSize]; // Pattern mask
57   *  U8  Pattern[PatternSize];         // Pattern
58   * } hdd_wowl_ptrn_t;
59   *
60   * PatternSize and PatternMaskSize indicate size of the variable
61   * length Pattern and PatternMask. PatternMask indicates which bytes
62   * of an incoming packet should be compared with corresponding bytes
63   * in the pattern.
64   *
65   * Maximum allowed pattern size is 128 bytes. Maximum allowed
66   * PatternMaskSize is 16 bytes.
67   *
68   * Maximum number of patterns that can be configured is 8
69   *
70   * PMO will add following 2 commonly used patterns for PBM by default:
71   *  1) ARP Broadcast Pattern
72   *  2) Unicast Pattern
73   *
74   * However note that WoWL will not be enabled by default by PMO. WoWL
75   * needs to enabled explcitly by exercising the iwpriv command.
76   *
77   * PMO will expose an API that accepts patterns as Hex string in the
78   * following format:
79   * "PatternSize:PatternMaskSize:PatternMask:Pattern"
80   *
81   * Multiple patterns can be specified by deleimiting each pattern with
82   * the ';' token:
83   * "PatternSize1:PatternMaskSize1:PatternMask1:Pattern1;PatternSize2:..."
84   *
85   * Patterns can be configured dynamically via iwpriv cmd or statically
86   * via qcom_cfg.ini file
87   *
88   * PBM (when enabled) can perform filtering on unicast data or
89   * broadcast data or both. These configurations are part of factory
90   * default (cfg.dat) and the default behavior is to perform filtering
91   * on both unicast and data frames.
92   *
93   * MP filtering (when enabled) is performed ALWAYS on both unicast and
94   * broadcast data frames.
95   *
96   * Management frames are not subjected to WoWL filtering and are
97   * discarded when WoWL is enabled.
98   *
99   * Whenever a pattern match succeeds, RX path is restored and packets
100   * (both management and data) will be pushed to the host from that
101   * point onwards.  Therefore, exit from WoWL is implicit and happens
102   * automatically when the first packet match succeeds.
103   *
104   * WoWL works on top of BMPS. So when WoWL is requested, SME will
105   * attempt to put the device in BMPS mode (if not already in BMPS). If
106   * attempt to BMPS fails, request for WoWL will be rejected.
107   */
108  
109  #define PMO_WOW_MAX_EVENT_BM_LEN 4
110  
111  #define PMO_WOW_FILTERS_ARP_NS		2
112  #define PMO_WOW_FILTERS_PKT_OR_APF	6
113  
114  /**
115   * pmo_get_and_increment_wow_default_ptrn() -Get and increment wow default ptrn
116   * @vdev_ctx: pmo vdev priv ctx
117   *
118   * API to get and increment wow default ptrn
119   *
120   * Return: current wow default ptrn count
121   */
pmo_get_and_increment_wow_default_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)122  static inline uint8_t pmo_get_and_increment_wow_default_ptrn(
123  		struct pmo_vdev_priv_obj *vdev_ctx)
124  {
125  	uint8_t count;
126  
127  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
128  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
129  		count = vdev_ctx->num_wow_default_patterns++;
130  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
131  	} else {
132  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
133  		count = vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++;
134  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
135  	}
136  
137  	return count;
138  }
139  
140  /**
141   * pmo_increment_wow_default_ptrn() -increment wow default ptrn
142   * @vdev_ctx: pmo vdev priv ctx
143   *
144   * API to increment wow default ptrn
145   *
146   * Return: None
147   */
pmo_increment_wow_default_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)148  static inline void pmo_increment_wow_default_ptrn(
149  		struct pmo_vdev_priv_obj *vdev_ctx)
150  {
151  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
152  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
153  		vdev_ctx->num_wow_default_patterns++;
154  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
155  	} else {
156  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
157  		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def++;
158  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
159  	}
160  }
161  
162  /**
163   * pmo_decrement_wow_default_ptrn() -decrement wow default ptrn
164   * @vdev_ctx: pmo vdev priv ctx
165   *
166   * API to decrement wow default ptrn
167   *
168   * Return: None
169   */
pmo_decrement_wow_default_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)170  static inline void pmo_decrement_wow_default_ptrn(
171  		struct pmo_vdev_priv_obj *vdev_ctx)
172  {
173  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
174  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
175  		vdev_ctx->num_wow_default_patterns--;
176  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
177  	} else {
178  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
179  		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def--;
180  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
181  	}
182  }
183  
184  /**
185   * pmo_get_wow_default_ptrn() -Get wow default ptrn
186   * @vdev_ctx: pmo vdev priv ctx
187   *
188   * API to get wow default ptrn
189   *
190   * Return: current wow default ptrn count
191   */
pmo_get_wow_default_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)192  static inline uint8_t pmo_get_wow_default_ptrn(
193  		struct pmo_vdev_priv_obj *vdev_ctx)
194  {
195  	uint8_t count;
196  
197  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
198  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
199  		count = vdev_ctx->num_wow_default_patterns;
200  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
201  	} else {
202  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
203  		count = vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def;
204  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
205  	}
206  
207  	return count;
208  }
209  
210  /**
211   * pmo_set_wow_default_ptrn() - Set wow default ptrn
212   * @vdev_ctx: pmo vdev priv ctx
213   * @value: WoW default pattern
214   *
215   * API to set wow default ptrn
216   *
217   * Return: Set wow default ptrn count
218   */
pmo_set_wow_default_ptrn(struct pmo_vdev_priv_obj * vdev_ctx,uint8_t value)219  static inline void pmo_set_wow_default_ptrn(
220  		struct pmo_vdev_priv_obj *vdev_ctx, uint8_t value)
221  {
222  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
223  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
224  		vdev_ctx->num_wow_default_patterns = value;
225  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
226  	} else {
227  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
228  		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_def = value;
229  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
230  	}
231  }
232  
233  /**
234   * pmo_increment_wow_user_ptrn() -increment wow user ptrn
235   * @vdev_ctx: pmo vdev priv ctx
236   *
237   * API to increment wow user ptrn
238   *
239   * Return: None
240   */
pmo_increment_wow_user_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)241  static inline void pmo_increment_wow_user_ptrn(
242  		struct pmo_vdev_priv_obj *vdev_ctx)
243  {
244  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
245  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
246  		vdev_ctx->num_wow_user_patterns++;
247  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
248  	} else {
249  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
250  		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr++;
251  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
252  	}
253  }
254  
255  /**
256   * pmo_decrement_wow_user_ptrn() -decrement wow user ptrn
257   * @vdev_ctx: pmo vdev priv ctx
258   *
259   * API to decrement wow user ptrn
260   *
261   * Return: None
262   */
pmo_decrement_wow_user_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)263  static inline void pmo_decrement_wow_user_ptrn(
264  		struct pmo_vdev_priv_obj *vdev_ctx)
265  {
266  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
267  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
268  		vdev_ctx->num_wow_user_patterns--;
269  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
270  	} else {
271  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
272  		vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr--;
273  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
274  	}
275  }
276  
277  /**
278   * pmo_get_wow_user_ptrn() -Get wow user ptrn
279   * @vdev_ctx: pmo vdev priv ctx
280   *
281   * API to Get wow user ptrn
282   *
283   * Return: None
284   */
pmo_get_wow_user_ptrn(struct pmo_vdev_priv_obj * vdev_ctx)285  static inline uint8_t pmo_get_wow_user_ptrn(
286  		struct pmo_vdev_priv_obj *vdev_ctx)
287  {
288  	uint8_t count;
289  
290  	if (vdev_ctx->pmo_psoc_ctx->caps.unified_wow) {
291  		qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
292  		count = vdev_ctx->num_wow_user_patterns;
293  		qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
294  	} else {
295  		qdf_spin_lock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
296  		count = vdev_ctx->pmo_psoc_ctx->wow.ptrn_id_usr;
297  		qdf_spin_unlock_bh(&vdev_ctx->pmo_psoc_ctx->lock);
298  	}
299  
300  	return count;
301  }
302  
303  /**
304   * pmo_core_del_wow_pattern() - Function which will delete the WoWL pattern
305   * @vdev: pointer to the vdev
306   *
307   * This function deletes all the user WoWl patterns and default WoWl patterns
308   *
309   * Return: error if any errors encountered, QDF_STATUS_SUCCESS otherwise
310   */
311  
312  QDF_STATUS pmo_core_del_wow_pattern(struct wlan_objmgr_vdev *vdev);
313  
314  /**
315   * pmo_core_add_wow_user_pattern() - Function which will add the WoWL pattern
316   *			 to be used when PBM filtering is enabled
317   * @vdev: pointer to the vdev
318   * @ptrn: pointer to the pattern string to be added
319   *
320   * Return: false if any errors encountered, QDF_STATUS_SUCCESS otherwise
321   */
322  QDF_STATUS pmo_core_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
323  			struct pmo_wow_add_pattern *ptrn);
324  
325  /**
326   * pmo_core_del_wow_user_pattern() - Function which will delete the WoWL pattern
327   * @vdev: pointer to the vdev
328   * @pattern_id: pointer to the pattern string to be delete
329   *
330   * Return: error if any errors encountered, QDF_STATUS_SUCCESS otherwise
331   */
332  QDF_STATUS pmo_core_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
333  			uint8_t pattern_id);
334  
335  /**
336   * pmo_core_enable_wakeup_event() -  enable wow wakeup events
337   * @psoc: objmgr psoc
338   * @vdev_id: vdev id
339   * @wow_event: wow event to enable
340   *
341   * Return: none
342   */
343  void pmo_core_enable_wakeup_event(struct wlan_objmgr_psoc *psoc,
344  				  uint32_t vdev_id,
345  				  WOW_WAKE_EVENT_TYPE wow_event);
346  
347  /**
348   * pmo_core_disable_wakeup_event() -  disable wow wakeup events
349   * @psoc: objmgr psoc
350   * @vdev_id: vdev id
351   * @wow_event: wow event to disable
352   *
353   * Return: none
354   */
355  void pmo_core_disable_wakeup_event(struct wlan_objmgr_psoc *psoc,
356  				   uint32_t vdev_id,
357  				   WOW_WAKE_EVENT_TYPE wow_event);
358  
359  /**
360   * pmo_core_is_wow_applicable(): should enable wow
361   * @psoc: objmgr psoc object
362   *
363   *  Enable WOW if any one of the condition meets,
364   *  1) Is any one of vdev in beaconning mode (in AP mode) ?
365   *  2) Is any one of vdev in connected state (in STA mode) ?
366   *  3) Is PNO in progress in any one of vdev ?
367   *  4) Is Extscan in progress in any one of vdev ?
368   *  5) Is P2P listen offload in any one of vdev?
369   *  6) Is any vdev in NAN data mode? BSS is already started at the
370   *     the time of device creation. It is ready to accept data
371   *     requests.
372   *  7) If LPASS feature is enabled
373   *  8) If NaN feature is enabled
374   *  If none of above conditions is true then return false
375   *
376   * Return: true if wma needs to configure wow false otherwise.
377   */
378  bool pmo_core_is_wow_applicable(struct wlan_objmgr_psoc *psoc);
379  
380  /**
381   * pmo_core_update_wow_enable() - update wow enable flag
382   * @psoc_ctx: Pointer to objmgr psoc handle
383   * @value: true if wow mode enable else false
384   *
385   * Return: None
386   */
387  static inline
pmo_core_update_wow_enable(struct pmo_psoc_priv_obj * psoc_ctx,bool value)388  void pmo_core_update_wow_enable(struct pmo_psoc_priv_obj *psoc_ctx,
389  	bool value)
390  {
391  	qdf_spin_lock_bh(&psoc_ctx->lock);
392  	psoc_ctx->wow.wow_enable = value;
393  	qdf_spin_unlock_bh(&psoc_ctx->lock);
394  }
395  
396  /**
397   * pmo_core_is_wow_enabled() - check if wow needs to be enabled in fw
398   * @psoc_ctx: Pointer to objmgr psoc handle
399   *
400   * API to check if wow mode is enabled in fwr as part of apps suspend or not
401   *
402   * Return: true is wow mode is enabled else false
403   */
404  static inline
pmo_core_is_wow_enabled(struct pmo_psoc_priv_obj * psoc_ctx)405  bool pmo_core_is_wow_enabled(struct pmo_psoc_priv_obj *psoc_ctx)
406  {
407  	bool value;
408  
409  	if (!psoc_ctx) {
410  		pmo_err("psoc_ctx is null");
411  		return false;
412  	}
413  
414  	qdf_spin_lock_bh(&psoc_ctx->lock);
415  	value = psoc_ctx->wow.wow_enable;
416  	qdf_spin_unlock_bh(&psoc_ctx->lock);
417  	pmo_debug("WoW enable %d", value);
418  
419  	return value;
420  }
421  
422  /**
423   * pmo_core_set_wow_nack() - Set wow nack flag
424   * @psoc_ctx: Pointer to objmgr psoc handle
425   * @value: true if received wow nack from else false
426   * @reason_code: WoW status reason code
427   *
428   * Return: None
429   */
430  static inline
pmo_core_set_wow_nack(struct pmo_psoc_priv_obj * psoc_ctx,bool value,uint16_t reason_code)431  void pmo_core_set_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx, bool value,
432  			   uint16_t reason_code)
433  {
434  	qdf_spin_lock_bh(&psoc_ctx->lock);
435  	psoc_ctx->wow.wow_nack = value;
436  	psoc_ctx->wow.reason_code = reason_code;
437  	qdf_spin_unlock_bh(&psoc_ctx->lock);
438  }
439  
440  /**
441   * pmo_core_get_wow_nack() - Get wow nack flag
442   * @psoc_ctx: Pointer to objmgr psoc handle
443   *
444   * Return: wow nack flag
445   */
446  static inline
pmo_core_get_wow_nack(struct pmo_psoc_priv_obj * psoc_ctx)447  bool pmo_core_get_wow_nack(struct pmo_psoc_priv_obj *psoc_ctx)
448  {
449  	bool value;
450  
451  	qdf_spin_lock_bh(&psoc_ctx->lock);
452  	value = psoc_ctx->wow.wow_nack;
453  	qdf_spin_unlock_bh(&psoc_ctx->lock);
454  
455  	return value;
456  }
457  
458  /**
459   * pmo_core_get_wow_reason_code() - Get wow status reason code
460   * @psoc_ctx: Pointer to objmgr psoc handle
461   *
462   * Return: wow status reason code
463   */
464  static inline
pmo_core_get_wow_reason_code(struct pmo_psoc_priv_obj * psoc_ctx)465  uint16_t pmo_core_get_wow_reason_code(struct pmo_psoc_priv_obj *psoc_ctx)
466  {
467  	uint16_t value;
468  
469  	qdf_spin_lock_bh(&psoc_ctx->lock);
470  	value = psoc_ctx->wow.reason_code;
471  	qdf_spin_unlock_bh(&psoc_ctx->lock);
472  
473  	return value;
474  }
475  
476  /**
477   * pmo_core_update_wow_enable_cmd_sent() - update wow enable cmd sent flag
478   * @psoc_ctx: Pointer to objmgr psoc handle
479   * @value: true if wow enable cmd sent else false
480   *
481   * Return: None
482   */
483  static inline
pmo_core_update_wow_enable_cmd_sent(struct pmo_psoc_priv_obj * psoc_ctx,bool value)484  void pmo_core_update_wow_enable_cmd_sent(struct pmo_psoc_priv_obj *psoc_ctx,
485  	bool value)
486  {
487  	qdf_spin_lock_bh(&psoc_ctx->lock);
488  	psoc_ctx->wow.wow_enable_cmd_sent = value;
489  	qdf_spin_unlock_bh(&psoc_ctx->lock);
490  }
491  
492  /**
493   * pmo_core_get_wow_enable_cmd_sent() - Get wow enable cmd sent flag
494   * @psoc_ctx: Pointer to objmgr psoc handle
495   *
496   * Return: return true if wow enable cmd sent else false
497   */
498  static inline
pmo_core_get_wow_enable_cmd_sent(struct pmo_psoc_priv_obj * psoc_ctx)499  bool pmo_core_get_wow_enable_cmd_sent(struct pmo_psoc_priv_obj *psoc_ctx)
500  {
501  	bool value;
502  
503  	qdf_spin_lock_bh(&psoc_ctx->lock);
504  	value = psoc_ctx->wow.wow_enable_cmd_sent;
505  	qdf_spin_unlock_bh(&psoc_ctx->lock);
506  
507  	return value;
508  }
509  
510  /**
511   * pmo_core_update_wow_initial_wake_up() - update wow initial wake up
512   * @psoc_ctx: Pointer to objmgr psoc handle
513   * @value: set to 1 if wow initial wake up is received;
514   *         if clean state, reset it to 0;
515   *
516   * Return: None
517   */
518  static inline
pmo_core_update_wow_initial_wake_up(struct pmo_psoc_priv_obj * psoc_ctx,int value)519  void pmo_core_update_wow_initial_wake_up(struct pmo_psoc_priv_obj *psoc_ctx,
520  	int value)
521  {
522  	qdf_atomic_set(&psoc_ctx->wow.wow_initial_wake_up, value);
523  }
524  
525  /**
526   * pmo_core_get_wow_initial_wake_up() - Get wow initial wake up
527   * @psoc_ctx: Pointer to objmgr psoc handle
528   *
529   * Return:  1 if wow initial wake up is received;
530   *          0 if wow iniital wake up is not received;
531   */
532  static inline
pmo_core_get_wow_initial_wake_up(struct pmo_psoc_priv_obj * psoc_ctx)533  int pmo_core_get_wow_initial_wake_up(struct pmo_psoc_priv_obj *psoc_ctx)
534  {
535  	return qdf_atomic_read(&psoc_ctx->wow.wow_initial_wake_up);
536  }
537  
538  #ifdef FEATURE_WLAN_EXTSCAN
539  /**
540   * pmo_core_is_extscan_in_progress(): check if a extscan is in progress
541   * @vdev: objmgr vdev handle
542   *
543   * Return: TRUE/FALSE
544   */
545  static inline
pmo_core_is_extscan_in_progress(struct wlan_objmgr_vdev * vdev)546  bool pmo_core_is_extscan_in_progress(struct wlan_objmgr_vdev *vdev)
547  {
548  	bool extscan_in_progress;
549  	struct pmo_vdev_priv_obj *vdev_ctx;
550  
551  	vdev_ctx = pmo_vdev_get_priv(vdev);
552  	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
553  	extscan_in_progress = vdev_ctx->extscan_in_progress;
554  	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
555  
556  	return extscan_in_progress;
557  }
558  
559  /**
560   * pmo_core_update_extscan_in_progress(): update extscan is in progress flags
561   * @vdev: objmgr vdev handle
562   * @value:true if extscan is in progress else false
563   *
564   * Return: TRUE/FALSE
565   */
566  static inline
pmo_core_update_extscan_in_progress(struct wlan_objmgr_vdev * vdev,bool value)567  void pmo_core_update_extscan_in_progress(struct wlan_objmgr_vdev *vdev,
568  	bool value)
569  {
570  	struct pmo_vdev_priv_obj *vdev_ctx;
571  
572  	vdev_ctx = pmo_vdev_get_priv(vdev);
573  	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
574  	vdev_ctx->extscan_in_progress = value;
575  	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
576  }
577  #else
578  static inline
pmo_core_is_extscan_in_progress(struct wlan_objmgr_vdev * vdev)579  bool pmo_core_is_extscan_in_progress(struct wlan_objmgr_vdev *vdev)
580  {
581  	return false;
582  }
583  
584  static inline
pmo_core_update_extscan_in_progress(struct wlan_objmgr_vdev * vdev,bool value)585  void pmo_core_update_extscan_in_progress(struct wlan_objmgr_vdev *vdev,
586  	bool value)
587  {
588  }
589  #endif
590  
591  /**
592   * pmo_core_is_p2plo_in_progress(): check if p2plo is in progress
593   * @vdev: objmgr vdev handle
594   *
595   * Return: TRUE/FALSE
596   */
597  static inline
pmo_core_is_p2plo_in_progress(struct wlan_objmgr_vdev * vdev)598  bool pmo_core_is_p2plo_in_progress(struct wlan_objmgr_vdev *vdev)
599  {
600  	bool p2plo_in_progress;
601  	struct pmo_vdev_priv_obj *vdev_ctx;
602  
603  	vdev_ctx = pmo_vdev_get_priv(vdev);
604  	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
605  	p2plo_in_progress = vdev_ctx->p2plo_in_progress;
606  	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
607  
608  	return p2plo_in_progress;
609  }
610  
611  /**
612   * pmo_core_update_p2plo_in_progress(): update p2plo is in progress flags
613   * @vdev: objmgr vdev handle
614   * @value:true if p2plo is in progress else false
615   *
616   * Return: TRUE/FALSE
617   */
618  static inline
pmo_core_update_p2plo_in_progress(struct wlan_objmgr_vdev * vdev,bool value)619  void pmo_core_update_p2plo_in_progress(struct wlan_objmgr_vdev *vdev,
620  	bool value)
621  {
622  	struct pmo_vdev_priv_obj *vdev_ctx;
623  
624  	vdev_ctx = pmo_vdev_get_priv(vdev);
625  	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
626  	vdev_ctx->p2plo_in_progress = value;
627  	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
628  }
629  
630  #ifdef WLAN_FEATURE_LPSS
631  /**
632   * pmo_core_is_lpass_enabled() - check if lpass is enabled
633   * @psoc: objmgr psoc object
634   *
635   * WoW is needed if LPASS or NaN feature is enabled in INI because
636   * target can't wake up itself if its put in PDEV suspend when LPASS
637   * or NaN features are supported
638   *
639   * Return: true if lpass is enabled else false
640   */
641  static inline
pmo_core_is_lpass_enabled(struct wlan_objmgr_psoc * psoc)642  bool pmo_core_is_lpass_enabled(struct wlan_objmgr_psoc *psoc)
643  {
644  	struct pmo_psoc_priv_obj *pmo_psoc_ctx = pmo_psoc_get_priv(psoc);
645  
646  	return pmo_psoc_ctx->psoc_cfg.lpass_enable;
647  }
648  #else
649  static inline
pmo_core_is_lpass_enabled(struct wlan_objmgr_psoc * psoc)650  bool pmo_core_is_lpass_enabled(struct wlan_objmgr_psoc *psoc)
651  {
652  	return false;
653  }
654  #endif
655  
656  /**
657   * pmo_get_event_bitmap_idx() - get indices for extended wow bitmaps
658   * @event: wow event
659   * @wow_bitmap_size: WOW bitmap size
660   * @bit_idx: bit index
661   * @idx: byte index
662   *
663   * Return: none
664   */
pmo_get_event_bitmap_idx(WOW_WAKE_EVENT_TYPE event,uint32_t wow_bitmap_size,uint32_t * bit_idx,uint32_t * idx)665  static inline void pmo_get_event_bitmap_idx(WOW_WAKE_EVENT_TYPE event,
666  			      uint32_t wow_bitmap_size,
667  			      uint32_t *bit_idx,
668  			      uint32_t *idx)
669  {
670  
671  	if (!bit_idx || !idx || wow_bitmap_size == 0) {
672  		pmo_err("bit_idx:%pK idx:%pK wow_bitmap_size:%u",
673  			 bit_idx, idx, wow_bitmap_size);
674  		return;
675  	}
676  	if (event == 0) {
677  		*idx = *bit_idx = 0;
678  	} else {
679  		*idx = event / (wow_bitmap_size * 8);
680  		*bit_idx = event % (wow_bitmap_size * 8);
681  	}
682  }
683  
684  /**
685   * pmo_get_num_wow_filters() - get the supported number of WoW filters
686   * @psoc: the psoc to query
687   *
688   * Return: number of WoW filters supported
689   */
690  uint8_t pmo_get_num_wow_filters(struct wlan_objmgr_psoc *psoc);
691  
692  /**
693   * pmo_core_get_wow_state() - Get wow state
694   * @pmo_ctx: Pointer to pmo priv object
695   *
696   * Return:  current WoW status(none/D0/D3)
697   */
698  static inline
pmo_core_get_wow_state(struct pmo_psoc_priv_obj * pmo_ctx)699  enum pmo_wow_state pmo_core_get_wow_state(struct pmo_psoc_priv_obj *pmo_ctx)
700  {
701  	return pmo_ctx->wow.wow_state;
702  }
703  #endif /* WLAN_POWER_MANAGEMENT_OFFLOAD */
704  
705  #endif /* end  of _WLAN_PMO_WOW_H_ */
706