xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: Define the vdev data structure of UMAC
22  */
23 
24 #ifndef _WLAN_OBJMGR_VDEV_OBJ_H_
25 #define _WLAN_OBJMGR_VDEV_OBJ_H_
26 
27 #include "qdf_atomic.h"
28 #include "qdf_list.h"
29 #include "qdf_lock.h"
30 #include "qdf_types.h"
31 #include "wlan_cmn.h"
32 #include "wlan_objmgr_cmn.h"
33 #include "wlan_objmgr_pdev_obj.h"
34 #include "wlan_objmgr_psoc_obj.h"
35 #include "wlan_vdev_mlme_main.h"
36 #include "include/wlan_vdev_mlme.h"
37 #include "wlan_vdev_mlme_api.h"
38 #include "wlan_mlme_dbg.h"
39 #ifdef WLAN_FEATURE_11BE_MLO
40 #include "wlan_mlo_mgr_public_structs.h"
41 #endif
42 
43 	/* CONF: privacy enabled */
44 #define WLAN_VDEV_F_PRIVACY              0x00000001
45 	/* CONF: 11g w/o 11b sta's */
46 #define WLAN_VDEV_F_PUREG                0x00000002
47 	/* CONF: des_bssid is set */
48 #define WLAN_VDEV_F_DESBSSID             0x00000004
49 	/* CONF: bg scan enabled */
50 #define WLAN_VDEV_F_BGSCAN               0x00000008
51 	/* CONF: sw tx retry enabled */
52 #define WLAN_VDEV_F_SWRETRY              0x00000010
53 	/* STATUS: update beacon tim */
54 #define WLAN_VDEV_F_TIMUPDATE            0x00000020
55 	/* CONF: WPA enabled */
56 #define WLAN_VDEV_F_WPA1                 0x00000040
57 	/* CONF: WPA2 enabled */
58 #define WLAN_VDEV_F_WPA2                 0x00000080
59 	/* CONF: WPA/WPA2 enabled */
60 #define WLAN_VDEV_F_WPA                  0x000000c0
61 	/* CONF: drop unencrypted */
62 #define WLAN_VDEV_F_DROPUNENC            0x00000100
63 	/* CONF: TKIP countermeasures */
64 #define WLAN_VDEV_F_COUNTERM             0x00000200
65 	/* CONF: hide SSID in beacon */  /*TODO PDEV/PSOC */
66 #define WLAN_VDEV_F_HIDESSID             0x00000400
67 	/* CONF: disable internal bridge */ /*TODO PDEV/PSOC */
68 #define WLAN_VDEV_F_NOBRIDGE             0x00000800
69 	/* STATUS: update beacon wme */
70 #define WLAN_VDEV_F_WMEUPDATE            0x00001000
71 	/* CONF: enable U-APSD */
72 #define WLAN_VDEV_F_UAPSD                0x00004000
73 	/* STATUS: sleeping */
74 #define WLAN_VDEV_F_SLEEP                0x00008000
75 	/* drop uapsd EOSP frames for test */
76 #define WLAN_VDEV_F_EOSPDROP             0x00010000
77 	/* CONF: A-MPDU supported */
78 #define WLAN_VDEV_F_AMPDU                0x00020000
79 	/* STATE: beacon APP IE updated */
80 #define WLAN_VDEV_F_APPIE_UPDATE         0x00040000
81 	/* CONF: WDS auto Detect/DELBA */
82 #define WLAN_VDEV_F_WDS_AUTODETECT       0x00080000
83 	/* 11b only without 11g stations */
84 #define WLAN_VDEV_F_PUREB                0x00100000
85 	/* disable HT rates */
86 #define WLAN_VDEV_F_HTRATES              0x00200000
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 independence 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 	/* Fils discovery on 6G SAP*/
160 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP     0x80000000
161 
162 /* Feature more extension flags */
163 	/* VDEV is MLO*/
164 #define WLAN_VDEV_FEXT2_MLO                 0x00000001
165 	/* STA VDEV is link type */
166 #define WLAN_VDEV_FEXT2_MLO_STA_LINK        0x00000002
167 	/* VDEV is MLO mcast primary*/
168 #define WLAN_VDEV_FEXT2_MLO_MCAST           0x00000004
169 	/* 20TU BCAST PROBE RESP on 6G SAP*/
170 #define WLAN_VDEV_FEXT2_20TU_PRB_RESP       0x00000008
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 performed 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 /* VDEV Critical update category-1
213  * Inclusion of Critical Update IES flag
214  * This includes: CSA, ECSA, Quiet
215  * Quiet channel, Max Ch Switch Time IEs.
216  */
217 #define WLAN_VDEV_OP_CU_CAT1                0x00080000
218 /* VDEV Critical update category-2
219  * Modification of Critical Update IES flag
220  * This includes: DSSS Param, HT Operation element
221  * VHT Operation element, HE Operation element
222  * EHT Operation element, MU EDCA Param, EDCA param
223  * UORA Param, BSS Color Change Announcement element
224  * Spatial Reuse Param Set element
225  * Operating Mode Notification element
226  * Wide Bandwidth Channel Switch element
227  * Broadcast TWT element
228  */
229 #define WLAN_VDEV_OP_CU_CAT2                0x00100000
230 
231  /* CAPABILITY: IBSS available */
232 #define WLAN_VDEV_C_IBSS                    0x00000001
233 /* CAPABILITY: HOSTAP avail */
234 #define WLAN_VDEV_C_HOSTAP               0x00000002
235    /* CAPABILITY: Old Adhoc Demo */
236 #define WLAN_VDEV_C_AHDEMO               0x00000004
237   /* CAPABILITY: sw tx retry */
238 #define WLAN_VDEV_C_SWRETRY              0x00000008
239   /* CAPABILITY: monitor mode */
240 #define WLAN_VDEV_C_MONITOR              0x00000010
241   /* CAPABILITY: TKIP MIC avail */
242 #define WLAN_VDEV_C_TKIPMIC              0x00000020
243   /* CAPABILITY: 4-addr support */
244 #define WLAN_VDEV_C_WDS                  0x00000040
245   /* CAPABILITY: TKIP MIC for QoS frame */
246 #define WLAN_VDEV_C_WME_TKIPMIC          0x00000080
247   /* CAPABILITY: bg scanning */
248 #define WLAN_VDEV_C_BGSCAN               0x00000100
249   /* CAPABILITY: Restrict offchannel */
250 #define WLAN_VDEV_C_RESTRICT_OFFCHAN     0x00000200
251   /* CAPABILITY: eMLSR capability */
252 #define WLAN_VDEV_C_EMLSR_CAP            0x00000400
253 
254 /* Invalid VDEV identifier */
255 #define WLAN_INVALID_VDEV_ID 255
256 
257 /* Invalid VDEV link id*/
258 #define WLAN_INVALID_LINK_ID 255
259 
260 /**
261  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
262  *				    structure While creating VDEV
263  * @opmode:         Opmode of VDEV
264  * @flags:          create flags
265  * @size_vdev_priv: Size of vdev private
266  * @legacy_osif:    Legacy os_if private member
267  * @macaddr[]:      MAC address
268  * @mataddr[]:      MAT address
269  * @mldaddr[]:      MLD address
270  */
271 struct wlan_vdev_create_params {
272 	enum QDF_OPMODE opmode;
273 	uint32_t flags;
274 	size_t size_vdev_priv;
275 	void *legacy_osif;
276 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
277 	uint8_t mataddr[QDF_MAC_ADDR_SIZE];
278 	uint8_t mldaddr[QDF_MAC_ADDR_SIZE];
279 };
280 
281 /**
282  * struct wlan_channel - channel structure
283  * @ch_freq:      Channel in Mhz.
284  * @ch_ieee:      IEEE channel number.
285  * @ch_freq_seg1: Channel Center frequency for VHT80/160 and HE80/160.
286  * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode.
287  * @ch_maxpower:  Maximum tx power in dBm.
288  * @ch_flagext:   Channel extension flags.
289  * @ch_flags:     Channel flags.
290  * @ch_cfreq1:    channel center frequency for primary
291  * @ch_cfreq2:    channel center frequency for secondary
292  * @ch_width:     Channel width.
293  * @ch_phymode:   Channel phymode.
294  * @puncture_bitmap:   Puncture bitmap per 20MHz.
295  */
296 struct wlan_channel {
297 	uint16_t     ch_freq;
298 	uint8_t      ch_ieee;
299 	uint8_t      ch_freq_seg1;
300 	uint8_t      ch_freq_seg2;
301 	int8_t       ch_maxpower;
302 	uint16_t     ch_flagext;
303 	uint64_t     ch_flags;
304 	uint32_t     ch_cfreq1;
305 	uint32_t     ch_cfreq2;
306 	enum phy_ch_width ch_width;
307 	enum wlan_phymode ch_phymode;
308 #ifdef WLAN_FEATURE_11BE
309 	uint16_t     puncture_bitmap;
310 #endif
311 };
312 
313 /**
314  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
315  * @vdev_opmode:        Opmode of VDEV
316  * @mlme_state:         VDEV MLME SM state
317  * @mlme_state:         VDEV MLME SM substate
318  * @bss_chan:           BSS channel
319  * @des_chan:           Desired channel, for STA Desired may not be used
320  * @vdev_caps:          VDEV capabilities
321  * @vdev_feat_caps:     VDEV feature caps
322  * @vdev_feat_ext_caps: VDEV Extended feature caps
323  * @vdev_feat_ext2_caps: More VDEV Extended feature caps
324  * @vdev_op_flags:      Operation flags
325  * @mataddr[]:          MAT address
326  * @macaddr[]:          Contains link MAC address for ML connection and
327  *                      net dev address for non-ML connection
328  * @mldaddr[]:          MLD address
329  * @linkaddr[]:         Link MAC address
330  * @mlo_link_id: link id for mlo connection
331  * @wlan_vdev_mlo_lock: lock to protect the set/clear of
332  * WLAN_VDEV_FEXT2_MLO feature flag in vdev MLME
333  */
334 struct wlan_objmgr_vdev_mlme {
335 	enum QDF_OPMODE vdev_opmode;
336 	enum wlan_vdev_state mlme_state;
337 	enum wlan_vdev_state mlme_substate;
338 	struct wlan_channel *bss_chan;
339 	struct wlan_channel *des_chan;
340 	uint32_t vdev_caps;
341 	uint32_t vdev_feat_caps;
342 	uint32_t vdev_feat_ext_caps;
343 	uint32_t vdev_feat_ext2_caps;
344 	uint32_t vdev_op_flags;
345 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
346 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
347 	uint8_t  mldaddr[QDF_MAC_ADDR_SIZE];
348 	uint8_t  linkaddr[QDF_MAC_ADDR_SIZE];
349 #ifdef WLAN_FEATURE_11BE_MLO
350 	uint8_t  mlo_link_id;
351 #ifdef WLAN_MLO_USE_SPINLOCK
352 	qdf_spinlock_t wlan_vdev_mlo_lock;
353 #else
354 	qdf_mutex_t wlan_vdev_mlo_lock;
355 #endif
356 #endif
357 };
358 
359 /**
360  *  struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure
361  *  @osdev:  OS specific pointer
362  */
363 struct wlan_objmgr_vdev_nif {
364 	struct vdev_osif_priv *osdev;
365 };
366 
367 /**
368  *  struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
369  *  @vdev_id:           VDEV id
370  *  @print_cnt:         Count to throttle Logical delete prints
371  *  @self_peer:         Self PEER
372  *  @bss_peer:          BSS PEER
373  *  @wlan_peer_list:    PEER list
374  *  @wlan_pdev:         PDEV pointer
375  *  @wlan_peer_count:   Peer count
376  *  @max_peer_count:    Max Peer count
377  *  @c_flags:           creation specific flags
378  *  @ref_cnt:           Ref count
379  *  @ref_id_dbg:        Array to track Ref count
380  *  @wlan_objmgr_trace: Trace ref and deref
381  */
382 struct wlan_objmgr_vdev_objmgr {
383 	uint8_t vdev_id;
384 	uint8_t print_cnt;
385 	struct wlan_objmgr_peer *self_peer;
386 	struct wlan_objmgr_peer *bss_peer;
387 	qdf_list_t wlan_peer_list;
388 	struct wlan_objmgr_pdev *wlan_pdev;
389 	uint16_t wlan_peer_count;
390 	uint16_t max_peer_count;
391 	uint32_t c_flags;
392 	qdf_atomic_t ref_cnt;
393 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
394 #ifdef WLAN_OBJMGR_REF_ID_TRACE
395 	struct wlan_objmgr_trace trace;
396 #endif
397 };
398 
399 /**
400  * struct wlan_objmgr_vdev - VDEV common object
401  * @vdev_node:      qdf list of pdev's vdev list
402  * @vdev_mlme:      VDEV MLME substructure
403  * @vdev_objmgr:    VDEV Object Mgr substructure
404  * @vdev_nif:       VDEV HDD substructure
405  * @vdev_comp_priv_obj[]:Component's private objects list
406  * @obj_status[]:   Component object status
407  * @obj_state:      VDEV object state
408  * @vdev_lock:      VDEV lock
409  * @mlo_dev_ctx:    MLO device context
410  * @twt_work:	    TWT work
411  */
412 struct wlan_objmgr_vdev {
413 	qdf_list_node_t vdev_node;
414 	struct wlan_objmgr_vdev_mlme vdev_mlme;
415 	struct wlan_objmgr_vdev_objmgr vdev_objmgr;
416 	struct wlan_objmgr_vdev_nif vdev_nif;
417 	void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
418 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
419 	WLAN_OBJ_STATE obj_state;
420 	qdf_spinlock_t vdev_lock;
421 #ifdef WLAN_FEATURE_11BE_MLO
422 	struct wlan_mlo_dev_context *mlo_dev_ctx;
423 #endif
424 #ifdef WLAN_SUPPORT_TWT
425 	qdf_work_t twt_work;
426 #endif
427 };
428 
429 /**
430  ** APIs to Create/Delete Global object APIs
431  */
432 /**
433  * wlan_objmgr_vdev_obj_create() - vdev object create
434  * @pdev: PDEV object on which this vdev gets created
435  * @params: VDEV create params from HDD
436  *
437  * Creates vdev object, initializes with default values
438  * Attaches to psoc and pdev objects
439  * Invokes the registered notifiers to create component object
440  *
441  * Return: Handle to struct wlan_objmgr_vdev on successful creation,
442  *         NULL on Failure (on Mem alloc failure and Component objects
443  *         Failure)
444  */
445 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
446 			struct wlan_objmgr_pdev *pdev,
447 			struct wlan_vdev_create_params *params);
448 
449 /**
450  * wlan_objmgr_vdev_obj_delete() - vdev object delete
451  * @vdev: vdev object
452  *
453  * Logically deletes VDEV object,
454  * Once all the references are released, object manager invokes the registered
455  * notifiers to destroy component objects
456  *
457  * Return: SUCCESS/FAILURE
458  */
459 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev);
460 
461 /**
462  ** APIs to attach/detach component objects
463  */
464 /**
465  * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach
466  * @vdev: VDEV object
467  * @id: Component id
468  * @comp_priv_obj: component's private object pointer
469  * @status: Component's private object creation status
470  *
471  * API to be used for attaching component object with VDEV common object
472  *
473  * Return: SUCCESS on successful storing of component's object in common object
474  *         On FAILURE (appropriate failure codes are returned)
475  */
476 QDF_STATUS wlan_objmgr_vdev_component_obj_attach(
477 		struct wlan_objmgr_vdev *vdev,
478 		enum wlan_umac_comp_id id,
479 		void *comp_priv_obj,
480 		QDF_STATUS status);
481 
482 /**
483  * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach
484  * @vdev: VDEV object
485  * @id: Component id
486  * @comp_priv_obj: component's private object pointer
487  *
488  * API to be used for detaching component object with VDEV common object
489  *
490  * Return: SUCCESS on successful removal of component's object from common
491  *         object
492  *         On FAILURE (appropriate failure codes are returned)
493  */
494 QDF_STATUS wlan_objmgr_vdev_component_obj_detach(
495 		struct wlan_objmgr_vdev *vdev,
496 		enum wlan_umac_comp_id id,
497 		void *comp_priv_obj);
498 /*
499  ** APIs to operations on vdev objects
500 */
501 
502 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
503 					void *object,
504 					void *arg);
505 
506 /**
507  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
508  * @vdev: vdev object
509  * @handler: the handler will be called for each object of requested type
510  *            the handler should be implemented to perform required operation
511  * @arg:     arguments passed by caller
512  * @dbg_id: id of the caller
513  *
514  * API to be used for performing the operations on all PEER objects
515  * of vdev
516  *
517  * Return: SUCCESS/FAILURE
518  */
519 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
520 		struct wlan_objmgr_vdev *vdev,
521 		wlan_objmgr_vdev_op_handler handler,
522 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
523 
524 /**
525  * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
526  * @vdev: vdev object
527  * @dbg_id: id of the caller
528  *
529  * API to be used for populating the list of logically deleted peers from the
530  * vdev's peer list
531  *
532  * The caller of this function should free the memory allocated for the
533  * peerlist and the peer member in the list
534  * Also the peer ref release is handled by the caller
535  *
536  * Return: list of peer pointers
537  *         NULL on FAILURE
538  */
539 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
540 		struct wlan_objmgr_vdev *vdev,
541 		wlan_objmgr_ref_dbgid dbg_id);
542 
543 /**
544  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
545  * comp object creation
546  * @vdev: VDEV object
547  * @id: Component id
548  *
549  * API to create component private object in run time, this would
550  * be used for features which gets enabled in run time
551  *
552  * Return: SUCCESS on successful creation
553  *         On FAILURE (appropriate failure codes are returned)
554  */
555 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
556 		struct wlan_objmgr_vdev *vdev,
557 		enum wlan_umac_comp_id id);
558 
559 /**
560  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
561  *                                                        object deletion
562  * @vdev: VDEV object
563  * @id: Component id
564  *
565  * API to destroy component private object in run time, this would
566  * be used for features which gets disabled in run time
567  *
568  * Return: SUCCESS on successful deletion
569  *         On FAILURE (appropriate failure codes are returned)
570  */
571 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
572 		struct wlan_objmgr_vdev *vdev,
573 		enum wlan_umac_comp_id id);
574 
575 /**
576  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
577  * @vdev: VDEV object
578  * @id: Component id
579  *
580  * API to get component private object
581  *
582  * Return: void *ptr on SUCCESS
583  *         NULL on Failure
584  */
585 void *wlan_objmgr_vdev_get_comp_private_obj(
586 		struct wlan_objmgr_vdev *vdev,
587 		enum wlan_umac_comp_id id);
588 
589 /* Util APIs */
590 
591 /**
592  * wlan_vdev_get_pdev() - get pdev
593  * @vdev: VDEV object
594  *
595  * API to get pdev object pointer from vdev
596  *
597  * Return: pdev object pointer
598  */
599 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
600 				struct wlan_objmgr_vdev *vdev)
601 {
602 	return vdev->vdev_objmgr.wlan_pdev;
603 }
604 
605 /**
606  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
607  * @peer_list: qdf_list_t
608  *
609  * API to get the head vdev of given vdev (of pdev's vdev list)
610  *
611  * Caller need to acquire lock with wlan_vdev_obj_lock()
612  *
613  * Return:
614  * @peer: head peer
615  */
616 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
617 					qdf_list_t *vdev_list)
618 {
619 	struct wlan_objmgr_vdev *vdev;
620 	qdf_list_node_t *vdev_node = NULL;
621 
622 	/* This API is invoked with lock acquired, do not add log prints */
623 	if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS)
624 		return NULL;
625 
626 	vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node);
627 	return vdev;
628 }
629 
630 
631 /**
632  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
633  * @vdev: VDEV object
634  *
635  * API to get next vdev object pointer of vdev
636  *
637  * Caller need to acquire lock with wlan_vdev_obj_lock()
638  *
639  * Return:
640  * @vdev_next: VDEV object
641  */
642 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
643 					qdf_list_t *vdev_list,
644 					struct wlan_objmgr_vdev *vdev)
645 {
646 	struct wlan_objmgr_vdev *vdev_next;
647 	qdf_list_node_t *node = &vdev->vdev_node;
648 	qdf_list_node_t *next_node = NULL;
649 
650 	/* This API is invoked with lock acquired, do not add log prints */
651 	if (!node)
652 		return NULL;
653 
654 	if (qdf_list_peek_next(vdev_list, node, &next_node) !=
655 						QDF_STATUS_SUCCESS)
656 		return NULL;
657 
658 	vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev,
659 				vdev_node);
660 	return vdev_next;
661 }
662 
663 
664 
665 /**
666  * wlan_vdev_set_pdev() - set pdev
667  * @vdev: VDEV object
668  * @pdev: PDEV object
669  *
670  * API to get pdev object pointer from vdev
671  *
672  * Caller need to acquire lock with wlan_vdev_obj_lock()
673  *
674  * Return: void
675  */
676 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev,
677 					struct wlan_objmgr_pdev *pdev)
678 {
679 	/* This API is invoked with lock acquired, do not add log prints */
680 	vdev->vdev_objmgr.wlan_pdev = pdev;
681 }
682 
683 /**
684  * wlan_vdev_get_psoc() - get psoc
685  * @vdev: VDEV object
686  *
687  * API to get pdev object pointer from vdev
688  *
689  * Return: psoc object pointer
690  */
691 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc(
692 				struct wlan_objmgr_vdev *vdev)
693 {
694 	struct wlan_objmgr_pdev *pdev;
695 	struct wlan_objmgr_psoc *psoc = NULL;
696 
697 	pdev = wlan_vdev_get_pdev(vdev);
698 	if (!pdev)
699 		return NULL;
700 
701 	psoc = wlan_pdev_get_psoc(pdev);
702 
703 	return psoc;
704 }
705 
706 /**
707  * wlan_vdev_get_psoc_id() - get psoc id
708  * @vdev: VDEV object
709  *
710  * API to get VDEV's psoc id
711  *
712  * Return: @psoc_id: psoc id
713  */
714 static inline uint8_t wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev *vdev)
715 {
716 	struct wlan_objmgr_psoc *psoc;
717 
718 	psoc = wlan_vdev_get_psoc(vdev);
719 
720 	return wlan_psoc_get_id(psoc);
721 }
722 
723 /**
724  * wlan_vdev_mlme_set_opmode() - set vdev opmode
725  * @vdev: VDEV object
726  * @mode: VDEV op mode
727  *
728  * API to set opmode in vdev object
729  *
730  * Return: void
731  */
732 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev,
733 				enum QDF_OPMODE mode)
734 {
735 	vdev->vdev_mlme.vdev_opmode = mode;
736 }
737 
738 /**
739  * wlan_vdev_mlme_get_opmode() - get vdev opmode
740  * @vdev: VDEV object
741  *
742  * API to set opmode of vdev object
743  *
744  * Return:
745  * @mode: VDEV op mode
746  */
747 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
748 					struct wlan_objmgr_vdev *vdev)
749 {
750 	return vdev->vdev_mlme.vdev_opmode;
751 }
752 
753 /**
754  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
755  * @vdev: VDEV object
756  * @macaddr: MAC address
757  *
758  * API to set macaddr in vdev object
759  *
760  * Caller need to acquire lock with wlan_vdev_obj_lock()
761  *
762  * Return: void
763  */
764 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
765 					 uint8_t *macaddr)
766 {
767 	/* This API is invoked with lock acquired, do not add log prints */
768 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
769 }
770 
771 /**
772  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
773  * @vdev: VDEV object
774  *
775  * API to get MAC address from vdev object
776  *
777  * Caller need to acquire lock with wlan_vdev_obj_lock()
778  *
779  * Return:
780  * @macaddr: MAC address
781  */
782 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
783 {
784 	/* This API is invoked with lock acquired, do not add log prints */
785 	return vdev->vdev_mlme.macaddr;
786 }
787 
788 /**
789  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
790  * @vdev: VDEV object
791  * @mataddr: MAT address
792  *
793  * API to set mataddr in vdev object
794  *
795  * Caller need to acquire lock with wlan_vdev_obj_lock()
796  *
797  * Return: void
798  */
799 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
800 					uint8_t *mataddr)
801 {
802 	/* This API is invoked with lock acquired, do not add log prints */
803 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
804 }
805 
806 /**
807  * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr
808  * @vdev: VDEV object
809  *
810  * API to get MLD address from vdev object
811  *
812  * Caller need to acquire lock with wlan_vdev_obj_lock()
813  *
814  * Return:
815  * @macaddr: MAC address
816  */
817 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev)
818 {
819 	/* This API is invoked with lock acquired, do not add log prints */
820 	return vdev->vdev_mlme.mldaddr;
821 }
822 
823 /**
824  * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr
825  * @vdev: VDEV object
826  * @mldaddr: MLD address
827  *
828  * API to set MLD addr in vdev object
829  *
830  * Caller need to acquire lock with wlan_vdev_obj_lock()
831  *
832  * Return: void
833  */
834 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
835 					uint8_t *mldaddr)
836 {
837 	/* This API is invoked with lock acquired, do not add log prints */
838 	WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
839 }
840 
841 /**
842  * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
843  * @vdev: VDEV object
844  *
845  * API to get link MAC address from vdev object
846  *
847  * Caller need to acquire lock with wlan_vdev_obj_lock()
848  *
849  * Return:
850  * @linkaddr: Link MAC address
851  */
852 static inline
853 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev)
854 {
855 	/* This API is invoked with lock acquired, do not add log prints */
856 	return vdev->vdev_mlme.linkaddr;
857 }
858 
859 /**
860  * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr
861  * @vdev: VDEV object
862  * @linkaddr: Link address
863  *
864  * API to set link addr in vdev object
865  *
866  * Caller need to acquire lock with wlan_vdev_obj_lock()
867  *
868  * Return: void
869  */
870 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev,
871 					       uint8_t *linkaddr)
872 {
873 	/* This API is invoked with lock acquired, do not add log prints */
874 	qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr,
875 			 (struct qdf_mac_addr *)linkaddr);
876 }
877 
878 /**
879  * wlan_vdev_mlme_get_mataddr() - get mataddr
880  * @vdev: VDEV object
881  *
882  * API to get MAT address from vdev object
883  *
884  * Caller need to acquire lock with wlan_vdev_obj_lock()
885  *
886  * Return:
887  * @mataddr: MAT address
888  */
889 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
890 {
891 	/* This API is invoked with lock acquired, do not add log prints */
892 	return vdev->vdev_mlme.mataddr;
893 }
894 
895 /**
896  * wlan_vdev_get_id() - get vdev id
897  * @vdev: VDEV object
898  *
899  * API to get vdev id
900  *
901  * Return:
902  * @id: vdev id
903  */
904 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
905 {
906 	return vdev->vdev_objmgr.vdev_id;
907 }
908 
909 #ifdef WLAN_FEATURE_11BE_MLO
910 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
911 {
912 	return vdev->vdev_mlme.mlo_link_id;
913 }
914 
915 /**
916  * wlan_vdev_set_link_id() - set vdev mlo link id
917  * @vdev: VDEV object
918  * @link_id: link id
919  *
920  * API to set vdev mlo link id
921  *
922  * Return: void
923  */
924 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev,
925 					 uint8_t link_id)
926 {
927 	vdev->vdev_mlme.mlo_link_id = link_id;
928 }
929 
930 #ifdef WLAN_MLO_USE_SPINLOCK
931 /**
932  * wlan_create_vdev_mlo_lock() - API to create spin lock
933  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
934  * vdev MLME ext2 feature caps
935  * @vdev: VDEV object
936  *
937  * Return: void
938  */
939 static inline
940 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
941 {
942 	qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
943 }
944 
945 /**
946  * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock
947  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
948  * vdev MLME ext2 feature caps
949  * @vdev: VDEV object
950  *
951  * Return: void
952  */
953 static inline
954 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
955 {
956 	qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
957 }
958 
959 /**
960  * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock
961  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
962  * vdev MLME ext2 feature caps
963  * @vdev: VDEV object
964  *
965  * Return: void
966  */
967 static inline
968 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
969 {
970 	qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
971 }
972 
973 /**
974  * wlan_release_vdev_mlo_lock() - API to release spin lock
975  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
976  * vdev MLME ext2 feature caps
977  * @vdev: VDEV object
978  *
979  * Return: void
980  */
981 static inline
982 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
983 {
984 	qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
985 }
986 #else
987 /**
988  * wlan_create_vdev_mlo_lock() - API to create mutex which protects the
989  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
990  * @vdev: VDEV object
991  *
992  * Return: void
993  */
994 static inline
995 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
996 {
997 	qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
998 }
999 
1000 /**
1001  * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the
1002  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1003  * @vdev: VDEV object
1004  *
1005  * Return: void
1006  */
1007 static inline
1008 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1009 {
1010 	qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1011 }
1012 
1013 /**
1014  * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the
1015  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1016  * @vdev: VDEV object
1017  *
1018  * Return: void
1019  */
1020 static inline
1021 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1022 {
1023 	qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1024 }
1025 
1026 /**
1027  * wlan_release_vdev_mlo_lock() - API to release mutex which protects the
1028  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1029  * @vdev: VDEV object
1030  *
1031  * Return: void
1032  */
1033 static inline
1034 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1035 {
1036 	qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1037 }
1038 #endif /* WLAN_MLO_USE_SPINLOCK */
1039 #else
1040 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
1041 {
1042 	return WLAN_INVALID_LINK_ID;
1043 }
1044 
1045 static inline
1046 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1047 {
1048 }
1049 
1050 static inline
1051 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1052 {
1053 }
1054 #endif
1055 
1056 /**
1057  * wlan_vdev_get_hw_macaddr() - get hw macaddr
1058  * @vdev: VDEV object
1059  *
1060  * API to retrieve the HW MAC address from PDEV
1061  *
1062  * Caller need to acquire lock with wlan_vdev_obj_lock()
1063  *
1064  * Return:
1065  * @macaddr: HW MAC address
1066  */
1067 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
1068 {
1069 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
1070 
1071 	/* This API is invoked with lock acquired, do not add log prints */
1072 	if (pdev)
1073 		return wlan_pdev_get_hw_macaddr(pdev);
1074 	else
1075 		return NULL;
1076 }
1077 
1078 /**
1079  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
1080  * @vdev: VDEV object
1081  *
1082  * API to acquire VDEV lock
1083  * Parent lock should not be taken in child lock context
1084  * but child lock can be taken in parent lock context
1085  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
1086  *
1087  * Return: void
1088  */
1089 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
1090 {
1091 	qdf_spin_lock_bh(&vdev->vdev_lock);
1092 }
1093 
1094 /**
1095  * wlan_vdev_obj_unlock() - Release VDEV spinlock
1096  * @vdev: VDEV object
1097  *
1098  * API to Release VDEV lock
1099  *
1100  * Return: void
1101  */
1102 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
1103 {
1104 	qdf_spin_unlock_bh(&vdev->vdev_lock);
1105 }
1106 
1107 /**
1108  * wlan_vdev_mlme_set_bss_chan() - set bss chan
1109  * @vdev: VDEV object
1110  * @bss_chan: Channel
1111  *
1112  * API to set the BSS channel
1113  *
1114  * Return: void
1115  */
1116 static inline void wlan_vdev_mlme_set_bss_chan(
1117 				struct wlan_objmgr_vdev *vdev,
1118 				struct wlan_channel *bss_chan)
1119 {
1120 	vdev->vdev_mlme.bss_chan = bss_chan;
1121 }
1122 
1123 /**
1124  * wlan_vdev_mlme_get_bss_chan() - get bss chan
1125  * @vdev: VDEV object
1126  *
1127  * API to get the BSS channel
1128  *
1129  * Return:
1130  * @bss_chan: Channel
1131  */
1132 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
1133 				struct wlan_objmgr_vdev *vdev)
1134 {
1135 	return vdev->vdev_mlme.bss_chan;
1136 }
1137 
1138 /**
1139  * wlan_vdev_mlme_set_des_chan() - set desired chan
1140  * @vdev: VDEV object
1141  * @des_chan: Channel configured by user
1142  *
1143  * API to set the desired channel
1144  *
1145  * Return: void
1146  */
1147 static inline void wlan_vdev_mlme_set_des_chan(
1148 				struct wlan_objmgr_vdev *vdev,
1149 				struct wlan_channel *des_chan)
1150 {
1151 	vdev->vdev_mlme.des_chan = des_chan;
1152 }
1153 
1154 /**
1155  * wlan_vdev_mlme_get_des_chan() - get desired chan
1156  * @vdev: VDEV object
1157  *
1158  * API to get the desired channel
1159  *
1160  * Return:
1161  * @des_chan: Channel configured by user
1162  */
1163 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan(
1164 				struct wlan_objmgr_vdev *vdev)
1165 {
1166 	return vdev->vdev_mlme.des_chan;
1167 }
1168 
1169 /**
1170  * wlan_vdev_mlme_feat_cap_set() - set feature caps
1171  * @vdev: VDEV object
1172  * @cap: capabilities to be set
1173  *
1174  * API to set MLME feature capabilities
1175  *
1176  * Return: void
1177  */
1178 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev,
1179 				uint32_t cap)
1180 {
1181 	vdev->vdev_mlme.vdev_feat_caps |= cap;
1182 }
1183 
1184 /**
1185  * wlan_vdev_mlme_feat_cap_clear() - clear feature caps
1186  * @vdev: VDEV object
1187  * @cap: capabilities to be cleared
1188  *
1189  * API to clear MLME feature capabilities
1190  *
1191  * Return: void
1192  */
1193 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev,
1194 				uint32_t cap)
1195 {
1196 	vdev->vdev_mlme.vdev_feat_caps &= ~cap;
1197 }
1198 
1199 /**
1200  * wlan_vdev_mlme_feat_cap_get() - get feature caps
1201  * @vdev: VDEV object
1202  * @cap: capabilities to be checked
1203  *
1204  * API to know MLME feature capability is set or not
1205  *
1206  * Return: 1 -- if capabilities set
1207  *         0 -- if capabilities clear
1208  */
1209 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev,
1210 				uint32_t cap)
1211 {
1212 	return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0;
1213 }
1214 
1215 /**
1216  * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps
1217  * @vdev: VDEV object
1218  * @cap: capabilities to be set
1219  *
1220  * API to set the MLME extensive feature capabilities
1221  *
1222  * Return: void
1223  */
1224 static inline void wlan_vdev_mlme_feat_ext_cap_set(
1225 				struct wlan_objmgr_vdev *vdev,
1226 				uint32_t cap)
1227 {
1228 	vdev->vdev_mlme.vdev_feat_ext_caps |= cap;
1229 }
1230 
1231 /**
1232  * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps
1233  * @vdev: VDEV object
1234  * @cap: capabilities to be cleared
1235  *
1236  * API to clear the MLME extensive feature capabilities
1237  *
1238  * Return: void
1239  */
1240 static inline void wlan_vdev_mlme_feat_ext_cap_clear(
1241 				struct wlan_objmgr_vdev *vdev,
1242 				uint32_t cap)
1243 {
1244 	vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap;
1245 }
1246 
1247 /**
1248  * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps
1249  * @vdev: VDEV object
1250  * @cap: capabilities to be checked
1251  *
1252  * API to know MLME ext feature capability is set or not
1253  *
1254  * Return: 1 -- if capabilities set
1255  *         0 -- if capabilities clear
1256  */
1257 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get(
1258 				struct wlan_objmgr_vdev *vdev,
1259 				uint32_t cap)
1260 {
1261 	return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0;
1262 }
1263 
1264 /**
1265  * wlan_vdev_mlme_feat_ext2_cap_set() - set ext2 feature caps
1266  * @vdev: VDEV object
1267  * @cap: capabilities to be set
1268  *
1269  * API to set the MLME more extensive feature capabilities
1270  *
1271  * Return: void
1272  */
1273 static inline void wlan_vdev_mlme_feat_ext2_cap_set(
1274 				struct wlan_objmgr_vdev *vdev,
1275 				uint32_t cap)
1276 {
1277 	vdev->vdev_mlme.vdev_feat_ext2_caps |= cap;
1278 }
1279 
1280 /**
1281  * wlan_vdev_mlme_feat_ext2_cap_clear() - clear ext2 feature caps
1282  * @vdev: VDEV object
1283  * @cap: capabilities to be cleared
1284  *
1285  * API to clear the MLME more extensive feature capabilities
1286  *
1287  * Return: void
1288  */
1289 static inline void wlan_vdev_mlme_feat_ext2_cap_clear(
1290 				struct wlan_objmgr_vdev *vdev,
1291 				uint32_t cap)
1292 {
1293 	vdev->vdev_mlme.vdev_feat_ext2_caps &= ~cap;
1294 }
1295 
1296 /**
1297  * wlan_vdev_mlme_feat_ext2_cap_get() - get feature ext2 caps
1298  * @vdev: VDEV object
1299  * @cap: capabilities to be checked
1300  *
1301  * API to know MLME more ext feature capability is set or not
1302  *
1303  * Return: 1 -- if capabilities set
1304  *         0 -- if capabilities clear
1305  */
1306 static inline uint8_t wlan_vdev_mlme_feat_ext2_cap_get(
1307 				struct wlan_objmgr_vdev *vdev,
1308 				uint32_t cap)
1309 {
1310 	return (vdev->vdev_mlme.vdev_feat_ext2_caps & cap) ? 1 : 0;
1311 }
1312 
1313 /**
1314  * wlan_vdev_mlme_op_flags_set() - set vdev op flag
1315  * @vdev: VDEV object
1316  * @flag: vdev op flag to be set
1317  *
1318  * API to set the MLME VDEV OP flag
1319  *
1320  * Return: void
1321  */
1322 static inline void wlan_vdev_mlme_op_flags_set(
1323 				struct wlan_objmgr_vdev *vdev,
1324 				uint32_t flag)
1325 {
1326 	vdev->vdev_mlme.vdev_op_flags |= flag;
1327 }
1328 
1329 /**
1330  * wlan_vdev_mlme_op_flags_clear() - clear vdev op flag
1331  * @vdev: VDEV object
1332  * @flag: vdev op flag to be cleared
1333  *
1334  * API to clear the MLME VDEV OP flag
1335  *
1336  * Return: void
1337  */
1338 static inline void wlan_vdev_mlme_op_flags_clear(
1339 				struct wlan_objmgr_vdev *vdev,
1340 				uint32_t flag)
1341 {
1342 	vdev->vdev_mlme.vdev_op_flags &= ~flag;
1343 }
1344 
1345 /**
1346  * wlan_vdev_mlme_op_flags_get() - get vdev op flag
1347  * @vdev: VDEV object
1348  * @flag: vdev op flags to be checked
1349  *
1350  * API to know MLME VDEV OP flag is set or not
1351  *
1352  * Return: 1 -- if flag is set
1353  *         0 -- if flag is clear
1354  */
1355 static inline uint8_t wlan_vdev_mlme_op_flags_get(
1356 				struct wlan_objmgr_vdev *vdev,
1357 				uint32_t flag)
1358 {
1359 	return (vdev->vdev_mlme.vdev_op_flags & flag) ? 1 : 0;
1360 }
1361 
1362 /**
1363  * wlan_vdev_mlme_cap_set() - mlme caps set
1364  * @vdev: VDEV object
1365  * @cap: capabilities to be set
1366  *
1367  * API to set the MLME capabilities
1368  *
1369  * Return: void
1370  */
1371 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev,
1372 				uint32_t cap)
1373 {
1374 	vdev->vdev_mlme.vdev_caps |= cap;
1375 }
1376 
1377 /**
1378  * wlan_vdev_mlme_cap_clear() -  mlme caps clear
1379  * @vdev: VDEV object
1380  * @cap: capabilities to be cleared
1381  *
1382  * API to clear the MLME capabilities
1383  *
1384  * Return: void
1385  */
1386 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev,
1387 				uint32_t cap)
1388 {
1389 	vdev->vdev_mlme.vdev_caps &= ~cap;
1390 }
1391 
1392 /**
1393  * wlan_vdev_mlme_cap_get() - get mlme caps
1394  * @vdev: VDEV object
1395  * @cap: capabilities to be checked
1396  *
1397  * API to know MLME capability is set or not
1398  *
1399  * Return: 1 -- if capabilities set
1400  *         0 -- if capabilities clear
1401  */
1402 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev,
1403 				uint32_t cap)
1404 {
1405 	return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0;
1406 }
1407 
1408 /**
1409  * wlan_vdev_mlme_get_state() - get mlme state
1410  * @vdev: VDEV object
1411  *
1412  * API to get MLME state
1413  *
1414  * Return: state of MLME
1415  */
1416 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
1417 				struct wlan_objmgr_vdev *vdev)
1418 {
1419 	return vdev->vdev_mlme.mlme_state;
1420 }
1421 
1422 /**
1423  * wlan_vdev_mlme_get_substate() - get mlme substate
1424  * @vdev: VDEV object
1425  *
1426  * API to get VDEV MLME substate
1427  *
1428  * Return: substate of VDEV MLME
1429  */
1430 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
1431 				struct wlan_objmgr_vdev *vdev)
1432 {
1433 	return vdev->vdev_mlme.mlme_substate;
1434 }
1435 
1436 /**
1437  * wlan_vdev_set_selfpeer() - set self peer
1438  * @vdev: VDEV object
1439  * @peer: peer pointer
1440  *
1441  * API to set the self peer of VDEV
1442  *
1443  * Return: void
1444  */
1445 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev,
1446 						struct wlan_objmgr_peer *peer)
1447 {
1448 	vdev->vdev_objmgr.self_peer = peer;
1449 }
1450 
1451 /**
1452  * wlan_vdev_get_selfpeer() - get self peer
1453  * @vdev: VDEV object
1454  *
1455  * API to get the self peer of VDEV
1456  *
1457  * Return:
1458  * @peer: peer pointer
1459  */
1460 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1461 					struct wlan_objmgr_vdev *vdev)
1462 {
1463 	return vdev->vdev_objmgr.self_peer;
1464 }
1465 
1466 /**
1467  * wlan_vdev_set_bsspeer() - set bss peer
1468  * @vdev: VDEV object
1469  * @peer: BSS peer pointer
1470  *
1471  * API to set the BSS peer of VDEV
1472  *
1473  * Return: void
1474  */
1475 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1476 						 struct wlan_objmgr_peer *peer)
1477 {
1478 	vdev->vdev_objmgr.bss_peer = peer;
1479 }
1480 
1481 /**
1482  * wlan_vdev_get_bsspeer() - get bss peer
1483  * @vdev: VDEV object
1484  *
1485  * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API
1486  * preferred to use outside obj manager to take and handle ref count of
1487  * bss_peer with ref debug ID.
1488  *
1489  * Return:
1490  * @peer: BSS peer pointer
1491  */
1492 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1493 					struct wlan_objmgr_vdev *vdev)
1494 {
1495 	return vdev->vdev_objmgr.bss_peer;
1496 }
1497 
1498 /**
1499  * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
1500  * @vdev: VDEV object
1501  * @peer_mac: mac address of the peer to be found
1502  * @dbg_id: dbg_id of the module
1503  *
1504  * API to get and increment ref count of BSS peer of VDEV
1505  *
1506  * Return:
1507  * @peer: peer pointer to the peer of the mac address
1508  */
1509 struct wlan_objmgr_peer *
1510 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
1511 				  uint8_t *peer_mac,
1512 				  wlan_objmgr_ref_dbgid dbg_id);
1513 
1514 /**
1515  * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
1516  * of VDEV
1517  * @vdev: VDEV object
1518  * @id:   Object Manager ref debug id
1519  *
1520  * API to get and increment ref count of BSS peer of VDEV
1521  *
1522  * Return:
1523  * @peer: BSS peer pointer if bss peer is present and valid else NULL
1524  */
1525 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer(
1526 					struct wlan_objmgr_vdev *vdev,
1527 					wlan_objmgr_ref_dbgid id);
1528 /**
1529  * wlan_vdev_get_ospriv() - get os priv pointer
1530  * @vdev: VDEV object
1531  *
1532  * API to get OS private pointer from VDEV
1533  *
1534  * Return: ospriv - private pointer
1535  */
1536 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1537 	struct wlan_objmgr_vdev *vdev)
1538 {
1539 	return vdev->vdev_nif.osdev;
1540 }
1541 
1542 /**
1543  * wlan_vdev_reset_ospriv() - reset os priv pointer
1544  * @vdev: VDEV object
1545  *
1546  * API to reset OS private pointer in VDEV
1547  *
1548  * Return: void
1549  */
1550 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1551 {
1552 	vdev->vdev_nif.osdev = NULL;
1553 }
1554 
1555 /**
1556  * wlan_vdev_get_peer_count() - get vdev peer count
1557  * @vdev: VDEV object
1558  *
1559  * API to get peer count from VDEV
1560  *
1561  * Return: peer_count - vdev's peer count
1562  */
1563 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1564 {
1565 	return vdev->vdev_objmgr.wlan_peer_count;
1566 }
1567 
1568 #ifdef WLAN_FEATURE_11BE_MLO
1569 /**
1570  * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO
1571  * vdev or not
1572  * @vdev: VDEV object
1573  *
1574  * Return: True if it is MLO, otherwise false.
1575  */
1576 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1577 
1578 /**
1579  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
1580  * @vdev: VDEV object
1581  *
1582  * Return: True if it is mlo ap, otherwise false.
1583  */
1584 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1585 {
1586 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
1587 		wlan_vdev_mlme_is_mlo_vdev(vdev);
1588 }
1589 
1590 /**
1591  * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev
1592  * @vdev: VDEV object
1593  *
1594  * Return: void
1595  */
1596 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1597 
1598 /**
1599  * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev
1600  * @vdev: VDEV object
1601  *
1602  * Return: void
1603  */
1604 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1605 
1606 /**
1607  * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev
1608  * @vdev: VDEV object
1609  *
1610  * Return: void
1611  */
1612 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1613 
1614 /**
1615  * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an
1616  * MLO link vdev
1617  * @vdev: VDEV object
1618  *
1619  * Return: void
1620  */
1621 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1622 #ifdef WLAN_MCAST_MLO
1623 /**
1624  * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not
1625  * @vdev: VDEV object
1626  *
1627  * Return: True if it is mlo mcast vdev, otherwise false.
1628  */
1629 static inline
1630 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1631 {
1632 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1633 						WLAN_VDEV_FEXT2_MLO_MCAST);
1634 }
1635 #else
1636 static inline
1637 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1638 {
1639 	return false;
1640 }
1641 #endif
1642 
1643 /**
1644  * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not
1645  * @vdev: VDEV object
1646  *
1647  * Return: True if it is mlo sta link, otherwise false.
1648  */
1649 static inline
1650 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1651 {
1652 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1653 						WLAN_VDEV_FEXT2_MLO_STA_LINK);
1654 }
1655 
1656 /**
1657  * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not
1658  * @vdev: VDEV object
1659  *
1660  * Return: True if it is mlo sta assoc vdev, otherwise false.
1661  */
1662 static inline
1663 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1664 {
1665 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1666 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1667 		return false;
1668 
1669 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1670 		return true;
1671 
1672 	return false;
1673 }
1674 
1675 /**
1676  * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not
1677  * @vdev: VDEV object
1678  *
1679  * Return: True if it is mlo sta link vdev, otherwise false.
1680  */
1681 static inline
1682 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1683 {
1684 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1685 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1686 		return false;
1687 
1688 	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1689 		return true;
1690 
1691 	return false;
1692 }
1693 #else
1694 static inline
1695 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1696 {
1697 	return false;
1698 }
1699 
1700 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1701 {
1702 	return false;
1703 }
1704 
1705 static inline
1706 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1707 {
1708 }
1709 
1710 static inline
1711 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1712 {
1713 }
1714 
1715 static inline
1716 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1717 {
1718 }
1719 
1720 static inline
1721 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1722 {
1723 }
1724 
1725 static inline
1726 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1727 {
1728 	return false;
1729 }
1730 
1731 static inline
1732 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1733 {
1734 	return false;
1735 }
1736 
1737 static inline
1738 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1739 {
1740 	return false;
1741 }
1742 #endif
1743 
1744 /**
1745  * DOC: Examples to use VDEV ref count APIs
1746  *
1747  * In all the scenarios, the pair of API should be followed
1748  * other it lead to memory leak
1749  *
1750  *  scenario 1:
1751  *
1752  *     wlan_objmgr_vdev_obj_create()
1753  *     ----
1754  *     wlan_objmgr_vdev_obj_delete()
1755  *
1756  *  scenario 2:
1757  *
1758  *     wlan_objmgr_vdev_get_ref()
1759  *     ----
1760  *     the operations which are done on
1761  *     vdev object
1762  *     ----
1763  *     wlan_objmgr_vdev_release_ref()
1764  *
1765  *  scenario 3:
1766  *
1767  *     API to retrieve vdev (xxx_get_vdev_xxx())
1768  *     ----
1769  *     the operations which are done on
1770  *     vdev object
1771  *     ----
1772  *     wlan_objmgr_vdev_release_ref()
1773  */
1774 
1775 /**
1776  * wlan_objmgr_vdev_get_ref() - increment ref count
1777  * @vdev: VDEV object
1778  * @id:   Object Manager ref debug id
1779  *
1780  * API to increment ref count of vdev
1781  *
1782  * Return: void
1783  */
1784 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1785 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1786 				    wlan_objmgr_ref_dbgid id,
1787 				    const char *func, int line);
1788 
1789 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \
1790 		wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__)
1791 #else
1792 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
1793 				wlan_objmgr_ref_dbgid id);
1794 #endif
1795 
1796 /**
1797  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
1798  * @vdev: VDEV object
1799  * @id:   Object Manager ref debug id
1800  *
1801  * API to increment ref count of vdev after checking valid object state
1802  *
1803  * Return: void
1804  */
1805 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1806 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1807 					      wlan_objmgr_ref_dbgid id,
1808 					      const char *func, int line);
1809 
1810 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \
1811 		wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \
1812 		__func__, __LINE__)
1813 #else
1814 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
1815 						wlan_objmgr_ref_dbgid id);
1816 #endif
1817 
1818 /**
1819  * wlan_objmgr_vdev_release_ref() - decrement ref count
1820  * @vdev: VDEV object
1821  * @id:   Object Manager ref debug id
1822  *
1823  * API to decrement ref count of vdev, if ref count is 1, it initiates the
1824  * VDEV deletion
1825  *
1826  * Return: void
1827  */
1828 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1829 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
1830 					wlan_objmgr_ref_dbgid id,
1831 					const char *func, int line);
1832 
1833 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\
1834 		wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \
1835 		__func__, __LINE__)
1836 #else
1837 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
1838 						wlan_objmgr_ref_dbgid id);
1839 #endif
1840 
1841 /**
1842  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
1843  * @pdev: PDEV object
1844  * @vdev_list: qdf_list_t
1845  * @vdev: VDEV object
1846  * @dbg_id: id of the caller
1847  *
1848  * API to get next active vdev object pointer of vdev
1849  *
1850  * Return:
1851  * @vdev_next: VDEV object
1852  */
1853 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1854 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
1855 					struct wlan_objmgr_pdev *pdev,
1856 					qdf_list_t *vdev_list,
1857 					struct wlan_objmgr_vdev *vdev,
1858 					wlan_objmgr_ref_dbgid dbg_id,
1859 					const char *func, int line);
1860 
1861 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \
1862 		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
1863 		vdev, dbgid, __func__, __LINE__)
1864 #else
1865 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
1866 					struct wlan_objmgr_pdev *pdev,
1867 					qdf_list_t *vdev_list,
1868 					struct wlan_objmgr_vdev *vdev,
1869 					wlan_objmgr_ref_dbgid dbg_id);
1870 #endif
1871 
1872 /**
1873  * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
1874  * @pdev: PDEV object
1875  * @dbg_id: id of the caller
1876  *
1877  * API to get the head active vdev of given pdev (of pdev's vdev list)
1878  *
1879  * Return:
1880  */
1881 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1882 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
1883 		struct wlan_objmgr_pdev *pdev,
1884 		wlan_objmgr_ref_dbgid dbg_id,
1885 		const char *func, int line);
1886 
1887 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \
1888 		wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \
1889 		__func__, __LINE__)
1890 #else
1891 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
1892 		struct wlan_objmgr_pdev *pdev,
1893 		wlan_objmgr_ref_dbgid dbg_id);
1894 #endif
1895 
1896 /**
1897  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
1898  * @vdev: VDEV object
1899  * @vdev_list: qdf_list_t
1900  * @dbg_id: id of the caller
1901  *
1902  * API to get the head active vdev of given vdev (of pdev's vdev list)
1903  *
1904  * Return:
1905  * @peer: head peer
1906  */
1907 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1908 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
1909 				struct wlan_objmgr_pdev *pdev,
1910 				qdf_list_t *vdev_list,
1911 				wlan_objmgr_ref_dbgid dbg_id,
1912 				const char *func, int line);
1913 
1914 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \
1915 		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
1916 		dbgid, __func__, __LINE__)
1917 #else
1918 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
1919 				struct wlan_objmgr_pdev *pdev,
1920 				qdf_list_t *vdev_list,
1921 				wlan_objmgr_ref_dbgid dbg_id);
1922 #endif
1923 
1924 /**
1925  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed
1926  * @vdev: VDEV object
1927  *
1928  * API to invokes registered callbacks to notify about peer freed
1929  *
1930  * Return: void
1931  */
1932 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev);
1933 
1934 /**
1935  * wlan_vdev_set_max_peer_count() - set max peer count
1936  * @vdev: VDEV object
1937  * @count: Max peer count
1938  *
1939  * API to set max peer count of VDEV
1940  *
1941  * Return: void
1942  */
1943 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
1944 						uint16_t count)
1945 {
1946 	vdev->vdev_objmgr.max_peer_count = count;
1947 }
1948 
1949 /**
1950  * wlan_vdev_get_max_peer_count() - get max peer count
1951  * @vdev: VDEV object
1952  *
1953  * API to get max peer count of VDEV
1954  *
1955  * Return: max peer count
1956  */
1957 static inline uint16_t wlan_vdev_get_max_peer_count(
1958 						struct wlan_objmgr_vdev *vdev)
1959 {
1960 	return vdev->vdev_objmgr.max_peer_count;
1961 }
1962 
1963 /**
1964  * wlan_print_vdev_info() - print vdev members
1965  * @vdev: vdev object pointer
1966  *
1967  * Return: void
1968  */
1969 #ifdef WLAN_OBJMGR_DEBUG
1970 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
1971 #else
1972 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
1973 #endif
1974 
1975 /**
1976  * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
1977  * @vdev: vdev object pointer
1978  *
1979  * Return: void
1980  */
1981 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1982 static inline void
1983 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1984 {
1985 	wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
1986 }
1987 #else
1988 static inline void
1989 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1990 {
1991 }
1992 #endif
1993 
1994 /**
1995  * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
1996  * @vdev: vdev object pointer
1997  *
1998  * Return: void
1999  */
2000 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2001 static inline void
2002 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2003 {
2004 	wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
2005 }
2006 #else
2007 static inline void
2008 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2009 {
2010 }
2011 #endif
2012 
2013 /**
2014  * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
2015  * @vdev: vdev object pointer
2016  *
2017  * Return: void
2018  */
2019 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2020 static inline void
2021 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2022 {
2023 	wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
2024 }
2025 #else
2026 static inline void
2027 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2028 {
2029 }
2030 #endif
2031 
2032 /**
2033  * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
2034  * @vdev: pointer to vdev
2035  * @bss_peer_mac: pointer to bss_peer_mac_address
2036  *
2037  * This API is used to get mac address of peer.
2038  *
2039  * Context: Any context.
2040  *
2041  * Return: QDF_STATUS based on overall success
2042  */
2043 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev,
2044 				      struct qdf_mac_addr *bss_peer_mac);
2045 
2046 #ifdef WLAN_FEATURE_11BE_MLO
2047 /**
2048  * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address
2049  * @vdev: pointer to vdev
2050  * @mld_mac: pointer to mld mac address
2051  *
2052  * This API is used to get mld mac address of peer.
2053  *
2054  * Context: Any context.
2055  *
2056  * Return: QDF_STATUS based on overall success
2057  */
2058 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
2059 					  struct qdf_mac_addr *mld_mac);
2060 #endif
2061 
2062 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
2063