xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
1 /*
2  * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /**
18  * DOC: Define the pdev data structure of UMAC
19  * Public APIs to perform operations on Global objects
20  */
21 
22 #ifndef _WLAN_OBJMGR_PDEV_OBJ_H_
23 #define _WLAN_OBJMGR_PDEV_OBJ_H_
24 
25 #include <wlan_objmgr_cmn.h>
26 #include "wlan_objmgr_psoc_obj.h"
27 
28 /* STATUS: scanning */
29 #define WLAN_PDEV_F_SCAN                    0x00000001
30 /* STATUS: use short slot time*/
31 #define WLAN_PDEV_F_SHSLOT                  0x00000002
32   /* STATUS: channel switch event pending after DFS RADAR */
33 #define WLAN_PDEV_F_DFS_CHANSWITCH_PENDING  0x00000004
34   /* TX Power: fixed rate */
35 #define WLAN_PDEV_F_TXPOW_FIXED             0x00000008
36   /* STATUS: use short preamble */
37 #define WLAN_PDEV_F_SHPREAMBLE              0x00000010
38   /* CONF: do alignment pad */
39 #define WLAN_PDEV_F_DATAPAD                 0x00000020
40   /* STATUS: protection enabled */
41 #define WLAN_PDEV_F_USEPROT                 0x00000040
42   /* STATUS: use barker preamble*/
43 #define WLAN_PDEV_F_USEBARKER               0x00000080
44   /* CONF: DISABLE 2040 coexistence */
45 #define WLAN_PDEV_F_COEXT_DISABLE           0x00000100
46   /* STATE: scan pending */
47 #define WLAN_PDEV_F_SCAN_PENDING            0x00000200
48   /* CONF: send regclassids in country ie */
49 #define WLAN_PDEV_F_REGCLASS                0x00000400
50   /* CONF: block the use of DFS channels */
51 #define WLAN_PDEV_F_BLKDFSCHAN              0x00000800
52   /* STATUS: 11D in used */
53 #define WLAN_PDEV_F_DOT11D                  0x00001000
54   /* STATUS: 11D channel-switch detected */
55 #define WLAN_PDEV_F_RADAR                   0x00002000
56   /* CONF: A-MPDU supported */
57 #define WLAN_PDEV_F_AMPDU                   0x00004000
58   /* CONF: A-MSDU supported */
59 #define WLAN_PDEV_F_AMSDU                   0x00008000
60   /* CONF: HT traffic protected */
61 #define WLAN_PDEV_F_HTPROT                  0x00010000
62   /* CONF: Reset once */
63 #define WLAN_PDEV_F_RESET                   0x00020000
64   /* CONF: ignore 11d beacon */
65 #define WLAN_PDEV_F_IGNORE_11D_BEACON       0x00040000
66   /* HT CAP IE present */
67 #define WLAN_PDEV_F_HTVIE                   0x00080000
68  /* radio in middle of CSA */
69 #define WLAN_PDEV_F_CSA_WAIT                0x00100000
70  /* wnm support flag */
71 #define WLAN_PDEV_F_WNM                     0x00200000
72 #define WLAN_PDEV_F_2G_CSA                  0x00400000
73   /* enhanced independent repeater  */
74 #define WLAN_PDEV_F_ENH_REP_IND             0x00800000
75  /* Disable Tx AMSDU for station vap */
76 #define WLAN_PDEV_F_STA_AMPDU_DIS           0x01000000
77 /* do not send probe request in passive channel */
78 #define WLAN_PDEV_F_STRICT_PSCAN_EN         0x02000000
79   /* dupie (ANA,pre ANA ) */
80 /*#define WLAN_PDEV_F_DUPIE                 0x00200000*/
81  /* QWRAP enable flag */
82 #define WLAN_PDEV_F_WRAP_EN                 0x04000000
83 /* Chan concurrency enabled */
84 #define WLAN_PDEV_F_CHAN_CONCURRENCY        0x08000000
85 /* Multivdev restart enabled */
86 #define WLAN_PDEV_F_MULTIVDEV_RESTART       0x10000000
87 
88 /* PDEV op flags */
89    /* Enable htrate for wep and tkip */
90 #define WLAN_PDEV_OP_WEP_TKIP_HTRATE    0x00000001
91   /* non HT AP found flag */
92 #define WLAN_PDEV_OP_NON_HT_AP          0x00000002
93   /* block the use of DFS channels flag */
94 #define WLAN_PDEV_OP_BLK_DFS_CHAN       0x00000004
95   /* 11.h flag */
96 #define WLAN_PDEV_OP_DOTH               0x00000008
97   /* Off-channel support enabled */
98 #define WLAN_PDEV_OP_OFFCHAN            0x00000010
99 #define WLAN_PDEV_OP_HT20ADHOC          0x00000020
100 #define WLAN_PDEV_OP_HT40ADHOC          0x00000040
101 #define WLAN_PDEV_OP_HTADHOC_AGGR       0x00000080
102    /* disallow CC change when assoc completes */
103 #define WLAN_PDEV_OP_DISALLOW_AUTO_CC   0x00000100
104    /* Is P2P Enabled? */
105 #define WLAN_PDEV_OP_P2P                0x00000200
106    /* disallowed  */
107 #define WLAN_PDEV_OP_IGNORE_DYNHALT     0x00000400
108    /* overwrite probe response IE with beacon IE */
109 #define WLAN_PDEV_OP_OVERRIDE_PROBERESP 0x00000800
110 #define WLAN_PDEV_OP_DROPSTA_QUERY      0x00001000
111 #define WLAN_PDEV_OP_BLK_REPORT_FLOOD   0x00002000
112    /* Offchan scan */
113 #define WLAN_PDEV_OP_OFFCHAN_SCAN       0x00004000
114    /*Consider OBSS non-erp to change to long slot*/
115 #define WLAN_PDEV_OP_OBSS_LONGSLOT      0x00008000
116    /* enable/disable min rssi cli block */
117 #define WLAN_PDEV_OP_MIN_RSSI_ENABLE    0x00010000
118    /* PDEV VDEV restart is in progress */
119 #define WLAN_PDEV_OP_RESTART_INPROGRESS 0x00020000
120    /* PDEV MBSSID VDEV restart trigger */
121 #define WLAN_PDEV_OP_MBSSID_RESTART     0x00040000
122 
123 
124 struct osif_pdev_priv;
125 
126 /**
127  * struct wlan_objmgr_pdev_nif  - pdev object nif structure
128  * @pdev_fw_caps:       radio specific FW capabilities
129  * @pdev_feature_caps:  radio specific feature capabilities
130  * @pdev_ospriv:        OS specific pointer
131  * @macaddr[]:          MAC address
132  * @notified_ap_vdev:   ap vdev
133  */
134 struct wlan_objmgr_pdev_nif {
135 	uint32_t pdev_fw_caps;
136 	uint32_t pdev_feature_caps;
137 	struct pdev_osif_priv *pdev_ospriv;
138 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
139 	uint8_t notified_ap_vdev;
140 };
141 
142 /**
143  * struct wlan_objmgr_pdev_mlme - pdev object mlme structure
144  * @pdev_op_flags:    PDEV operation flags, can be used to know the
145  *                    operation status (deletion progress, etc)
146  */
147 struct wlan_objmgr_pdev_mlme {
148 	uint32_t pdev_op_flags;
149 };
150 
151 /**
152  * struct wlan_objmgr_pdev_objmgr - pdev object object manager structure
153  * @wlan_pdev_id:      PDEV id
154  * @wlan_vdev_count:   VDEVs count
155  * @max_vdev_count:    Max no. of VDEVs supported by this PDEV
156  * @print_cnt:         Count to throttle Logical delete prints
157  * @wlan_vdev_list:    List maintains the VDEVs created on this PDEV
158  * @wlan_peer_count:   Peer count
159  * @max_peer_count:    Max Peer count
160  * @temp_peer_count:   Temporary peer count
161  * @wlan_psoc:         back pointer to PSOC, its attached to
162  * @ref_cnt:           Ref count
163  * @ref_id_dbg:        Array to track Ref count
164  */
165 struct wlan_objmgr_pdev_objmgr {
166 	uint8_t wlan_pdev_id;
167 	uint8_t wlan_vdev_count;
168 	uint8_t max_vdev_count;
169 	uint8_t print_cnt;
170 	qdf_list_t wlan_vdev_list;
171 	uint16_t wlan_peer_count;
172 	uint16_t max_peer_count;
173 	uint16_t temp_peer_count;
174 	struct wlan_objmgr_psoc *wlan_psoc;
175 	qdf_atomic_t ref_cnt;
176 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
177 };
178 
179 /**
180  * struct wlan_objmgr_pdev - PDEV common object
181  * @current_chan_list: Active/current Channel list of the radio
182  * @pdev_nif:          pdev nif structure
183  * @pdev_objmgr:       pdev object manager structure
184  * @pdev_mlme:         pdev MLME structure
185  * @pdev_comp_priv_obj[]:   component's private object array
186  * @obj_status[]:      object status of each component object
187  * @obj_state:         object state
188  * @tgt_if_handle:     Target interface handle
189  * @dp_handle:         DP module handle
190  * @pdev_lock:         lock to protect object
191 */
192 struct wlan_objmgr_pdev {
193 	struct wlan_chan_list *current_chan_list;
194 	struct wlan_objmgr_pdev_nif  pdev_nif;
195 	struct wlan_objmgr_pdev_objmgr pdev_objmgr;
196 	struct wlan_objmgr_pdev_mlme   pdev_mlme;
197 	void *pdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
198 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
199 	WLAN_OBJ_STATE obj_state;
200 	void *tgt_if_handle;
201 	void *dp_handle;
202 	qdf_spinlock_t pdev_lock;
203 };
204 
205 /**
206  ** APIs to Create/Delete Global object APIs
207  */
208 /**
209  * wlan_objmgr_pdev_obj_create() - pdev create
210  * @psoc: PSOC object
211  * @scn: os private object
212  *
213  * Creates PDEV object, intializes with default values
214  * Invokes the registered notifiers to create component object
215  *
216  * Return: Handle to struct wlan_objmgr_psoc on successful creation,
217  *         NULL on Failure (on Mem alloc failure and Component objects
218  *         Failure)
219  */
220 struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
221 	struct wlan_objmgr_psoc *psoc, struct pdev_osif_priv *osif_priv);
222 
223 /**
224  * wlan_objmgr_pdev_obj_delete() - pdev delete
225  * @psoc: PDEV object
226  *
227  * Logically deletes PDEV object,
228  * Once all the references are released, object manager invokes the registered
229  * notifiers to destroy component objects
230  *
231  * Return: SUCCESS/FAILURE
232  */
233 QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev);
234 
235 /**
236  ** APIs to attach/detach component objects
237  */
238 /**
239  * wlan_objmgr_pdev_component_obj_attach() - pdev comp object attach
240  * @psoc: PDEV object
241  * @id: Component id
242  * @comp_priv_obj: component's private object pointer
243  * @status: Component's private object creation status
244  *
245  * API to be used for attaching component object with PDEV common object
246  *
247  * Return: SUCCESS on successful storing of component's object in common object
248  *         On FAILURE (appropriate failure codes are returned)
249  */
250 QDF_STATUS wlan_objmgr_pdev_component_obj_attach(
251 		struct wlan_objmgr_pdev *pdev,
252 		enum wlan_umac_comp_id id,
253 		void *comp_priv_obj,
254 		QDF_STATUS status);
255 
256 /**
257  * wlan_objmgr_pdev_component_obj_detach() - pdev comp object detach
258  * @psoc: PDEV object
259  * @id: Component id
260  * @comp_priv_obj: component's private object pointer
261  *
262  * API to be used for detaching component object with PDEV common object
263  *
264  * Return: SUCCESS on successful removal of component's object from common
265  *         object
266  *         On FAILURE (appropriate failure codes are returned)
267  */
268 QDF_STATUS wlan_objmgr_pdev_component_obj_detach(
269 		struct wlan_objmgr_pdev *pdev,
270 		enum wlan_umac_comp_id id,
271 		void *comp_priv_obj);
272 
273 /**
274  ** APIs to operations on pdev objects
275  */
276 
277 typedef void (*wlan_objmgr_pdev_op_handler)(struct wlan_objmgr_pdev *pdev,
278 					void *object,
279 					void *arg);
280 
281 /**
282  * wlan_objmgr_pdev_iterate_obj_list() - operate on all objects of pdev
283  * @pdev: PDEV object
284  * @obj_type: VDEV_OP/PEER_OP
285  * @handler: the handler will be called for each object of requested type
286  *           the handler should be implemented to perform required operation
287  * @arg: agruments passed by caller
288  * @lock_free_op: its obsolete
289  * @dbg_id: id of the caller
290  *
291  * API to be used for performing the operations on all VDEV/PEER objects
292  * of pdev
293  *
294  * Return: SUCCESS/FAILURE
295  */
296 QDF_STATUS wlan_objmgr_pdev_iterate_obj_list(
297 		struct wlan_objmgr_pdev *pdev,
298 		enum wlan_objmgr_obj_type obj_type,
299 		wlan_objmgr_pdev_op_handler handler,
300 		void *arg, uint8_t lock_free_op,
301 		wlan_objmgr_ref_dbgid dbg_id);
302 
303 /**
304  * wlan_objmgr_trigger_pdev_comp_priv_object_creation() - create
305  * comp object of pdev
306  * @pdev: PDEV object
307  * @id: Component id
308  *
309  * API to create component private object in run time, this would be
310  * used for features which gets enabled in run time
311  *
312  * Return: SUCCESS on successful creation
313  *         On FAILURE (appropriate failure codes are returned)
314  */
315 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_creation(
316 		struct wlan_objmgr_pdev *pdev,
317 		enum wlan_umac_comp_id id);
318 
319 /**
320  * wlan_objmgr_trigger_pdev_comp_priv_object_deletion() - destroy
321  * comp object of pdev
322  * @pdev: PDEV object
323  * @id: Component id
324  *
325  * API to destroy component private object in run time, this would
326  * be used for features which gets disabled in run time
327  *
328  * Return: SUCCESS on successful deletion
329  *         On FAILURE (appropriate failure codes are returned)
330  */
331 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion(
332 		struct wlan_objmgr_pdev *pdev,
333 		enum wlan_umac_comp_id id);
334 
335 /**
336  * wlan_objmgr_get_vdev_by_id_from_pdev() - find vdev using id from pdev
337  * @pdev: PDEV object
338  * @vdev_id: vdev id
339  * @dbg_id: id of the caller
340  *
341  * API to find vdev object pointer by vdev id from pdev's vdev list
342  *
343  * This API increments the ref count of the vdev object internally, the
344  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
345  * ref count
346  *
347  * Return: vdev pointer
348  *         NULL on FAILURE
349  */
350 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
351 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
352 			wlan_objmgr_ref_dbgid dbg_id);
353 
354 /**
355  * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id from
356  *                                                      pdev
357  * @pdev: PDEV object
358  * @vdev_id: vdev id
359  * @dbg_id: id of the caller
360  *
361  * API to find vdev object pointer by vdev id from pdev's vdev list
362  *
363  * This API increments the ref count of the vdev object internally, the
364  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
365  * ref count
366  *
367  * Return: vdev pointer
368  *         NULL on FAILURE
369  */
370 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
371 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
372 			wlan_objmgr_ref_dbgid dbg_id);
373 
374 /**
375  * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr
376  * @pdev: PDEV object
377  * @macaddr: MAC address
378  * @dbg_id: id of the caller
379  *
380  * API to find vdev object pointer by vdev mac addr from pdev's vdev list
381  *
382  * This API increments the ref count of the vdev object internally, the
383  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
384  * ref count
385  *
386  * Return: vdev pointer
387  *         NULL on FAILURE
388  */
389 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
390 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
391 		wlan_objmgr_ref_dbgid dbg_id);
392 
393 /**
394  * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using
395  *                                                           macaddr
396  * @pdev: PDEV object
397  * @macaddr: MAC address
398  * @dbg_id: id of the caller
399  *
400  * API to find vdev object pointer by vdev mac addr from pdev's vdev list
401  *
402  * This API increments the ref count of the vdev object internally, the
403  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
404  * ref count
405  *
406  * Return: vdev pointer
407  *         NULL on FAILURE
408  */
409 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
410 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
411 		wlan_objmgr_ref_dbgid dbg_id);
412 
413 /**
414  * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object
415  * @pdev: PDEV object
416  * @id: Component id
417  *
418  * API to get component private object
419  *
420  * Return: void *ptr on SUCCESS
421  *         NULL on Failure
422  */
423 void *wlan_objmgr_pdev_get_comp_private_obj(
424 		struct wlan_objmgr_pdev *pdev,
425 		enum wlan_umac_comp_id id);
426 
427 /**
428  * wlan_pdev_obj_lock() - Acquire PDEV spinlock
429  * @pdev: PDEV object
430  *
431  * API to acquire PDEV lock
432  * Parent lock should not be taken in child lock context
433  * but child lock can be taken in parent lock context
434  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
435  *
436  * Return: void
437  */
438 static inline void wlan_pdev_obj_lock(struct wlan_objmgr_pdev *pdev)
439 {
440 	qdf_spin_lock_bh(&pdev->pdev_lock);
441 }
442 
443 /**
444  * wlan_pdev_obj_unlock() - Release PDEV spinlock
445  * @pdev: PDEV object
446  *
447  * API to Release PDEV lock
448  *
449  * Return: void
450  */
451 static inline void wlan_pdev_obj_unlock(struct wlan_objmgr_pdev *pdev)
452 {
453 	qdf_spin_unlock_bh(&pdev->pdev_lock);
454 }
455 
456 /**
457  * wlan_pdev_get_psoc() - get psoc
458  * @pdev: PDEV object
459  *
460  * API to get the psoc object from PDEV
461  *
462  * Return:
463  * @psoc: PSOC object
464  */
465 static inline struct wlan_objmgr_psoc *wlan_pdev_get_psoc(
466 			struct wlan_objmgr_pdev *pdev)
467 {
468 	return pdev->pdev_objmgr.wlan_psoc;
469 }
470 
471 /**
472  * wlan_pdev_set_psoc() - set psoc
473  * @pdev: PDEV object
474  * @psoc: PSOC object
475  *
476  * API to set the psoc object from PDEV
477  *
478  * Return: void
479  */
480 static inline void wlan_pdev_set_psoc(struct wlan_objmgr_pdev *pdev,
481 				struct wlan_objmgr_psoc *psoc)
482 {
483 	pdev->pdev_objmgr.wlan_psoc = psoc;
484 }
485 
486 /**
487  * wlan_pdev_nif_fw_cap_set() - set fw caps
488  * @pdev: PDEV object
489  * @cap: capability flag to be set
490  *
491  * API to set fw caps in pdev
492  *
493  * Return: void
494  */
495 static inline void wlan_pdev_nif_fw_cap_set(struct wlan_objmgr_pdev *pdev,
496 				uint32_t cap)
497 {
498 	pdev->pdev_nif.pdev_fw_caps |= cap;
499 }
500 
501 /**
502  * wlan_pdev_nif_fw_cap_clear() - clear fw cap
503  * @pdev: PDEV object
504  * @cap: capability flag to be cleared
505  *
506  * API to clear fw caps in pdev
507  *
508  * Return: void
509  */
510 static inline void wlan_pdev_nif_fw_cap_clear(struct wlan_objmgr_pdev *pdev,
511 				uint32_t cap)
512 {
513 	pdev->pdev_nif.pdev_fw_caps &= ~cap;
514 }
515 
516 /**
517  * wlan_pdev_nif_fw_cap_get() - get fw caps
518  * @pdev: PDEV object
519  * @cap: capability flag to be checked
520  *
521  * API to know, whether particular fw caps flag is set in pdev
522  *
523  * Return: 1 (for set) or 0 (for not set)
524  */
525 static inline uint8_t wlan_pdev_nif_fw_cap_get(struct wlan_objmgr_pdev *pdev,
526 				uint32_t cap)
527 {
528 	return (pdev->pdev_nif.pdev_fw_caps & cap) ? 1 : 0;
529 }
530 
531 /**
532  * wlan_pdev_nif_feat_cap_set() - set feature caps
533  * @pdev: PDEV object
534  * @cap: capability flag to be set
535  *
536  * API to set feat caps in pdev
537  *
538  * Return: void
539  */
540 static inline void wlan_pdev_nif_feat_cap_set(struct wlan_objmgr_pdev *pdev,
541 				uint32_t cap)
542 {
543 	pdev->pdev_nif.pdev_feature_caps |= cap;
544 }
545 
546 /**
547  * wlan_pdev_nif_feat_cap_clear() - clear feature caps
548  * @pdev: PDEV object
549  * @cap: capability flag to be cleared
550  *
551  * API to clear feat caps in pdev
552  *
553  * Return: void
554  */
555 static inline void wlan_pdev_nif_feat_cap_clear(struct wlan_objmgr_pdev *pdev,
556 				uint32_t cap)
557 {
558 	pdev->pdev_nif.pdev_feature_caps &= ~cap;
559 }
560 
561 /**
562  * wlan_pdev_nif_feat_cap_get() - get feature caps
563  * @pdev: PDEV object
564  * @cap: capability flag to be checked
565  *
566  * API to know, whether particular feat caps flag is set in pdev
567  *
568  * Return: 1 (for set) or 0 (for not set)
569  */
570 static inline uint8_t wlan_pdev_nif_feat_cap_get(struct wlan_objmgr_pdev *pdev,
571 				uint32_t cap)
572 {
573 	return (pdev->pdev_nif.pdev_feature_caps & cap) ? 1 : 0;
574 }
575 
576 /**
577  * wlan_pdev_mlme_op_set() - set operation flags
578  * @pdev: PDEV object
579  * @op: Operation flag to be set
580  *
581  * API to set operation flag in pdev
582  *
583  * Return: void
584  */
585 static inline void wlan_pdev_mlme_op_set(struct wlan_objmgr_pdev *pdev,
586 					 uint32_t op)
587 {
588 	pdev->pdev_mlme.pdev_op_flags |= op;
589 }
590 
591 /**
592  * wlan_pdev_mlme_op_clear() - clear op flags
593  * @pdev: PDEV object
594  * @op: Operation flag to be cleared
595  *
596  * API to clear op flag in pdev
597  *
598  * Return: void
599  */
600 static inline void wlan_pdev_mlme_op_clear(struct wlan_objmgr_pdev *pdev,
601 					   uint32_t op)
602 {
603 	pdev->pdev_mlme.pdev_op_flags &= ~op;
604 }
605 
606 /**
607  * wlan_pdev_mlme_op_get() - get op flag
608  * @pdev: PDEV object
609  * @op: Operation flag to be checked
610  *
611  * API to know, whether particular operation flag is set in pdev
612  *
613  * Return: 1 (for set) or 0 (for not set)
614  */
615 static inline uint8_t wlan_pdev_mlme_op_get(struct wlan_objmgr_pdev *pdev,
616 					    uint32_t op)
617 {
618 	return (pdev->pdev_mlme.pdev_op_flags & op) ? 1 : 0;
619 }
620 
621 /**
622  * wlan_pdev_get_hw_macaddr() - get hw macaddr
623  * @pdev: PDEV object
624  *
625  * API to get HW MAC address form PDEV
626  *
627  * Caller need to acquire lock with wlan_pdev_obj_lock()
628  *
629  * Return: @macaddr -MAC address
630  */
631 static inline uint8_t *wlan_pdev_get_hw_macaddr(struct wlan_objmgr_pdev *pdev)
632 {
633 	if (!pdev)
634 		return NULL;
635 
636 	/* This API is invoked with lock acquired, do not add log prints */
637 	return pdev->pdev_nif.macaddr;
638 }
639 
640 /**
641  * wlan_pdev_set_hw_macaddr() - set hw macaddr
642  * @pdev: PDEV object
643  * @macaddr: MAC address
644  *
645  * API to set HW MAC address form PDEV
646  *
647  * Caller need to acquire lock with wlan_pdev_obj_lock()
648  *
649  * Return: void
650  */
651 static inline void wlan_pdev_set_hw_macaddr(struct wlan_objmgr_pdev *pdev,
652 			uint8_t *macaddr)
653 {
654 	/* This API is invoked with lock acquired, do not add log prints */
655 	WLAN_ADDR_COPY(pdev->pdev_nif.macaddr, macaddr);
656 }
657 
658 /**
659  * wlan_pdev_get_ospriv() - get os priv pointer
660  * @pdev: PDEV object
661  *
662  * API to get OS private pointer from PDEV
663  *
664  * Return: ospriv - private pointer
665  */
666 static inline struct pdev_osif_priv *wlan_pdev_get_ospriv(
667 				struct wlan_objmgr_pdev *pdev)
668 {
669 	return pdev->pdev_nif.pdev_ospriv;
670 }
671 
672 /**
673  * wlan_pdev_reset_ospriv() - reset os priv pointer
674  * @pdev: PDEV object
675  *
676  * API to reset OS private pointer in PDEV
677  *
678  * Return: void
679  */
680 static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev)
681 {
682 	pdev->pdev_nif.pdev_ospriv = NULL;
683 }
684 
685 /**
686  * wlan_pdev_set_max_vdev_count() - set pdev max vdev count
687  * @pdev: PDEV object
688  * @vdev count: Max vdev count
689  *
690  * API to set Max vdev count
691  *
692  * Return: void
693  */
694 static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev,
695 					   uint8_t max_vdev_count)
696 {
697 	pdev->pdev_objmgr.max_vdev_count = max_vdev_count;
698 }
699 
700 /**
701  * wlan_pdev_get_max_vdev_count() - get pdev max vdev count
702  * @pdev: PDEV object
703  *
704  * API to set Max vdev count
705  *
706  * Return: @vdev count: Max vdev count
707  */
708 static inline uint8_t wlan_pdev_get_max_vdev_count(
709 					struct wlan_objmgr_pdev *pdev)
710 {
711 	return pdev->pdev_objmgr.max_vdev_count;
712 }
713 
714 /**
715  * DOC: Examples to use PDEV ref count APIs
716  *
717  * In all the scenarios, the pair of API should be followed
718  * otherwise it lead to memory leak
719  *
720  *  scenario 1:
721  *
722  *     wlan_objmgr_pdev_obj_create()
723  *     ----
724  *     wlan_objmgr_pdev_obj_delete()
725  *
726  *  scenario 2:
727  *
728  *     wlan_objmgr_pdev_get_ref()
729  *     ----
730  *     the operations which are done on
731  *     pdev object
732  *     ----
733  *     wlan_objmgr_pdev_release_ref()
734  *
735  *  scenario 3:
736  *
737  *     wlan_objmgr_get_pdev_by_id[_no_state]()
738  *     ----
739  *     the operations which are done on
740  *     pdev object
741  *     ----
742  *     wlan_objmgr_pdev_release_ref()
743  *
744  *  scenario 4:
745  *
746  *     wlan_objmgr_get_pdev_by_macaddr[_no_state]()
747  *     ----
748  *     the operations which are done on
749  *     pdev object
750  *     ----
751  *     wlan_objmgr_pdev_release_ref()
752  */
753 
754 /**
755  * wlan_objmgr_pdev_get_ref() - increment ref count
756  * @pdev: PDEV object
757  * @id:   Object Manager ref debug id
758  *
759  * API to increment ref count of pdev
760  *
761  * Return: void
762  */
763 void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
764 					wlan_objmgr_ref_dbgid id);
765 
766 /**
767  * wlan_objmgr_pdev_try_get_ref() - increment ref count, if allowed
768  * @pdev: PDEV object
769  * @id:   Object Manager ref debug id
770  *
771  * API to increment ref count of pdev after checking valid object state
772  *
773  * Return: void
774  */
775 QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
776 						wlan_objmgr_ref_dbgid id);
777 
778 /**
779  * wlan_objmgr_pdev_release_ref() - decrement ref count
780  * @pdev: PDEV object
781  * @id:   Object Manager ref debug id
782  *
783  * API to decrement ref count of pdev, if ref count is 1, it initiates the
784  * PDEV deletion
785  *
786  * Return: void
787  */
788 void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
789 						wlan_objmgr_ref_dbgid id);
790 
791 /**
792  * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev
793  * @pdev: PDEV object
794  * @dbg_id:   Object Manager ref debug id
795  *
796  * API to get reference to first vdev of pdev.
797  *
798  * Return: reference to first vdev
799  */
800 struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
801 		struct wlan_objmgr_pdev *pdev,
802 		wlan_objmgr_ref_dbgid dbg_id);
803 
804 /**
805  * wlan_objmgr_pdev_get_pdev_id() - get pdev id
806  * @pdev: PDEV object
807  *
808  * API to get pdev id from pdev object
809  *
810  * Return: @pdev id
811  */
812 static inline
813 uint8_t wlan_objmgr_pdev_get_pdev_id(struct wlan_objmgr_pdev *pdev)
814 {
815 	return pdev->pdev_objmgr.wlan_pdev_id;
816 }
817 
818 /**
819  * wlan_pdev_set_tgt_if_handle(): API to set target if handle in pdev object
820  * @pdev: Pdev pointer
821  * @tgt_if_handle: target interface handle
822  *
823  * API to set target interface handle in pdev object
824  *
825  * Caller needs to acquire lock with wlan_pdev_obj_lock()
826  *
827  * Return: None
828  */
829 static inline void wlan_pdev_set_tgt_if_handle(struct wlan_objmgr_pdev *pdev,
830 			void *tgt_if_handle)
831 {
832 	/* This API is invoked with lock acquired, do not add log prints */
833 	if (pdev == NULL)
834 		return;
835 
836 	pdev->tgt_if_handle = tgt_if_handle;
837 }
838 
839 /**
840  * wlan_pdev_get_tgt_if_handle(): API to get target interface handle
841  * @pdev: Pdev pointer
842  *
843  * API to get target interface handle from pdev object
844  *
845  * Return: target interface handle
846  */
847 static inline void *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev)
848 {
849 	if (pdev == NULL)
850 		return NULL;
851 
852 	return pdev->tgt_if_handle;
853 }
854 
855 /**
856  * wlan_pdev_set_max_peer_count() - set max peer count
857  * @vdev: PDEV object
858  * @count: Max peer count
859  *
860  * API to set max peer count of PDEV
861  *
862  * Return: void
863  */
864 static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev,
865 						uint16_t count)
866 {
867 	pdev->pdev_objmgr.max_peer_count = count;
868 }
869 
870 /**
871  * wlan_pdev_get_max_peer_count() - get max peer count
872  * @pdev: PDEV object
873  *
874  * API to get max peer count of PDEV
875  *
876  * Return: max peer count
877  */
878 static inline uint16_t wlan_pdev_get_max_peer_count(
879 						struct wlan_objmgr_pdev *pdev)
880 {
881 	return pdev->pdev_objmgr.max_peer_count;
882 }
883 
884 /**
885  * wlan_pdev_get_peer_count() - get pdev peer count
886  * @pdev: PDEV object
887  *
888  * API to get peer count from PDEV
889  *
890  * Return: peer_count - pdev's peer count
891  */
892 static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev)
893 {
894 	return pdev->pdev_objmgr.wlan_peer_count;
895 }
896 
897 /**
898  * wlan_pdev_get_temp_peer_count() - get pdev temporary peer count
899  * @pdev: PDEV object
900  *
901  * API to get temporary peer count from PDEV
902  *
903  * Return: temp_peer_count - pdev's temporary peer count
904  */
905 static inline uint16_t wlan_pdev_get_temp_peer_count(struct wlan_objmgr_pdev *pdev)
906 {
907 	return pdev->pdev_objmgr.temp_peer_count;
908 }
909 
910 
911 /**
912  * wlan_pdev_incr_peer_count() - increment pdev peer count
913  * @pdev: PDEV object
914  *
915  * API to increment peer count of PDEV by 1
916  *
917  * Return: void
918  */
919 static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev)
920 {
921 	pdev->pdev_objmgr.wlan_peer_count++;
922 }
923 
924 /**
925  * wlan_pdev_decr_peer_count() - decrement pdev peer count
926  * @pdev: PDEV object
927  *
928  * API to decrement peer count of PDEV by 1
929  *
930  * Return: void
931  */
932 static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev)
933 {
934 	pdev->pdev_objmgr.wlan_peer_count--;
935 }
936 
937 /**
938  * wlan_pdev_incr_temp_peer_count() - increment temporary pdev peer count
939  * @pdev: PDEV object
940  *
941  * API to increment temporary  peer count of PDEV by 1
942  *
943  * Return: void
944  */
945 static inline void wlan_pdev_incr_temp_peer_count(struct wlan_objmgr_pdev *pdev)
946 {
947 	pdev->pdev_objmgr.temp_peer_count++;
948 }
949 
950 /**
951  * wlan_pdev_decr_temp_peer_count() - decrement pdev temporary peer count
952  * @pdev: PDEV object
953  *
954  * API to decrement temporary peer count of PDEV by 1
955  *
956  * Return: void
957  */
958 static inline void wlan_pdev_decr_temp_peer_count(struct wlan_objmgr_pdev *pdev)
959 {
960 	pdev->pdev_objmgr.temp_peer_count--;
961 }
962 
963 /**
964  * wlan_pdev_get_vdev_count() - get PDEV vdev count
965  * @pdev: PDEV object
966  *
967  * API to get vdev count from PDEV
968  *
969  * Return: vdev_count - pdev's vdev count
970  */
971 static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev)
972 {
973 	return pdev->pdev_objmgr.wlan_vdev_count;
974 }
975 
976 /**
977  * wlan_pdev_set_dp_handle() - set dp handle
978  * @pdev: pdev object pointer
979  * @dp_handle: Data path module handle
980  *
981  * Return: void
982  */
983 static inline void wlan_pdev_set_dp_handle(struct wlan_objmgr_pdev *pdev,
984 		void *dp_handle)
985 {
986 	if (qdf_unlikely(!pdev)) {
987 		QDF_BUG(0);
988 		return;
989 	}
990 
991 	pdev->dp_handle = dp_handle;
992 }
993 
994 /**
995  * wlan_pdev_get_dp_handle() - get dp handle
996  * @pdev: pdev object pointer
997  *
998  * Return: dp handle
999  */
1000 static inline void *wlan_pdev_get_dp_handle(struct wlan_objmgr_pdev *pdev)
1001 {
1002 	if (qdf_unlikely(!pdev)) {
1003 		QDF_BUG(0);
1004 		return NULL;
1005 	}
1006 
1007 	return pdev->dp_handle;
1008 }
1009 
1010 #endif /* _WLAN_OBJMGR_PDEV_H_*/
1011