xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 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   /* for mlo reconfig link removal functionality */
231 #define WLAN_VDEV_OP_MLO_STOP_LINK_DEL      0x00200000
232   /* for mlo reconfig link add functionality */
233 #define WLAN_VDEV_OP_MLO_LINK_ADD           0x00400000
234   /* for mlo reconfig link removal TBTT complete */
235 #define WLAN_VDEV_OP_MLO_LINK_TBTT_COMPLETE 0x00800000
236 
237 /* MLO link removal is in progress on this VDEV */
238 #define WLAN_VDEV_OP_MLO_LINK_REMOVAL_IN_PROGRESS 0x01000000
239 
240  /* CAPABILITY: IBSS available */
241 #define WLAN_VDEV_C_IBSS                    0x00000001
242 /* CAPABILITY: HOSTAP avail */
243 #define WLAN_VDEV_C_HOSTAP               0x00000002
244    /* CAPABILITY: Old Adhoc Demo */
245 #define WLAN_VDEV_C_AHDEMO               0x00000004
246   /* CAPABILITY: sw tx retry */
247 #define WLAN_VDEV_C_SWRETRY              0x00000008
248   /* CAPABILITY: monitor mode */
249 #define WLAN_VDEV_C_MONITOR              0x00000010
250   /* CAPABILITY: TKIP MIC avail */
251 #define WLAN_VDEV_C_TKIPMIC              0x00000020
252   /* CAPABILITY: 4-addr support */
253 #define WLAN_VDEV_C_WDS                  0x00000040
254   /* CAPABILITY: TKIP MIC for QoS frame */
255 #define WLAN_VDEV_C_WME_TKIPMIC          0x00000080
256   /* CAPABILITY: bg scanning */
257 #define WLAN_VDEV_C_BGSCAN               0x00000100
258   /* CAPABILITY: Restrict offchannel */
259 #define WLAN_VDEV_C_RESTRICT_OFFCHAN     0x00000200
260   /* CAPABILITY: eMLSR capability */
261 #define WLAN_VDEV_C_EMLSR_CAP            0x00000400
262 
263 /* Invalid VDEV identifier */
264 #define WLAN_INVALID_VDEV_ID 255
265 
266 /* Invalid VDEV link id*/
267 #define WLAN_INVALID_LINK_ID 255
268 
269 /**
270  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
271  *				    structure While creating VDEV
272  * @opmode:         Opmode of VDEV
273  * @flags:          create flags
274  * @size_vdev_priv: Size of vdev private
275  * @legacy_osif:    Legacy os_if private member
276  * @macaddr:        MAC address
277  * @mataddr:        MAT address
278  * @mldaddr:        MLD address
279  */
280 struct wlan_vdev_create_params {
281 	enum QDF_OPMODE opmode;
282 	uint32_t flags;
283 	size_t size_vdev_priv;
284 	void *legacy_osif;
285 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
286 	uint8_t mataddr[QDF_MAC_ADDR_SIZE];
287 	uint8_t mldaddr[QDF_MAC_ADDR_SIZE];
288 };
289 
290 /**
291  * struct wlan_channel - channel structure
292  * @ch_freq:      Channel in Mhz.
293  * @ch_ieee:      IEEE channel number.
294  * @ch_freq_seg1: Channel Center frequency for VHT80/160 and HE80/160.
295  * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode.
296  * @ch_maxpower:  Maximum tx power in dBm.
297  * @ch_flagext:   Channel extension flags.
298  * @ch_flags:     Channel flags.
299  * @ch_cfreq1:    channel center frequency for primary
300  * @ch_cfreq2:    channel center frequency for secondary
301  * @ch_width:     Channel width.
302  * @ch_phymode:   Channel phymode.
303  * @puncture_bitmap:   Puncture bitmap per 20MHz.
304  */
305 struct wlan_channel {
306 	uint16_t     ch_freq;
307 	uint8_t      ch_ieee;
308 	uint8_t      ch_freq_seg1;
309 	uint8_t      ch_freq_seg2;
310 	int8_t       ch_maxpower;
311 	uint16_t     ch_flagext;
312 	uint64_t     ch_flags;
313 	uint32_t     ch_cfreq1;
314 	uint32_t     ch_cfreq2;
315 	enum phy_ch_width ch_width;
316 	enum wlan_phymode ch_phymode;
317 #ifdef WLAN_FEATURE_11BE
318 	uint16_t     puncture_bitmap;
319 #endif
320 };
321 
322 /**
323  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
324  * @vdev_opmode:        Opmode of VDEV
325  * @mlme_state:         VDEV MLME SM state
326  * @mlme_substate:      VDEV MLME SM substate
327  * @bss_chan:           BSS channel
328  * @des_chan:           Desired channel, for STA Desired may not be used
329  * @vdev_caps:          VDEV capabilities
330  * @vdev_feat_caps:     VDEV feature caps
331  * @vdev_feat_ext_caps: VDEV Extended feature caps
332  * @vdev_feat_ext2_caps: More VDEV Extended feature caps
333  * @vdev_op_flags:      Operation flags
334  * @mataddr:            MAT address
335  * @macaddr:            Contains link MAC address for ML connection and
336  *                      net dev address for non-ML connection
337  * @mldaddr:            MLD address
338  * @linkaddr:           Link MAC address
339  * @mlo_link_id: link id for mlo connection
340  * @wlan_vdev_mlo_lock: lock to protect the set/clear of
341  * WLAN_VDEV_FEXT2_MLO feature flag in vdev MLME
342  */
343 struct wlan_objmgr_vdev_mlme {
344 	enum QDF_OPMODE vdev_opmode;
345 	enum wlan_vdev_state mlme_state;
346 	enum wlan_vdev_state mlme_substate;
347 	struct wlan_channel *bss_chan;
348 	struct wlan_channel *des_chan;
349 	uint32_t vdev_caps;
350 	uint32_t vdev_feat_caps;
351 	uint32_t vdev_feat_ext_caps;
352 	uint32_t vdev_feat_ext2_caps;
353 	uint32_t vdev_op_flags;
354 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
355 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
356 	uint8_t  mldaddr[QDF_MAC_ADDR_SIZE];
357 	uint8_t  linkaddr[QDF_MAC_ADDR_SIZE];
358 #ifdef WLAN_FEATURE_11BE_MLO
359 	uint8_t  mlo_link_id;
360 #ifdef WLAN_MLO_USE_SPINLOCK
361 	qdf_spinlock_t wlan_vdev_mlo_lock;
362 #else
363 	qdf_mutex_t wlan_vdev_mlo_lock;
364 #endif
365 #endif
366 };
367 
368 /**
369  *  struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure
370  *  @osdev:  OS specific pointer
371  */
372 struct wlan_objmgr_vdev_nif {
373 	struct vdev_osif_priv *osdev;
374 };
375 
376 /**
377  *  struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
378  *  @vdev_id:           VDEV id
379  *  @print_cnt:         Count to throttle Logical delete prints
380  *  @self_peer:         Self PEER
381  *  @bss_peer:          BSS PEER
382  *  @wlan_peer_list:    PEER list
383  *  @wlan_pdev:         PDEV pointer
384  *  @wlan_peer_count:   Peer count
385  *  @max_peer_count:    Max Peer count
386  *  @c_flags:           creation specific flags
387  *  @ref_cnt:           Ref count
388  *  @ref_id_dbg:        Array to track Ref count
389  *  @trace:             Trace ref and deref
390  */
391 struct wlan_objmgr_vdev_objmgr {
392 	uint8_t vdev_id;
393 	uint8_t print_cnt;
394 	struct wlan_objmgr_peer *self_peer;
395 	struct wlan_objmgr_peer *bss_peer;
396 	qdf_list_t wlan_peer_list;
397 	struct wlan_objmgr_pdev *wlan_pdev;
398 	uint16_t wlan_peer_count;
399 	uint16_t max_peer_count;
400 	uint32_t c_flags;
401 	qdf_atomic_t ref_cnt;
402 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
403 #ifdef WLAN_OBJMGR_REF_ID_TRACE
404 	struct wlan_objmgr_trace trace;
405 #endif
406 };
407 
408 /**
409  * struct wlan_objmgr_vdev - VDEV common object
410  * @vdev_node:      qdf list of pdev's vdev list
411  * @vdev_mlme:      VDEV MLME substructure
412  * @vdev_objmgr:    VDEV Object Mgr substructure
413  * @vdev_nif:       VDEV HDD substructure
414  * @vdev_comp_priv_obj:Component's private objects list
415  * @obj_status:     Component object status
416  * @obj_state:      VDEV object state
417  * @vdev_lock:      VDEV lock
418  * @mlo_dev_ctx:    MLO device context
419  * @twt_work:	    TWT work
420  */
421 struct wlan_objmgr_vdev {
422 	qdf_list_node_t vdev_node;
423 	struct wlan_objmgr_vdev_mlme vdev_mlme;
424 	struct wlan_objmgr_vdev_objmgr vdev_objmgr;
425 	struct wlan_objmgr_vdev_nif vdev_nif;
426 	void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
427 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
428 	WLAN_OBJ_STATE obj_state;
429 	qdf_spinlock_t vdev_lock;
430 #ifdef WLAN_FEATURE_11BE_MLO
431 	struct wlan_mlo_dev_context *mlo_dev_ctx;
432 #endif
433 #ifdef WLAN_SUPPORT_TWT
434 	qdf_work_t twt_work;
435 #endif
436 };
437 
438 /*
439  * APIs to Create/Delete Global object APIs
440  */
441 /**
442  * wlan_objmgr_vdev_obj_create() - vdev object create
443  * @pdev: PDEV object on which this vdev gets created
444  * @params: VDEV create params from HDD
445  *
446  * Creates vdev object, initializes with default values
447  * Attaches to psoc and pdev objects
448  * Invokes the registered notifiers to create component object
449  *
450  * Return: Handle to struct wlan_objmgr_vdev on successful creation,
451  *         NULL on Failure (on Mem alloc failure and Component objects
452  *         Failure)
453  */
454 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
455 			struct wlan_objmgr_pdev *pdev,
456 			struct wlan_vdev_create_params *params);
457 
458 /**
459  * wlan_objmgr_vdev_obj_delete() - vdev object delete
460  * @vdev: vdev object
461  *
462  * Logically deletes VDEV object,
463  * Once all the references are released, object manager invokes the registered
464  * notifiers to destroy component objects
465  *
466  * Return: SUCCESS/FAILURE
467  */
468 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev);
469 
470 /*
471  * APIs to attach/detach component objects
472  */
473 /**
474  * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach
475  * @vdev: VDEV object
476  * @id: Component id
477  * @comp_priv_obj: component's private object pointer
478  * @status: Component's private object creation status
479  *
480  * API to be used for attaching component object with VDEV common object
481  *
482  * Return: SUCCESS on successful storing of component's object in common object
483  *         On FAILURE (appropriate failure codes are returned)
484  */
485 QDF_STATUS wlan_objmgr_vdev_component_obj_attach(
486 		struct wlan_objmgr_vdev *vdev,
487 		enum wlan_umac_comp_id id,
488 		void *comp_priv_obj,
489 		QDF_STATUS status);
490 
491 /**
492  * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach
493  * @vdev: VDEV object
494  * @id: Component id
495  * @comp_priv_obj: component's private object pointer
496  *
497  * API to be used for detaching component object with VDEV common object
498  *
499  * Return: SUCCESS on successful removal of component's object from common
500  *         object
501  *         On FAILURE (appropriate failure codes are returned)
502  */
503 QDF_STATUS wlan_objmgr_vdev_component_obj_detach(
504 		struct wlan_objmgr_vdev *vdev,
505 		enum wlan_umac_comp_id id,
506 		void *comp_priv_obj);
507 
508 /*
509  * APIs to operations on vdev objects
510  */
511 
512 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
513 					void *object,
514 					void *arg);
515 
516 /**
517  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
518  * @vdev: vdev object
519  * @handler: the handler will be called for each object of requested type
520  *            the handler should be implemented to perform required operation
521  * @arg:     arguments passed by caller
522  * @dbg_id: id of the caller
523  *
524  * API to be used for performing the operations on all PEER objects
525  * of vdev
526  *
527  * Return: SUCCESS/FAILURE
528  */
529 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
530 		struct wlan_objmgr_vdev *vdev,
531 		wlan_objmgr_vdev_op_handler handler,
532 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
533 
534 /**
535  * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
536  * @vdev: vdev object
537  * @dbg_id: id of the caller
538  *
539  * API to be used for populating the list of logically deleted peers from the
540  * vdev's peer list
541  *
542  * The caller of this function should free the memory allocated for the
543  * peerlist and the peer member in the list
544  * Also the peer ref release is handled by the caller
545  *
546  * Return: list of peer pointers
547  *         NULL on FAILURE
548  */
549 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
550 		struct wlan_objmgr_vdev *vdev,
551 		wlan_objmgr_ref_dbgid dbg_id);
552 
553 /**
554  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
555  * comp object creation
556  * @vdev: VDEV object
557  * @id: Component id
558  *
559  * API to create component private object in run time, this would
560  * be used for features which gets enabled in run time
561  *
562  * Return: SUCCESS on successful creation
563  *         On FAILURE (appropriate failure codes are returned)
564  */
565 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
566 		struct wlan_objmgr_vdev *vdev,
567 		enum wlan_umac_comp_id id);
568 
569 /**
570  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
571  *                                                        object deletion
572  * @vdev: VDEV object
573  * @id: Component id
574  *
575  * API to destroy component private object in run time, this would
576  * be used for features which gets disabled in run time
577  *
578  * Return: SUCCESS on successful deletion
579  *         On FAILURE (appropriate failure codes are returned)
580  */
581 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
582 		struct wlan_objmgr_vdev *vdev,
583 		enum wlan_umac_comp_id id);
584 
585 /**
586  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
587  * @vdev: VDEV object
588  * @id: Component id
589  *
590  * API to get component private object
591  *
592  * Return: void *ptr on SUCCESS
593  *         NULL on Failure
594  */
595 void *wlan_objmgr_vdev_get_comp_private_obj(
596 		struct wlan_objmgr_vdev *vdev,
597 		enum wlan_umac_comp_id id);
598 
599 /* Util APIs */
600 
601 /**
602  * wlan_vdev_get_pdev() - get pdev
603  * @vdev: VDEV object
604  *
605  * API to get pdev object pointer from vdev
606  *
607  * Return: pdev object pointer
608  */
609 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
610 				struct wlan_objmgr_vdev *vdev)
611 {
612 	return vdev->vdev_objmgr.wlan_pdev;
613 }
614 
615 /**
616  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
617  * @vdev_list: qdf_list_t
618  *
619  * API to get the head vdev of given vdev (of pdev's vdev list)
620  *
621  * Caller need to acquire lock with wlan_vdev_obj_lock()
622  *
623  * Return: head peer
624  */
625 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
626 					qdf_list_t *vdev_list)
627 {
628 	struct wlan_objmgr_vdev *vdev;
629 	qdf_list_node_t *vdev_node = NULL;
630 
631 	/* This API is invoked with lock acquired, do not add log prints */
632 	if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS)
633 		return NULL;
634 
635 	vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node);
636 	return vdev;
637 }
638 
639 
640 /**
641  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
642  * @vdev_list: qdf_list_t
643  * @vdev: VDEV object
644  *
645  * API to get next vdev object pointer of vdev
646  *
647  * Caller need to acquire lock with wlan_vdev_obj_lock()
648  *
649  * Return: VDEV object
650  */
651 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
652 					qdf_list_t *vdev_list,
653 					struct wlan_objmgr_vdev *vdev)
654 {
655 	struct wlan_objmgr_vdev *vdev_next;
656 	qdf_list_node_t *node = &vdev->vdev_node;
657 	qdf_list_node_t *next_node = NULL;
658 
659 	/* This API is invoked with lock acquired, do not add log prints */
660 	if (!node)
661 		return NULL;
662 
663 	if (qdf_list_peek_next(vdev_list, node, &next_node) !=
664 						QDF_STATUS_SUCCESS)
665 		return NULL;
666 
667 	vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev,
668 				vdev_node);
669 	return vdev_next;
670 }
671 
672 
673 
674 /**
675  * wlan_vdev_set_pdev() - set pdev
676  * @vdev: VDEV object
677  * @pdev: PDEV object
678  *
679  * API to get pdev object pointer from vdev
680  *
681  * Caller need to acquire lock with wlan_vdev_obj_lock()
682  *
683  * Return: void
684  */
685 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev,
686 					struct wlan_objmgr_pdev *pdev)
687 {
688 	/* This API is invoked with lock acquired, do not add log prints */
689 	vdev->vdev_objmgr.wlan_pdev = pdev;
690 }
691 
692 /**
693  * wlan_vdev_get_psoc() - get psoc
694  * @vdev: VDEV object
695  *
696  * API to get pdev object pointer from vdev
697  *
698  * Return: psoc object pointer
699  */
700 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc(
701 				struct wlan_objmgr_vdev *vdev)
702 {
703 	struct wlan_objmgr_pdev *pdev;
704 	struct wlan_objmgr_psoc *psoc = NULL;
705 
706 	pdev = wlan_vdev_get_pdev(vdev);
707 	if (!pdev)
708 		return NULL;
709 
710 	psoc = wlan_pdev_get_psoc(pdev);
711 
712 	return psoc;
713 }
714 
715 /**
716  * wlan_vdev_get_psoc_id() - get psoc id
717  * @vdev: VDEV object
718  *
719  * API to get VDEV's psoc id
720  *
721  * Return: psoc id
722  */
723 static inline uint8_t wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev *vdev)
724 {
725 	struct wlan_objmgr_psoc *psoc;
726 
727 	psoc = wlan_vdev_get_psoc(vdev);
728 
729 	return wlan_psoc_get_id(psoc);
730 }
731 
732 /**
733  * wlan_vdev_mlme_set_opmode() - set vdev opmode
734  * @vdev: VDEV object
735  * @mode: VDEV op mode
736  *
737  * API to set opmode in vdev object
738  *
739  * Return: void
740  */
741 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev,
742 				enum QDF_OPMODE mode)
743 {
744 	vdev->vdev_mlme.vdev_opmode = mode;
745 }
746 
747 /**
748  * wlan_vdev_mlme_get_opmode() - get vdev opmode
749  * @vdev: VDEV object
750  *
751  * API to set opmode of vdev object
752  *
753  * Return: VDEV op mode
754  */
755 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
756 					struct wlan_objmgr_vdev *vdev)
757 {
758 	return vdev->vdev_mlme.vdev_opmode;
759 }
760 
761 /**
762  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
763  * @vdev: VDEV object
764  * @macaddr: MAC address
765  *
766  * API to set macaddr in vdev object
767  *
768  * Caller need to acquire lock with wlan_vdev_obj_lock()
769  *
770  * Return: void
771  */
772 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
773 					 uint8_t *macaddr)
774 {
775 	/* This API is invoked with lock acquired, do not add log prints */
776 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
777 }
778 
779 /**
780  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
781  * @vdev: VDEV object
782  *
783  * API to get MAC address from vdev object
784  *
785  * Caller need to acquire lock with wlan_vdev_obj_lock()
786  *
787  * Return: MAC address
788  */
789 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
790 {
791 	/* This API is invoked with lock acquired, do not add log prints */
792 	return vdev->vdev_mlme.macaddr;
793 }
794 
795 /**
796  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
797  * @vdev: VDEV object
798  * @mataddr: MAT address
799  *
800  * API to set mataddr in vdev object
801  *
802  * Caller need to acquire lock with wlan_vdev_obj_lock()
803  *
804  * Return: void
805  */
806 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
807 					uint8_t *mataddr)
808 {
809 	/* This API is invoked with lock acquired, do not add log prints */
810 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
811 }
812 
813 /**
814  * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr
815  * @vdev: VDEV object
816  *
817  * API to get MLD address from vdev object
818  *
819  * Caller need to acquire lock with wlan_vdev_obj_lock()
820  *
821  * Return: MAC address
822  */
823 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev)
824 {
825 	/* This API is invoked with lock acquired, do not add log prints */
826 	return vdev->vdev_mlme.mldaddr;
827 }
828 
829 /**
830  * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr
831  * @vdev: VDEV object
832  * @mldaddr: MLD address
833  *
834  * API to set MLD addr in vdev object
835  *
836  * Caller need to acquire lock with wlan_vdev_obj_lock()
837  *
838  * Return: void
839  */
840 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
841 					uint8_t *mldaddr)
842 {
843 	/* This API is invoked with lock acquired, do not add log prints */
844 	WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
845 }
846 
847 /**
848  * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
849  * @vdev: VDEV object
850  *
851  * API to get link MAC address from vdev object
852  *
853  * Caller need to acquire lock with wlan_vdev_obj_lock()
854  *
855  * Return: Link MAC address
856  */
857 static inline
858 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev)
859 {
860 	/* This API is invoked with lock acquired, do not add log prints */
861 	return vdev->vdev_mlme.linkaddr;
862 }
863 
864 /**
865  * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr
866  * @vdev: VDEV object
867  * @linkaddr: Link address
868  *
869  * API to set link addr in vdev object
870  *
871  * Caller need to acquire lock with wlan_vdev_obj_lock()
872  *
873  * Return: void
874  */
875 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev,
876 					       uint8_t *linkaddr)
877 {
878 	/* This API is invoked with lock acquired, do not add log prints */
879 	qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr,
880 			 (struct qdf_mac_addr *)linkaddr);
881 }
882 
883 /**
884  * wlan_vdev_mlme_get_mataddr() - get mataddr
885  * @vdev: VDEV object
886  *
887  * API to get MAT address from vdev object
888  *
889  * Caller need to acquire lock with wlan_vdev_obj_lock()
890  *
891  * Return: MAT address
892  */
893 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
894 {
895 	/* This API is invoked with lock acquired, do not add log prints */
896 	return vdev->vdev_mlme.mataddr;
897 }
898 
899 /**
900  * wlan_vdev_get_id() - get vdev id
901  * @vdev: VDEV object
902  *
903  * API to get vdev id
904  *
905  * Return: vdev id
906  */
907 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
908 {
909 	return vdev->vdev_objmgr.vdev_id;
910 }
911 
912 #ifdef WLAN_FEATURE_11BE_MLO
913 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
914 {
915 	return vdev->vdev_mlme.mlo_link_id;
916 }
917 
918 /**
919  * wlan_vdev_set_link_id() - set vdev mlo link id
920  * @vdev: VDEV object
921  * @link_id: link id
922  *
923  * API to set vdev mlo link id
924  *
925  * Return: void
926  */
927 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev,
928 					 uint8_t link_id)
929 {
930 	vdev->vdev_mlme.mlo_link_id = link_id;
931 }
932 
933 #ifdef WLAN_MLO_USE_SPINLOCK
934 /**
935  * wlan_create_vdev_mlo_lock() - API to create spin lock
936  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
937  * vdev MLME ext2 feature caps
938  * @vdev: VDEV object
939  *
940  * Return: void
941  */
942 static inline
943 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
944 {
945 	qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
946 }
947 
948 /**
949  * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock
950  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
951  * vdev MLME ext2 feature caps
952  * @vdev: VDEV object
953  *
954  * Return: void
955  */
956 static inline
957 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
958 {
959 	qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
960 }
961 
962 /**
963  * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock
964  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
965  * vdev MLME ext2 feature caps
966  * @vdev: VDEV object
967  *
968  * Return: void
969  */
970 static inline
971 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
972 {
973 	qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
974 }
975 
976 /**
977  * wlan_release_vdev_mlo_lock() - API to release spin lock
978  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
979  * vdev MLME ext2 feature caps
980  * @vdev: VDEV object
981  *
982  * Return: void
983  */
984 static inline
985 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
986 {
987 	qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
988 }
989 #else
990 /**
991  * wlan_create_vdev_mlo_lock() - API to create mutex which protects the
992  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
993  * @vdev: VDEV object
994  *
995  * Return: void
996  */
997 static inline
998 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
999 {
1000 	qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1001 }
1002 
1003 /**
1004  * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the
1005  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1006  * @vdev: VDEV object
1007  *
1008  * Return: void
1009  */
1010 static inline
1011 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1012 {
1013 	qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1014 }
1015 
1016 /**
1017  * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the
1018  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1019  * @vdev: VDEV object
1020  *
1021  * Return: void
1022  */
1023 static inline
1024 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1025 {
1026 	qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1027 }
1028 
1029 /**
1030  * wlan_release_vdev_mlo_lock() - API to release mutex which protects the
1031  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1032  * @vdev: VDEV object
1033  *
1034  * Return: void
1035  */
1036 static inline
1037 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1038 {
1039 	qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1040 }
1041 #endif /* WLAN_MLO_USE_SPINLOCK */
1042 #else
1043 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
1044 {
1045 	return WLAN_INVALID_LINK_ID;
1046 }
1047 
1048 static inline
1049 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1050 {
1051 }
1052 
1053 static inline
1054 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1055 {
1056 }
1057 #endif
1058 
1059 /**
1060  * wlan_vdev_get_hw_macaddr() - get hw macaddr
1061  * @vdev: VDEV object
1062  *
1063  * API to retrieve the HW MAC address from PDEV
1064  *
1065  * Caller need to acquire lock with wlan_vdev_obj_lock()
1066  *
1067  * Return: HW MAC address
1068  */
1069 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
1070 {
1071 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
1072 
1073 	/* This API is invoked with lock acquired, do not add log prints */
1074 	if (pdev)
1075 		return wlan_pdev_get_hw_macaddr(pdev);
1076 	else
1077 		return NULL;
1078 }
1079 
1080 /**
1081  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
1082  * @vdev: VDEV object
1083  *
1084  * API to acquire VDEV lock
1085  * Parent lock should not be taken in child lock context
1086  * but child lock can be taken in parent lock context
1087  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
1088  *
1089  * Return: void
1090  */
1091 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
1092 {
1093 	qdf_spin_lock_bh(&vdev->vdev_lock);
1094 }
1095 
1096 /**
1097  * wlan_vdev_obj_unlock() - Release VDEV spinlock
1098  * @vdev: VDEV object
1099  *
1100  * API to Release VDEV lock
1101  *
1102  * Return: void
1103  */
1104 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
1105 {
1106 	qdf_spin_unlock_bh(&vdev->vdev_lock);
1107 }
1108 
1109 /**
1110  * wlan_vdev_mlme_set_bss_chan() - set bss chan
1111  * @vdev: VDEV object
1112  * @bss_chan: Channel
1113  *
1114  * API to set the BSS channel
1115  *
1116  * Return: void
1117  */
1118 static inline void wlan_vdev_mlme_set_bss_chan(
1119 				struct wlan_objmgr_vdev *vdev,
1120 				struct wlan_channel *bss_chan)
1121 {
1122 	vdev->vdev_mlme.bss_chan = bss_chan;
1123 }
1124 
1125 /**
1126  * wlan_vdev_mlme_get_bss_chan() - get bss chan
1127  * @vdev: VDEV object
1128  *
1129  * API to get the BSS channel
1130  *
1131  * Return: Channel
1132  */
1133 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
1134 				struct wlan_objmgr_vdev *vdev)
1135 {
1136 	return vdev->vdev_mlme.bss_chan;
1137 }
1138 
1139 /**
1140  * wlan_vdev_mlme_set_des_chan() - set desired chan
1141  * @vdev: VDEV object
1142  * @des_chan: Channel configured by user
1143  *
1144  * API to set the desired channel
1145  *
1146  * Return: void
1147  */
1148 static inline void wlan_vdev_mlme_set_des_chan(
1149 				struct wlan_objmgr_vdev *vdev,
1150 				struct wlan_channel *des_chan)
1151 {
1152 	vdev->vdev_mlme.des_chan = des_chan;
1153 }
1154 
1155 /**
1156  * wlan_vdev_mlme_get_des_chan() - get desired chan
1157  * @vdev: VDEV object
1158  *
1159  * API to get the desired channel
1160  *
1161  * Return: 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: peer pointer
1458  */
1459 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1460 					struct wlan_objmgr_vdev *vdev)
1461 {
1462 	return vdev->vdev_objmgr.self_peer;
1463 }
1464 
1465 /**
1466  * wlan_vdev_set_bsspeer() - set bss peer
1467  * @vdev: VDEV object
1468  * @peer: BSS peer pointer
1469  *
1470  * API to set the BSS peer of VDEV
1471  *
1472  * Return: void
1473  */
1474 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1475 						 struct wlan_objmgr_peer *peer)
1476 {
1477 	vdev->vdev_objmgr.bss_peer = peer;
1478 }
1479 
1480 /**
1481  * wlan_vdev_get_bsspeer() - get bss peer
1482  * @vdev: VDEV object
1483  *
1484  * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API
1485  * preferred to use outside obj manager to take and handle ref count of
1486  * bss_peer with ref debug ID.
1487  *
1488  * Return: BSS peer pointer
1489  */
1490 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1491 					struct wlan_objmgr_vdev *vdev)
1492 {
1493 	return vdev->vdev_objmgr.bss_peer;
1494 }
1495 
1496 /**
1497  * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
1498  * @vdev: VDEV object
1499  * @peer_mac: mac address of the peer to be found
1500  * @dbg_id: dbg_id of the module
1501  *
1502  * API to get and increment ref count of BSS peer of VDEV
1503  *
1504  * Return: peer pointer to the peer of the mac address
1505  */
1506 struct wlan_objmgr_peer *
1507 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
1508 				  uint8_t *peer_mac,
1509 				  wlan_objmgr_ref_dbgid dbg_id);
1510 
1511 /**
1512  * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
1513  * of VDEV
1514  * @vdev: VDEV object
1515  * @id:   Object Manager ref debug id
1516  *
1517  * API to get and increment ref count of BSS peer of VDEV
1518  *
1519  * Return: BSS peer pointer if bss peer is present and valid else NULL
1520  */
1521 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer(
1522 					struct wlan_objmgr_vdev *vdev,
1523 					wlan_objmgr_ref_dbgid id);
1524 /**
1525  * wlan_vdev_get_ospriv() - get os priv pointer
1526  * @vdev: VDEV object
1527  *
1528  * API to get OS private pointer from VDEV
1529  *
1530  * Return: ospriv - private pointer
1531  */
1532 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1533 	struct wlan_objmgr_vdev *vdev)
1534 {
1535 	return vdev->vdev_nif.osdev;
1536 }
1537 
1538 /**
1539  * wlan_vdev_reset_ospriv() - reset os priv pointer
1540  * @vdev: VDEV object
1541  *
1542  * API to reset OS private pointer in VDEV
1543  *
1544  * Return: void
1545  */
1546 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1547 {
1548 	vdev->vdev_nif.osdev = NULL;
1549 }
1550 
1551 /**
1552  * wlan_vdev_get_peer_count() - get vdev peer count
1553  * @vdev: VDEV object
1554  *
1555  * API to get peer count from VDEV
1556  *
1557  * Return: peer_count - vdev's peer count
1558  */
1559 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1560 {
1561 	return vdev->vdev_objmgr.wlan_peer_count;
1562 }
1563 
1564 /**
1565  * wlan_vdev_mlme_is_ap() - Check whether @vdev is an AP or not
1566  * @vdev: VDEV object
1567  *
1568  * Return: True if @vdev is ap, otherwise false.
1569  */
1570 static inline bool wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev *vdev)
1571 {
1572 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE);
1573 }
1574 
1575 #ifdef WLAN_FEATURE_11BE_MLO
1576 /**
1577  * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO
1578  * vdev or not
1579  * @vdev: VDEV object
1580  *
1581  * Return: True if it is MLO, otherwise false.
1582  */
1583 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1584 
1585 /**
1586  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
1587  * @vdev: VDEV object
1588  *
1589  * Return: True if it is mlo ap, otherwise false.
1590  */
1591 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1592 {
1593 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
1594 		wlan_vdev_mlme_is_mlo_vdev(vdev);
1595 }
1596 
1597 /**
1598  * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev
1599  * @vdev: VDEV object
1600  *
1601  * Return: void
1602  */
1603 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1604 
1605 /**
1606  * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev
1607  * @vdev: VDEV object
1608  *
1609  * Return: void
1610  */
1611 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1612 
1613 /**
1614  * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev
1615  * @vdev: VDEV object
1616  *
1617  * Return: void
1618  */
1619 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1620 
1621 /**
1622  * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an
1623  * MLO link vdev
1624  * @vdev: VDEV object
1625  *
1626  * Return: void
1627  */
1628 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1629 #ifdef WLAN_MCAST_MLO
1630 /**
1631  * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not
1632  * @vdev: VDEV object
1633  *
1634  * Return: True if it is mlo mcast vdev, otherwise false.
1635  */
1636 static inline
1637 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1638 {
1639 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1640 						WLAN_VDEV_FEXT2_MLO_MCAST);
1641 }
1642 #else
1643 static inline
1644 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1645 {
1646 	return false;
1647 }
1648 #endif
1649 
1650 /**
1651  * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not
1652  * @vdev: VDEV object
1653  *
1654  * Return: True if it is mlo sta link, otherwise false.
1655  */
1656 static inline
1657 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1658 {
1659 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1660 						WLAN_VDEV_FEXT2_MLO_STA_LINK);
1661 }
1662 
1663 /**
1664  * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not
1665  * @vdev: VDEV object
1666  *
1667  * Return: True if it is mlo sta assoc vdev, otherwise false.
1668  */
1669 static inline
1670 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1671 {
1672 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1673 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1674 		return false;
1675 
1676 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1677 		return true;
1678 
1679 	return false;
1680 }
1681 
1682 /**
1683  * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not
1684  * @vdev: VDEV object
1685  *
1686  * Return: True if it is mlo sta link vdev, otherwise false.
1687  */
1688 static inline
1689 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1690 {
1691 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1692 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1693 		return false;
1694 
1695 	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1696 		return true;
1697 
1698 	return false;
1699 }
1700 #else
1701 static inline
1702 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1703 {
1704 	return false;
1705 }
1706 
1707 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1708 {
1709 	return false;
1710 }
1711 
1712 static inline
1713 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1714 {
1715 }
1716 
1717 static inline
1718 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1719 {
1720 }
1721 
1722 static inline
1723 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1724 {
1725 }
1726 
1727 static inline
1728 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1729 {
1730 }
1731 
1732 static inline
1733 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1734 {
1735 	return false;
1736 }
1737 
1738 static inline
1739 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1740 {
1741 	return false;
1742 }
1743 
1744 static inline
1745 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1746 {
1747 	return false;
1748 }
1749 #endif
1750 
1751 /**
1752  * DOC: Examples to use VDEV ref count APIs
1753  *
1754  * In all the scenarios, the pair of API should be followed
1755  * other it lead to memory leak
1756  *
1757  *  scenario 1:
1758  *
1759  *     wlan_objmgr_vdev_obj_create()
1760  *     ----
1761  *     wlan_objmgr_vdev_obj_delete()
1762  *
1763  *  scenario 2:
1764  *
1765  *     wlan_objmgr_vdev_get_ref()
1766  *     ----
1767  *     the operations which are done on
1768  *     vdev object
1769  *     ----
1770  *     wlan_objmgr_vdev_release_ref()
1771  *
1772  *  scenario 3:
1773  *
1774  *     API to retrieve vdev (xxx_get_vdev_xxx())
1775  *     ----
1776  *     the operations which are done on
1777  *     vdev object
1778  *     ----
1779  *     wlan_objmgr_vdev_release_ref()
1780  */
1781 
1782 /**
1783  * wlan_objmgr_vdev_get_ref() - increment ref count
1784  * @vdev: VDEV object
1785  * @id:   Object Manager ref debug id
1786  *
1787  * API to increment ref count of vdev
1788  *
1789  * Return: void
1790  */
1791 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1792 #define wlan_objmgr_vdev_get_ref(vdev, id) \
1793 		wlan_objmgr_vdev_get_ref_debug(vdev, id, __func__, __LINE__)
1794 
1795 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1796 				    wlan_objmgr_ref_dbgid id,
1797 				    const char *func, int line);
1798 #else
1799 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
1800 				wlan_objmgr_ref_dbgid id);
1801 #endif
1802 
1803 /**
1804  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
1805  * @vdev: VDEV object
1806  * @id:   Object Manager ref debug id
1807  *
1808  * API to increment ref count of vdev after checking valid object state
1809  *
1810  * Return: void
1811  */
1812 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1813 #define wlan_objmgr_vdev_try_get_ref(vdev, id) \
1814 		wlan_objmgr_vdev_try_get_ref_debug(vdev, id, \
1815 		__func__, __LINE__)
1816 
1817 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1818 					      wlan_objmgr_ref_dbgid id,
1819 					      const char *func, int line);
1820 #else
1821 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
1822 						wlan_objmgr_ref_dbgid id);
1823 #endif
1824 
1825 /**
1826  * wlan_objmgr_vdev_release_ref() - decrement ref count
1827  * @vdev: VDEV object
1828  * @id:   Object Manager ref debug id
1829  *
1830  * API to decrement ref count of vdev, if ref count is 1, it initiates the
1831  * VDEV deletion
1832  *
1833  * Return: void
1834  */
1835 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1836 #define wlan_objmgr_vdev_release_ref(vdev, id)\
1837 		wlan_objmgr_vdev_release_ref_debug(vdev, id, \
1838 		__func__, __LINE__)
1839 
1840 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
1841 					wlan_objmgr_ref_dbgid id,
1842 					const char *func, int line);
1843 #else
1844 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
1845 						wlan_objmgr_ref_dbgid id);
1846 #endif
1847 
1848 /**
1849  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
1850  * @pdev: PDEV object
1851  * @vdev_list: qdf_list_t
1852  * @vdev: VDEV object
1853  * @dbg_id: id of the caller
1854  *
1855  * API to get next active vdev object pointer of vdev
1856  *
1857  * Return: VDEV object
1858  */
1859 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1860 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbg_id) \
1861 		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
1862 		vdev, dbg_id, __func__, __LINE__)
1863 
1864 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
1865 					struct wlan_objmgr_pdev *pdev,
1866 					qdf_list_t *vdev_list,
1867 					struct wlan_objmgr_vdev *vdev,
1868 					wlan_objmgr_ref_dbgid dbg_id,
1869 					const char *func, int line);
1870 #else
1871 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
1872 					struct wlan_objmgr_pdev *pdev,
1873 					qdf_list_t *vdev_list,
1874 					struct wlan_objmgr_vdev *vdev,
1875 					wlan_objmgr_ref_dbgid dbg_id);
1876 #endif
1877 
1878 /**
1879  * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
1880  * @pdev: PDEV object
1881  * @dbg_id: id of the caller
1882  *
1883  * API to get the head active vdev of given pdev (of pdev's vdev list)
1884  *
1885  * Return:
1886  */
1887 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1888 #define wlan_pdev_peek_active_first_vdev(pdev, dbg_id) \
1889 		wlan_pdev_peek_active_first_vdev_debug(pdev, dbg_id, \
1890 		__func__, __LINE__)
1891 
1892 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
1893 		struct wlan_objmgr_pdev *pdev,
1894 		wlan_objmgr_ref_dbgid dbg_id,
1895 		const char *func, int line);
1896 #else
1897 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
1898 		struct wlan_objmgr_pdev *pdev,
1899 		wlan_objmgr_ref_dbgid dbg_id);
1900 #endif
1901 
1902 /**
1903  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
1904  * @pdev: PDEV object
1905  * @vdev_list: qdf_list_t
1906  * @dbg_id: id of the caller
1907  *
1908  * API to get the head active vdev of given vdev (of pdev's vdev list)
1909  *
1910  * Return: head peer
1911  */
1912 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1913 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbg_id) \
1914 		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
1915 		dbg_id, __func__, __LINE__)
1916 
1917 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
1918 				struct wlan_objmgr_pdev *pdev,
1919 				qdf_list_t *vdev_list,
1920 				wlan_objmgr_ref_dbgid dbg_id,
1921 				const char *func, int line);
1922 #else
1923 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
1924 				struct wlan_objmgr_pdev *pdev,
1925 				qdf_list_t *vdev_list,
1926 				wlan_objmgr_ref_dbgid dbg_id);
1927 #endif
1928 
1929 /**
1930  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed
1931  * @vdev: VDEV object
1932  *
1933  * API to invokes registered callbacks to notify about peer freed
1934  *
1935  * Return: void
1936  */
1937 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev);
1938 
1939 /**
1940  * wlan_vdev_set_max_peer_count() - set max peer count
1941  * @vdev: VDEV object
1942  * @count: Max peer count
1943  *
1944  * API to set max peer count of VDEV
1945  *
1946  * Return: void
1947  */
1948 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
1949 						uint16_t count)
1950 {
1951 	vdev->vdev_objmgr.max_peer_count = count;
1952 }
1953 
1954 /**
1955  * wlan_vdev_get_max_peer_count() - get max peer count
1956  * @vdev: VDEV object
1957  *
1958  * API to get max peer count of VDEV
1959  *
1960  * Return: max peer count
1961  */
1962 static inline uint16_t wlan_vdev_get_max_peer_count(
1963 						struct wlan_objmgr_vdev *vdev)
1964 {
1965 	return vdev->vdev_objmgr.max_peer_count;
1966 }
1967 
1968 /**
1969  * wlan_print_vdev_info() - print vdev members
1970  * @vdev: vdev object pointer
1971  *
1972  * Return: void
1973  */
1974 #ifdef WLAN_OBJMGR_DEBUG
1975 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
1976 #else
1977 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
1978 #endif
1979 
1980 /**
1981  * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
1982  * @vdev: vdev object pointer
1983  *
1984  * Return: void
1985  */
1986 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1987 static inline void
1988 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1989 {
1990 	wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
1991 }
1992 #else
1993 static inline void
1994 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
1995 {
1996 }
1997 #endif
1998 
1999 /**
2000  * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
2001  * @vdev: vdev object pointer
2002  *
2003  * Return: void
2004  */
2005 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2006 static inline void
2007 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2008 {
2009 	wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
2010 }
2011 #else
2012 static inline void
2013 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2014 {
2015 }
2016 #endif
2017 
2018 /**
2019  * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
2020  * @vdev: vdev object pointer
2021  *
2022  * Return: void
2023  */
2024 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2025 static inline void
2026 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2027 {
2028 	wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
2029 }
2030 #else
2031 static inline void
2032 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2033 {
2034 }
2035 #endif
2036 
2037 /**
2038  * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
2039  * @vdev: pointer to vdev
2040  * @bss_peer_mac: pointer to bss_peer_mac_address
2041  *
2042  * This API is used to get mac address of peer.
2043  *
2044  * Context: Any context.
2045  *
2046  * Return: QDF_STATUS based on overall success
2047  */
2048 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev,
2049 				      struct qdf_mac_addr *bss_peer_mac);
2050 
2051 #ifdef WLAN_FEATURE_11BE_MLO
2052 /**
2053  * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address
2054  * @vdev: pointer to vdev
2055  * @mld_mac: pointer to mld mac address
2056  *
2057  * This API is used to get mld mac address of peer.
2058  *
2059  * Context: Any context.
2060  *
2061  * Return: QDF_STATUS based on overall success
2062  */
2063 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
2064 					  struct qdf_mac_addr *mld_mac);
2065 #endif
2066 
2067 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
2068