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