xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h (revision 3149adf58a329e17232a4c0e58d460d025edd55a)
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 coexistance */
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  * @wlan_psoc:         back pointer to PSOC, its attached to
153  * @ref_cnt:           Ref count
154  * @ref_id_dbg:        Array to track Ref count
155  */
156 struct wlan_objmgr_pdev_objmgr {
157 	uint8_t wlan_pdev_id;
158 	uint8_t wlan_vdev_count;
159 	uint8_t max_vdev_count;
160 	uint8_t print_cnt;
161 	qdf_list_t wlan_vdev_list;
162 	uint16_t wlan_peer_count;
163 	uint16_t max_peer_count;
164 	struct wlan_objmgr_psoc *wlan_psoc;
165 	qdf_atomic_t ref_cnt;
166 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
167 };
168 
169 /**
170  * struct wlan_objmgr_pdev - PDEV common object
171  * @current_chan_list: Active/current Channel list of the radio
172  * @pdev_nif:          pdev nif structure
173  * @pdev_objmgr:       pdev object manager structure
174  * @pdev_mlme:         pdev MLME structure
175  * @pdev_comp_priv_obj[]:   component's private object array
176  * @obj_status[]:      object status of each component object
177  * @obj_state:         object state
178  * @tgt_if_handle:     Target interface handle
179  * @dp_handle:         DP module handle
180  * @pdev_lock:         lock to protect object
181 */
182 struct wlan_objmgr_pdev {
183 	struct wlan_chan_list *current_chan_list;
184 	struct wlan_objmgr_pdev_nif  pdev_nif;
185 	struct wlan_objmgr_pdev_objmgr pdev_objmgr;
186 	struct wlan_objmgr_pdev_mlme   pdev_mlme;
187 	void *pdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
188 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
189 	WLAN_OBJ_STATE obj_state;
190 	void *tgt_if_handle;
191 	void *dp_handle;
192 	qdf_spinlock_t pdev_lock;
193 };
194 
195 /**
196  ** APIs to Create/Delete Global object APIs
197  */
198 /**
199  * wlan_objmgr_pdev_obj_create() - pdev create
200  * @psoc: PSOC object
201  * @scn: os private object
202  *
203  * Creates PDEV object, intializes with default values
204  * Invokes the registered notifiers to create component object
205  *
206  * Return: Handle to struct wlan_objmgr_psoc on successful creation,
207  *         NULL on Failure (on Mem alloc failure and Component objects
208  *         Failure)
209  */
210 struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
211 	struct wlan_objmgr_psoc *psoc, struct pdev_osif_priv *osif_priv);
212 
213 /**
214  * wlan_objmgr_pdev_obj_delete() - pdev delete
215  * @psoc: PDEV object
216  *
217  * Logically deletes PDEV object,
218  * Once all the references are released, object manager invokes the registered
219  * notifiers to destroy component objects
220  *
221  * Return: SUCCESS/FAILURE
222  */
223 QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev);
224 
225 /**
226  ** APIs to attach/detach component objects
227  */
228 /**
229  * wlan_objmgr_pdev_component_obj_attach() - pdev comp object attach
230  * @psoc: PDEV object
231  * @id: Component id
232  * @comp_priv_obj: component's private object pointer
233  * @status: Component's private object creation status
234  *
235  * API to be used for attaching component object with PDEV common object
236  *
237  * Return: SUCCESS on successful storing of component's object in common object
238  *         On FAILURE (appropriate failure codes are returned)
239  */
240 QDF_STATUS wlan_objmgr_pdev_component_obj_attach(
241 		struct wlan_objmgr_pdev *pdev,
242 		enum wlan_umac_comp_id id,
243 		void *comp_priv_obj,
244 		QDF_STATUS status);
245 
246 /**
247  * wlan_objmgr_pdev_component_obj_detach() - pdev comp object detach
248  * @psoc: PDEV object
249  * @id: Component id
250  * @comp_priv_obj: component's private object pointer
251  *
252  * API to be used for detaching component object with PDEV common object
253  *
254  * Return: SUCCESS on successful removal of component's object from common
255  *         object
256  *         On FAILURE (appropriate failure codes are returned)
257  */
258 QDF_STATUS wlan_objmgr_pdev_component_obj_detach(
259 		struct wlan_objmgr_pdev *pdev,
260 		enum wlan_umac_comp_id id,
261 		void *comp_priv_obj);
262 
263 /**
264  ** APIs to operations on pdev objects
265  */
266 
267 typedef void (*wlan_objmgr_pdev_op_handler)(struct wlan_objmgr_pdev *pdev,
268 					void *object,
269 					void *arg);
270 
271 /**
272  * wlan_objmgr_pdev_iterate_obj_list() - operate on all objects of pdev
273  * @pdev: PDEV object
274  * @obj_type: VDEV_OP/PEER_OP
275  * @handler: the handler will be called for each object of requested type
276  *           the handler should be implemented to perform required operation
277  * @arg: agruments passed by caller
278  * @lock_free_op: This gives provision to run this API with out lock protected
279  *                It would be useful, for operations like Obj Delete, where
280  *                lock should not be taken by caller.
281  * @dbg_id: id of the caller
282  *
283  * API to be used for performing the operations on all VDEV/PEER objects
284  * of pdev
285  *
286  * Return: SUCCESS/FAILURE
287  */
288 QDF_STATUS wlan_objmgr_pdev_iterate_obj_list(
289 		struct wlan_objmgr_pdev *pdev,
290 		enum wlan_objmgr_obj_type obj_type,
291 		wlan_objmgr_pdev_op_handler handler,
292 		void *arg, uint8_t lock_free_op,
293 		wlan_objmgr_ref_dbgid dbg_id);
294 
295 /**
296  * wlan_objmgr_trigger_pdev_comp_priv_object_creation() - create
297  * comp object of pdev
298  * @pdev: PDEV object
299  * @id: Component id
300  *
301  * API to create component private object in run time, this would be
302  * used for features which gets enabled in run time
303  *
304  * Return: SUCCESS on successful creation
305  *         On FAILURE (appropriate failure codes are returned)
306  */
307 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_creation(
308 		struct wlan_objmgr_pdev *pdev,
309 		enum wlan_umac_comp_id id);
310 
311 /**
312  * wlan_objmgr_trigger_pdev_comp_priv_object_deletion() - destroy
313  * comp object of pdev
314  * @pdev: PDEV object
315  * @id: Component id
316  *
317  * API to destroy component private object in run time, this would
318  * be used for features which gets disabled in run time
319  *
320  * Return: SUCCESS on successful deletion
321  *         On FAILURE (appropriate failure codes are returned)
322  */
323 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion(
324 		struct wlan_objmgr_pdev *pdev,
325 		enum wlan_umac_comp_id id);
326 
327 /**
328  * wlan_objmgr_get_vdev_by_id_from_pdev() - find vdev using id from pdev
329  * @pdev: PDEV object
330  * @vdev_id: vdev id
331  * @dbg_id: id of the caller
332  *
333  * API to find vdev object pointer by vdev id from pdev's vdev list
334  *
335  * This API increments the ref count of the vdev object internally, the
336  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
337  * ref count
338  *
339  * Return: vdev pointer
340  *         NULL on FAILURE
341  */
342 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
343 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
344 			wlan_objmgr_ref_dbgid dbg_id);
345 
346 /**
347  * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id from
348  *                                                      pdev
349  * @pdev: PDEV object
350  * @vdev_id: vdev id
351  * @dbg_id: id of the caller
352  *
353  * API to find vdev object pointer by vdev id from pdev's vdev list
354  *
355  * This API increments the ref count of the vdev object internally, the
356  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
357  * ref count
358  *
359  * Return: vdev pointer
360  *         NULL on FAILURE
361  */
362 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
363 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
364 			wlan_objmgr_ref_dbgid dbg_id);
365 
366 /**
367  * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr
368  * @pdev: PDEV object
369  * @macaddr: MAC address
370  * @dbg_id: id of the caller
371  *
372  * API to find vdev object pointer by vdev mac addr from pdev's vdev list
373  *
374  * This API increments the ref count of the vdev object internally, the
375  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
376  * ref count
377  *
378  * Return: vdev pointer
379  *         NULL on FAILURE
380  */
381 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
382 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
383 		wlan_objmgr_ref_dbgid dbg_id);
384 
385 /**
386  * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using
387  *                                                           macaddr
388  * @pdev: PDEV object
389  * @macaddr: MAC address
390  * @dbg_id: id of the caller
391  *
392  * API to find vdev object pointer by vdev mac addr from pdev's vdev list
393  *
394  * This API increments the ref count of the vdev object internally, the
395  * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
396  * ref count
397  *
398  * Return: vdev pointer
399  *         NULL on FAILURE
400  */
401 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
402 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
403 		wlan_objmgr_ref_dbgid dbg_id);
404 
405 /**
406  * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object
407  * @pdev: PDEV object
408  * @id: Component id
409  *
410  * API to get component private object
411  *
412  * Return: void *ptr on SUCCESS
413  *         NULL on Failure
414  */
415 void *wlan_objmgr_pdev_get_comp_private_obj(
416 		struct wlan_objmgr_pdev *pdev,
417 		enum wlan_umac_comp_id id);
418 
419 /**
420  * wlan_pdev_obj_lock() - Acquire PDEV spinlock
421  * @pdev: PDEV object
422  *
423  * API to acquire PDEV lock
424  * Parent lock should not be taken in child lock context
425  * but child lock can be taken in parent lock context
426  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
427  *
428  * Return: void
429  */
430 static inline void wlan_pdev_obj_lock(struct wlan_objmgr_pdev *pdev)
431 {
432 	qdf_spin_lock_bh(&pdev->pdev_lock);
433 }
434 
435 /**
436  * wlan_pdev_obj_unlock() - Release PDEV spinlock
437  * @pdev: PDEV object
438  *
439  * API to Release PDEV lock
440  *
441  * Return: void
442  */
443 static inline void wlan_pdev_obj_unlock(struct wlan_objmgr_pdev *pdev)
444 {
445 	qdf_spin_unlock_bh(&pdev->pdev_lock);
446 }
447 
448 /**
449  * wlan_pdev_get_psoc() - get psoc
450  * @pdev: PDEV object
451  *
452  * API to get the psoc object from PDEV
453  *
454  * Return:
455  * @psoc: PSOC object
456  */
457 static inline struct wlan_objmgr_psoc *wlan_pdev_get_psoc(
458 			struct wlan_objmgr_pdev *pdev)
459 {
460 	return pdev->pdev_objmgr.wlan_psoc;
461 }
462 
463 /**
464  * wlan_pdev_set_psoc() - set psoc
465  * @pdev: PDEV object
466  * @psoc: PSOC object
467  *
468  * API to set the psoc object from PDEV
469  *
470  * Return: void
471  */
472 static inline void wlan_pdev_set_psoc(struct wlan_objmgr_pdev *pdev,
473 				struct wlan_objmgr_psoc *psoc)
474 {
475 	pdev->pdev_objmgr.wlan_psoc = psoc;
476 }
477 
478 /**
479  * wlan_pdev_nif_fw_cap_set() - set fw caps
480  * @pdev: PDEV object
481  * @cap: capability flag to be set
482  *
483  * API to set fw caps in pdev
484  *
485  * Return: void
486  */
487 static inline void wlan_pdev_nif_fw_cap_set(struct wlan_objmgr_pdev *pdev,
488 				uint32_t cap)
489 {
490 	pdev->pdev_nif.pdev_fw_caps |= cap;
491 }
492 
493 /**
494  * wlan_pdev_nif_fw_cap_clear() - clear fw cap
495  * @pdev: PDEV object
496  * @cap: capability flag to be cleared
497  *
498  * API to clear fw caps in pdev
499  *
500  * Return: void
501  */
502 static inline void wlan_pdev_nif_fw_cap_clear(struct wlan_objmgr_pdev *pdev,
503 				uint32_t cap)
504 {
505 	pdev->pdev_nif.pdev_fw_caps &= ~cap;
506 }
507 
508 /**
509  * wlan_pdev_nif_fw_cap_get() - get fw caps
510  * @pdev: PDEV object
511  * @cap: capability flag to be checked
512  *
513  * API to know, whether particular fw caps flag is set in pdev
514  *
515  * Return: 1 (for set) or 0 (for not set)
516  */
517 static inline uint8_t wlan_pdev_nif_fw_cap_get(struct wlan_objmgr_pdev *pdev,
518 				uint32_t cap)
519 {
520 	return (pdev->pdev_nif.pdev_fw_caps & cap) ? 1 : 0;
521 }
522 
523 /**
524  * wlan_pdev_nif_feat_cap_set() - set feature caps
525  * @pdev: PDEV object
526  * @cap: capability flag to be set
527  *
528  * API to set feat caps in pdev
529  *
530  * Return: void
531  */
532 static inline void wlan_pdev_nif_feat_cap_set(struct wlan_objmgr_pdev *pdev,
533 				uint32_t cap)
534 {
535 	pdev->pdev_nif.pdev_feature_caps |= cap;
536 }
537 
538 /**
539  * wlan_pdev_nif_feat_cap_clear() - clear feature caps
540  * @pdev: PDEV object
541  * @cap: capability flag to be cleared
542  *
543  * API to clear feat caps in pdev
544  *
545  * Return: void
546  */
547 static inline void wlan_pdev_nif_feat_cap_clear(struct wlan_objmgr_pdev *pdev,
548 				uint32_t cap)
549 {
550 	pdev->pdev_nif.pdev_feature_caps &= ~cap;
551 }
552 
553 /**
554  * wlan_pdev_nif_feat_cap_get() - get feature caps
555  * @pdev: PDEV object
556  * @cap: capability flag to be checked
557  *
558  * API to know, whether particular feat caps flag is set in pdev
559  *
560  * Return: 1 (for set) or 0 (for not set)
561  */
562 static inline uint8_t wlan_pdev_nif_feat_cap_get(struct wlan_objmgr_pdev *pdev,
563 				uint32_t cap)
564 {
565 	return (pdev->pdev_nif.pdev_feature_caps & cap) ? 1 : 0;
566 }
567 
568 /**
569  * wlan_pdev_get_hw_macaddr() - get hw macaddr
570  * @pdev: PDEV object
571  *
572  * API to get HW MAC address form PDEV
573  *
574  * Caller need to acquire lock with wlan_pdev_obj_lock()
575  *
576  * Return: @macaddr -MAC address
577  */
578 static inline uint8_t *wlan_pdev_get_hw_macaddr(struct wlan_objmgr_pdev *pdev)
579 {
580 	if (!pdev)
581 		return NULL;
582 
583 	/* This API is invoked with lock acquired, do not add log prints */
584 	return pdev->pdev_nif.macaddr;
585 }
586 
587 /**
588  * wlan_pdev_set_hw_macaddr() - set hw macaddr
589  * @pdev: PDEV object
590  * @macaddr: MAC address
591  *
592  * API to set HW MAC address form PDEV
593  *
594  * Caller need to acquire lock with wlan_pdev_obj_lock()
595  *
596  * Return: void
597  */
598 static inline void wlan_pdev_set_hw_macaddr(struct wlan_objmgr_pdev *pdev,
599 			uint8_t *macaddr)
600 {
601 	/* This API is invoked with lock acquired, do not add log prints */
602 	WLAN_ADDR_COPY(pdev->pdev_nif.macaddr, macaddr);
603 }
604 
605 /**
606  * wlan_pdev_get_ospriv() - get os priv pointer
607  * @pdev: PDEV object
608  *
609  * API to get OS private pointer from PDEV
610  *
611  * Return: ospriv - private pointer
612  */
613 static inline struct pdev_osif_priv *wlan_pdev_get_ospriv(
614 				struct wlan_objmgr_pdev *pdev)
615 {
616 	return pdev->pdev_nif.pdev_ospriv;
617 }
618 
619 /**
620  * wlan_pdev_reset_ospriv() - reset os priv pointer
621  * @pdev: PDEV object
622  *
623  * API to reset OS private pointer in PDEV
624  *
625  * Return: void
626  */
627 static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev)
628 {
629 	pdev->pdev_nif.pdev_ospriv = NULL;
630 }
631 
632 /**
633  * wlan_pdev_set_max_vdev_count() - set pdev max vdev count
634  * @pdev: PDEV object
635  * @vdev count: Max vdev count
636  *
637  * API to set Max vdev count
638  *
639  * Return: void
640  */
641 static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev,
642 					   uint8_t max_vdev_count)
643 {
644 	pdev->pdev_objmgr.max_vdev_count = max_vdev_count;
645 }
646 
647 /**
648  * wlan_pdev_get_max_vdev_count() - get pdev max vdev count
649  * @pdev: PDEV object
650  *
651  * API to set Max vdev count
652  *
653  * Return: @vdev count: Max vdev count
654  */
655 static inline uint8_t wlan_pdev_get_max_vdev_count(
656 					struct wlan_objmgr_pdev *pdev)
657 {
658 	return pdev->pdev_objmgr.max_vdev_count;
659 }
660 
661 /**
662  * DOC: Examples to use PDEV ref count APIs
663  *
664  * In all the scenarios, the pair of API should be followed
665  * otherwise it lead to memory leak
666  *
667  *  scenario 1:
668  *
669  *     wlan_objmgr_pdev_obj_create()
670  *     ----
671  *     wlan_objmgr_pdev_obj_delete()
672  *
673  *  scenario 2:
674  *
675  *     wlan_objmgr_pdev_get_ref()
676  *     ----
677  *     the operations which are done on
678  *     pdev object
679  *     ----
680  *     wlan_objmgr_pdev_release_ref()
681  *
682  *  scenario 3:
683  *
684  *     wlan_objmgr_get_pdev_by_id[_no_state]()
685  *     ----
686  *     the operations which are done on
687  *     pdev object
688  *     ----
689  *     wlan_objmgr_pdev_release_ref()
690  *
691  *  scenario 4:
692  *
693  *     wlan_objmgr_get_pdev_by_macaddr[_no_state]()
694  *     ----
695  *     the operations which are done on
696  *     pdev object
697  *     ----
698  *     wlan_objmgr_pdev_release_ref()
699  */
700 
701 /**
702  * wlan_objmgr_pdev_get_ref() - increment ref count
703  * @pdev: PDEV object
704  * @id:   Object Manager ref debug id
705  *
706  * API to increment ref count of pdev
707  *
708  * Return: void
709  */
710 void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
711 					wlan_objmgr_ref_dbgid id);
712 
713 /**
714  * wlan_objmgr_pdev_try_get_ref() - increment ref count, if allowed
715  * @pdev: PDEV object
716  * @id:   Object Manager ref debug id
717  *
718  * API to increment ref count of pdev after checking valid object state
719  *
720  * Return: void
721  */
722 QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
723 						wlan_objmgr_ref_dbgid id);
724 
725 /**
726  * wlan_objmgr_pdev_release_ref() - decrement ref count
727  * @pdev: PDEV object
728  * @id:   Object Manager ref debug id
729  *
730  * API to decrement ref count of pdev, if ref count is 1, it initiates the
731  * PDEV deletion
732  *
733  * Return: void
734  */
735 void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
736 						wlan_objmgr_ref_dbgid id);
737 
738 /**
739  * wlan_objmgr_pdev_get_pdev_id() - get pdev id
740  * @pdev: PDEV object
741  *
742  * API to get pdev id from pdev object
743  *
744  * Return: @pdev id
745  */
746 static inline
747 uint8_t wlan_objmgr_pdev_get_pdev_id(struct wlan_objmgr_pdev *pdev)
748 {
749 	return pdev->pdev_objmgr.wlan_pdev_id;
750 }
751 
752 /**
753  * wlan_pdev_set_tgt_if_handle(): API to set target if handle in pdev object
754  * @pdev: Pdev pointer
755  * @tgt_if_handle: target interface handle
756  *
757  * API to set target interface handle in pdev object
758  *
759  * Caller needs to acquire lock with wlan_pdev_obj_lock()
760  *
761  * Return: None
762  */
763 static inline void wlan_pdev_set_tgt_if_handle(struct wlan_objmgr_pdev *pdev,
764 			void *tgt_if_handle)
765 {
766 	/* This API is invoked with lock acquired, do not add log prints */
767 	if (pdev == NULL)
768 		return;
769 
770 	pdev->tgt_if_handle = tgt_if_handle;
771 }
772 
773 /**
774  * wlan_pdev_get_tgt_if_handle(): API to get target interface handle
775  * @pdev: Pdev pointer
776  *
777  * API to get target interface handle from pdev object
778  *
779  * Return: target interface handle
780  */
781 static inline void *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev)
782 {
783 	if (pdev == NULL)
784 		return NULL;
785 
786 	return pdev->tgt_if_handle;
787 }
788 
789 /**
790  * wlan_pdev_set_max_peer_count() - set max peer count
791  * @vdev: PDEV object
792  * @count: Max peer count
793  *
794  * API to set max peer count of PDEV
795  *
796  * Return: void
797  */
798 static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev,
799 						uint16_t count)
800 {
801 	pdev->pdev_objmgr.max_peer_count = count;
802 }
803 
804 /**
805  * wlan_pdev_get_max_peer_count() - get max peer count
806  * @pdev: PDEV object
807  *
808  * API to get max peer count of PDEV
809  *
810  * Return: max peer count
811  */
812 static inline uint16_t wlan_pdev_get_max_peer_count(
813 						struct wlan_objmgr_pdev *pdev)
814 {
815 	return pdev->pdev_objmgr.max_peer_count;
816 }
817 
818 /**
819  * wlan_pdev_get_peer_count() - get pdev peer count
820  * @pdev: PDEV object
821  *
822  * API to get peer count from PDEV
823  *
824  * Return: peer_count - pdev's peer count
825  */
826 static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev)
827 {
828 	return pdev->pdev_objmgr.wlan_peer_count;
829 }
830 
831 /**
832  * wlan_pdev_incr_peer_count() - increment pdev peer count
833  * @pdev: PDEV object
834  *
835  * API to increment peer count of PDEV by 1
836  *
837  * Return: void
838  */
839 static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev)
840 {
841 	pdev->pdev_objmgr.wlan_peer_count++;
842 }
843 
844 /**
845  * wlan_pdev_decr_peer_count() - decrement pdev peer count
846  * @pdev: PDEV object
847  *
848  * API to decrement peer count of PDEV by 1
849  *
850  * Return: void
851  */
852 static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev)
853 {
854 	pdev->pdev_objmgr.wlan_peer_count--;
855 }
856 
857 /**
858  * wlan_pdev_get_vdev_count() - get PDEV vdev count
859  * @pdev: PDEV object
860  *
861  * API to get vdev count from PDEV
862  *
863  * Return: vdev_count - pdev's vdev count
864  */
865 static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev)
866 {
867 	return pdev->pdev_objmgr.wlan_vdev_count;
868 }
869 
870 /**
871  * wlan_pdev_set_dp_handle() - set dp handle
872  * @pdev: pdev object pointer
873  * @dp_handle: Data path module handle
874  *
875  * Return: void
876  */
877 static inline void wlan_pdev_set_dp_handle(struct wlan_objmgr_pdev *pdev,
878 		void *dp_handle)
879 {
880 	if (qdf_unlikely(!pdev)) {
881 		QDF_BUG(0);
882 		return;
883 	}
884 
885 	pdev->dp_handle = dp_handle;
886 }
887 
888 /**
889  * wlan_pdev_get_dp_handle() - get dp handle
890  * @pdev: pdev object pointer
891  *
892  * Return: dp handle
893  */
894 static inline void *wlan_pdev_get_dp_handle(struct wlan_objmgr_pdev *pdev)
895 {
896 	if (qdf_unlikely(!pdev)) {
897 		QDF_BUG(0);
898 		return NULL;
899 	}
900 
901 	return pdev->dp_handle;
902 }
903 
904 #endif /* _WLAN_OBJMGR_PDEV_H_*/
905