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