xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h (revision 70a19e16789e308182f63b15c75decec7bf0b342)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: Define the vdev data structure of UMAC
22  */
23 
24 #ifndef _WLAN_OBJMGR_VDEV_OBJ_H_
25 #define _WLAN_OBJMGR_VDEV_OBJ_H_
26 
27 #include "qdf_atomic.h"
28 #include "qdf_list.h"
29 #include "qdf_lock.h"
30 #include "qdf_types.h"
31 #include "wlan_cmn.h"
32 #include "wlan_objmgr_cmn.h"
33 #include "wlan_objmgr_pdev_obj.h"
34 #include "wlan_objmgr_psoc_obj.h"
35 #include "wlan_vdev_mlme_main.h"
36 #include "include/wlan_vdev_mlme.h"
37 #include "wlan_vdev_mlme_api.h"
38 #include "wlan_mlme_dbg.h"
39 #ifdef WLAN_FEATURE_11BE_MLO
40 #include "wlan_mlo_mgr_public_structs.h"
41 #endif
42 
43 	/* CONF: privacy enabled */
44 #define WLAN_VDEV_F_PRIVACY              0x00000001
45 	/* CONF: 11g w/o 11b sta's */
46 #define WLAN_VDEV_F_PUREG                0x00000002
47 	/* CONF: des_bssid is set */
48 #define WLAN_VDEV_F_DESBSSID             0x00000004
49 	/* CONF: bg scan enabled */
50 #define WLAN_VDEV_F_BGSCAN               0x00000008
51 	/* CONF: sw tx retry enabled */
52 #define WLAN_VDEV_F_SWRETRY              0x00000010
53 	/* STATUS: update beacon tim */
54 #define WLAN_VDEV_F_TIMUPDATE            0x00000020
55 	/* CONF: WPA enabled */
56 #define WLAN_VDEV_F_WPA1                 0x00000040
57 	/* CONF: WPA2 enabled */
58 #define WLAN_VDEV_F_WPA2                 0x00000080
59 	/* CONF: WPA/WPA2 enabled */
60 #define WLAN_VDEV_F_WPA                  0x000000c0
61 	/* CONF: drop unencrypted */
62 #define WLAN_VDEV_F_DROPUNENC            0x00000100
63 	/* CONF: TKIP countermeasures */
64 #define WLAN_VDEV_F_COUNTERM             0x00000200
65 	/* CONF: hide SSID in beacon */  /*TODO PDEV/PSOC */
66 #define WLAN_VDEV_F_HIDESSID             0x00000400
67 	/* CONF: disable internal bridge */ /*TODO PDEV/PSOC */
68 #define WLAN_VDEV_F_NOBRIDGE             0x00000800
69 	/* STATUS: update beacon wme */
70 #define WLAN_VDEV_F_WMEUPDATE            0x00001000
71 	/* CONF: enable U-APSD */
72 #define WLAN_VDEV_F_UAPSD                0x00004000
73 	/* STATUS: sleeping */
74 #define WLAN_VDEV_F_SLEEP                0x00008000
75 	/* drop uapsd EOSP frames for test */
76 #define WLAN_VDEV_F_EOSPDROP             0x00010000
77 	/* CONF: A-MPDU supported */
78 #define WLAN_VDEV_F_AMPDU                0x00020000
79 	/* STATE: beacon APP IE updated */
80 #define WLAN_VDEV_F_APPIE_UPDATE         0x00040000
81 	/* CONF: WDS auto Detect/DELBA */
82 #define WLAN_VDEV_F_WDS_AUTODETECT       0x00080000
83 	/* 11b only without 11g stations */
84 #define WLAN_VDEV_F_PUREB                0x00100000
85 	/* disable HT rates */
86 #define WLAN_VDEV_F_HTRATES              0x00200000
87 	/* CONF: deliver rx frames with 802.11 header */
88 #define WLAN_VDEV_F_DELIVER_80211        0x00800000
89 	/* CONF: os sends down tx frames with 802.11 header */
90 #define WLAN_VDEV_F_SEND_80211           0x01000000
91 	/* CONF: statically configured WDS */
92 #define WLAN_VDEV_F_WDS_STATIC           0x02000000
93 	/* CONF: pure 11n mode */
94 #define WLAN_VDEV_F_PURE11N              0x04000000
95 	/* CONF: pure 11ac mode */
96 #define WLAN_VDEV_F_PURE11AC             0x08000000
97 	/* Basic Rates Update */
98 #define WLAN_VDEV_F_BR_UPDATE            0x10000000
99 	/* CONF: restrict bw ont top of per 11ac/n */
100 #define WLAN_VDEV_F_STRICT_BW            0x20000000
101 	/* Wi-Fi SON mode (with APS) */
102 #define WLAN_VDEV_F_SON                  0x40000000
103 	/* Wi-Fi SON mode (with APS) */
104 #define WLAN_VDEV_F_MBO                  0x80000000
105 
106 /* Feature extension flags */
107 		/* CONF: MSFT safe mode         */
108 #define WLAN_VDEV_FEXT_SAFEMODE             0x00000001
109 		/* if the vap can sleep*/
110 #define WLAN_VDEV_FEXT_CANSLEEP             0x00000002
111 		/* use sw bmiss timer */
112 #define WLAN_VDEV_FEXT_SWBMISS              0x00000004
113 		/* enable beacon copy */
114 #define WLAN_VDEV_FEXT_COPY_BEACON          0x00000008
115 #define WLAN_VDEV_FEXT_WAPI                 0x00000010
116 		/* 802.11h enabled */
117 #define WLAN_VDEV_FEXT_DOTH                 0x00000020
118 	/* if the vap has wds independence set */
119 #define WLAN_VDEV_FEXT_VAPIND               0x00000040
120 	/* QBSS load IE enabled */
121 #define WLAN_VDEV_FEXT_BSSLOAD              0x00000080
122 	/* Short Guard Interval Enable:1 Disable:0 */
123 #define WLAN_VDEV_FEXT_SGI                  0x00000100
124 	/* Short Guard Interval Enable:1 Disable:0 for VHT fixed rates */
125 #define WLAN_VDEV_FEXT_DATASGI              0x00000200
126 	/* LDPC Enable Rx:1 TX: 2 ; Disable:0 */
127 #define WLAN_VDEV_FEXT_LDPC_TX              0x00000400
128 #define WLAN_VDEV_FEXT_LDPC_RX              0x00000800
129 #define WLAN_VDEV_FEXT_LDPC                 0x00000c00
130 	/* wme enabled */
131 #define WLAN_VDEV_FEXT_WME                  0x00001000
132 	/* WNM Capabilities */
133 #define WLAN_VDEV_FEXT_WNM                  0x00002000
134 	/* RRM Capabilities */
135 #define WLAN_VDEV_FEXT_RRM                  0x00004000
136 	/* WNM Proxy ARP Capabilities */
137 #define WLAN_VDEV_FEXT_PROXYARP             0x00008000
138 	/* 256 QAM support in 2.4GHz mode Enable:1 Disable:0 */
139 #define WLAN_VDEV_FEXT_256QAM               0x00010000
140 	/* 2.4NG 256 QAM Interop mode Enable:1 Disable:0 */
141 #define WLAN_VDEV_FEXT_256QAM_INTEROP       0x00020000
142 	/* static mimo ps enabled */
143 #define WLAN_VDEV_FEXT_STATIC_MIMOPS        0x00040000
144 	/* dynamic mimo ps enabled */
145 #define WLAN_VDEV_FEXT_DYN_MIMOPS           0x00080000
146 	/* Country IE enabled */
147 #define WLAN_VDEV_FEXT_CNTRY_IE             0x00100000
148 	/*does not want to trigger multi channel operation
149 	instead follow master vaps channel (for AP/GO Vaps) */
150 #define WLAN_VDEV_FEXT_NO_MULCHAN           0x00200000
151 	/*non-beaconing AP VAP*/
152 #define WLAN_VDEV_FEXT_NON_BEACON           0x00400000
153 	/* SPL repeater enabled for SON*/
154 #define WLAN_VDEV_FEXT_SON_SPL_RPT          0x00800000
155 	/* SON IE update in MGMT frame */
156 #define WLAN_VDEV_FEXT_SON_INFO_UPDATE      0x01000000
157 	/* CONF: A-MSDU supported */
158 #define WLAN_VDEV_FEXT_AMSDU                0x02000000
159 	/* Fils discovery on 6G SAP*/
160 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP     0x80000000
161 
162 /* Feature more extension flags */
163 	/* VDEV is MLO*/
164 #define WLAN_VDEV_FEXT2_MLO                 0x00000001
165 	/* STA VDEV is link type */
166 #define WLAN_VDEV_FEXT2_MLO_STA_LINK        0x00000002
167 	/* VDEV is MLO mcast primary*/
168 #define WLAN_VDEV_FEXT2_MLO_MCAST           0x00000004
169 	/* 20TU BCAST PROBE RESP on 6G SAP*/
170 #define WLAN_VDEV_FEXT2_20TU_PRB_RESP       0x00000008
171 
172 /* VDEV OP flags  */
173   /* if the vap destroyed by user */
174 #define WLAN_VDEV_OP_DELETE_PROGRESS        0x00000001
175  /* set to enable sta-fws fweature */
176 #define WLAN_VDEV_OP_STAFWD                 0x00000002
177    /* Off-channel support enabled */
178 #define WLAN_VDEV_OP_OFFCHAN                0x00000004
179   /* if the vap has erp update set */
180 #define WLAN_VDEV_OP_ERPUPDATE              0x00000008
181   /* this vap needs scheduler for off channel operation */
182 #define WLAN_VDEV_OP_NEEDS_SCHED            0x00000010
183   /*STA in forced sleep set PS bit for all outgoing frames */
184 #define WLAN_VDEV_OP_FORCED_SLEEP           0x00000020
185   /* update bssload IE in beacon */
186 #define WLAN_VDEV_OP_BSSLOAD_UPDATE         0x00000040
187   /* Hotspot 2.0 DGAF Disable bit */
188 #define WLAN_VDEV_OP_DGAF_DISABLE           0x00000080
189   /* STA SmartNet enabled */
190 #define WLAN_VDEV_OP_SMARTNET_EN            0x00000100
191   /* SoftAP to reject resuming in DFS channels */
192 #define WLAN_VDEV_OP_REJ_DFS_CHAN           0x00000200
193   /* Trigger mlme response */
194 #define WLAN_VDEV_OP_TRIGGER_MLME_RESP      0x00000400
195   /* test flag for MFP */
196 #define WLAN_VDEV_OP_MFP_TEST               0x00000800
197   /* flag to indicate using default ratemask */
198 #define WLAN_VDEV_OP_DEF_RATEMASK           0x00001000
199 /*For wakeup AP VAP when wds-sta connect to the AP only use when
200 	export (UMAC_REPEATER_DELAYED_BRINGUP || DBDC_REPEATER_SUPPORT)=1*/
201 #define WLAN_VDEV_OP_KEYFLAG                0x00002000
202   /* if performed the iwlist scanning */
203 #define WLAN_VDEV_OP_LIST_SCANNING          0x00004000
204    /*Set when VAP down*/
205 #define WLAN_VDEV_OP_IS_DOWN                0x00008000
206   /* if vap may require acs when another vap is brought down */
207 #define WLAN_VDEV_OP_NEEDS_UP_ACS           0x00010000
208   /* Block data traffic tx for this vap */
209 #define WLAN_VDEV_OP_BLOCK_TX_TRAFFIC       0x00020000
210   /* for mbo functionality */
211 #define WLAN_VDEV_OP_MBO                    0x00040000
212 /* VDEV Critical update category-1
213  * Inclusion of Critical Update IES flag
214  * This includes: CSA, ECSA, Quiet
215  * Quiet channel, Max Ch Switch Time IEs.
216  */
217 #define WLAN_VDEV_OP_CU_CAT1                0x00080000
218 /* VDEV Critical update category-2
219  * Modification of Critical Update IES flag
220  * This includes: DSSS Param, HT Operation element
221  * VHT Operation element, HE Operation element
222  * EHT Operation element, MU EDCA Param, EDCA param
223  * UORA Param, BSS Color Change Announcement element
224  * Spatial Reuse Param Set element
225  * Operating Mode Notification element
226  * Wide Bandwidth Channel Switch element
227  * Broadcast TWT element
228  */
229 #define WLAN_VDEV_OP_CU_CAT2                0x00100000
230   /* 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_state:         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  *  @wlan_objmgr_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  ** APIs to operations on vdev objects
509 */
510 
511 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
512 					void *object,
513 					void *arg);
514 
515 /**
516  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
517  * @vdev: vdev object
518  * @handler: the handler will be called for each object of requested type
519  *            the handler should be implemented to perform required operation
520  * @arg:     arguments passed by caller
521  * @dbg_id: id of the caller
522  *
523  * API to be used for performing the operations on all PEER objects
524  * of vdev
525  *
526  * Return: SUCCESS/FAILURE
527  */
528 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
529 		struct wlan_objmgr_vdev *vdev,
530 		wlan_objmgr_vdev_op_handler handler,
531 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
532 
533 /**
534  * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
535  * @vdev: vdev object
536  * @dbg_id: id of the caller
537  *
538  * API to be used for populating the list of logically deleted peers from the
539  * vdev's peer list
540  *
541  * The caller of this function should free the memory allocated for the
542  * peerlist and the peer member in the list
543  * Also the peer ref release is handled by the caller
544  *
545  * Return: list of peer pointers
546  *         NULL on FAILURE
547  */
548 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
549 		struct wlan_objmgr_vdev *vdev,
550 		wlan_objmgr_ref_dbgid dbg_id);
551 
552 /**
553  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
554  * comp object creation
555  * @vdev: VDEV object
556  * @id: Component id
557  *
558  * API to create component private object in run time, this would
559  * be used for features which gets enabled in run time
560  *
561  * Return: SUCCESS on successful creation
562  *         On FAILURE (appropriate failure codes are returned)
563  */
564 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
565 		struct wlan_objmgr_vdev *vdev,
566 		enum wlan_umac_comp_id id);
567 
568 /**
569  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
570  *                                                        object deletion
571  * @vdev: VDEV object
572  * @id: Component id
573  *
574  * API to destroy component private object in run time, this would
575  * be used for features which gets disabled in run time
576  *
577  * Return: SUCCESS on successful deletion
578  *         On FAILURE (appropriate failure codes are returned)
579  */
580 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
581 		struct wlan_objmgr_vdev *vdev,
582 		enum wlan_umac_comp_id id);
583 
584 /**
585  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
586  * @vdev: VDEV object
587  * @id: Component id
588  *
589  * API to get component private object
590  *
591  * Return: void *ptr on SUCCESS
592  *         NULL on Failure
593  */
594 void *wlan_objmgr_vdev_get_comp_private_obj(
595 		struct wlan_objmgr_vdev *vdev,
596 		enum wlan_umac_comp_id id);
597 
598 /* Util APIs */
599 
600 /**
601  * wlan_vdev_get_pdev() - get pdev
602  * @vdev: VDEV object
603  *
604  * API to get pdev object pointer from vdev
605  *
606  * Return: pdev object pointer
607  */
608 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
609 				struct wlan_objmgr_vdev *vdev)
610 {
611 	return vdev->vdev_objmgr.wlan_pdev;
612 }
613 
614 /**
615  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
616  * @peer_list: qdf_list_t
617  *
618  * API to get the head vdev of given vdev (of pdev's vdev list)
619  *
620  * Caller need to acquire lock with wlan_vdev_obj_lock()
621  *
622  * Return:
623  * @peer: 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: VDEV object
643  *
644  * API to get next vdev object pointer of vdev
645  *
646  * Caller need to acquire lock with wlan_vdev_obj_lock()
647  *
648  * Return:
649  * @vdev_next: 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: 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:
754  * @mode: VDEV op mode
755  */
756 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
757 					struct wlan_objmgr_vdev *vdev)
758 {
759 	return vdev->vdev_mlme.vdev_opmode;
760 }
761 
762 /**
763  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
764  * @vdev: VDEV object
765  * @macaddr: MAC address
766  *
767  * API to set macaddr in vdev object
768  *
769  * Caller need to acquire lock with wlan_vdev_obj_lock()
770  *
771  * Return: void
772  */
773 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
774 					 uint8_t *macaddr)
775 {
776 	/* This API is invoked with lock acquired, do not add log prints */
777 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
778 }
779 
780 /**
781  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
782  * @vdev: VDEV object
783  *
784  * API to get MAC address from vdev object
785  *
786  * Caller need to acquire lock with wlan_vdev_obj_lock()
787  *
788  * Return:
789  * @macaddr: MAC address
790  */
791 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
792 {
793 	/* This API is invoked with lock acquired, do not add log prints */
794 	return vdev->vdev_mlme.macaddr;
795 }
796 
797 /**
798  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
799  * @vdev: VDEV object
800  * @mataddr: MAT address
801  *
802  * API to set mataddr in vdev object
803  *
804  * Caller need to acquire lock with wlan_vdev_obj_lock()
805  *
806  * Return: void
807  */
808 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
809 					uint8_t *mataddr)
810 {
811 	/* This API is invoked with lock acquired, do not add log prints */
812 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
813 }
814 
815 /**
816  * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr
817  * @vdev: VDEV object
818  *
819  * API to get MLD address from vdev object
820  *
821  * Caller need to acquire lock with wlan_vdev_obj_lock()
822  *
823  * Return:
824  * @macaddr: MAC address
825  */
826 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev)
827 {
828 	/* This API is invoked with lock acquired, do not add log prints */
829 	return vdev->vdev_mlme.mldaddr;
830 }
831 
832 /**
833  * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr
834  * @vdev: VDEV object
835  * @mldaddr: MLD address
836  *
837  * API to set MLD addr in vdev object
838  *
839  * Caller need to acquire lock with wlan_vdev_obj_lock()
840  *
841  * Return: void
842  */
843 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
844 					uint8_t *mldaddr)
845 {
846 	/* This API is invoked with lock acquired, do not add log prints */
847 	WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
848 }
849 
850 /**
851  * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
852  * @vdev: VDEV object
853  *
854  * API to get link MAC address from vdev object
855  *
856  * Caller need to acquire lock with wlan_vdev_obj_lock()
857  *
858  * Return:
859  * @linkaddr: Link MAC address
860  */
861 static inline
862 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev)
863 {
864 	/* This API is invoked with lock acquired, do not add log prints */
865 	return vdev->vdev_mlme.linkaddr;
866 }
867 
868 /**
869  * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr
870  * @vdev: VDEV object
871  * @linkaddr: Link address
872  *
873  * API to set link addr in vdev object
874  *
875  * Caller need to acquire lock with wlan_vdev_obj_lock()
876  *
877  * Return: void
878  */
879 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev,
880 					       uint8_t *linkaddr)
881 {
882 	/* This API is invoked with lock acquired, do not add log prints */
883 	qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr,
884 			 (struct qdf_mac_addr *)linkaddr);
885 }
886 
887 /**
888  * wlan_vdev_mlme_get_mataddr() - get mataddr
889  * @vdev: VDEV object
890  *
891  * API to get MAT address from vdev object
892  *
893  * Caller need to acquire lock with wlan_vdev_obj_lock()
894  *
895  * Return:
896  * @mataddr: MAT address
897  */
898 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
899 {
900 	/* This API is invoked with lock acquired, do not add log prints */
901 	return vdev->vdev_mlme.mataddr;
902 }
903 
904 /**
905  * wlan_vdev_get_id() - get vdev id
906  * @vdev: VDEV object
907  *
908  * API to get vdev id
909  *
910  * Return:
911  * @id: vdev id
912  */
913 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
914 {
915 	return vdev->vdev_objmgr.vdev_id;
916 }
917 
918 #ifdef WLAN_FEATURE_11BE_MLO
919 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
920 {
921 	return vdev->vdev_mlme.mlo_link_id;
922 }
923 
924 /**
925  * wlan_vdev_set_link_id() - set vdev mlo link id
926  * @vdev: VDEV object
927  * @link_id: link id
928  *
929  * API to set vdev mlo link id
930  *
931  * Return: void
932  */
933 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev,
934 					 uint8_t link_id)
935 {
936 	vdev->vdev_mlme.mlo_link_id = link_id;
937 }
938 
939 #ifdef WLAN_MLO_USE_SPINLOCK
940 /**
941  * wlan_create_vdev_mlo_lock() - API to create spin lock
942  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
943  * vdev MLME ext2 feature caps
944  * @vdev: VDEV object
945  *
946  * Return: void
947  */
948 static inline
949 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
950 {
951 	qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
952 }
953 
954 /**
955  * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock
956  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
957  * vdev MLME ext2 feature caps
958  * @vdev: VDEV object
959  *
960  * Return: void
961  */
962 static inline
963 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
964 {
965 	qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
966 }
967 
968 /**
969  * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock
970  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
971  * vdev MLME ext2 feature caps
972  * @vdev: VDEV object
973  *
974  * Return: void
975  */
976 static inline
977 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
978 {
979 	qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
980 }
981 
982 /**
983  * wlan_release_vdev_mlo_lock() - API to release spin lock
984  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
985  * vdev MLME ext2 feature caps
986  * @vdev: VDEV object
987  *
988  * Return: void
989  */
990 static inline
991 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
992 {
993 	qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
994 }
995 #else
996 /**
997  * wlan_create_vdev_mlo_lock() - API to create mutex which protects the
998  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
999  * @vdev: VDEV object
1000  *
1001  * Return: void
1002  */
1003 static inline
1004 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1005 {
1006 	qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1007 }
1008 
1009 /**
1010  * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the
1011  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1012  * @vdev: VDEV object
1013  *
1014  * Return: void
1015  */
1016 static inline
1017 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1018 {
1019 	qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1020 }
1021 
1022 /**
1023  * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the
1024  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1025  * @vdev: VDEV object
1026  *
1027  * Return: void
1028  */
1029 static inline
1030 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1031 {
1032 	qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1033 }
1034 
1035 /**
1036  * wlan_release_vdev_mlo_lock() - API to release mutex which protects the
1037  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1038  * @vdev: VDEV object
1039  *
1040  * Return: void
1041  */
1042 static inline
1043 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1044 {
1045 	qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1046 }
1047 #endif /* WLAN_MLO_USE_SPINLOCK */
1048 #else
1049 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
1050 {
1051 	return WLAN_INVALID_LINK_ID;
1052 }
1053 
1054 static inline
1055 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1056 {
1057 }
1058 
1059 static inline
1060 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1061 {
1062 }
1063 #endif
1064 
1065 /**
1066  * wlan_vdev_get_hw_macaddr() - get hw macaddr
1067  * @vdev: VDEV object
1068  *
1069  * API to retrieve the HW MAC address from PDEV
1070  *
1071  * Caller need to acquire lock with wlan_vdev_obj_lock()
1072  *
1073  * Return:
1074  * @macaddr: HW MAC address
1075  */
1076 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
1077 {
1078 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
1079 
1080 	/* This API is invoked with lock acquired, do not add log prints */
1081 	if (pdev)
1082 		return wlan_pdev_get_hw_macaddr(pdev);
1083 	else
1084 		return NULL;
1085 }
1086 
1087 /**
1088  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
1089  * @vdev: VDEV object
1090  *
1091  * API to acquire VDEV lock
1092  * Parent lock should not be taken in child lock context
1093  * but child lock can be taken in parent lock context
1094  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
1095  *
1096  * Return: void
1097  */
1098 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
1099 {
1100 	qdf_spin_lock_bh(&vdev->vdev_lock);
1101 }
1102 
1103 /**
1104  * wlan_vdev_obj_unlock() - Release VDEV spinlock
1105  * @vdev: VDEV object
1106  *
1107  * API to Release VDEV lock
1108  *
1109  * Return: void
1110  */
1111 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
1112 {
1113 	qdf_spin_unlock_bh(&vdev->vdev_lock);
1114 }
1115 
1116 /**
1117  * wlan_vdev_mlme_set_bss_chan() - set bss chan
1118  * @vdev: VDEV object
1119  * @bss_chan: Channel
1120  *
1121  * API to set the BSS channel
1122  *
1123  * Return: void
1124  */
1125 static inline void wlan_vdev_mlme_set_bss_chan(
1126 				struct wlan_objmgr_vdev *vdev,
1127 				struct wlan_channel *bss_chan)
1128 {
1129 	vdev->vdev_mlme.bss_chan = bss_chan;
1130 }
1131 
1132 /**
1133  * wlan_vdev_mlme_get_bss_chan() - get bss chan
1134  * @vdev: VDEV object
1135  *
1136  * API to get the BSS channel
1137  *
1138  * Return:
1139  * @bss_chan: Channel
1140  */
1141 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
1142 				struct wlan_objmgr_vdev *vdev)
1143 {
1144 	return vdev->vdev_mlme.bss_chan;
1145 }
1146 
1147 /**
1148  * wlan_vdev_mlme_set_des_chan() - set desired chan
1149  * @vdev: VDEV object
1150  * @des_chan: Channel configured by user
1151  *
1152  * API to set the desired channel
1153  *
1154  * Return: void
1155  */
1156 static inline void wlan_vdev_mlme_set_des_chan(
1157 				struct wlan_objmgr_vdev *vdev,
1158 				struct wlan_channel *des_chan)
1159 {
1160 	vdev->vdev_mlme.des_chan = des_chan;
1161 }
1162 
1163 /**
1164  * wlan_vdev_mlme_get_des_chan() - get desired chan
1165  * @vdev: VDEV object
1166  *
1167  * API to get the desired channel
1168  *
1169  * Return:
1170  * @des_chan: Channel configured by user
1171  */
1172 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan(
1173 				struct wlan_objmgr_vdev *vdev)
1174 {
1175 	return vdev->vdev_mlme.des_chan;
1176 }
1177 
1178 /**
1179  * wlan_vdev_mlme_feat_cap_set() - set feature caps
1180  * @vdev: VDEV object
1181  * @cap: capabilities to be set
1182  *
1183  * API to set MLME feature capabilities
1184  *
1185  * Return: void
1186  */
1187 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev,
1188 				uint32_t cap)
1189 {
1190 	vdev->vdev_mlme.vdev_feat_caps |= cap;
1191 }
1192 
1193 /**
1194  * wlan_vdev_mlme_feat_cap_clear() - clear feature caps
1195  * @vdev: VDEV object
1196  * @cap: capabilities to be cleared
1197  *
1198  * API to clear MLME feature capabilities
1199  *
1200  * Return: void
1201  */
1202 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev,
1203 				uint32_t cap)
1204 {
1205 	vdev->vdev_mlme.vdev_feat_caps &= ~cap;
1206 }
1207 
1208 /**
1209  * wlan_vdev_mlme_feat_cap_get() - get feature caps
1210  * @vdev: VDEV object
1211  * @cap: capabilities to be checked
1212  *
1213  * API to know MLME feature capability is set or not
1214  *
1215  * Return: 1 -- if capabilities set
1216  *         0 -- if capabilities clear
1217  */
1218 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev,
1219 				uint32_t cap)
1220 {
1221 	return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0;
1222 }
1223 
1224 /**
1225  * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps
1226  * @vdev: VDEV object
1227  * @cap: capabilities to be set
1228  *
1229  * API to set the MLME extensive feature capabilities
1230  *
1231  * Return: void
1232  */
1233 static inline void wlan_vdev_mlme_feat_ext_cap_set(
1234 				struct wlan_objmgr_vdev *vdev,
1235 				uint32_t cap)
1236 {
1237 	vdev->vdev_mlme.vdev_feat_ext_caps |= cap;
1238 }
1239 
1240 /**
1241  * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps
1242  * @vdev: VDEV object
1243  * @cap: capabilities to be cleared
1244  *
1245  * API to clear the MLME extensive feature capabilities
1246  *
1247  * Return: void
1248  */
1249 static inline void wlan_vdev_mlme_feat_ext_cap_clear(
1250 				struct wlan_objmgr_vdev *vdev,
1251 				uint32_t cap)
1252 {
1253 	vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap;
1254 }
1255 
1256 /**
1257  * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps
1258  * @vdev: VDEV object
1259  * @cap: capabilities to be checked
1260  *
1261  * API to know MLME ext feature capability is set or not
1262  *
1263  * Return: 1 -- if capabilities set
1264  *         0 -- if capabilities clear
1265  */
1266 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get(
1267 				struct wlan_objmgr_vdev *vdev,
1268 				uint32_t cap)
1269 {
1270 	return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0;
1271 }
1272 
1273 /**
1274  * wlan_vdev_mlme_feat_ext2_cap_set() - set ext2 feature caps
1275  * @vdev: VDEV object
1276  * @cap: capabilities to be set
1277  *
1278  * API to set the MLME more extensive feature capabilities
1279  *
1280  * Return: void
1281  */
1282 static inline void wlan_vdev_mlme_feat_ext2_cap_set(
1283 				struct wlan_objmgr_vdev *vdev,
1284 				uint32_t cap)
1285 {
1286 	vdev->vdev_mlme.vdev_feat_ext2_caps |= cap;
1287 }
1288 
1289 /**
1290  * wlan_vdev_mlme_feat_ext2_cap_clear() - clear ext2 feature caps
1291  * @vdev: VDEV object
1292  * @cap: capabilities to be cleared
1293  *
1294  * API to clear the MLME more extensive feature capabilities
1295  *
1296  * Return: void
1297  */
1298 static inline void wlan_vdev_mlme_feat_ext2_cap_clear(
1299 				struct wlan_objmgr_vdev *vdev,
1300 				uint32_t cap)
1301 {
1302 	vdev->vdev_mlme.vdev_feat_ext2_caps &= ~cap;
1303 }
1304 
1305 /**
1306  * wlan_vdev_mlme_feat_ext2_cap_get() - get feature ext2 caps
1307  * @vdev: VDEV object
1308  * @cap: capabilities to be checked
1309  *
1310  * API to know MLME more ext feature capability is set or not
1311  *
1312  * Return: 1 -- if capabilities set
1313  *         0 -- if capabilities clear
1314  */
1315 static inline uint8_t wlan_vdev_mlme_feat_ext2_cap_get(
1316 				struct wlan_objmgr_vdev *vdev,
1317 				uint32_t cap)
1318 {
1319 	return (vdev->vdev_mlme.vdev_feat_ext2_caps & cap) ? 1 : 0;
1320 }
1321 
1322 /**
1323  * wlan_vdev_mlme_op_flags_set() - set vdev op flag
1324  * @vdev: VDEV object
1325  * @flag: vdev op flag to be set
1326  *
1327  * API to set the MLME VDEV OP flag
1328  *
1329  * Return: void
1330  */
1331 static inline void wlan_vdev_mlme_op_flags_set(
1332 				struct wlan_objmgr_vdev *vdev,
1333 				uint32_t flag)
1334 {
1335 	vdev->vdev_mlme.vdev_op_flags |= flag;
1336 }
1337 
1338 /**
1339  * wlan_vdev_mlme_op_flags_clear() - clear vdev op flag
1340  * @vdev: VDEV object
1341  * @flag: vdev op flag to be cleared
1342  *
1343  * API to clear the MLME VDEV OP flag
1344  *
1345  * Return: void
1346  */
1347 static inline void wlan_vdev_mlme_op_flags_clear(
1348 				struct wlan_objmgr_vdev *vdev,
1349 				uint32_t flag)
1350 {
1351 	vdev->vdev_mlme.vdev_op_flags &= ~flag;
1352 }
1353 
1354 /**
1355  * wlan_vdev_mlme_op_flags_get() - get vdev op flag
1356  * @vdev: VDEV object
1357  * @flag: vdev op flags to be checked
1358  *
1359  * API to know MLME VDEV OP flag is set or not
1360  *
1361  * Return: 1 -- if flag is set
1362  *         0 -- if flag is clear
1363  */
1364 static inline uint8_t wlan_vdev_mlme_op_flags_get(
1365 				struct wlan_objmgr_vdev *vdev,
1366 				uint32_t flag)
1367 {
1368 	return (vdev->vdev_mlme.vdev_op_flags & flag) ? 1 : 0;
1369 }
1370 
1371 /**
1372  * wlan_vdev_mlme_cap_set() - mlme caps set
1373  * @vdev: VDEV object
1374  * @cap: capabilities to be set
1375  *
1376  * API to set the MLME capabilities
1377  *
1378  * Return: void
1379  */
1380 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev,
1381 				uint32_t cap)
1382 {
1383 	vdev->vdev_mlme.vdev_caps |= cap;
1384 }
1385 
1386 /**
1387  * wlan_vdev_mlme_cap_clear() -  mlme caps clear
1388  * @vdev: VDEV object
1389  * @cap: capabilities to be cleared
1390  *
1391  * API to clear the MLME capabilities
1392  *
1393  * Return: void
1394  */
1395 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev,
1396 				uint32_t cap)
1397 {
1398 	vdev->vdev_mlme.vdev_caps &= ~cap;
1399 }
1400 
1401 /**
1402  * wlan_vdev_mlme_cap_get() - get mlme caps
1403  * @vdev: VDEV object
1404  * @cap: capabilities to be checked
1405  *
1406  * API to know MLME capability is set or not
1407  *
1408  * Return: 1 -- if capabilities set
1409  *         0 -- if capabilities clear
1410  */
1411 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev,
1412 				uint32_t cap)
1413 {
1414 	return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0;
1415 }
1416 
1417 /**
1418  * wlan_vdev_mlme_get_state() - get mlme state
1419  * @vdev: VDEV object
1420  *
1421  * API to get MLME state
1422  *
1423  * Return: state of MLME
1424  */
1425 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
1426 				struct wlan_objmgr_vdev *vdev)
1427 {
1428 	return vdev->vdev_mlme.mlme_state;
1429 }
1430 
1431 /**
1432  * wlan_vdev_mlme_get_substate() - get mlme substate
1433  * @vdev: VDEV object
1434  *
1435  * API to get VDEV MLME substate
1436  *
1437  * Return: substate of VDEV MLME
1438  */
1439 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
1440 				struct wlan_objmgr_vdev *vdev)
1441 {
1442 	return vdev->vdev_mlme.mlme_substate;
1443 }
1444 
1445 /**
1446  * wlan_vdev_set_selfpeer() - set self peer
1447  * @vdev: VDEV object
1448  * @peer: peer pointer
1449  *
1450  * API to set the self peer of VDEV
1451  *
1452  * Return: void
1453  */
1454 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev,
1455 						struct wlan_objmgr_peer *peer)
1456 {
1457 	vdev->vdev_objmgr.self_peer = peer;
1458 }
1459 
1460 /**
1461  * wlan_vdev_get_selfpeer() - get self peer
1462  * @vdev: VDEV object
1463  *
1464  * API to get the self peer of VDEV
1465  *
1466  * Return:
1467  * @peer: peer pointer
1468  */
1469 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1470 					struct wlan_objmgr_vdev *vdev)
1471 {
1472 	return vdev->vdev_objmgr.self_peer;
1473 }
1474 
1475 /**
1476  * wlan_vdev_set_bsspeer() - set bss peer
1477  * @vdev: VDEV object
1478  * @peer: BSS peer pointer
1479  *
1480  * API to set the BSS peer of VDEV
1481  *
1482  * Return: void
1483  */
1484 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1485 						 struct wlan_objmgr_peer *peer)
1486 {
1487 	vdev->vdev_objmgr.bss_peer = peer;
1488 }
1489 
1490 /**
1491  * wlan_vdev_get_bsspeer() - get bss peer
1492  * @vdev: VDEV object
1493  *
1494  * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API
1495  * preferred to use outside obj manager to take and handle ref count of
1496  * bss_peer with ref debug ID.
1497  *
1498  * Return:
1499  * @peer: BSS peer pointer
1500  */
1501 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1502 					struct wlan_objmgr_vdev *vdev)
1503 {
1504 	return vdev->vdev_objmgr.bss_peer;
1505 }
1506 
1507 /**
1508  * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
1509  * @vdev: VDEV object
1510  * @peer_mac: mac address of the peer to be found
1511  * @dbg_id: dbg_id of the module
1512  *
1513  * API to get and increment ref count of BSS peer of VDEV
1514  *
1515  * Return:
1516  * @peer: peer pointer to the peer of the mac address
1517  */
1518 struct wlan_objmgr_peer *
1519 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
1520 				  uint8_t *peer_mac,
1521 				  wlan_objmgr_ref_dbgid dbg_id);
1522 
1523 /**
1524  * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
1525  * of VDEV
1526  * @vdev: VDEV object
1527  * @id:   Object Manager ref debug id
1528  *
1529  * API to get and increment ref count of BSS peer of VDEV
1530  *
1531  * Return:
1532  * @peer: BSS peer pointer if bss peer is present and valid else NULL
1533  */
1534 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer(
1535 					struct wlan_objmgr_vdev *vdev,
1536 					wlan_objmgr_ref_dbgid id);
1537 /**
1538  * wlan_vdev_get_ospriv() - get os priv pointer
1539  * @vdev: VDEV object
1540  *
1541  * API to get OS private pointer from VDEV
1542  *
1543  * Return: ospriv - private pointer
1544  */
1545 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1546 	struct wlan_objmgr_vdev *vdev)
1547 {
1548 	return vdev->vdev_nif.osdev;
1549 }
1550 
1551 /**
1552  * wlan_vdev_reset_ospriv() - reset os priv pointer
1553  * @vdev: VDEV object
1554  *
1555  * API to reset OS private pointer in VDEV
1556  *
1557  * Return: void
1558  */
1559 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1560 {
1561 	vdev->vdev_nif.osdev = NULL;
1562 }
1563 
1564 /**
1565  * wlan_vdev_get_peer_count() - get vdev peer count
1566  * @vdev: VDEV object
1567  *
1568  * API to get peer count from VDEV
1569  *
1570  * Return: peer_count - vdev's peer count
1571  */
1572 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1573 {
1574 	return vdev->vdev_objmgr.wlan_peer_count;
1575 }
1576 
1577 /**
1578  * wlan_vdev_mlme_is_ap() - Check whether @vdev is an AP or not
1579  * @vdev: VDEV object
1580  *
1581  * Return: True if @vdev is ap, otherwise false.
1582  */
1583 static inline bool wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev *vdev)
1584 {
1585 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE);
1586 }
1587 
1588 #ifdef WLAN_FEATURE_11BE_MLO
1589 /**
1590  * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO
1591  * vdev or not
1592  * @vdev: VDEV object
1593  *
1594  * Return: True if it is MLO, otherwise false.
1595  */
1596 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1597 
1598 /**
1599  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
1600  * @vdev: VDEV object
1601  *
1602  * Return: True if it is mlo ap, otherwise false.
1603  */
1604 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1605 {
1606 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
1607 		wlan_vdev_mlme_is_mlo_vdev(vdev);
1608 }
1609 
1610 /**
1611  * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev
1612  * @vdev: VDEV object
1613  *
1614  * Return: void
1615  */
1616 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1617 
1618 /**
1619  * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev
1620  * @vdev: VDEV object
1621  *
1622  * Return: void
1623  */
1624 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1625 
1626 /**
1627  * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev
1628  * @vdev: VDEV object
1629  *
1630  * Return: void
1631  */
1632 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1633 
1634 /**
1635  * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an
1636  * MLO link vdev
1637  * @vdev: VDEV object
1638  *
1639  * Return: void
1640  */
1641 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1642 #ifdef WLAN_MCAST_MLO
1643 /**
1644  * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not
1645  * @vdev: VDEV object
1646  *
1647  * Return: True if it is mlo mcast vdev, otherwise false.
1648  */
1649 static inline
1650 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1651 {
1652 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1653 						WLAN_VDEV_FEXT2_MLO_MCAST);
1654 }
1655 #else
1656 static inline
1657 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1658 {
1659 	return false;
1660 }
1661 #endif
1662 
1663 /**
1664  * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not
1665  * @vdev: VDEV object
1666  *
1667  * Return: True if it is mlo sta link, otherwise false.
1668  */
1669 static inline
1670 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1671 {
1672 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1673 						WLAN_VDEV_FEXT2_MLO_STA_LINK);
1674 }
1675 
1676 /**
1677  * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not
1678  * @vdev: VDEV object
1679  *
1680  * Return: True if it is mlo sta assoc vdev, otherwise false.
1681  */
1682 static inline
1683 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1684 {
1685 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1686 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1687 		return false;
1688 
1689 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1690 		return true;
1691 
1692 	return false;
1693 }
1694 
1695 /**
1696  * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not
1697  * @vdev: VDEV object
1698  *
1699  * Return: True if it is mlo sta link vdev, otherwise false.
1700  */
1701 static inline
1702 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1703 {
1704 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1705 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1706 		return false;
1707 
1708 	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1709 		return true;
1710 
1711 	return false;
1712 }
1713 #else
1714 static inline
1715 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1716 {
1717 	return false;
1718 }
1719 
1720 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1721 {
1722 	return false;
1723 }
1724 
1725 static inline
1726 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1727 {
1728 }
1729 
1730 static inline
1731 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1732 {
1733 }
1734 
1735 static inline
1736 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1737 {
1738 }
1739 
1740 static inline
1741 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1742 {
1743 }
1744 
1745 static inline
1746 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1747 {
1748 	return false;
1749 }
1750 
1751 static inline
1752 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1753 {
1754 	return false;
1755 }
1756 
1757 static inline
1758 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1759 {
1760 	return false;
1761 }
1762 #endif
1763 
1764 /**
1765  * DOC: Examples to use VDEV ref count APIs
1766  *
1767  * In all the scenarios, the pair of API should be followed
1768  * other it lead to memory leak
1769  *
1770  *  scenario 1:
1771  *
1772  *     wlan_objmgr_vdev_obj_create()
1773  *     ----
1774  *     wlan_objmgr_vdev_obj_delete()
1775  *
1776  *  scenario 2:
1777  *
1778  *     wlan_objmgr_vdev_get_ref()
1779  *     ----
1780  *     the operations which are done on
1781  *     vdev object
1782  *     ----
1783  *     wlan_objmgr_vdev_release_ref()
1784  *
1785  *  scenario 3:
1786  *
1787  *     API to retrieve vdev (xxx_get_vdev_xxx())
1788  *     ----
1789  *     the operations which are done on
1790  *     vdev object
1791  *     ----
1792  *     wlan_objmgr_vdev_release_ref()
1793  */
1794 
1795 /**
1796  * wlan_objmgr_vdev_get_ref() - increment ref count
1797  * @vdev: VDEV object
1798  * @id:   Object Manager ref debug id
1799  *
1800  * API to increment ref count of vdev
1801  *
1802  * Return: void
1803  */
1804 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1805 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1806 				    wlan_objmgr_ref_dbgid id,
1807 				    const char *func, int line);
1808 
1809 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \
1810 		wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__)
1811 #else
1812 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
1813 				wlan_objmgr_ref_dbgid id);
1814 #endif
1815 
1816 /**
1817  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
1818  * @vdev: VDEV object
1819  * @id:   Object Manager ref debug id
1820  *
1821  * API to increment ref count of vdev after checking valid object state
1822  *
1823  * Return: void
1824  */
1825 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1826 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
1827 					      wlan_objmgr_ref_dbgid id,
1828 					      const char *func, int line);
1829 
1830 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \
1831 		wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \
1832 		__func__, __LINE__)
1833 #else
1834 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
1835 						wlan_objmgr_ref_dbgid id);
1836 #endif
1837 
1838 /**
1839  * wlan_objmgr_vdev_release_ref() - decrement ref count
1840  * @vdev: VDEV object
1841  * @id:   Object Manager ref debug id
1842  *
1843  * API to decrement ref count of vdev, if ref count is 1, it initiates the
1844  * VDEV deletion
1845  *
1846  * Return: void
1847  */
1848 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1849 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
1850 					wlan_objmgr_ref_dbgid id,
1851 					const char *func, int line);
1852 
1853 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\
1854 		wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \
1855 		__func__, __LINE__)
1856 #else
1857 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
1858 						wlan_objmgr_ref_dbgid id);
1859 #endif
1860 
1861 /**
1862  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
1863  * @pdev: PDEV object
1864  * @vdev_list: qdf_list_t
1865  * @vdev: VDEV object
1866  * @dbg_id: id of the caller
1867  *
1868  * API to get next active vdev object pointer of vdev
1869  *
1870  * Return:
1871  * @vdev_next: VDEV object
1872  */
1873 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1874 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
1875 					struct wlan_objmgr_pdev *pdev,
1876 					qdf_list_t *vdev_list,
1877 					struct wlan_objmgr_vdev *vdev,
1878 					wlan_objmgr_ref_dbgid dbg_id,
1879 					const char *func, int line);
1880 
1881 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \
1882 		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
1883 		vdev, dbgid, __func__, __LINE__)
1884 #else
1885 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
1886 					struct wlan_objmgr_pdev *pdev,
1887 					qdf_list_t *vdev_list,
1888 					struct wlan_objmgr_vdev *vdev,
1889 					wlan_objmgr_ref_dbgid dbg_id);
1890 #endif
1891 
1892 /**
1893  * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
1894  * @pdev: PDEV object
1895  * @dbg_id: id of the caller
1896  *
1897  * API to get the head active vdev of given pdev (of pdev's vdev list)
1898  *
1899  * Return:
1900  */
1901 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1902 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
1903 		struct wlan_objmgr_pdev *pdev,
1904 		wlan_objmgr_ref_dbgid dbg_id,
1905 		const char *func, int line);
1906 
1907 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \
1908 		wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \
1909 		__func__, __LINE__)
1910 #else
1911 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
1912 		struct wlan_objmgr_pdev *pdev,
1913 		wlan_objmgr_ref_dbgid dbg_id);
1914 #endif
1915 
1916 /**
1917  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
1918  * @vdev: VDEV object
1919  * @vdev_list: qdf_list_t
1920  * @dbg_id: id of the caller
1921  *
1922  * API to get the head active vdev of given vdev (of pdev's vdev list)
1923  *
1924  * Return:
1925  * @peer: head peer
1926  */
1927 #ifdef WLAN_OBJMGR_REF_ID_TRACE
1928 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
1929 				struct wlan_objmgr_pdev *pdev,
1930 				qdf_list_t *vdev_list,
1931 				wlan_objmgr_ref_dbgid dbg_id,
1932 				const char *func, int line);
1933 
1934 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \
1935 		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
1936 		dbgid, __func__, __LINE__)
1937 #else
1938 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
1939 				struct wlan_objmgr_pdev *pdev,
1940 				qdf_list_t *vdev_list,
1941 				wlan_objmgr_ref_dbgid dbg_id);
1942 #endif
1943 
1944 /**
1945  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed
1946  * @vdev: VDEV object
1947  *
1948  * API to invokes registered callbacks to notify about peer freed
1949  *
1950  * Return: void
1951  */
1952 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev);
1953 
1954 /**
1955  * wlan_vdev_set_max_peer_count() - set max peer count
1956  * @vdev: VDEV object
1957  * @count: Max peer count
1958  *
1959  * API to set max peer count of VDEV
1960  *
1961  * Return: void
1962  */
1963 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
1964 						uint16_t count)
1965 {
1966 	vdev->vdev_objmgr.max_peer_count = count;
1967 }
1968 
1969 /**
1970  * wlan_vdev_get_max_peer_count() - get max peer count
1971  * @vdev: VDEV object
1972  *
1973  * API to get max peer count of VDEV
1974  *
1975  * Return: max peer count
1976  */
1977 static inline uint16_t wlan_vdev_get_max_peer_count(
1978 						struct wlan_objmgr_vdev *vdev)
1979 {
1980 	return vdev->vdev_objmgr.max_peer_count;
1981 }
1982 
1983 /**
1984  * wlan_print_vdev_info() - print vdev members
1985  * @vdev: vdev object pointer
1986  *
1987  * Return: void
1988  */
1989 #ifdef WLAN_OBJMGR_DEBUG
1990 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
1991 #else
1992 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
1993 #endif
1994 
1995 /**
1996  * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
1997  * @vdev: vdev object pointer
1998  *
1999  * Return: void
2000  */
2001 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2002 static inline void
2003 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
2004 {
2005 	wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
2006 }
2007 #else
2008 static inline void
2009 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
2010 {
2011 }
2012 #endif
2013 
2014 /**
2015  * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
2016  * @vdev: vdev object pointer
2017  *
2018  * Return: void
2019  */
2020 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2021 static inline void
2022 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2023 {
2024 	wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
2025 }
2026 #else
2027 static inline void
2028 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2029 {
2030 }
2031 #endif
2032 
2033 /**
2034  * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
2035  * @vdev: vdev object pointer
2036  *
2037  * Return: void
2038  */
2039 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2040 static inline void
2041 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2042 {
2043 	wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
2044 }
2045 #else
2046 static inline void
2047 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2048 {
2049 }
2050 #endif
2051 
2052 /**
2053  * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
2054  * @vdev: pointer to vdev
2055  * @bss_peer_mac: pointer to bss_peer_mac_address
2056  *
2057  * This API is used to get 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_mac(struct wlan_objmgr_vdev *vdev,
2064 				      struct qdf_mac_addr *bss_peer_mac);
2065 
2066 #ifdef WLAN_FEATURE_11BE_MLO
2067 /**
2068  * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address
2069  * @vdev: pointer to vdev
2070  * @mld_mac: pointer to mld mac address
2071  *
2072  * This API is used to get mld mac address of peer.
2073  *
2074  * Context: Any context.
2075  *
2076  * Return: QDF_STATUS based on overall success
2077  */
2078 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
2079 					  struct qdf_mac_addr *mld_mac);
2080 #endif
2081 
2082 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
2083