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