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