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