xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h (revision 97f44cd39e4ff816eaa1710279d28cf6b9e65ad9)
1 /*
2  * Copyright (c) 2016-2020 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 vdev data structure of UMAC
21  */
22 
23 #ifndef _WLAN_OBJMGR_VDEV_OBJ_H_
24 #define _WLAN_OBJMGR_VDEV_OBJ_H_
25 
26 #include "qdf_atomic.h"
27 #include "qdf_list.h"
28 #include "qdf_lock.h"
29 #include "qdf_types.h"
30 #include "wlan_cmn.h"
31 #include "wlan_objmgr_cmn.h"
32 #include "wlan_objmgr_pdev_obj.h"
33 #include "wlan_objmgr_psoc_obj.h"
34 #include "wlan_vdev_mlme_main.h"
35 #include "include/wlan_vdev_mlme.h"
36 #include "wlan_vdev_mlme_api.h"
37 #include "wlan_mlme_dbg.h"
38 
39 	/* CONF: privacy enabled */
40 #define WLAN_VDEV_F_PRIVACY              0x00000001
41 	/* CONF: 11g w/o 11b sta's */
42 #define WLAN_VDEV_F_PUREG                0x00000002
43 	/* CONF: des_bssid is set */
44 #define WLAN_VDEV_F_DESBSSID             0x00000004
45 	/* CONF: bg scan enabled */
46 #define WLAN_VDEV_F_BGSCAN               0x00000008
47 	/* CONF: sw tx retry enabled */
48 #define WLAN_VDEV_F_SWRETRY              0x00000010
49 	/* STATUS: update beacon tim */
50 #define WLAN_VDEV_F_TIMUPDATE            0x00000020
51 	/* CONF: WPA enabled */
52 #define WLAN_VDEV_F_WPA1                 0x00000040
53 	/* CONF: WPA2 enabled */
54 #define WLAN_VDEV_F_WPA2                 0x00000080
55 	/* CONF: WPA/WPA2 enabled */
56 #define WLAN_VDEV_F_WPA                  0x000000c0
57 	/* CONF: drop unencrypted */
58 #define WLAN_VDEV_F_DROPUNENC            0x00000100
59 	/* CONF: TKIP countermeasures */
60 #define WLAN_VDEV_F_COUNTERM             0x00000200
61 	/* CONF: hide SSID in beacon */  /*TODO PDEV/PSOC */
62 #define WLAN_VDEV_F_HIDESSID             0x00000400
63 	/* CONF: disable internal bridge */ /*TODO PDEV/PSOC */
64 #define WLAN_VDEV_F_NOBRIDGE             0x00000800
65 	/* STATUS: update beacon wme */
66 #define WLAN_VDEV_F_WMEUPDATE            0x00001000
67 	/* CONF: 4 addr allowed */
68 #define WLAN_VDEV_F_WDS                  0x00002000
69 	/* CONF: enable U-APSD */
70 #define WLAN_VDEV_F_UAPSD                0x00004000
71 	/* STATUS: sleeping */
72 #define WLAN_VDEV_F_SLEEP                0x00008000
73 	/* drop uapsd EOSP frames for test */
74 #define WLAN_VDEV_F_EOSPDROP             0x00010000
75 	/* CONF: A-MPDU supported */
76 #define WLAN_VDEV_F_AMPDU                0x00020000
77 	/* STATE: beacon APP IE updated */
78 #define WLAN_VDEV_F_APPIE_UPDATE         0x00040000
79 	/* CONF: WDS auto Detect/DELBA */
80 #define WLAN_VDEV_F_WDS_AUTODETECT       0x00080000
81 	/* 11b only without 11g stations */
82 #define WLAN_VDEV_F_PUREB                0x00100000
83 	/* disable HT rates */
84 #define WLAN_VDEV_F_HTRATES              0x00200000
85 	/* Extender AP */
86 #define WLAN_VDEV_F_AP                   0x00400000
87 	/* CONF: deliver rx frames with 802.11 header */
88 #define WLAN_VDEV_F_DELIVER_80211        0x00800000
89 	/* CONF: os sends down tx frames with 802.11 header */
90 #define WLAN_VDEV_F_SEND_80211           0x01000000
91 	/* CONF: statically configured WDS */
92 #define WLAN_VDEV_F_WDS_STATIC           0x02000000
93 	/* CONF: pure 11n mode */
94 #define WLAN_VDEV_F_PURE11N              0x04000000
95 	/* CONF: pure 11ac mode */
96 #define WLAN_VDEV_F_PURE11AC             0x08000000
97 	/* Basic Rates Update */
98 #define WLAN_VDEV_F_BR_UPDATE            0x10000000
99 	/* CONF: restrict bw ont top of per 11ac/n */
100 #define WLAN_VDEV_F_STRICT_BW            0x20000000
101 	/* Wi-Fi SON mode (with APS) */
102 #define WLAN_VDEV_F_SON                  0x40000000
103 	/* Wi-Fi SON mode (with APS) */
104 #define WLAN_VDEV_F_MBO                  0x80000000
105 
106 /* Feature extension flags */
107 		/* CONF: MSFT safe mode         */
108 #define WLAN_VDEV_FEXT_SAFEMODE             0x00000001
109 		/* if the vap can sleep*/
110 #define WLAN_VDEV_FEXT_CANSLEEP             0x00000002
111 		/* use sw bmiss timer */
112 #define WLAN_VDEV_FEXT_SWBMISS              0x00000004
113 		/* enable beacon copy */
114 #define WLAN_VDEV_FEXT_COPY_BEACON          0x00000008
115 #define WLAN_VDEV_FEXT_WAPI                 0x00000010
116 		/* 802.11h enabled */
117 #define WLAN_VDEV_FEXT_DOTH                 0x00000020
118 	/* if the vap has wds independance set */
119 #define WLAN_VDEV_FEXT_VAPIND               0x00000040
120 	/* QBSS load IE enabled */
121 #define WLAN_VDEV_FEXT_BSSLOAD              0x00000080
122 	/* Short Guard Interval Enable:1 Disable:0 */
123 #define WLAN_VDEV_FEXT_SGI                  0x00000100
124 	/* Short Guard Interval Enable:1 Disable:0 for VHT fixed rates */
125 #define WLAN_VDEV_FEXT_DATASGI              0x00000200
126 	/* LDPC Enable Rx:1 TX: 2 ; Disable:0 */
127 #define WLAN_VDEV_FEXT_LDPC_TX              0x00000400
128 #define WLAN_VDEV_FEXT_LDPC_RX              0x00000800
129 #define WLAN_VDEV_FEXT_LDPC                 0x00000c00
130 	/* wme enabled */
131 #define WLAN_VDEV_FEXT_WME                  0x00001000
132 	/* WNM Capabilities */
133 #define WLAN_VDEV_FEXT_WNM                  0x00002000
134 	/* RRM Capabilities */
135 #define WLAN_VDEV_FEXT_RRM                  0x00004000
136 	/* WNM Proxy ARP Capabilities */
137 #define WLAN_VDEV_FEXT_PROXYARP             0x00008000
138 	/* 256 QAM support in 2.4GHz mode Enable:1 Disable:0 */
139 #define WLAN_VDEV_FEXT_256QAM               0x00010000
140 	/* 2.4NG 256 QAM Interop mode Enable:1 Disable:0 */
141 #define WLAN_VDEV_FEXT_256QAM_INTEROP       0x00020000
142 	/* static mimo ps enabled */
143 #define WLAN_VDEV_FEXT_STATIC_MIMOPS        0x00040000
144 	/* dynamic mimo ps enabled */
145 #define WLAN_VDEV_FEXT_DYN_MIMOPS           0x00080000
146 	/* Country IE enabled */
147 #define WLAN_VDEV_FEXT_CNTRY_IE             0x00100000
148 	/*does not want to trigger multi channel operation
149 	instead follow master vaps channel (for AP/GO Vaps) */
150 #define WLAN_VDEV_FEXT_NO_MULCHAN           0x00200000
151 	/*non-beaconing AP VAP*/
152 #define WLAN_VDEV_FEXT_NON_BEACON           0x00400000
153 	/* SPL repeater enabled for SON*/
154 #define WLAN_VDEV_FEXT_SON_SPL_RPT          0x00800000
155 	/* SON IE update in MGMT frame */
156 #define WLAN_VDEV_FEXT_SON_INFO_UPDATE      0x01000000
157 	/* CONF: A-MSDU supported */
158 #define WLAN_VDEV_FEXT_AMSDU                0x02000000
159 	/* VDEV is PSTA*/
160 #define WLAN_VDEV_FEXT_PSTA                 0x04000000
161 	/* VDEV is MPSTA*/
162 #define WLAN_VDEV_FEXT_MPSTA                0x08000000
163 	/* VDEV is WRAP*/
164 #define WLAN_VDEV_FEXT_WRAP                 0x10000000
165 	/* VDEV has MAT enabled*/
166 #define WLAN_VDEV_FEXT_MAT                  0x20000000
167 	/* VDEV is wired PSTA*/
168 #define WLAN_VDEV_FEXT_WIRED_PSTA           0x40000000
169 	/* Fils discovery on 6G SAP*/
170 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP     0x80000000
171 
172 /* VDEV OP flags  */
173   /* if the vap destroyed by user */
174 #define WLAN_VDEV_OP_DELETE_PROGRESS        0x00000001
175  /* set to enable sta-fws fweature */
176 #define WLAN_VDEV_OP_STAFWD                 0x00000002
177    /* Off-channel support enabled */
178 #define WLAN_VDEV_OP_OFFCHAN                0x00000004
179   /* if the vap has erp update set */
180 #define WLAN_VDEV_OP_ERPUPDATE              0x00000008
181   /* this vap needs scheduler for off channel operation */
182 #define WLAN_VDEV_OP_NEEDS_SCHED            0x00000010
183   /*STA in forced sleep set PS bit for all outgoing frames */
184 #define WLAN_VDEV_OP_FORCED_SLEEP           0x00000020
185   /* update bssload IE in beacon */
186 #define WLAN_VDEV_OP_BSSLOAD_UPDATE         0x00000040
187   /* Hotspot 2.0 DGAF Disable bit */
188 #define WLAN_VDEV_OP_DGAF_DISABLE           0x00000080
189   /* STA SmartNet enabled */
190 #define WLAN_VDEV_OP_SMARTNET_EN            0x00000100
191   /* SoftAP to reject resuming in DFS channels */
192 #define WLAN_VDEV_OP_REJ_DFS_CHAN           0x00000200
193   /* Trigger mlme response */
194 #define WLAN_VDEV_OP_TRIGGER_MLME_RESP      0x00000400
195   /* test flag for MFP */
196 #define WLAN_VDEV_OP_MFP_TEST               0x00000800
197   /* flag to indicate using default ratemask */
198 #define WLAN_VDEV_OP_DEF_RATEMASK           0x00001000
199 /*For wakeup AP VAP when wds-sta connect to the AP only use when
200 	export (UMAC_REPEATER_DELAYED_BRINGUP || DBDC_REPEATER_SUPPORT)=1*/
201 #define WLAN_VDEV_OP_KEYFLAG                0x00002000
202   /* if performe the iwlist scanning */
203 #define WLAN_VDEV_OP_LIST_SCANNING          0x00004000
204    /*Set when VAP down*/
205 #define WLAN_VDEV_OP_IS_DOWN                0x00008000
206   /* if vap may require acs when another vap is brought down */
207 #define WLAN_VDEV_OP_NEEDS_UP_ACS           0x00010000
208   /* Block data traffic tx for this vap */
209 #define WLAN_VDEV_OP_BLOCK_TX_TRAFFIC       0x00020000
210   /* for mbo functionality */
211 #define WLAN_VDEV_OP_MBO                    0x00040000
212 
213  /* CAPABILITY: IBSS available */
214 #define WLAN_VDEV_C_IBSS                    0x00000001
215 /* CAPABILITY: HOSTAP avail */
216 #define WLAN_VDEV_C_HOSTAP               0x00000002
217    /* CAPABILITY: Old Adhoc Demo */
218 #define WLAN_VDEV_C_AHDEMO               0x00000004
219   /* CAPABILITY: sw tx retry */
220 #define WLAN_VDEV_C_SWRETRY              0x00000008
221   /* CAPABILITY: monitor mode */
222 #define WLAN_VDEV_C_MONITOR              0x00000010
223   /* CAPABILITY: TKIP MIC avail */
224 #define WLAN_VDEV_C_TKIPMIC              0x00000020
225   /* CAPABILITY: 4-addr support */
226 #define WLAN_VDEV_C_WDS                  0x00000040
227   /* CAPABILITY: TKIP MIC for QoS frame */
228 #define WLAN_VDEV_C_WME_TKIPMIC          0x00000080
229   /* CAPABILITY: bg scanning */
230 #define WLAN_VDEV_C_BGSCAN               0x00000100
231   /* CAPABILITY: Restrict offchannel */
232 #define WLAN_VDEV_C_RESTRICT_OFFCHAN     0x00000200
233 
234 /* Invalid VDEV identifier */
235 #define WLAN_INVALID_VDEV_ID 255
236 
237 /**
238  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
239  *				    structure While creating VDEV
240  * @opmode:         Opmode of VDEV
241  * @flags:          create flags
242  * @size_vdev_priv: Size of vdev private
243  * @legacy_osif:    Legacy os_if private member
244  * @macaddr[]:      MAC address
245  * @mataddr[]:      MAT address
246  */
247 struct wlan_vdev_create_params {
248 	enum QDF_OPMODE opmode;
249 	uint32_t flags;
250 	size_t size_vdev_priv;
251 	void *legacy_osif;
252 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
253 	uint8_t mataddr[QDF_MAC_ADDR_SIZE];
254 };
255 
256 /**
257  * struct wlan_channel - channel structure
258  * @ch_freq:      Channel in Mhz.
259  * @ch_ieee:      IEEE channel number.
260  * @ch_freq_seg1: Channel Center frequeny for VHT80/160 and HE80/160.
261  * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode.
262  * @ch_maxpower:  Maximum tx power in dBm.
263  * @ch_flagext:   Channel extension flags.
264  * @ch_flags:     Channel flags.
265  * @ch_cfreq1:    channel center frequency for primary
266  * @ch_cfreq2:    channel center frequency for secondary
267  * @ch_width:     Channel width.
268  * @ch_phymode:   Channel phymode.
269  */
270 struct wlan_channel {
271 	uint16_t     ch_freq;
272 	uint8_t      ch_ieee;
273 	uint8_t      ch_freq_seg1;
274 	uint8_t      ch_freq_seg2;
275 	int8_t       ch_maxpower;
276 	uint16_t     ch_flagext;
277 	uint64_t     ch_flags;
278 	uint32_t     ch_cfreq1;
279 	uint32_t     ch_cfreq2;
280 	enum phy_ch_width ch_width;
281 	enum wlan_phymode ch_phymode;
282 };
283 
284 /**
285  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
286  * @vdev_opmode:        Opmode of VDEV
287  * @mlme_state:         VDEV MLME SM state
288  * @mlme_state:         VDEV MLME SM substate
289  * @bss_chan:           BSS channel
290  * @des_chan:           Desired channel, for STA Desired may not be used
291  * @vdev_caps:          VDEV capabilities
292  * @vdev_feat_caps:     VDEV feature caps
293  * @vdev_feat_ext_caps: VDEV Extended feature caps
294  * @vdev_op_flags:      Operation flags
295  * @mataddr[]:          MAT address
296  * @macaddr[]:          VDEV self MAC address
297  * @ssid[]:             SSID
298  * @ssid_len:           SSID length
299  * @nss:                Num. Spatial streams
300  * @tx_chainmask:       Tx Chainmask
301  * @rx_chainmask:       Rx Chainmask
302  * @tx_power:           Tx power
303  * @max_rate:           MAX rate
304  * @tx_mgmt_rate:       TX Mgmt. Rate
305  * @per_band_mgmt_rate: Per-band TX Mgmt. Rate
306  */
307 struct wlan_objmgr_vdev_mlme {
308 	enum QDF_OPMODE vdev_opmode;
309 	enum wlan_vdev_state mlme_state;
310 	enum wlan_vdev_state mlme_substate;
311 	struct wlan_channel *bss_chan;
312 	struct wlan_channel *des_chan;
313 	uint32_t vdev_caps;
314 	uint32_t vdev_feat_caps;
315 	uint32_t vdev_feat_ext_caps;
316 	uint32_t vdev_op_flags;
317 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
318 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
319 };
320 
321 /**
322  *  struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure
323  *  @osdev:  OS specific pointer
324  */
325 struct wlan_objmgr_vdev_nif {
326 	struct vdev_osif_priv *osdev;
327 };
328 
329 /**
330  *  struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
331  *  @vdev_id:           VDEV id
332  *  @print_cnt:         Count to throttle Logical delete prints
333  *  @self_peer:         Self PEER
334  *  @bss_peer:          BSS PEER
335  *  @wlan_peer_list:    PEER list
336  *  @wlan_pdev:         PDEV pointer
337  *  @wlan_peer_count:   Peer count
338  *  @max_peer_count:    Max Peer count
339  *  @c_flags:           creation specific flags
340  *  @ref_cnt:           Ref count
341  *  @ref_id_dbg:        Array to track Ref count
342  *  @wlan_objmgr_trace: Trace ref and deref
343  */
344 struct wlan_objmgr_vdev_objmgr {
345 	uint8_t vdev_id;
346 	uint8_t print_cnt;
347 	struct wlan_objmgr_peer *self_peer;
348 	struct wlan_objmgr_peer *bss_peer;
349 	qdf_list_t wlan_peer_list;
350 	struct wlan_objmgr_pdev *wlan_pdev;
351 	uint16_t wlan_peer_count;
352 	uint16_t max_peer_count;
353 	uint32_t c_flags;
354 	qdf_atomic_t ref_cnt;
355 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
356 #ifdef WLAN_OBJMGR_REF_ID_TRACE
357 	struct wlan_objmgr_trace trace;
358 #endif
359 };
360 
361 /**
362  * struct wlan_objmgr_vdev - VDEV common object
363  * @vdev_node:      qdf list of pdev's vdev list
364  * @vdev_mlme:      VDEV MLME substructure
365  * @vdev_objmgr:    VDEV Object Mgr substructure
366  * @vdev_nif:       VDEV HDD substructure
367  * @vdev_comp_priv_obj[]:Component's private objects list
368  * @obj_status[]:   Component object status
369  * @obj_state:      VDEV object state
370  * @vdev_lock:      VDEV lock
371  */
372 struct wlan_objmgr_vdev {
373 	qdf_list_node_t vdev_node;
374 	struct wlan_objmgr_vdev_mlme vdev_mlme;
375 	struct wlan_objmgr_vdev_objmgr vdev_objmgr;
376 	struct wlan_objmgr_vdev_nif vdev_nif;
377 	void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
378 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
379 	WLAN_OBJ_STATE obj_state;
380 	qdf_spinlock_t vdev_lock;
381 };
382 
383 /**
384  ** APIs to Create/Delete Global object APIs
385  */
386 /**
387  * wlan_objmgr_vdev_obj_create() - vdev object create
388  * @pdev: PDEV object on which this vdev gets created
389  * @params: VDEV create params from HDD
390  *
391  * Creates vdev object, intializes with default values
392  * Attaches to psoc and pdev objects
393  * Invokes the registered notifiers to create component object
394  *
395  * Return: Handle to struct wlan_objmgr_vdev on successful creation,
396  *         NULL on Failure (on Mem alloc failure and Component objects
397  *         Failure)
398  */
399 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
400 			struct wlan_objmgr_pdev *pdev,
401 			struct wlan_vdev_create_params *params);
402 
403 /**
404  * wlan_objmgr_vdev_obj_delete() - vdev object delete
405  * @vdev: vdev object
406  *
407  * Logically deletes VDEV object,
408  * Once all the references are released, object manager invokes the registered
409  * notifiers to destroy component objects
410  *
411  * Return: SUCCESS/FAILURE
412  */
413 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev);
414 
415 /**
416  ** APIs to attach/detach component objects
417  */
418 /**
419  * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach
420  * @vdev: VDEV object
421  * @id: Component id
422  * @comp_priv_obj: component's private object pointer
423  * @status: Component's private object creation status
424  *
425  * API to be used for attaching component object with VDEV common object
426  *
427  * Return: SUCCESS on successful storing of component's object in common object
428  *         On FAILURE (appropriate failure codes are returned)
429  */
430 QDF_STATUS wlan_objmgr_vdev_component_obj_attach(
431 		struct wlan_objmgr_vdev *vdev,
432 		enum wlan_umac_comp_id id,
433 		void *comp_priv_obj,
434 		QDF_STATUS status);
435 
436 /**
437  * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach
438  * @vdev: VDEV object
439  * @id: Component id
440  * @comp_priv_obj: component's private object pointer
441  *
442  * API to be used for detaching component object with VDEV common object
443  *
444  * Return: SUCCESS on successful removal of component's object from common
445  *         object
446  *         On FAILURE (appropriate failure codes are returned)
447  */
448 QDF_STATUS wlan_objmgr_vdev_component_obj_detach(
449 		struct wlan_objmgr_vdev *vdev,
450 		enum wlan_umac_comp_id id,
451 		void *comp_priv_obj);
452 /*
453  ** APIs to operations on vdev objects
454 */
455 
456 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
457 					void *object,
458 					void *arg);
459 
460 /**
461  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
462  * @vdev: vdev object
463  * @handler: the handler will be called for each object of requested type
464  *            the handler should be implemented to perform required operation
465  * @arg:     agruments passed by caller
466  * @dbg_id: id of the caller
467  *
468  * API to be used for performing the operations on all PEER objects
469  * of vdev
470  *
471  * Return: SUCCESS/FAILURE
472  */
473 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
474 		struct wlan_objmgr_vdev *vdev,
475 		wlan_objmgr_vdev_op_handler handler,
476 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
477 
478 /**
479  * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
480  * @vdev: vdev object
481  * @dbg_id: id of the caller
482  *
483  * API to be used for populating the list of logically deleted peers from the
484  * vdev's peer list
485  *
486  * The caller of this function should free the memory allocated for the
487  * peerlist and the peer member in the list
488  * Also the peer ref release is handled by the caller
489  *
490  * Return: list of peer pointers
491  *         NULL on FAILURE
492  */
493 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
494 		struct wlan_objmgr_vdev *vdev,
495 		wlan_objmgr_ref_dbgid dbg_id);
496 
497 /**
498  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
499  * comp object creation
500  * @vdev: VDEV object
501  * @id: Component id
502  *
503  * API to create component private object in run time, this would
504  * be used for features which gets enabled in run time
505  *
506  * Return: SUCCESS on successful creation
507  *         On FAILURE (appropriate failure codes are returned)
508  */
509 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
510 		struct wlan_objmgr_vdev *vdev,
511 		enum wlan_umac_comp_id id);
512 
513 /**
514  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
515  *                                                        object deletion
516  * @vdev: VDEV object
517  * @id: Component id
518  *
519  * API to destroy component private object in run time, this would
520  * be used for features which gets disabled in run time
521  *
522  * Return: SUCCESS on successful deletion
523  *         On FAILURE (appropriate failure codes are returned)
524  */
525 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
526 		struct wlan_objmgr_vdev *vdev,
527 		enum wlan_umac_comp_id id);
528 
529 /**
530  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
531  * @vdev: VDEV object
532  * @id: Component id
533  *
534  * API to get component private object
535  *
536  * Return: void *ptr on SUCCESS
537  *         NULL on Failure
538  */
539 void *wlan_objmgr_vdev_get_comp_private_obj(
540 		struct wlan_objmgr_vdev *vdev,
541 		enum wlan_umac_comp_id id);
542 
543 /* Util APIs */
544 
545 /**
546  * wlan_vdev_get_pdev() - get pdev
547  * @vdev: VDEV object
548  *
549  * API to get pdev object pointer from vdev
550  *
551  * Return: pdev object pointer
552  */
553 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
554 				struct wlan_objmgr_vdev *vdev)
555 {
556 	return vdev->vdev_objmgr.wlan_pdev;
557 }
558 
559 /**
560  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
561  * @peer_list: qdf_list_t
562  *
563  * API to get the head vdev of given vdev (of pdev's vdev list)
564  *
565  * Caller need to acquire lock with wlan_vdev_obj_lock()
566  *
567  * Return:
568  * @peer: head peer
569  */
570 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
571 					qdf_list_t *vdev_list)
572 {
573 	struct wlan_objmgr_vdev *vdev;
574 	qdf_list_node_t *vdev_node = NULL;
575 
576 	/* This API is invoked with lock acquired, do not add log prints */
577 	if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS)
578 		return NULL;
579 
580 	vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node);
581 	return vdev;
582 }
583 
584 
585 /**
586  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
587  * @vdev: VDEV object
588  *
589  * API to get next vdev object pointer of vdev
590  *
591  * Caller need to acquire lock with wlan_vdev_obj_lock()
592  *
593  * Return:
594  * @vdev_next: VDEV object
595  */
596 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
597 					qdf_list_t *vdev_list,
598 					struct wlan_objmgr_vdev *vdev)
599 {
600 	struct wlan_objmgr_vdev *vdev_next;
601 	qdf_list_node_t *node = &vdev->vdev_node;
602 	qdf_list_node_t *next_node = NULL;
603 
604 	/* This API is invoked with lock acquired, do not add log prints */
605 	if (!node)
606 		return NULL;
607 
608 	if (qdf_list_peek_next(vdev_list, node, &next_node) !=
609 						QDF_STATUS_SUCCESS)
610 		return NULL;
611 
612 	vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev,
613 				vdev_node);
614 	return vdev_next;
615 }
616 
617 
618 
619 /**
620  * wlan_vdev_set_pdev() - set pdev
621  * @vdev: VDEV object
622  * @pdev: PDEV object
623  *
624  * API to get pdev object pointer from vdev
625  *
626  * Caller need to acquire lock with wlan_vdev_obj_lock()
627  *
628  * Return: void
629  */
630 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev,
631 					struct wlan_objmgr_pdev *pdev)
632 {
633 	/* This API is invoked with lock acquired, do not add log prints */
634 	vdev->vdev_objmgr.wlan_pdev = pdev;
635 }
636 
637 /**
638  * wlan_vdev_get_psoc() - get psoc
639  * @vdev: VDEV object
640  *
641  * API to get pdev object pointer from vdev
642  *
643  * Return: psoc object pointer
644  */
645 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc(
646 				struct wlan_objmgr_vdev *vdev)
647 {
648 	struct wlan_objmgr_pdev *pdev;
649 	struct wlan_objmgr_psoc *psoc = NULL;
650 
651 	pdev = wlan_vdev_get_pdev(vdev);
652 	if (!pdev)
653 		return NULL;
654 
655 	psoc = wlan_pdev_get_psoc(pdev);
656 
657 	return psoc;
658 }
659 
660 /**
661  * wlan_vdev_mlme_set_opmode() - set vdev opmode
662  * @vdev: VDEV object
663  * @mode: VDEV op mode
664  *
665  * API to set opmode in vdev object
666  *
667  * Return: void
668  */
669 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev,
670 				enum QDF_OPMODE mode)
671 {
672 	vdev->vdev_mlme.vdev_opmode = mode;
673 }
674 
675 /**
676  * wlan_vdev_mlme_get_opmode() - get vdev opmode
677  * @vdev: VDEV object
678  *
679  * API to set opmode of vdev object
680  *
681  * Return:
682  * @mode: VDEV op mode
683  */
684 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
685 					struct wlan_objmgr_vdev *vdev)
686 {
687 	return vdev->vdev_mlme.vdev_opmode;
688 }
689 
690 /**
691  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
692  * @vdev: VDEV object
693  * @macaddr: MAC address
694  *
695  * API to set macaddr in vdev object
696  *
697  * Caller need to acquire lock with wlan_vdev_obj_lock()
698  *
699  * Return: void
700  */
701 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
702 					 uint8_t *macaddr)
703 {
704 	/* This API is invoked with lock acquired, do not add log prints */
705 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
706 }
707 
708 /**
709  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
710  * @vdev: VDEV object
711  *
712  * API to get MAC address from vdev object
713  *
714  * Caller need to acquire lock with wlan_vdev_obj_lock()
715  *
716  * Return:
717  * @macaddr: MAC address
718  */
719 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
720 {
721 	/* This API is invoked with lock acquired, do not add log prints */
722 	return vdev->vdev_mlme.macaddr;
723 }
724 
725 /**
726  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
727  * @vdev: VDEV object
728  * @mataddr: MAT address
729  *
730  * API to set mataddr in vdev object
731  *
732  * Caller need to acquire lock with wlan_vdev_obj_lock()
733  *
734  * Return: void
735  */
736 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
737 					uint8_t *mataddr)
738 {
739 	/* This API is invoked with lock acquired, do not add log prints */
740 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
741 }
742 
743 /**
744  * wlan_vdev_mlme_get_mataddr() - get mataddr
745  * @vdev: VDEV object
746  *
747  * API to get MAT address from vdev object
748  *
749  * Caller need to acquire lock with wlan_vdev_obj_lock()
750  *
751  * Return:
752  * @mataddr: MAT address
753  */
754 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
755 {
756 	/* This API is invoked with lock acquired, do not add log prints */
757 	return vdev->vdev_mlme.mataddr;
758 }
759 
760 /**
761  * wlan_vdev_get_id() - get vdev id
762  * @vdev: VDEV object
763  *
764  * API to get vdev id
765  *
766  * Return:
767  * @id: vdev id
768  */
769 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
770 {
771 	return vdev->vdev_objmgr.vdev_id;
772 }
773 
774 /**
775  * wlan_vdev_get_hw_macaddr() - get hw macaddr
776  * @vdev: VDEV object
777  *
778  * API to retrieve the HW MAC address from PDEV
779  *
780  * Caller need to acquire lock with wlan_vdev_obj_lock()
781  *
782  * Return:
783  * @macaddr: HW MAC address
784  */
785 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
786 {
787 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
788 
789 	/* This API is invoked with lock acquired, do not add log prints */
790 	if (pdev)
791 		return wlan_pdev_get_hw_macaddr(pdev);
792 	else
793 		return NULL;
794 }
795 
796 /**
797  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
798  * @vdev: VDEV object
799  *
800  * API to acquire VDEV lock
801  * Parent lock should not be taken in child lock context
802  * but child lock can be taken in parent lock context
803  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
804  *
805  * Return: void
806  */
807 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
808 {
809 	qdf_spin_lock_bh(&vdev->vdev_lock);
810 }
811 
812 /**
813  * wlan_vdev_obj_unlock() - Release VDEV spinlock
814  * @vdev: VDEV object
815  *
816  * API to Release VDEV lock
817  *
818  * Return: void
819  */
820 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
821 {
822 	qdf_spin_unlock_bh(&vdev->vdev_lock);
823 }
824 
825 /**
826  * wlan_vdev_mlme_set_bss_chan() - set bss chan
827  * @vdev: VDEV object
828  * @bss_chan: Channel
829  *
830  * API to set the BSS channel
831  *
832  * Return: void
833  */
834 static inline void wlan_vdev_mlme_set_bss_chan(
835 				struct wlan_objmgr_vdev *vdev,
836 				struct wlan_channel *bss_chan)
837 {
838 	vdev->vdev_mlme.bss_chan = bss_chan;
839 }
840 
841 /**
842  * wlan_vdev_mlme_get_bss_chan() - get bss chan
843  * @vdev: VDEV object
844  *
845  * API to get the BSS channel
846  *
847  * Return:
848  * @bss_chan: Channel
849  */
850 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
851 				struct wlan_objmgr_vdev *vdev)
852 {
853 	return vdev->vdev_mlme.bss_chan;
854 }
855 
856 /**
857  * wlan_vdev_mlme_set_des_chan() - set desired chan
858  * @vdev: VDEV object
859  * @des_chan: Channel configured by user
860  *
861  * API to set the desired channel
862  *
863  * Return: void
864  */
865 static inline void wlan_vdev_mlme_set_des_chan(
866 				struct wlan_objmgr_vdev *vdev,
867 				struct wlan_channel *des_chan)
868 {
869 	vdev->vdev_mlme.des_chan = des_chan;
870 }
871 
872 /**
873  * wlan_vdev_mlme_get_des_chan() - get desired chan
874  * @vdev: VDEV object
875  *
876  * API to get the desired channel
877  *
878  * Return:
879  * @des_chan: Channel configured by user
880  */
881 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan(
882 				struct wlan_objmgr_vdev *vdev)
883 {
884 	return vdev->vdev_mlme.des_chan;
885 }
886 
887 /**
888  * wlan_vdev_mlme_feat_cap_set() - set feature caps
889  * @vdev: VDEV object
890  * @cap: capabilities to be set
891  *
892  * API to set MLME feature capabilities
893  *
894  * Return: void
895  */
896 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev,
897 				uint32_t cap)
898 {
899 	vdev->vdev_mlme.vdev_feat_caps |= cap;
900 }
901 
902 /**
903  * wlan_vdev_mlme_feat_cap_clear() - clear feature caps
904  * @vdev: VDEV object
905  * @cap: capabilities to be cleared
906  *
907  * API to clear MLME feature capabilities
908  *
909  * Return: void
910  */
911 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev,
912 				uint32_t cap)
913 {
914 	vdev->vdev_mlme.vdev_feat_caps &= ~cap;
915 }
916 
917 /**
918  * wlan_vdev_mlme_feat_cap_get() - get feature caps
919  * @vdev: VDEV object
920  * @cap: capabilities to be checked
921  *
922  * API to know MLME feature capability is set or not
923  *
924  * Return: 1 -- if capabilities set
925  *         0 -- if capabilities clear
926  */
927 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev,
928 				uint32_t cap)
929 {
930 	return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0;
931 }
932 
933 /**
934  * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps
935  * @vdev: VDEV object
936  * @cap: capabilities to be set
937  *
938  * API to set the MLME extensive feature capabilities
939  *
940  * Return: void
941  */
942 static inline void wlan_vdev_mlme_feat_ext_cap_set(
943 				struct wlan_objmgr_vdev *vdev,
944 				uint32_t cap)
945 {
946 	vdev->vdev_mlme.vdev_feat_ext_caps |= cap;
947 }
948 
949 /**
950  * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps
951  * @vdev: VDEV object
952  * @cap: capabilities to be cleared
953  *
954  * API to clear the MLME extensive feature capabilities
955  *
956  * Return: void
957  */
958 static inline void wlan_vdev_mlme_feat_ext_cap_clear(
959 				struct wlan_objmgr_vdev *vdev,
960 				uint32_t cap)
961 {
962 	vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap;
963 }
964 
965 /**
966  * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps
967  * @vdev: VDEV object
968  * @cap: capabilities to be checked
969  *
970  * API to know MLME ext feature capability is set or not
971  *
972  * Return: 1 -- if capabilities set
973  *         0 -- if capabilities clear
974  */
975 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get(
976 				struct wlan_objmgr_vdev *vdev,
977 				uint32_t cap)
978 {
979 	return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0;
980 }
981 
982 /**
983  * wlan_vdev_mlme_cap_set() - mlme caps set
984  * @vdev: VDEV object
985  * @cap: capabilities to be set
986  *
987  * API to set the MLME capabilities
988  *
989  * Return: void
990  */
991 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev,
992 				uint32_t cap)
993 {
994 	vdev->vdev_mlme.vdev_caps |= cap;
995 }
996 
997 /**
998  * wlan_vdev_mlme_cap_clear() -  mlme caps clear
999  * @vdev: VDEV object
1000  * @cap: capabilities to be cleared
1001  *
1002  * API to clear the MLME capabilities
1003  *
1004  * Return: void
1005  */
1006 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev,
1007 				uint32_t cap)
1008 {
1009 	vdev->vdev_mlme.vdev_caps &= ~cap;
1010 }
1011 
1012 /**
1013  * wlan_vdev_mlme_cap_get() - get mlme caps
1014  * @vdev: VDEV object
1015  * @cap: capabilities to be checked
1016  *
1017  * API to know MLME capability is set or not
1018  *
1019  * Return: 1 -- if capabilities set
1020  *         0 -- if capabilities clear
1021  */
1022 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev,
1023 				uint32_t cap)
1024 {
1025 	return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0;
1026 }
1027 
1028 /**
1029  * wlan_vdev_mlme_get_state() - get mlme state
1030  * @vdev: VDEV object
1031  *
1032  * API to get MLME state
1033  *
1034  * Return: state of MLME
1035  */
1036 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
1037 				struct wlan_objmgr_vdev *vdev)
1038 {
1039 	return vdev->vdev_mlme.mlme_state;
1040 }
1041 
1042 /**
1043  * wlan_vdev_mlme_get_substate() - get mlme substate
1044  * @vdev: VDEV object
1045  *
1046  * API to get VDEV MLME substate
1047  *
1048  * Return: substate of VDEV MLME
1049  */
1050 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
1051 				struct wlan_objmgr_vdev *vdev)
1052 {
1053 	return vdev->vdev_mlme.mlme_substate;
1054 }
1055 
1056 /**
1057  * wlan_vdev_set_selfpeer() - set self peer
1058  * @vdev: VDEV object
1059  * @peer: peer pointer
1060  *
1061  * API to set the self peer of VDEV
1062  *
1063  * Return: void
1064  */
1065 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev,
1066 						struct wlan_objmgr_peer *peer)
1067 {
1068 	vdev->vdev_objmgr.self_peer = peer;
1069 }
1070 
1071 /**
1072  * wlan_vdev_get_selfpeer() - get self peer
1073  * @vdev: VDEV object
1074  *
1075  * API to get the self peer of VDEV
1076  *
1077  * Return:
1078  * @peer: peer pointer
1079  */
1080 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1081 					struct wlan_objmgr_vdev *vdev)
1082 {
1083 	return vdev->vdev_objmgr.self_peer;
1084 }
1085 
1086 /**
1087  * wlan_vdev_set_bsspeer() - set bss peer
1088  * @vdev: VDEV object
1089  * @peer: BSS peer pointer
1090  *
1091  * API to set the BSS peer of VDEV
1092  *
1093  * Return: void
1094  */
1095 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1096 						 struct wlan_objmgr_peer *peer)
1097 {
1098 	vdev->vdev_objmgr.bss_peer = peer;
1099 }
1100 
1101 /**
1102  * wlan_vdev_get_bsspeer() - get bss peer
1103  * @vdev: VDEV object
1104  *
1105  * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API
1106  * preferred to use outside obj manager to take and handle ref count of
1107  * bss_peer with ref debug ID.
1108  *
1109  * Return:
1110  * @peer: BSS peer pointer
1111  */
1112 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1113 					struct wlan_objmgr_vdev *vdev)
1114 {
1115 	return vdev->vdev_objmgr.bss_peer;
1116 }
1117 
1118 /**
1119  * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
1120  * @vdev: VDEV object
1121  * @peer_mac: mac address of the peer to be found
1122  * @dbg_id: dbg_id of the module
1123  *
1124  * API to get and increment ref count of BSS peer of VDEV
1125  *
1126  * Return:
1127  * @peer: peer pointer to the peer of the mac address
1128  */
1129 struct wlan_objmgr_peer *
1130 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
1131 				  uint8_t *peer_mac,
1132 				  wlan_objmgr_ref_dbgid dbg_id);
1133 
1134 /**
1135  * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
1136  * of VDEV
1137  * @vdev: VDEV object
1138  * @id:   Object Manager ref debug id
1139  *
1140  * API to get and increment ref count of BSS peer of VDEV
1141  *
1142  * Return:
1143  * @peer: BSS peer pointer if bss peer is present and valid else NULL
1144  */
1145 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer(
1146 					struct wlan_objmgr_vdev *vdev,
1147 					wlan_objmgr_ref_dbgid id);
1148 /**
1149  * wlan_vdev_get_ospriv() - get os priv pointer
1150  * @vdev: VDEV object
1151  *
1152  * API to get OS private pointer from VDEV
1153  *
1154  * Return: ospriv - private pointer
1155  */
1156 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1157 	struct wlan_objmgr_vdev *vdev)
1158 {
1159 	return vdev->vdev_nif.osdev;
1160 }
1161 
1162 /**
1163  * wlan_vdev_reset_ospriv() - reset os priv pointer
1164  * @vdev: VDEV object
1165  *
1166  * API to reset OS private pointer in VDEV
1167  *
1168  * Return: void
1169  */
1170 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1171 {
1172 	vdev->vdev_nif.osdev = NULL;
1173 }
1174 
1175 /**
1176  * wlan_vdev_get_peer_count() - get vdev peer count
1177  * @vdev: VDEV object
1178  *
1179  * API to get peer count from VDEV
1180  *
1181  * Return: peer_count - vdev's peer count
1182  */
1183 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1184 {
1185 	return vdev->vdev_objmgr.wlan_peer_count;
1186 }
1187 
1188 /**
1189  * DOC: Examples to use VDEV ref count APIs
1190  *
1191  * In all the scenarios, the pair of API should be followed
1192  * other it lead to memory leak
1193  *
1194  *  scenario 1:
1195  *
1196  *     wlan_objmgr_vdev_obj_create()
1197  *     ----
1198  *     wlan_objmgr_vdev_obj_delete()
1199  *
1200  *  scenario 2:
1201  *
1202  *     wlan_objmgr_vdev_get_ref()
1203  *     ----
1204  *     the operations which are done on
1205  *     vdev object
1206  *     ----
1207  *     wlan_objmgr_vdev_release_ref()
1208  *
1209  *  scenario 3:
1210  *
1211  *     API to retrieve vdev (xxx_get_vdev_xxx())
1212  *     ----
1213  *     the operations which are done on
1214  *     vdev object
1215  *     ----
1216  *     wlan_objmgr_vdev_release_ref()
1217  */
1218 
1219 /**
1220  * wlan_objmgr_vdev_get_ref() - increment ref count
1221  * @vdev: VDEV object
1222  * @id:   Object Manager ref debug id
1223  *
1224  * API to increment ref count of vdev
1225  *
1226  * Return: void
1227  */
1228 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1229 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1230 				    wlan_objmgr_ref_dbgid id,
1231 				    const char *func, int line);
1232 
1233 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \
1234 		wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__)
1235 #else
1236 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
1237 				wlan_objmgr_ref_dbgid id);
1238 #endif
1239 
1240 /**
1241  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
1242  * @vdev: VDEV object
1243  * @id:   Object Manager ref debug id
1244  *
1245  * API to increment ref count of vdev after checking valid object state
1246  *
1247  * Return: void
1248  */
1249 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1250 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1251 					      wlan_objmgr_ref_dbgid id,
1252 					      const char *func, int line);
1253 
1254 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \
1255 		wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \
1256 		__func__, __LINE__)
1257 #else
1258 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
1259 						wlan_objmgr_ref_dbgid id);
1260 #endif
1261 
1262 /**
1263  * wlan_objmgr_vdev_release_ref() - decrement ref count
1264  * @vdev: VDEV object
1265  * @id:   Object Manager ref debug id
1266  *
1267  * API to decrement ref count of vdev, if ref count is 1, it initiates the
1268  * VDEV deletion
1269  *
1270  * Return: void
1271  */
1272 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1273 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
1274 					wlan_objmgr_ref_dbgid id,
1275 					const char *func, int line);
1276 
1277 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\
1278 		wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \
1279 		__func__, __LINE__)
1280 #else
1281 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
1282 						wlan_objmgr_ref_dbgid id);
1283 #endif
1284 
1285 /**
1286  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
1287  * @pdev: PDEV object
1288  * @vdev_list: qdf_list_t
1289  * @vdev: VDEV object
1290  * @dbg_id: id of the caller
1291  *
1292  * API to get next active vdev object pointer of vdev
1293  *
1294  * Return:
1295  * @vdev_next: VDEV object
1296  */
1297 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1298 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
1299 					struct wlan_objmgr_pdev *pdev,
1300 					qdf_list_t *vdev_list,
1301 					struct wlan_objmgr_vdev *vdev,
1302 					wlan_objmgr_ref_dbgid dbg_id,
1303 					const char *func, int line);
1304 
1305 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \
1306 		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
1307 		vdev, dbgid, __func__, __LINE__)
1308 #else
1309 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
1310 					struct wlan_objmgr_pdev *pdev,
1311 					qdf_list_t *vdev_list,
1312 					struct wlan_objmgr_vdev *vdev,
1313 					wlan_objmgr_ref_dbgid dbg_id);
1314 #endif
1315 
1316 /**
1317  * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
1318  * @pdev: PDEV object
1319  * @dbg_id: id of the caller
1320  *
1321  * API to get the head active vdev of given pdev (of pdev's vdev list)
1322  *
1323  * Return:
1324  */
1325 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1326 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
1327 		struct wlan_objmgr_pdev *pdev,
1328 		wlan_objmgr_ref_dbgid dbg_id,
1329 		const char *func, int line);
1330 
1331 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \
1332 		wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \
1333 		__func__, __LINE__)
1334 #else
1335 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
1336 		struct wlan_objmgr_pdev *pdev,
1337 		wlan_objmgr_ref_dbgid dbg_id);
1338 #endif
1339 
1340 /**
1341  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
1342  * @vdev: VDEV object
1343  * @vdev_list: qdf_list_t
1344  * @dbg_id: id of the caller
1345  *
1346  * API to get the head active vdev of given vdev (of pdev's vdev list)
1347  *
1348  * Return:
1349  * @peer: head peer
1350  */
1351 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1352 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
1353 				struct wlan_objmgr_pdev *pdev,
1354 				qdf_list_t *vdev_list,
1355 				wlan_objmgr_ref_dbgid dbg_id,
1356 				const char *func, int line);
1357 
1358 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \
1359 		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
1360 		dbgid, __func__, __LINE__)
1361 #else
1362 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
1363 				struct wlan_objmgr_pdev *pdev,
1364 				qdf_list_t *vdev_list,
1365 				wlan_objmgr_ref_dbgid dbg_id);
1366 #endif
1367 
1368 /**
1369  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed
1370  * @vdev: VDEV object
1371  *
1372  * API to invokes registered callbacks to notify about peer freed
1373  *
1374  * Return: void
1375  */
1376 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev);
1377 
1378 /**
1379  * wlan_vdev_set_max_peer_count() - set max peer count
1380  * @vdev: VDEV object
1381  * @count: Max peer count
1382  *
1383  * API to set max peer count of VDEV
1384  *
1385  * Return: void
1386  */
1387 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
1388 						uint16_t count)
1389 {
1390 	vdev->vdev_objmgr.max_peer_count = count;
1391 }
1392 
1393 /**
1394  * wlan_vdev_get_max_peer_count() - get max peer count
1395  * @vdev: VDEV object
1396  *
1397  * API to get max peer count of VDEV
1398  *
1399  * Return: max peer count
1400  */
1401 static inline uint16_t wlan_vdev_get_max_peer_count(
1402 						struct wlan_objmgr_vdev *vdev)
1403 {
1404 	return vdev->vdev_objmgr.max_peer_count;
1405 }
1406 
1407 /**
1408  * wlan_print_vdev_info() - print vdev members
1409  * @vdev: vdev object pointer
1410  *
1411  * Return: void
1412  */
1413 #ifdef WLAN_OBJMGR_DEBUG
1414 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
1415 #else
1416 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
1417 #endif
1418 
1419 /**
1420  * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
1421  * @vdev: vdev object pointer
1422  *
1423  * Return: void
1424  */
1425 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1426 static inline void
1427 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1428 {
1429 	wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
1430 }
1431 #else
1432 static inline void
1433 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1434 {
1435 }
1436 #endif
1437 
1438 /**
1439  * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
1440  * @vdev: vdev object pointer
1441  *
1442  * Return: void
1443  */
1444 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1445 static inline void
1446 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
1447 {
1448 	wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
1449 }
1450 #else
1451 static inline void
1452 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
1453 {
1454 }
1455 #endif
1456 
1457 /**
1458  * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
1459  * @vdev: vdev object pointer
1460  *
1461  * Return: void
1462  */
1463 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1464 static inline void
1465 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
1466 {
1467 	wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
1468 }
1469 #else
1470 static inline void
1471 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
1472 {
1473 }
1474 #endif
1475 
1476 /**
1477  * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
1478  * @vdev: pointer to vdev
1479  * @bss_peer_mac: pointer to bss_peer_mac_address
1480  *
1481  * This API is used to get mac address of peer.
1482  *
1483  * Context: Any context.
1484  *
1485  * Return: QDF_STATUS based on overall success
1486  */
1487 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev,
1488 				      struct qdf_mac_addr *bss_peer_mac);
1489 
1490 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
1491