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