1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: Define the vdev data structure of UMAC
22  */
23 
24 #ifndef _WLAN_OBJMGR_VDEV_OBJ_H_
25 #define _WLAN_OBJMGR_VDEV_OBJ_H_
26 
27 #include "qdf_atomic.h"
28 #include "qdf_list.h"
29 #include "qdf_lock.h"
30 #include "qdf_types.h"
31 #include "wlan_cmn.h"
32 #include "wlan_objmgr_cmn.h"
33 #include "wlan_objmgr_pdev_obj.h"
34 #include "wlan_objmgr_psoc_obj.h"
35 #include "wlan_vdev_mlme_main.h"
36 #include "include/wlan_vdev_mlme.h"
37 #include "wlan_vdev_mlme_api.h"
38 #include "wlan_mlme_dbg.h"
39 #ifdef WLAN_FEATURE_11BE_MLO
40 #include "wlan_mlo_mgr_public_structs.h"
41 #endif
42 
43 	/* CONF: privacy enabled */
44 #define WLAN_VDEV_F_PRIVACY              0x00000001
45 	/* CONF: 11g w/o 11b sta's */
46 #define WLAN_VDEV_F_PUREG                0x00000002
47 	/* CONF: des_bssid is set */
48 #define WLAN_VDEV_F_DESBSSID             0x00000004
49 	/* CONF: bg scan enabled */
50 #define WLAN_VDEV_F_BGSCAN               0x00000008
51 	/* CONF: sw tx retry enabled */
52 #define WLAN_VDEV_F_SWRETRY              0x00000010
53 	/* STATUS: update beacon tim */
54 #define WLAN_VDEV_F_TIMUPDATE            0x00000020
55 	/* CONF: WPA enabled */
56 #define WLAN_VDEV_F_WPA1                 0x00000040
57 	/* CONF: WPA2 enabled */
58 #define WLAN_VDEV_F_WPA2                 0x00000080
59 	/* CONF: WPA/WPA2 enabled */
60 #define WLAN_VDEV_F_WPA                  0x000000c0
61 	/* CONF: drop unencrypted */
62 #define WLAN_VDEV_F_DROPUNENC            0x00000100
63 	/* CONF: TKIP countermeasures */
64 #define WLAN_VDEV_F_COUNTERM             0x00000200
65 	/* CONF: hide SSID in beacon */  /*TODO PDEV/PSOC */
66 #define WLAN_VDEV_F_HIDESSID             0x00000400
67 	/* CONF: disable internal bridge */ /*TODO PDEV/PSOC */
68 #define WLAN_VDEV_F_NOBRIDGE             0x00000800
69 	/* STATUS: update beacon wme */
70 #define WLAN_VDEV_F_WMEUPDATE            0x00001000
71 	/* CONF: enable U-APSD */
72 #define WLAN_VDEV_F_UAPSD                0x00004000
73 	/* STATUS: sleeping */
74 #define WLAN_VDEV_F_SLEEP                0x00008000
75 	/* drop uapsd EOSP frames for test */
76 #define WLAN_VDEV_F_EOSPDROP             0x00010000
77 	/* CONF: A-MPDU supported */
78 #define WLAN_VDEV_F_AMPDU                0x00020000
79 	/* STATE: beacon APP IE updated */
80 #define WLAN_VDEV_F_APPIE_UPDATE         0x00040000
81 	/* CONF: WDS auto Detect/DELBA */
82 #define WLAN_VDEV_F_WDS_AUTODETECT       0x00080000
83 	/* 11b only without 11g stations */
84 #define WLAN_VDEV_F_PUREB                0x00100000
85 	/* disable HT rates */
86 #define WLAN_VDEV_F_HTRATES              0x00200000
87 	/* CONF: deliver rx frames with 802.11 header */
88 #define WLAN_VDEV_F_DELIVER_80211        0x00800000
89 	/* CONF: os sends down tx frames with 802.11 header */
90 #define WLAN_VDEV_F_SEND_80211           0x01000000
91 	/* CONF: statically configured WDS */
92 #define WLAN_VDEV_F_WDS_STATIC           0x02000000
93 	/* CONF: pure 11n mode */
94 #define WLAN_VDEV_F_PURE11N              0x04000000
95 	/* CONF: pure 11ac mode */
96 #define WLAN_VDEV_F_PURE11AC             0x08000000
97 	/* Basic Rates Update */
98 #define WLAN_VDEV_F_BR_UPDATE            0x10000000
99 	/* CONF: restrict bw ont top of per 11ac/n */
100 #define WLAN_VDEV_F_STRICT_BW            0x20000000
101 	/* Wi-Fi SON mode (with APS) */
102 #define WLAN_VDEV_F_SON                  0x40000000
103 	/* Wi-Fi SON mode (with APS) */
104 #define WLAN_VDEV_F_MBO                  0x80000000
105 
106 /* Feature extension flags */
107 		/* CONF: MSFT safe mode         */
108 #define WLAN_VDEV_FEXT_SAFEMODE             0x00000001
109 		/* if the vap can sleep*/
110 #define WLAN_VDEV_FEXT_CANSLEEP             0x00000002
111 		/* use sw bmiss timer */
112 #define WLAN_VDEV_FEXT_SWBMISS              0x00000004
113 		/* enable beacon copy */
114 #define WLAN_VDEV_FEXT_COPY_BEACON          0x00000008
115 #define WLAN_VDEV_FEXT_WAPI                 0x00000010
116 		/* 802.11h enabled */
117 #define WLAN_VDEV_FEXT_DOTH                 0x00000020
118 	/* if the vap has wds independence set */
119 #define WLAN_VDEV_FEXT_VAPIND               0x00000040
120 	/* QBSS load IE enabled */
121 #define WLAN_VDEV_FEXT_BSSLOAD              0x00000080
122 	/* Short Guard Interval Enable:1 Disable:0 */
123 #define WLAN_VDEV_FEXT_SGI                  0x00000100
124 	/* Short Guard Interval Enable:1 Disable:0 for VHT fixed rates */
125 #define WLAN_VDEV_FEXT_DATASGI              0x00000200
126 	/* LDPC Enable Rx:1 TX: 2 ; Disable:0 */
127 #define WLAN_VDEV_FEXT_LDPC_TX              0x00000400
128 #define WLAN_VDEV_FEXT_LDPC_RX              0x00000800
129 #define WLAN_VDEV_FEXT_LDPC                 0x00000c00
130 	/* wme enabled */
131 #define WLAN_VDEV_FEXT_WME                  0x00001000
132 	/* WNM Capabilities */
133 #define WLAN_VDEV_FEXT_WNM                  0x00002000
134 	/* RRM Capabilities */
135 #define WLAN_VDEV_FEXT_RRM                  0x00004000
136 	/* WNM Proxy ARP Capabilities */
137 #define WLAN_VDEV_FEXT_PROXYARP             0x00008000
138 	/* 256 QAM support in 2.4GHz mode Enable:1 Disable:0 */
139 #define WLAN_VDEV_FEXT_256QAM               0x00010000
140 	/* 2.4NG 256 QAM Interop mode Enable:1 Disable:0 */
141 #define WLAN_VDEV_FEXT_256QAM_INTEROP       0x00020000
142 	/* static mimo ps enabled */
143 #define WLAN_VDEV_FEXT_STATIC_MIMOPS        0x00040000
144 	/* dynamic mimo ps enabled */
145 #define WLAN_VDEV_FEXT_DYN_MIMOPS           0x00080000
146 	/* Country IE enabled */
147 #define WLAN_VDEV_FEXT_CNTRY_IE             0x00100000
148 	/*does not want to trigger multi channel operation
149 	instead follow master vaps channel (for AP/GO Vaps) */
150 #define WLAN_VDEV_FEXT_NO_MULCHAN           0x00200000
151 	/*non-beaconing AP VAP*/
152 #define WLAN_VDEV_FEXT_NON_BEACON           0x00400000
153 	/* SPL repeater enabled for SON*/
154 #define WLAN_VDEV_FEXT_SON_SPL_RPT          0x00800000
155 	/* SON IE update in MGMT frame */
156 #define WLAN_VDEV_FEXT_SON_INFO_UPDATE      0x01000000
157 	/* CONF: A-MSDU supported */
158 #define WLAN_VDEV_FEXT_AMSDU                0x02000000
159 	/* Fils discovery on 6G SAP*/
160 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP     0x80000000
161 
162 /* Feature more extension flags */
163 	/* VDEV is MLO*/
164 #define WLAN_VDEV_FEXT2_MLO                 0x00000001
165 	/* STA VDEV is link type */
166 #define WLAN_VDEV_FEXT2_MLO_STA_LINK        0x00000002
167 	/* VDEV is MLO mcast primary*/
168 #define WLAN_VDEV_FEXT2_MLO_MCAST           0x00000004
169 	/* 20TU BCAST PROBE RESP on 6G SAP*/
170 #define WLAN_VDEV_FEXT2_20TU_PRB_RESP       0x00000008
171 	/* STA VDEV is TDLS link type */
172 #define WLAN_VDEV_FEXT2_MLO_STA_TDLS        0x00000010
173 
174 /* VDEV OP flags  */
175   /* if the vap destroyed by user */
176 #define WLAN_VDEV_OP_DELETE_PROGRESS        0x00000001
177  /* set to enable sta-fws fweature */
178 #define WLAN_VDEV_OP_STAFWD                 0x00000002
179    /* Off-channel support enabled */
180 #define WLAN_VDEV_OP_OFFCHAN                0x00000004
181   /* if the vap has erp update set */
182 #define WLAN_VDEV_OP_ERPUPDATE              0x00000008
183   /* this vap needs scheduler for off channel operation */
184 #define WLAN_VDEV_OP_NEEDS_SCHED            0x00000010
185   /*STA in forced sleep set PS bit for all outgoing frames */
186 #define WLAN_VDEV_OP_FORCED_SLEEP           0x00000020
187   /* update bssload IE in beacon */
188 #define WLAN_VDEV_OP_BSSLOAD_UPDATE         0x00000040
189   /* Hotspot 2.0 DGAF Disable bit */
190 #define WLAN_VDEV_OP_DGAF_DISABLE           0x00000080
191   /* STA SmartNet enabled */
192 #define WLAN_VDEV_OP_SMARTNET_EN            0x00000100
193   /* SoftAP to reject resuming in DFS channels */
194 #define WLAN_VDEV_OP_REJ_DFS_CHAN           0x00000200
195   /* Trigger mlme response */
196 #define WLAN_VDEV_OP_TRIGGER_MLME_RESP      0x00000400
197   /* test flag for MFP */
198 #define WLAN_VDEV_OP_MFP_TEST               0x00000800
199   /* flag to indicate using default ratemask */
200 #define WLAN_VDEV_OP_DEF_RATEMASK           0x00001000
201 /*For wakeup AP VAP when wds-sta connect to the AP only use when
202 	export (UMAC_REPEATER_DELAYED_BRINGUP || DBDC_REPEATER_SUPPORT)=1*/
203 #define WLAN_VDEV_OP_KEYFLAG                0x00002000
204   /* if performed the iwlist scanning */
205 #define WLAN_VDEV_OP_LIST_SCANNING          0x00004000
206    /*Set when VAP down*/
207 #define WLAN_VDEV_OP_IS_DOWN                0x00008000
208   /* if vap may require acs when another vap is brought down */
209 #define WLAN_VDEV_OP_NEEDS_UP_ACS           0x00010000
210   /* Block data traffic tx for this vap */
211 #define WLAN_VDEV_OP_BLOCK_TX_TRAFFIC       0x00020000
212   /* for mbo functionality */
213 #define WLAN_VDEV_OP_MBO                    0x00040000
214 /* VDEV Critical update category-1
215  * Inclusion of Critical Update IES flag
216  * This includes: CSA, ECSA, Quiet
217  * Quiet channel, Max Ch Switch Time IEs.
218  */
219 #define WLAN_VDEV_OP_CU_CAT1                0x00080000
220 /* VDEV Critical update category-2
221  * Modification of Critical Update IES flag
222  * This includes: DSSS Param, HT Operation element
223  * VHT Operation element, HE Operation element
224  * EHT Operation element, MU EDCA Param, EDCA param
225  * UORA Param, BSS Color Change Announcement element
226  * Spatial Reuse Param Set element
227  * Operating Mode Notification element
228  * Wide Bandwidth Channel Switch element
229  * Broadcast TWT element
230  */
231 #define WLAN_VDEV_OP_CU_CAT2                0x00100000
232   /* for mlo reconfig link removal functionality */
233 #define WLAN_VDEV_OP_MLO_STOP_LINK_DEL      0x00200000
234   /* for mlo reconfig link add functionality */
235 #define WLAN_VDEV_OP_MLO_LINK_ADD           0x00400000
236   /* for mlo reconfig link removal TBTT complete */
237 #define WLAN_VDEV_OP_MLO_LINK_TBTT_COMPLETE 0x00800000
238 
239 /* MLO link removal is in progress on this VDEV */
240 #define WLAN_VDEV_OP_MLO_LINK_REMOVAL_IN_PROGRESS 0x01000000
241 /* MLO link switch is in progress on this VDEV */
242 #define WLAN_VDEV_OP_MLO_LINK_SWITCH_IN_PROGRESS 0x02000000
243 
244  /* flag to indicate disconnect only legacy peers due to moving to DFS channel
245   * from non-DFS channel
246   */
247 #define WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG 0x02000000
248   /* for mlo reconfig link removal functionality */
249 #define WLAN_VDEV_OP_MLO_REMOVE_LINK_VDEV      0x04000000
250 
251  /* CAPABILITY: IBSS available */
252 #define WLAN_VDEV_C_IBSS                    0x00000001
253 /* CAPABILITY: HOSTAP avail */
254 #define WLAN_VDEV_C_HOSTAP               0x00000002
255    /* CAPABILITY: Old Adhoc Demo */
256 #define WLAN_VDEV_C_AHDEMO               0x00000004
257   /* CAPABILITY: sw tx retry */
258 #define WLAN_VDEV_C_SWRETRY              0x00000008
259   /* CAPABILITY: monitor mode */
260 #define WLAN_VDEV_C_MONITOR              0x00000010
261   /* CAPABILITY: TKIP MIC avail */
262 #define WLAN_VDEV_C_TKIPMIC              0x00000020
263   /* CAPABILITY: 4-addr support */
264 #define WLAN_VDEV_C_WDS                  0x00000040
265   /* CAPABILITY: TKIP MIC for QoS frame */
266 #define WLAN_VDEV_C_WME_TKIPMIC          0x00000080
267   /* CAPABILITY: bg scanning */
268 #define WLAN_VDEV_C_BGSCAN               0x00000100
269   /* CAPABILITY: Restrict offchannel */
270 #define WLAN_VDEV_C_RESTRICT_OFFCHAN     0x00000200
271   /* CAPABILITY: eMLSR capability */
272 #define WLAN_VDEV_C_EMLSR_CAP            0x00000400
273   /* CAPABILITY: Exclude per sta profile in unicast Probe req */
274 #define WLAN_VDEV_C_EXCL_STA_PROF_PRB_REQ   0x00000800
275 
276 /* Invalid VDEV identifier */
277 #define WLAN_INVALID_VDEV_ID 255
278 
279 /* Invalid VDEV link id*/
280 #define WLAN_INVALID_LINK_ID 255
281 
282 /**
283  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
284  *				    structure While creating VDEV
285  * @opmode:         Opmode of VDEV
286  * @flags:          create flags
287  * @size_vdev_priv: Size of vdev private
288  * @legacy_osif:    Legacy os_if private member
289  * @macaddr:        MAC address
290  * @mataddr:        MAT address
291  * @mldaddr:        MLD address
292  */
293 struct wlan_vdev_create_params {
294 	enum QDF_OPMODE opmode;
295 	uint32_t flags;
296 	size_t size_vdev_priv;
297 	void *legacy_osif;
298 	uint8_t macaddr[QDF_MAC_ADDR_SIZE];
299 	uint8_t mataddr[QDF_MAC_ADDR_SIZE];
300 	uint8_t mldaddr[QDF_MAC_ADDR_SIZE];
301 };
302 
303 /**
304  * struct wlan_channel - channel structure
305  * @ch_freq:      Channel in Mhz.
306  * @ch_ieee:      IEEE channel number.
307  * @ch_freq_seg1: Channel Center frequency for VHT80/160 and HE80/160.
308  * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode.
309  * @ch_maxpower:  Maximum tx power in dBm.
310  * @ch_flagext:   Channel extension flags.
311  * @ch_flags:     Channel flags.
312  * @ch_cfreq1:    channel center frequency for primary
313  * @ch_cfreq2:    channel center frequency for secondary
314  * @ch_width:     Channel width.
315  * @ch_phymode:   Channel phymode.
316  * @puncture_bitmap:   Puncture bitmap per 20MHz.
317  */
318 struct wlan_channel {
319 	uint16_t     ch_freq;
320 	uint8_t      ch_ieee;
321 	uint8_t      ch_freq_seg1;
322 	uint8_t      ch_freq_seg2;
323 	int8_t       ch_maxpower;
324 	uint16_t     ch_flagext;
325 	uint64_t     ch_flags;
326 	uint32_t     ch_cfreq1;
327 	uint32_t     ch_cfreq2;
328 	enum phy_ch_width ch_width;
329 	enum wlan_phymode ch_phymode;
330 #ifdef WLAN_FEATURE_11BE
331 	uint16_t     puncture_bitmap;
332 #endif
333 };
334 
335 /**
336  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
337  * @vdev_opmode:        Opmode of VDEV
338  * @mlme_state:         VDEV MLME SM state
339  * @mlme_substate:      VDEV MLME SM substate
340  * @bss_chan:           BSS channel
341  * @des_chan:           Desired channel, for STA Desired may not be used
342  * @vdev_caps:          VDEV capabilities
343  * @vdev_feat_caps:     VDEV feature caps
344  * @vdev_feat_ext_caps: VDEV Extended feature caps
345  * @vdev_feat_ext2_caps: More VDEV Extended feature caps
346  * @vdev_op_flags:      Operation flags
347  * @mataddr:            MAT address
348  * @macaddr:            Contains link MAC address for ML connection and
349  *                      net dev address for non-ML connection
350  * @mldaddr:            MLD address
351  * @linkaddr:           Link MAC address
352  * @epcs_enable:        EPCS enable flag
353  * @mlo_link_id: link id for mlo connection
354  * @mlo_external_sae_auth: MLO external SAE auth
355  * @user_disable_eht: user disable eht for IOT issues
356  * @wlan_vdev_mlo_lock: lock to protect the set/clear of
357  * @skip_pumac_cnt: Counter to skip vdev to be selected as pumac
358  * WLAN_VDEV_FEXT2_MLO feature flag in vdev MLME
359  */
360 struct wlan_objmgr_vdev_mlme {
361 	enum QDF_OPMODE vdev_opmode;
362 	enum wlan_vdev_state mlme_state;
363 	enum wlan_vdev_state mlme_substate;
364 	struct wlan_channel *bss_chan;
365 	struct wlan_channel *des_chan;
366 	uint32_t vdev_caps;
367 	uint32_t vdev_feat_caps;
368 	uint32_t vdev_feat_ext_caps;
369 	uint32_t vdev_feat_ext2_caps;
370 	uint32_t vdev_op_flags;
371 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
372 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
373 	uint8_t  mldaddr[QDF_MAC_ADDR_SIZE];
374 	uint8_t  linkaddr[QDF_MAC_ADDR_SIZE];
375 #ifdef WLAN_FEATURE_11BE_MLO
376 	bool epcs_enable;
377 	uint8_t  mlo_link_id;
378 	bool mlo_external_sae_auth;
379 	bool user_disable_eht;
380 #ifdef WLAN_MLO_USE_SPINLOCK
381 	qdf_spinlock_t wlan_vdev_mlo_lock;
382 #else
383 	qdf_mutex_t wlan_vdev_mlo_lock;
384 #endif
385 #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
386 	qdf_atomic_t skip_pumac_cnt;
387 #endif
388 #endif
389 };
390 
391 /**
392  *  struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure
393  *  @osdev:  OS specific pointer
394  */
395 struct wlan_objmgr_vdev_nif {
396 	struct vdev_osif_priv *osdev;
397 };
398 
399 /**
400  *  struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
401  *  @vdev_id:            VDEV id
402  *  @print_cnt:          Count to throttle Logical delete prints
403  *  @self_peer:          Self PEER
404  *  @bss_peer:           BSS PEER
405  *  @wlan_peer_list:     PEER list
406  *  @wlan_pdev:          PDEV pointer
407  *  @wlan_peer_count:    Peer count
408  *  @wlan_ml_peer_count: Multilink Peer count
409  *  @mlo_bridge_vdev:    Indicates it is bridge VDEV
410  *  @mlo_central_vdev:   Indicates it is central VDEV
411  *  @max_peer_count:     Max Peer count
412  *  @c_flags:            creation specific flags
413  *  @ref_cnt:            Ref count
414  *  @ref_id_dbg:         Array to track Ref count
415  *  @trace:              Trace ref and deref
416  */
417 struct wlan_objmgr_vdev_objmgr {
418 	uint8_t vdev_id;
419 	uint8_t print_cnt;
420 	struct wlan_objmgr_peer *self_peer;
421 	struct wlan_objmgr_peer *bss_peer;
422 	qdf_list_t wlan_peer_list;
423 	struct wlan_objmgr_pdev *wlan_pdev;
424 	uint16_t wlan_peer_count;
425 #ifdef WLAN_FEATURE_11BE_MLO
426 	qdf_atomic_t wlan_ml_peer_count;
427 #ifdef WLAN_MLO_MULTI_CHIP
428 	bool mlo_bridge_vdev;
429 	bool mlo_central_vdev;
430 #endif
431 #endif
432 	uint16_t max_peer_count;
433 	uint32_t c_flags;
434 	qdf_atomic_t ref_cnt;
435 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
436 #ifdef WLAN_OBJMGR_REF_ID_TRACE
437 	struct wlan_objmgr_trace trace;
438 #endif
439 };
440 
441 /**
442  * struct wlan_objmgr_vdev - VDEV common object
443  * @vdev_node:      qdf list of pdev's vdev list
444  * @vdev_mlme:      VDEV MLME substructure
445  * @vdev_objmgr:    VDEV Object Mgr substructure
446  * @vdev_nif:       VDEV HDD substructure
447  * @vdev_comp_priv_obj:Component's private objects list
448  * @obj_status:     Component object status
449  * @obj_state:      VDEV object state
450  * @vdev_lock:      VDEV lock
451  * @mlo_dev_ctx:    MLO device context
452  * @twt_work:	    TWT work
453  */
454 struct wlan_objmgr_vdev {
455 	qdf_list_node_t vdev_node;
456 	struct wlan_objmgr_vdev_mlme vdev_mlme;
457 	struct wlan_objmgr_vdev_objmgr vdev_objmgr;
458 	struct wlan_objmgr_vdev_nif vdev_nif;
459 	void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
460 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
461 	WLAN_OBJ_STATE obj_state;
462 	qdf_spinlock_t vdev_lock;
463 #ifdef WLAN_FEATURE_11BE_MLO
464 	struct wlan_mlo_dev_context *mlo_dev_ctx;
465 #endif
466 #ifdef WLAN_SUPPORT_TWT
467 	qdf_work_t twt_work;
468 #endif
469 };
470 
471 /*
472  * APIs to Create/Delete Global object APIs
473  */
474 /**
475  * wlan_objmgr_vdev_obj_create() - vdev object create
476  * @pdev: PDEV object on which this vdev gets created
477  * @params: VDEV create params from HDD
478  *
479  * Creates vdev object, initializes with default values
480  * Attaches to psoc and pdev objects
481  * Invokes the registered notifiers to create component object
482  *
483  * Return: Handle to struct wlan_objmgr_vdev on successful creation,
484  *         NULL on Failure (on Mem alloc failure and Component objects
485  *         Failure)
486  */
487 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
488 			struct wlan_objmgr_pdev *pdev,
489 			struct wlan_vdev_create_params *params);
490 
491 /**
492  * wlan_objmgr_vdev_obj_delete() - vdev object delete
493  * @vdev: vdev object
494  *
495  * Logically deletes VDEV object,
496  * Once all the references are released, object manager invokes the registered
497  * notifiers to destroy component objects
498  *
499  * Return: SUCCESS/FAILURE
500  */
501 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev);
502 
503 /**
504  * wlan_objmgr_vdev_mlo_dev_ctxt_attach() - vdev mlo ctxt object attach
505  * @vdev: vdev object
506  *
507  * Attach vdev to mlo dev context object.
508  *
509  * Return: SUCCESS/FAILURE
510  */
511 QDF_STATUS
512 wlan_objmgr_vdev_mlo_dev_ctxt_attach(struct wlan_objmgr_vdev *vdev);
513 
514 /**
515  * wlan_objmgr_vdev_mlo_dev_ctxt_detach() - vdev mlo ctxt object delete
516  * @vdev: vdev object
517  *
518  * Detach mlo dev context object from vdev.
519  *
520  * Return: SUCCESS/FAILURE
521  */
522 QDF_STATUS
523 wlan_objmgr_vdev_mlo_dev_ctxt_detach(struct wlan_objmgr_vdev *vdev);
524 
525 /*
526  * APIs to attach/detach component objects
527  */
528 /**
529  * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach
530  * @vdev: VDEV object
531  * @id: Component id
532  * @comp_priv_obj: component's private object pointer
533  * @status: Component's private object creation status
534  *
535  * API to be used for attaching component object with VDEV common object
536  *
537  * Return: SUCCESS on successful storing of component's object in common object
538  *         On FAILURE (appropriate failure codes are returned)
539  */
540 QDF_STATUS wlan_objmgr_vdev_component_obj_attach(
541 		struct wlan_objmgr_vdev *vdev,
542 		enum wlan_umac_comp_id id,
543 		void *comp_priv_obj,
544 		QDF_STATUS status);
545 
546 /**
547  * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach
548  * @vdev: VDEV object
549  * @id: Component id
550  * @comp_priv_obj: component's private object pointer
551  *
552  * API to be used for detaching component object with VDEV common object
553  *
554  * Return: SUCCESS on successful removal of component's object from common
555  *         object
556  *         On FAILURE (appropriate failure codes are returned)
557  */
558 QDF_STATUS wlan_objmgr_vdev_component_obj_detach(
559 		struct wlan_objmgr_vdev *vdev,
560 		enum wlan_umac_comp_id id,
561 		void *comp_priv_obj);
562 
563 /*
564  * APIs to operations on vdev objects
565  */
566 
567 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
568 					void *object,
569 					void *arg);
570 
571 /**
572  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
573  * @vdev: vdev object
574  * @handler: the handler will be called for each object of requested type
575  *            the handler should be implemented to perform required operation
576  * @arg:     arguments passed by caller
577  * @dbg_id: id of the caller
578  *
579  * API to be used for performing the operations on all PEER objects
580  * of vdev
581  *
582  * Return: SUCCESS/FAILURE
583  */
584 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
585 		struct wlan_objmgr_vdev *vdev,
586 		wlan_objmgr_vdev_op_handler handler,
587 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
588 
589 /**
590  * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list
591  * @vdev: vdev object
592  * @dbg_id: id of the caller
593  *
594  * API to be used for populating the list of logically deleted peers from the
595  * vdev's peer list
596  *
597  * The caller of this function should free the memory allocated for the
598  * peerlist and the peer member in the list
599  * Also the peer ref release is handled by the caller
600  *
601  * Return: list of peer pointers
602  *         NULL on FAILURE
603  */
604 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list(
605 		struct wlan_objmgr_vdev *vdev,
606 		wlan_objmgr_ref_dbgid dbg_id);
607 
608 /**
609  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
610  * comp object creation
611  * @vdev: VDEV object
612  * @id: Component id
613  *
614  * API to create component private object in run time, this would
615  * be used for features which gets enabled in run time
616  *
617  * Return: SUCCESS on successful creation
618  *         On FAILURE (appropriate failure codes are returned)
619  */
620 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
621 		struct wlan_objmgr_vdev *vdev,
622 		enum wlan_umac_comp_id id);
623 
624 /**
625  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
626  *                                                        object deletion
627  * @vdev: VDEV object
628  * @id: Component id
629  *
630  * API to destroy component private object in run time, this would
631  * be used for features which gets disabled in run time
632  *
633  * Return: SUCCESS on successful deletion
634  *         On FAILURE (appropriate failure codes are returned)
635  */
636 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
637 		struct wlan_objmgr_vdev *vdev,
638 		enum wlan_umac_comp_id id);
639 
640 /**
641  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
642  * @vdev: VDEV object
643  * @id: Component id
644  *
645  * API to get component private object
646  *
647  * Return: void *ptr on SUCCESS
648  *         NULL on Failure
649  */
650 void *wlan_objmgr_vdev_get_comp_private_obj(
651 		struct wlan_objmgr_vdev *vdev,
652 		enum wlan_umac_comp_id id);
653 
654 /* Util APIs */
655 
656 /**
657  * wlan_vdev_get_pdev() - get pdev
658  * @vdev: VDEV object
659  *
660  * API to get pdev object pointer from vdev
661  *
662  * Return: pdev object pointer
663  */
wlan_vdev_get_pdev(struct wlan_objmgr_vdev * vdev)664 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
665 				struct wlan_objmgr_vdev *vdev)
666 {
667 	return vdev->vdev_objmgr.wlan_pdev;
668 }
669 
670 /**
671  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
672  * @vdev_list: qdf_list_t
673  *
674  * API to get the head vdev of given vdev (of pdev's vdev list)
675  *
676  * Caller need to acquire lock with wlan_vdev_obj_lock()
677  *
678  * Return: head peer
679  */
wlan_pdev_vdev_list_peek_head(qdf_list_t * vdev_list)680 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
681 					qdf_list_t *vdev_list)
682 {
683 	struct wlan_objmgr_vdev *vdev;
684 	qdf_list_node_t *vdev_node = NULL;
685 
686 	/* This API is invoked with lock acquired, do not add log prints */
687 	if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS)
688 		return NULL;
689 
690 	vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node);
691 	return vdev;
692 }
693 
694 
695 /**
696  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
697  * @vdev_list: qdf_list_t
698  * @vdev: VDEV object
699  *
700  * API to get next vdev object pointer of vdev
701  *
702  * Caller need to acquire lock with wlan_vdev_obj_lock()
703  *
704  * Return: VDEV object
705  */
wlan_vdev_get_next_vdev_of_pdev(qdf_list_t * vdev_list,struct wlan_objmgr_vdev * vdev)706 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
707 					qdf_list_t *vdev_list,
708 					struct wlan_objmgr_vdev *vdev)
709 {
710 	struct wlan_objmgr_vdev *vdev_next;
711 	qdf_list_node_t *node = &vdev->vdev_node;
712 	qdf_list_node_t *next_node = NULL;
713 
714 	/* This API is invoked with lock acquired, do not add log prints */
715 	if (!node)
716 		return NULL;
717 
718 	if (qdf_list_peek_next(vdev_list, node, &next_node) !=
719 						QDF_STATUS_SUCCESS)
720 		return NULL;
721 
722 	vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev,
723 				vdev_node);
724 	return vdev_next;
725 }
726 
727 
728 
729 /**
730  * wlan_vdev_set_pdev() - set pdev
731  * @vdev: VDEV object
732  * @pdev: PDEV object
733  *
734  * API to get pdev object pointer from vdev
735  *
736  * Caller need to acquire lock with wlan_vdev_obj_lock()
737  *
738  * Return: void
739  */
wlan_vdev_set_pdev(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_pdev * pdev)740 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev,
741 					struct wlan_objmgr_pdev *pdev)
742 {
743 	/* This API is invoked with lock acquired, do not add log prints */
744 	vdev->vdev_objmgr.wlan_pdev = pdev;
745 }
746 
747 /**
748  * wlan_vdev_get_psoc() - get psoc
749  * @vdev: VDEV object
750  *
751  * API to get pdev object pointer from vdev
752  *
753  * Return: psoc object pointer
754  */
wlan_vdev_get_psoc(struct wlan_objmgr_vdev * vdev)755 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc(
756 				struct wlan_objmgr_vdev *vdev)
757 {
758 	struct wlan_objmgr_pdev *pdev;
759 	struct wlan_objmgr_psoc *psoc = NULL;
760 
761 	pdev = wlan_vdev_get_pdev(vdev);
762 	if (!pdev)
763 		return NULL;
764 
765 	psoc = wlan_pdev_get_psoc(pdev);
766 
767 	return psoc;
768 }
769 
770 /**
771  * wlan_vdev_get_psoc_id() - get psoc id
772  * @vdev: VDEV object
773  *
774  * API to get VDEV's psoc id
775  *
776  * Return: psoc id
777  */
wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev * vdev)778 static inline uint8_t wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev *vdev)
779 {
780 	struct wlan_objmgr_psoc *psoc;
781 
782 	psoc = wlan_vdev_get_psoc(vdev);
783 
784 	return wlan_psoc_get_id(psoc);
785 }
786 
787 /**
788  * wlan_vdev_skip_pumac() - get primary umac support
789  * @vdev: VDEV object
790  *
791  * API to get Primary umac support for MLO
792  *
793  * Return: get primary umac support (bool)
794  */
wlan_vdev_skip_pumac(struct wlan_objmgr_vdev * vdev)795 static inline bool wlan_vdev_skip_pumac(struct wlan_objmgr_vdev *vdev)
796 {
797 	struct wlan_objmgr_psoc *psoc;
798 
799 	psoc = wlan_vdev_get_psoc(vdev);
800 
801 	if (wlan_psoc_get_pumac_skip(psoc))
802 		return true;
803 
804 	return false;
805 }
806 
807 /**
808  * wlan_vdev_mlme_set_opmode() - set vdev opmode
809  * @vdev: VDEV object
810  * @mode: VDEV op mode
811  *
812  * API to set opmode in vdev object
813  *
814  * Return: void
815  */
wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev * vdev,enum QDF_OPMODE mode)816 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev,
817 				enum QDF_OPMODE mode)
818 {
819 	vdev->vdev_mlme.vdev_opmode = mode;
820 }
821 
822 /**
823  * wlan_vdev_mlme_get_opmode() - get vdev opmode
824  * @vdev: VDEV object
825  *
826  * API to set opmode of vdev object
827  *
828  * Return: VDEV op mode
829  */
wlan_vdev_mlme_get_opmode(struct wlan_objmgr_vdev * vdev)830 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
831 					struct wlan_objmgr_vdev *vdev)
832 {
833 	return vdev->vdev_mlme.vdev_opmode;
834 }
835 
836 /**
837  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
838  * @vdev: VDEV object
839  * @macaddr: MAC address
840  *
841  * API to set macaddr in vdev object
842  *
843  * Caller need to acquire lock with wlan_vdev_obj_lock()
844  *
845  * Return: void
846  */
wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev * vdev,uint8_t * macaddr)847 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
848 					 uint8_t *macaddr)
849 {
850 	/* This API is invoked with lock acquired, do not add log prints */
851 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
852 }
853 
854 /**
855  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
856  * @vdev: VDEV object
857  *
858  * API to get MAC address from vdev object
859  *
860  * Caller need to acquire lock with wlan_vdev_obj_lock()
861  *
862  * Return: MAC address
863  */
wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev * vdev)864 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
865 {
866 	/* This API is invoked with lock acquired, do not add log prints */
867 	return vdev->vdev_mlme.macaddr;
868 }
869 
870 /**
871  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
872  * @vdev: VDEV object
873  * @mataddr: MAT address
874  *
875  * API to set mataddr in vdev object
876  *
877  * Caller need to acquire lock with wlan_vdev_obj_lock()
878  *
879  * Return: void
880  */
wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev * vdev,uint8_t * mataddr)881 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
882 					uint8_t *mataddr)
883 {
884 	/* This API is invoked with lock acquired, do not add log prints */
885 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
886 }
887 
888 /**
889  * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr
890  * @vdev: VDEV object
891  *
892  * API to get MLD address from vdev object
893  *
894  * Caller need to acquire lock with wlan_vdev_obj_lock()
895  *
896  * Return: MAC address
897  */
wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev * vdev)898 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev)
899 {
900 	/* This API is invoked with lock acquired, do not add log prints */
901 	return vdev->vdev_mlme.mldaddr;
902 }
903 
904 /**
905  * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr
906  * @vdev: VDEV object
907  * @mldaddr: MLD address
908  *
909  * API to set MLD addr in vdev object
910  *
911  * Caller need to acquire lock with wlan_vdev_obj_lock()
912  *
913  * Return: void
914  */
wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev * vdev,uint8_t * mldaddr)915 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev,
916 					uint8_t *mldaddr)
917 {
918 	/* This API is invoked with lock acquired, do not add log prints */
919 	WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr);
920 }
921 
922 /**
923  * wlan_vdev_mlme_reset_mldaddr() - clear vdev mldaddr
924  * @vdev: VDEV object
925  *
926  * API to clear MLD addr in vdev object
927  *
928  * Caller need to acquire lock with wlan_vdev_obj_lock()
929  *
930  * Return: void
931  */
wlan_vdev_mlme_reset_mldaddr(struct wlan_objmgr_vdev * vdev)932 static inline void wlan_vdev_mlme_reset_mldaddr(struct wlan_objmgr_vdev *vdev)
933 {
934 	/* This API is invoked with lock acquired, do not add log prints */
935 	qdf_zero_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.mldaddr);
936 }
937 
938 /**
939  * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr
940  * @vdev: VDEV object
941  *
942  * API to get link MAC address from vdev object
943  *
944  * Caller need to acquire lock with wlan_vdev_obj_lock()
945  *
946  * Return: Link MAC address
947  */
948 static inline
wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev * vdev)949 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev)
950 {
951 	/* This API is invoked with lock acquired, do not add log prints */
952 	return vdev->vdev_mlme.linkaddr;
953 }
954 
955 /**
956  * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr
957  * @vdev: VDEV object
958  * @linkaddr: Link address
959  *
960  * API to set link addr in vdev object
961  *
962  * Caller need to acquire lock with wlan_vdev_obj_lock()
963  *
964  * Return: void
965  */
wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev * vdev,uint8_t * linkaddr)966 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev,
967 					       uint8_t *linkaddr)
968 {
969 	/* This API is invoked with lock acquired, do not add log prints */
970 	qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr,
971 			 (struct qdf_mac_addr *)linkaddr);
972 }
973 
974 /**
975  * wlan_vdev_mlme_get_mataddr() - get mataddr
976  * @vdev: VDEV object
977  *
978  * API to get MAT address from vdev object
979  *
980  * Caller need to acquire lock with wlan_vdev_obj_lock()
981  *
982  * Return: MAT address
983  */
wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev * vdev)984 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
985 {
986 	/* This API is invoked with lock acquired, do not add log prints */
987 	return vdev->vdev_mlme.mataddr;
988 }
989 
990 /**
991  * wlan_vdev_get_id() - get vdev id
992  * @vdev: VDEV object
993  *
994  * API to get vdev id
995  *
996  * Return: vdev id
997  */
wlan_vdev_get_id(struct wlan_objmgr_vdev * vdev)998 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
999 {
1000 	return vdev->vdev_objmgr.vdev_id;
1001 }
1002 
1003 #ifdef WLAN_FEATURE_11BE_MLO
wlan_vdev_get_link_id(struct wlan_objmgr_vdev * vdev)1004 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
1005 {
1006 	return vdev->vdev_mlme.mlo_link_id;
1007 }
1008 
1009 /**
1010  * wlan_vdev_set_link_id() - set vdev mlo link id
1011  * @vdev: VDEV object
1012  * @link_id: link id
1013  *
1014  * API to set vdev mlo link id
1015  *
1016  * Return: void
1017  */
wlan_vdev_set_link_id(struct wlan_objmgr_vdev * vdev,uint8_t link_id)1018 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev,
1019 					 uint8_t link_id)
1020 {
1021 	vdev->vdev_mlme.mlo_link_id = link_id;
1022 }
1023 
1024 #ifdef WLAN_MLO_USE_SPINLOCK
1025 /**
1026  * wlan_create_vdev_mlo_lock() - API to create spin lock
1027  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
1028  * vdev MLME ext2 feature caps
1029  * @vdev: VDEV object
1030  *
1031  * Return: void
1032  */
1033 static inline
wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1034 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1035 {
1036 	qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1037 }
1038 
1039 /**
1040  * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock
1041  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
1042  * vdev MLME ext2 feature caps
1043  * @vdev: VDEV object
1044  *
1045  * Return: void
1046  */
1047 static inline
wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1048 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1049 {
1050 	qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1051 }
1052 
1053 /**
1054  * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock
1055  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
1056  * vdev MLME ext2 feature caps
1057  * @vdev: VDEV object
1058  *
1059  * Return: void
1060  */
1061 static inline
wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1062 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1063 {
1064 	qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1065 }
1066 
1067 /**
1068  * wlan_release_vdev_mlo_lock() - API to release spin lock
1069  * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
1070  * vdev MLME ext2 feature caps
1071  * @vdev: VDEV object
1072  *
1073  * Return: void
1074  */
1075 static inline
wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1076 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1077 {
1078 	qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1079 }
1080 #else
1081 /**
1082  * wlan_create_vdev_mlo_lock() - API to create mutex which protects the
1083  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1084  * @vdev: VDEV object
1085  *
1086  * Return: void
1087  */
1088 static inline
wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1089 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1090 {
1091 	qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1092 }
1093 
1094 /**
1095  * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the
1096  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1097  * @vdev: VDEV object
1098  *
1099  * Return: void
1100  */
1101 static inline
wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1102 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1103 {
1104 	qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1105 }
1106 
1107 /**
1108  * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the
1109  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1110  * @vdev: VDEV object
1111  *
1112  * Return: void
1113  */
1114 static inline
wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1115 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1116 {
1117 	qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1118 }
1119 
1120 /**
1121  * wlan_release_vdev_mlo_lock() - API to release mutex which protects the
1122  * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
1123  * @vdev: VDEV object
1124  *
1125  * Return: void
1126  */
1127 static inline
wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1128 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1129 {
1130 	qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
1131 }
1132 #endif /* WLAN_MLO_USE_SPINLOCK */
1133 #else
wlan_vdev_get_link_id(struct wlan_objmgr_vdev * vdev)1134 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
1135 {
1136 	return WLAN_INVALID_LINK_ID;
1137 }
1138 
1139 static inline
wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1140 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1141 {
1142 }
1143 
1144 static inline
wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev * vdev)1145 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
1146 {
1147 }
1148 #endif
1149 
1150 /**
1151  * wlan_vdev_get_hw_macaddr() - get hw macaddr
1152  * @vdev: VDEV object
1153  *
1154  * API to retrieve the HW MAC address from PDEV
1155  *
1156  * Caller need to acquire lock with wlan_vdev_obj_lock()
1157  *
1158  * Return: HW MAC address
1159  */
wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev * vdev)1160 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
1161 {
1162 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
1163 
1164 	/* This API is invoked with lock acquired, do not add log prints */
1165 	if (pdev)
1166 		return wlan_pdev_get_hw_macaddr(pdev);
1167 	else
1168 		return NULL;
1169 }
1170 
1171 /**
1172  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
1173  * @vdev: VDEV object
1174  *
1175  * API to acquire VDEV lock
1176  * Parent lock should not be taken in child lock context
1177  * but child lock can be taken in parent lock context
1178  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
1179  *
1180  * Return: void
1181  */
wlan_vdev_obj_lock(struct wlan_objmgr_vdev * vdev)1182 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
1183 {
1184 	qdf_spin_lock_bh(&vdev->vdev_lock);
1185 }
1186 
1187 /**
1188  * wlan_vdev_obj_unlock() - Release VDEV spinlock
1189  * @vdev: VDEV object
1190  *
1191  * API to Release VDEV lock
1192  *
1193  * Return: void
1194  */
wlan_vdev_obj_unlock(struct wlan_objmgr_vdev * vdev)1195 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
1196 {
1197 	qdf_spin_unlock_bh(&vdev->vdev_lock);
1198 }
1199 
1200 /**
1201  * wlan_vdev_mlme_set_bss_chan() - set bss chan
1202  * @vdev: VDEV object
1203  * @bss_chan: Channel
1204  *
1205  * API to set the BSS channel
1206  *
1207  * Return: void
1208  */
wlan_vdev_mlme_set_bss_chan(struct wlan_objmgr_vdev * vdev,struct wlan_channel * bss_chan)1209 static inline void wlan_vdev_mlme_set_bss_chan(
1210 				struct wlan_objmgr_vdev *vdev,
1211 				struct wlan_channel *bss_chan)
1212 {
1213 	vdev->vdev_mlme.bss_chan = bss_chan;
1214 }
1215 
1216 /**
1217  * wlan_vdev_mlme_get_bss_chan() - get bss chan
1218  * @vdev: VDEV object
1219  *
1220  * API to get the BSS channel
1221  *
1222  * Return: Channel
1223  */
wlan_vdev_mlme_get_bss_chan(struct wlan_objmgr_vdev * vdev)1224 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
1225 				struct wlan_objmgr_vdev *vdev)
1226 {
1227 	return vdev->vdev_mlme.bss_chan;
1228 }
1229 
1230 /**
1231  * wlan_vdev_mlme_set_des_chan() - set desired chan
1232  * @vdev: VDEV object
1233  * @des_chan: Channel configured by user
1234  *
1235  * API to set the desired channel
1236  *
1237  * Return: void
1238  */
wlan_vdev_mlme_set_des_chan(struct wlan_objmgr_vdev * vdev,struct wlan_channel * des_chan)1239 static inline void wlan_vdev_mlme_set_des_chan(
1240 				struct wlan_objmgr_vdev *vdev,
1241 				struct wlan_channel *des_chan)
1242 {
1243 	vdev->vdev_mlme.des_chan = des_chan;
1244 }
1245 
1246 /**
1247  * wlan_vdev_mlme_get_des_chan() - get desired chan
1248  * @vdev: VDEV object
1249  *
1250  * API to get the desired channel
1251  *
1252  * Return: Channel configured by user
1253  */
wlan_vdev_mlme_get_des_chan(struct wlan_objmgr_vdev * vdev)1254 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan(
1255 				struct wlan_objmgr_vdev *vdev)
1256 {
1257 	return vdev->vdev_mlme.des_chan;
1258 }
1259 
1260 /**
1261  * wlan_vdev_mlme_feat_cap_set() - set feature caps
1262  * @vdev: VDEV object
1263  * @cap: capabilities to be set
1264  *
1265  * API to set MLME feature capabilities
1266  *
1267  * Return: void
1268  */
wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev * vdev,uint32_t cap)1269 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev,
1270 				uint32_t cap)
1271 {
1272 	vdev->vdev_mlme.vdev_feat_caps |= cap;
1273 }
1274 
1275 /**
1276  * wlan_vdev_mlme_feat_cap_clear() - clear feature caps
1277  * @vdev: VDEV object
1278  * @cap: capabilities to be cleared
1279  *
1280  * API to clear MLME feature capabilities
1281  *
1282  * Return: void
1283  */
wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev * vdev,uint32_t cap)1284 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev,
1285 				uint32_t cap)
1286 {
1287 	vdev->vdev_mlme.vdev_feat_caps &= ~cap;
1288 }
1289 
1290 /**
1291  * wlan_vdev_mlme_feat_cap_get() - get feature caps
1292  * @vdev: VDEV object
1293  * @cap: capabilities to be checked
1294  *
1295  * API to know MLME feature capability is set or not
1296  *
1297  * Return: 1 -- if capabilities set
1298  *         0 -- if capabilities clear
1299  */
wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev * vdev,uint32_t cap)1300 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev,
1301 				uint32_t cap)
1302 {
1303 	return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0;
1304 }
1305 
1306 /**
1307  * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps
1308  * @vdev: VDEV object
1309  * @cap: capabilities to be set
1310  *
1311  * API to set the MLME extensive feature capabilities
1312  *
1313  * Return: void
1314  */
wlan_vdev_mlme_feat_ext_cap_set(struct wlan_objmgr_vdev * vdev,uint32_t cap)1315 static inline void wlan_vdev_mlme_feat_ext_cap_set(
1316 				struct wlan_objmgr_vdev *vdev,
1317 				uint32_t cap)
1318 {
1319 	vdev->vdev_mlme.vdev_feat_ext_caps |= cap;
1320 }
1321 
1322 /**
1323  * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps
1324  * @vdev: VDEV object
1325  * @cap: capabilities to be cleared
1326  *
1327  * API to clear the MLME extensive feature capabilities
1328  *
1329  * Return: void
1330  */
wlan_vdev_mlme_feat_ext_cap_clear(struct wlan_objmgr_vdev * vdev,uint32_t cap)1331 static inline void wlan_vdev_mlme_feat_ext_cap_clear(
1332 				struct wlan_objmgr_vdev *vdev,
1333 				uint32_t cap)
1334 {
1335 	vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap;
1336 }
1337 
1338 /**
1339  * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps
1340  * @vdev: VDEV object
1341  * @cap: capabilities to be checked
1342  *
1343  * API to know MLME ext feature capability is set or not
1344  *
1345  * Return: 1 -- if capabilities set
1346  *         0 -- if capabilities clear
1347  */
wlan_vdev_mlme_feat_ext_cap_get(struct wlan_objmgr_vdev * vdev,uint32_t cap)1348 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get(
1349 				struct wlan_objmgr_vdev *vdev,
1350 				uint32_t cap)
1351 {
1352 	return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0;
1353 }
1354 
1355 /**
1356  * wlan_vdev_mlme_feat_ext2_cap_set() - set ext2 feature caps
1357  * @vdev: VDEV object
1358  * @cap: capabilities to be set
1359  *
1360  * API to set the MLME more extensive feature capabilities
1361  *
1362  * Return: void
1363  */
wlan_vdev_mlme_feat_ext2_cap_set(struct wlan_objmgr_vdev * vdev,uint32_t cap)1364 static inline void wlan_vdev_mlme_feat_ext2_cap_set(
1365 				struct wlan_objmgr_vdev *vdev,
1366 				uint32_t cap)
1367 {
1368 	vdev->vdev_mlme.vdev_feat_ext2_caps |= cap;
1369 }
1370 
1371 /**
1372  * wlan_vdev_mlme_feat_ext2_cap_clear() - clear ext2 feature caps
1373  * @vdev: VDEV object
1374  * @cap: capabilities to be cleared
1375  *
1376  * API to clear the MLME more extensive feature capabilities
1377  *
1378  * Return: void
1379  */
wlan_vdev_mlme_feat_ext2_cap_clear(struct wlan_objmgr_vdev * vdev,uint32_t cap)1380 static inline void wlan_vdev_mlme_feat_ext2_cap_clear(
1381 				struct wlan_objmgr_vdev *vdev,
1382 				uint32_t cap)
1383 {
1384 	vdev->vdev_mlme.vdev_feat_ext2_caps &= ~cap;
1385 }
1386 
1387 /**
1388  * wlan_vdev_mlme_feat_ext2_cap_get() - get feature ext2 caps
1389  * @vdev: VDEV object
1390  * @cap: capabilities to be checked
1391  *
1392  * API to know MLME more ext feature capability is set or not
1393  *
1394  * Return: 1 -- if capabilities set
1395  *         0 -- if capabilities clear
1396  */
wlan_vdev_mlme_feat_ext2_cap_get(struct wlan_objmgr_vdev * vdev,uint32_t cap)1397 static inline uint8_t wlan_vdev_mlme_feat_ext2_cap_get(
1398 				struct wlan_objmgr_vdev *vdev,
1399 				uint32_t cap)
1400 {
1401 	return (vdev->vdev_mlme.vdev_feat_ext2_caps & cap) ? 1 : 0;
1402 }
1403 
1404 /**
1405  * wlan_vdev_mlme_op_flags_set() - set vdev op flag
1406  * @vdev: VDEV object
1407  * @flag: vdev op flag to be set
1408  *
1409  * API to set the MLME VDEV OP flag
1410  *
1411  * Return: void
1412  */
wlan_vdev_mlme_op_flags_set(struct wlan_objmgr_vdev * vdev,uint32_t flag)1413 static inline void wlan_vdev_mlme_op_flags_set(
1414 				struct wlan_objmgr_vdev *vdev,
1415 				uint32_t flag)
1416 {
1417 	vdev->vdev_mlme.vdev_op_flags |= flag;
1418 }
1419 
1420 /**
1421  * wlan_vdev_mlme_op_flags_clear() - clear vdev op flag
1422  * @vdev: VDEV object
1423  * @flag: vdev op flag to be cleared
1424  *
1425  * API to clear the MLME VDEV OP flag
1426  *
1427  * Return: void
1428  */
wlan_vdev_mlme_op_flags_clear(struct wlan_objmgr_vdev * vdev,uint32_t flag)1429 static inline void wlan_vdev_mlme_op_flags_clear(
1430 				struct wlan_objmgr_vdev *vdev,
1431 				uint32_t flag)
1432 {
1433 	vdev->vdev_mlme.vdev_op_flags &= ~flag;
1434 }
1435 
1436 /**
1437  * wlan_vdev_mlme_op_flags_get() - get vdev op flag
1438  * @vdev: VDEV object
1439  * @flag: vdev op flags to be checked
1440  *
1441  * API to know MLME VDEV OP flag is set or not
1442  *
1443  * Return: 1 -- if flag is set
1444  *         0 -- if flag is clear
1445  */
wlan_vdev_mlme_op_flags_get(struct wlan_objmgr_vdev * vdev,uint32_t flag)1446 static inline uint8_t wlan_vdev_mlme_op_flags_get(
1447 				struct wlan_objmgr_vdev *vdev,
1448 				uint32_t flag)
1449 {
1450 	return (vdev->vdev_mlme.vdev_op_flags & flag) ? 1 : 0;
1451 }
1452 
1453 /**
1454  * wlan_vdev_mlme_cap_set() - mlme caps set
1455  * @vdev: VDEV object
1456  * @cap: capabilities to be set
1457  *
1458  * API to set the MLME capabilities
1459  *
1460  * Return: void
1461  */
wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev * vdev,uint32_t cap)1462 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev,
1463 				uint32_t cap)
1464 {
1465 	vdev->vdev_mlme.vdev_caps |= cap;
1466 }
1467 
1468 /**
1469  * wlan_vdev_mlme_cap_clear() -  mlme caps clear
1470  * @vdev: VDEV object
1471  * @cap: capabilities to be cleared
1472  *
1473  * API to clear the MLME capabilities
1474  *
1475  * Return: void
1476  */
wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev * vdev,uint32_t cap)1477 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev,
1478 				uint32_t cap)
1479 {
1480 	vdev->vdev_mlme.vdev_caps &= ~cap;
1481 }
1482 
1483 /**
1484  * wlan_vdev_mlme_cap_get() - get mlme caps
1485  * @vdev: VDEV object
1486  * @cap: capabilities to be checked
1487  *
1488  * API to know MLME capability is set or not
1489  *
1490  * Return: 1 -- if capabilities set
1491  *         0 -- if capabilities clear
1492  */
wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev * vdev,uint32_t cap)1493 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev,
1494 				uint32_t cap)
1495 {
1496 	return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0;
1497 }
1498 
1499 /**
1500  * wlan_vdev_mlme_get_state() - get mlme state
1501  * @vdev: VDEV object
1502  *
1503  * API to get MLME state
1504  *
1505  * Return: state of MLME
1506  */
wlan_vdev_mlme_get_state(struct wlan_objmgr_vdev * vdev)1507 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
1508 				struct wlan_objmgr_vdev *vdev)
1509 {
1510 	return vdev->vdev_mlme.mlme_state;
1511 }
1512 
1513 /**
1514  * wlan_vdev_mlme_get_substate() - get mlme substate
1515  * @vdev: VDEV object
1516  *
1517  * API to get VDEV MLME substate
1518  *
1519  * Return: substate of VDEV MLME
1520  */
wlan_vdev_mlme_get_substate(struct wlan_objmgr_vdev * vdev)1521 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
1522 				struct wlan_objmgr_vdev *vdev)
1523 {
1524 	return vdev->vdev_mlme.mlme_substate;
1525 }
1526 
1527 /**
1528  * wlan_vdev_set_selfpeer() - set self peer
1529  * @vdev: VDEV object
1530  * @peer: peer pointer
1531  *
1532  * API to set the self peer of VDEV
1533  *
1534  * Return: void
1535  */
wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer)1536 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev,
1537 						struct wlan_objmgr_peer *peer)
1538 {
1539 	vdev->vdev_objmgr.self_peer = peer;
1540 }
1541 
1542 /**
1543  * wlan_vdev_get_selfpeer() - get self peer
1544  * @vdev: VDEV object
1545  *
1546  * API to get the self peer of VDEV
1547  *
1548  * Return: peer pointer
1549  */
wlan_vdev_get_selfpeer(struct wlan_objmgr_vdev * vdev)1550 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1551 					struct wlan_objmgr_vdev *vdev)
1552 {
1553 	return vdev->vdev_objmgr.self_peer;
1554 }
1555 
1556 /**
1557  * wlan_vdev_set_bsspeer() - set bss peer
1558  * @vdev: VDEV object
1559  * @peer: BSS peer pointer
1560  *
1561  * API to set the BSS peer of VDEV
1562  *
1563  * Return: void
1564  */
wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev * vdev,struct wlan_objmgr_peer * peer)1565 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1566 						 struct wlan_objmgr_peer *peer)
1567 {
1568 	vdev->vdev_objmgr.bss_peer = peer;
1569 }
1570 
1571 /**
1572  * wlan_vdev_get_bsspeer() - get bss peer
1573  * @vdev: VDEV object
1574  *
1575  * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API
1576  * preferred to use outside obj manager to take and handle ref count of
1577  * bss_peer with ref debug ID.
1578  *
1579  * Return: BSS peer pointer
1580  */
wlan_vdev_get_bsspeer(struct wlan_objmgr_vdev * vdev)1581 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1582 					struct wlan_objmgr_vdev *vdev)
1583 {
1584 	return vdev->vdev_objmgr.bss_peer;
1585 }
1586 
1587 /**
1588  * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev
1589  * @vdev: VDEV object
1590  * @peer_mac: mac address of the peer to be found
1591  * @dbg_id: dbg_id of the module
1592  *
1593  * API to get and increment ref count of BSS peer of VDEV
1594  *
1595  * Return: peer pointer to the peer of the mac address
1596  */
1597 struct wlan_objmgr_peer *
1598 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev,
1599 				  uint8_t *peer_mac,
1600 				  wlan_objmgr_ref_dbgid dbg_id);
1601 
1602 /**
1603  * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer
1604  * of VDEV
1605  * @vdev: VDEV object
1606  * @id:   Object Manager ref debug id
1607  *
1608  * API to get and increment ref count of BSS peer of VDEV
1609  *
1610  * Return: BSS peer pointer if bss peer is present and valid else NULL
1611  */
1612 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer(
1613 					struct wlan_objmgr_vdev *vdev,
1614 					wlan_objmgr_ref_dbgid id);
1615 /**
1616  * wlan_vdev_get_ospriv() - get os priv pointer
1617  * @vdev: VDEV object
1618  *
1619  * API to get OS private pointer from VDEV
1620  *
1621  * Return: ospriv - private pointer
1622  */
wlan_vdev_get_ospriv(struct wlan_objmgr_vdev * vdev)1623 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1624 	struct wlan_objmgr_vdev *vdev)
1625 {
1626 	return vdev->vdev_nif.osdev;
1627 }
1628 
1629 /**
1630  * wlan_vdev_reset_ospriv() - reset os priv pointer
1631  * @vdev: VDEV object
1632  *
1633  * API to reset OS private pointer in VDEV
1634  *
1635  * Return: void
1636  */
wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev * vdev)1637 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1638 {
1639 	vdev->vdev_nif.osdev = NULL;
1640 }
1641 
1642 /**
1643  * wlan_vdev_get_peer_count() - get vdev peer count
1644  * @vdev: VDEV object
1645  *
1646  * API to get peer count from VDEV
1647  *
1648  * Return: peer_count - vdev's peer count
1649  */
wlan_vdev_get_peer_count(struct wlan_objmgr_vdev * vdev)1650 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1651 {
1652 	return vdev->vdev_objmgr.wlan_peer_count;
1653 }
1654 
1655 #ifdef WLAN_FEATURE_11BE_MLO
1656 /**
1657  * wlan_vdev_get_legacy_peer_count() - get vdev peer count
1658  * @vdev: VDEV object
1659  *
1660  * API to get legacy peer count from VDEV
1661  *
1662  * Return: peer_count - vdev's peer count
1663  */
wlan_vdev_get_legacy_peer_count(struct wlan_objmgr_vdev * vdev)1664 static inline uint16_t wlan_vdev_get_legacy_peer_count(
1665 					struct wlan_objmgr_vdev *vdev)
1666 {
1667 	return vdev->vdev_objmgr.wlan_peer_count -
1668 	       qdf_atomic_read(&vdev->vdev_objmgr.wlan_ml_peer_count);
1669 }
1670 #else
wlan_vdev_get_legacy_peer_count(struct wlan_objmgr_vdev * vdev)1671 static inline uint16_t wlan_vdev_get_legacy_peer_count(
1672 					struct wlan_objmgr_vdev *vdev)
1673 {
1674 	return vdev->vdev_objmgr.wlan_peer_count;
1675 }
1676 #endif
1677 
1678 /**
1679  * wlan_vdev_mlme_is_ap() - Check whether @vdev is an AP or not
1680  * @vdev: VDEV object
1681  *
1682  * Return: True if @vdev is ap, otherwise false.
1683  */
wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev * vdev)1684 static inline bool wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev *vdev)
1685 {
1686 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE);
1687 }
1688 
1689 #ifdef WLAN_FEATURE_11BE_MLO
1690 /**
1691  * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO
1692  * vdev or not
1693  * @vdev: VDEV object
1694  *
1695  * Return: True if it is MLO, otherwise false.
1696  */
1697 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1698 
1699 #ifdef WLAN_MLO_MULTI_CHIP
1700 /**
1701  * wlan_vdev_mlme_is_mlo_bridge_vdev() - check if it is bridge vdev
1702  * @vdev: Object manager VDEV object
1703  *
1704  * API to get if given vdev is bridge vdev or not
1705  *
1706  * Return: True if it is bridge vdev, otherwise false.
1707  */
1708 bool wlan_vdev_mlme_is_mlo_bridge_vdev(struct wlan_objmgr_vdev *vdev);
1709 #else
1710 static inline bool
wlan_vdev_mlme_is_mlo_bridge_vdev(struct wlan_objmgr_vdev * vdev)1711 wlan_vdev_mlme_is_mlo_bridge_vdev(struct wlan_objmgr_vdev *vdev)
1712 {
1713 	return false;
1714 }
1715 #endif
1716 
1717 /**
1718  * wlan_vdev_mlme_is_tdls_vdev() - Determine whether the given vdev is tdls MLO
1719  * vdev or not
1720  * @vdev: VDEV object
1721  *
1722  * Return: True if it is tdls MLO, otherwise false.
1723  */
1724 bool wlan_vdev_mlme_is_tdls_vdev(struct wlan_objmgr_vdev *vdev);
1725 
1726 /**
1727  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
1728  * @vdev: VDEV object
1729  *
1730  * Return: True if it is mlo ap, otherwise false.
1731  */
wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev * vdev)1732 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1733 {
1734 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
1735 		wlan_vdev_mlme_is_mlo_vdev(vdev);
1736 }
1737 
1738 /**
1739  * wlan_vdev_mlme_set_epcs_flag() - Set epcs flag for vdev
1740  * @vdev: VDEV object
1741  * @flag: True or Flase
1742  *
1743  * Return: void
1744  */
1745 void wlan_vdev_mlme_set_epcs_flag(struct wlan_objmgr_vdev *vdev, bool flag);
1746 
1747 /**
1748  * wlan_vdev_mlme_get_epcs_flag() - Get epcs flag for vdev
1749  * @vdev: VDEV object
1750  *
1751  * Return: bool
1752  */
1753 bool wlan_vdev_mlme_get_epcs_flag(struct wlan_objmgr_vdev *vdev);
1754 
1755 /**
1756  * wlan_vdev_mlme_set_user_dis_eht_flag() - Set user disable eht flag for vdev
1757  * @vdev: VDEV object
1758  * @flag: True or Flase
1759  *
1760  * Return: void
1761  */
1762 void wlan_vdev_mlme_set_user_dis_eht_flag(struct wlan_objmgr_vdev *vdev,
1763 					  bool flag);
1764 
1765 /**
1766  * wlan_vdev_mlme_get_user_dis_eht_flag() - Get user disable eht flag for vdev
1767  * @vdev: VDEV object
1768  *
1769  * Return: bool
1770  */
1771 bool wlan_vdev_mlme_get_user_dis_eht_flag(struct wlan_objmgr_vdev *vdev);
1772 
1773 /**
1774  * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev
1775  * @vdev: VDEV object
1776  *
1777  * Return: void
1778  */
1779 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1780 
1781 /**
1782  * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev
1783  * @vdev: VDEV object
1784  *
1785  * Return: void
1786  */
1787 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
1788 
1789 /**
1790  * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev
1791  * @vdev: VDEV object
1792  *
1793  * Return: void
1794  */
1795 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1796 
1797 /**
1798  * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an
1799  * MLO link vdev
1800  * @vdev: VDEV object
1801  *
1802  * Return: void
1803  */
1804 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
1805 
1806 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
1807 /**
1808  * wlan_vdev_mlme_set_mlo_link_switch_in_progress() - Set link switch in
1809  * progress flag for VDEV.
1810  * @vdev: VDEV object manager.
1811  *
1812  * Return: void
1813  */
1814 static inline void
wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1815 wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1816 {
1817 	unsigned long flag = WLAN_VDEV_OP_MLO_LINK_SWITCH_IN_PROGRESS;
1818 
1819 	wlan_vdev_mlme_op_flags_set(vdev, flag);
1820 }
1821 
1822 /**
1823  * wlan_vdev_mlme_clear_mlo_link_switch_in_progress() - Clear link switch in
1824  * progress flag for VDEV.
1825  * @vdev: VDEV object manager
1826  *
1827  * Return: void
1828  */
1829 static inline void
wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1830 wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1831 {
1832 	unsigned long flag = WLAN_VDEV_OP_MLO_LINK_SWITCH_IN_PROGRESS;
1833 
1834 	wlan_vdev_mlme_op_flags_clear(vdev, flag);
1835 }
1836 
1837 /**
1838  * wlan_vdev_mlme_is_mlo_link_switch_in_progress() - Return true if VDEV is
1839  * in link transitioning state.
1840  * @vdev: VDEV object manager.
1841  *
1842  * Return: bool
1843  */
1844 static inline bool
wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1845 wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1846 {
1847 	unsigned long flag = WLAN_VDEV_OP_MLO_LINK_SWITCH_IN_PROGRESS;
1848 
1849 	return wlan_vdev_mlme_op_flags_get(vdev, flag);
1850 }
1851 #else
1852 static inline void
wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1853 wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1854 {
1855 }
1856 
1857 static inline void
wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1858 wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1859 {
1860 }
1861 
1862 static inline bool
wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1863 wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1864 {
1865 	return false;
1866 }
1867 #endif /* WLAN_FEATURE_11BE_MLO_ADV_FEATURE  */
1868 
1869 #ifdef WLAN_MCAST_MLO
1870 /**
1871  * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not
1872  * @vdev: VDEV object
1873  *
1874  * Return: True if it is mlo mcast vdev, otherwise false.
1875  */
1876 static inline
wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev * vdev)1877 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1878 {
1879 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1880 						WLAN_VDEV_FEXT2_MLO_MCAST);
1881 }
1882 #else
1883 static inline
wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev * vdev)1884 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev)
1885 {
1886 	return false;
1887 }
1888 #endif
1889 
1890 /**
1891  * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not
1892  * @vdev: VDEV object
1893  *
1894  * Return: True if it is mlo sta link, otherwise false.
1895  */
1896 static inline
wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev * vdev)1897 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1898 {
1899 	return wlan_vdev_mlme_feat_ext2_cap_get(vdev,
1900 						WLAN_VDEV_FEXT2_MLO_STA_LINK);
1901 }
1902 
1903 /**
1904  * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not
1905  * @vdev: VDEV object
1906  *
1907  * Return: True if it is mlo sta assoc vdev, otherwise false.
1908  */
1909 static inline
wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev * vdev)1910 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
1911 {
1912 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1913 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1914 		return false;
1915 
1916 	if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1917 		return true;
1918 
1919 	return false;
1920 }
1921 
1922 /**
1923  * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not
1924  * @vdev: VDEV object
1925  *
1926  * Return: True if it is mlo sta link vdev, otherwise false.
1927  */
1928 static inline
wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev * vdev)1929 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
1930 {
1931 	if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) ||
1932 	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
1933 		return false;
1934 
1935 	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev))
1936 		return true;
1937 
1938 	return false;
1939 }
1940 #else
1941 static inline
wlan_vdev_mlme_set_user_dis_eht_flag(struct wlan_objmgr_vdev * vdev,bool flag)1942 void wlan_vdev_mlme_set_user_dis_eht_flag(struct wlan_objmgr_vdev *vdev,
1943 					  bool flag)
1944 {
1945 }
1946 
1947 static inline
wlan_vdev_mlme_get_user_dis_eht_flag(struct wlan_objmgr_vdev * vdev)1948 bool wlan_vdev_mlme_get_user_dis_eht_flag(struct wlan_objmgr_vdev *vdev)
1949 {
1950 	return false;
1951 }
1952 
1953 static inline
wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev * vdev)1954 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1955 {
1956 	return false;
1957 }
1958 
1959 static inline bool
wlan_vdev_mlme_is_mlo_bridge_vdev(struct wlan_objmgr_vdev * vdev)1960 wlan_vdev_mlme_is_mlo_bridge_vdev(struct wlan_objmgr_vdev *vdev)
1961 {
1962 	return false;
1963 }
1964 
wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev * vdev)1965 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
1966 {
1967 	return false;
1968 }
1969 
1970 static inline
wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev * vdev)1971 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1972 {
1973 }
1974 
1975 static inline
wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev * vdev)1976 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
1977 {
1978 }
1979 
1980 static inline
wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev * vdev)1981 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1982 {
1983 }
1984 
1985 static inline
wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev * vdev)1986 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
1987 {
1988 }
1989 
1990 static inline void
wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1991 wlan_vdev_mlme_set_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1992 {
1993 }
1994 
1995 static inline void
wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)1996 wlan_vdev_mlme_clear_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
1997 {
1998 }
1999 
2000 static inline bool
wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev * vdev)2001 wlan_vdev_mlme_is_mlo_link_switch_in_progress(struct wlan_objmgr_vdev *vdev)
2002 {
2003 	return false;
2004 }
2005 
2006 static inline
wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev * vdev)2007 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
2008 {
2009 	return false;
2010 }
2011 
2012 static inline
wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev * vdev)2013 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev)
2014 {
2015 	return false;
2016 }
2017 
2018 static inline
wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev * vdev)2019 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
2020 {
2021 	return false;
2022 }
2023 #endif
2024 
2025 /**
2026  * DOC: Examples to use VDEV ref count APIs
2027  *
2028  * In all the scenarios, the pair of API should be followed
2029  * other it lead to memory leak
2030  *
2031  *  scenario 1:
2032  *
2033  *     wlan_objmgr_vdev_obj_create()
2034  *     ----
2035  *     wlan_objmgr_vdev_obj_delete()
2036  *
2037  *  scenario 2:
2038  *
2039  *     wlan_objmgr_vdev_get_ref()
2040  *     ----
2041  *     the operations which are done on
2042  *     vdev object
2043  *     ----
2044  *     wlan_objmgr_vdev_release_ref()
2045  *
2046  *  scenario 3:
2047  *
2048  *     API to retrieve vdev (xxx_get_vdev_xxx())
2049  *     ----
2050  *     the operations which are done on
2051  *     vdev object
2052  *     ----
2053  *     wlan_objmgr_vdev_release_ref()
2054  */
2055 
2056 /**
2057  * wlan_objmgr_vdev_get_ref() - increment ref count
2058  * @vdev: VDEV object
2059  * @id:   Object Manager ref debug id
2060  *
2061  * API to increment ref count of vdev
2062  *
2063  * Return: void
2064  */
2065 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2066 #define wlan_objmgr_vdev_get_ref(vdev, id) \
2067 		wlan_objmgr_vdev_get_ref_debug(vdev, id, __func__, __LINE__)
2068 
2069 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
2070 				    wlan_objmgr_ref_dbgid id,
2071 				    const char *func, int line);
2072 #else
2073 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
2074 				wlan_objmgr_ref_dbgid id);
2075 #endif
2076 
2077 /**
2078  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
2079  * @vdev: VDEV object
2080  * @id:   Object Manager ref debug id
2081  *
2082  * API to increment ref count of vdev after checking valid object state
2083  *
2084  * Return: void
2085  */
2086 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2087 #define wlan_objmgr_vdev_try_get_ref(vdev, id) \
2088 		wlan_objmgr_vdev_try_get_ref_debug(vdev, id, \
2089 		__func__, __LINE__)
2090 
2091 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
2092 					      wlan_objmgr_ref_dbgid id,
2093 					      const char *func, int line);
2094 #else
2095 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
2096 						wlan_objmgr_ref_dbgid id);
2097 #endif
2098 
2099 /**
2100  * wlan_objmgr_vdev_release_ref() - decrement ref count
2101  * @vdev: VDEV object
2102  * @id:   Object Manager ref debug id
2103  *
2104  * API to decrement ref count of vdev, if ref count is 1, it initiates the
2105  * VDEV deletion
2106  *
2107  * Return: void
2108  */
2109 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2110 #define wlan_objmgr_vdev_release_ref(vdev, id)\
2111 		wlan_objmgr_vdev_release_ref_debug(vdev, id, \
2112 		__func__, __LINE__)
2113 
2114 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
2115 					wlan_objmgr_ref_dbgid id,
2116 					const char *func, int line);
2117 #else
2118 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
2119 						wlan_objmgr_ref_dbgid id);
2120 #endif
2121 
2122 /**
2123  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
2124  * @pdev: PDEV object
2125  * @vdev_list: qdf_list_t
2126  * @vdev: VDEV object
2127  * @dbg_id: id of the caller
2128  *
2129  * API to get next active vdev object pointer of vdev
2130  *
2131  * Return: VDEV object
2132  */
2133 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2134 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbg_id) \
2135 		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
2136 		vdev, dbg_id, __func__, __LINE__)
2137 
2138 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
2139 					struct wlan_objmgr_pdev *pdev,
2140 					qdf_list_t *vdev_list,
2141 					struct wlan_objmgr_vdev *vdev,
2142 					wlan_objmgr_ref_dbgid dbg_id,
2143 					const char *func, int line);
2144 #else
2145 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
2146 					struct wlan_objmgr_pdev *pdev,
2147 					qdf_list_t *vdev_list,
2148 					struct wlan_objmgr_vdev *vdev,
2149 					wlan_objmgr_ref_dbgid dbg_id);
2150 #endif
2151 
2152 /**
2153  * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
2154  * @pdev: PDEV object
2155  * @dbg_id: id of the caller
2156  *
2157  * API to get the head active vdev of given pdev (of pdev's vdev list)
2158  *
2159  * Return:
2160  */
2161 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2162 #define wlan_pdev_peek_active_first_vdev(pdev, dbg_id) \
2163 		wlan_pdev_peek_active_first_vdev_debug(pdev, dbg_id, \
2164 		__func__, __LINE__)
2165 
2166 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
2167 		struct wlan_objmgr_pdev *pdev,
2168 		wlan_objmgr_ref_dbgid dbg_id,
2169 		const char *func, int line);
2170 #else
2171 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
2172 		struct wlan_objmgr_pdev *pdev,
2173 		wlan_objmgr_ref_dbgid dbg_id);
2174 #endif
2175 
2176 /**
2177  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
2178  * @pdev: PDEV object
2179  * @vdev_list: qdf_list_t
2180  * @dbg_id: id of the caller
2181  *
2182  * API to get the head active vdev of given vdev (of pdev's vdev list)
2183  *
2184  * Return: head peer
2185  */
2186 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2187 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbg_id) \
2188 		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
2189 		dbg_id, __func__, __LINE__)
2190 
2191 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
2192 				struct wlan_objmgr_pdev *pdev,
2193 				qdf_list_t *vdev_list,
2194 				wlan_objmgr_ref_dbgid dbg_id,
2195 				const char *func, int line);
2196 #else
2197 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
2198 				struct wlan_objmgr_pdev *pdev,
2199 				qdf_list_t *vdev_list,
2200 				wlan_objmgr_ref_dbgid dbg_id);
2201 #endif
2202 
2203 /**
2204  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed
2205  * @vdev: VDEV object
2206  *
2207  * API to invokes registered callbacks to notify about peer freed
2208  *
2209  * Return: void
2210  */
2211 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev);
2212 
2213 /**
2214  * wlan_vdev_set_max_peer_count() - set max peer count
2215  * @vdev: VDEV object
2216  * @count: Max peer count
2217  *
2218  * API to set max peer count of VDEV
2219  *
2220  * Return: void
2221  */
wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev * vdev,uint16_t count)2222 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
2223 						uint16_t count)
2224 {
2225 	vdev->vdev_objmgr.max_peer_count = count;
2226 }
2227 
2228 /**
2229  * wlan_vdev_get_max_peer_count() - get max peer count
2230  * @vdev: VDEV object
2231  *
2232  * API to get max peer count of VDEV
2233  *
2234  * Return: max peer count
2235  */
wlan_vdev_get_max_peer_count(struct wlan_objmgr_vdev * vdev)2236 static inline uint16_t wlan_vdev_get_max_peer_count(
2237 						struct wlan_objmgr_vdev *vdev)
2238 {
2239 	return vdev->vdev_objmgr.max_peer_count;
2240 }
2241 
2242 #ifdef WLAN_FEATURE_11BE_MLO
2243 /**wlan_vdev_set_mlo_external_sae_auth_conversion() - set MLO external sae auth
2244  * @vdev: VDEV object
2245  * @val: true or false
2246  *
2247  * API to set mlo external sae auth of VDEV
2248  *
2249  * Return: void
2250  */
2251 static inline void
wlan_vdev_set_mlo_external_sae_auth_conversion(struct wlan_objmgr_vdev * vdev,bool val)2252 wlan_vdev_set_mlo_external_sae_auth_conversion(struct wlan_objmgr_vdev *vdev,
2253 					       bool val)
2254 {
2255 	vdev->vdev_mlme.mlo_external_sae_auth = val;
2256 }
2257 
2258 /**wlan_vdev_get_mlo_external_sae_auth_conversion() - get MLO external sae auth
2259  * @vdev: VDEV object
2260  *
2261  * API to get mlo external sae auth of VDEV
2262  *
2263  * Return: mlo external sae auth of VDEV
2264  */
2265 static inline bool
wlan_vdev_get_mlo_external_sae_auth_conversion(struct wlan_objmgr_vdev * vdev)2266 wlan_vdev_get_mlo_external_sae_auth_conversion(struct wlan_objmgr_vdev *vdev)
2267 {
2268 	return vdev->vdev_mlme.mlo_external_sae_auth;
2269 }
2270 #endif
2271 
2272 /**
2273  * wlan_print_vdev_info() - print vdev members
2274  * @vdev: vdev object pointer
2275  *
2276  * Return: void
2277  */
2278 #ifdef WLAN_OBJMGR_DEBUG
2279 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev);
2280 #else
wlan_print_vdev_info(struct wlan_objmgr_vdev * vdev)2281 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {}
2282 #endif
2283 
2284 /**
2285  * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock
2286  * @vdev: vdev object pointer
2287  *
2288  * Return: void
2289  */
2290 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2291 static inline void
wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev * vdev)2292 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
2293 {
2294 	wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace);
2295 }
2296 #else
2297 static inline void
wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev * vdev)2298 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev)
2299 {
2300 }
2301 #endif
2302 
2303 /**
2304  * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock
2305  * @vdev: vdev object pointer
2306  *
2307  * Return: void
2308  */
2309 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2310 static inline void
wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev * vdev)2311 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2312 {
2313 	wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace);
2314 }
2315 #else
2316 static inline void
wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev * vdev)2317 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev)
2318 {
2319 }
2320 #endif
2321 
2322 /**
2323  * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list
2324  * @vdev: vdev object pointer
2325  *
2326  * Return: void
2327  */
2328 #ifdef WLAN_OBJMGR_REF_ID_TRACE
2329 static inline void
wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev * vdev)2330 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2331 {
2332 	wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace);
2333 }
2334 #else
2335 static inline void
wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev * vdev)2336 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev)
2337 {
2338 }
2339 #endif
2340 
2341 /**
2342  * wlan_vdev_get_bss_peer_mac_for_pmksa() - To get bss peer mac/mld
2343  * address based on association to cache/retrieve PMK.
2344  * @vdev: Pointer to vdev
2345  * @bss_peer_mac: Pointer to BSS peer MAC address.
2346  *
2347  * The PMKSA entry for an ML candaidate will be present with MLD
2348  * address, whereas for non-ML candidate legacy MAC address is used
2349  * to save the PMKSA. To get the right entry during lookup, this API
2350  * will return MLD address if the VDEV is MLO VDEV else return
2351  * MAC address of BSS peer.
2352  *
2353  * Return: QDF_STATUS
2354  */
2355 QDF_STATUS
2356 wlan_vdev_get_bss_peer_mac_for_pmksa(struct wlan_objmgr_vdev *vdev,
2357 				     struct qdf_mac_addr *bss_peer_mac);
2358 
2359 /**
2360  * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address
2361  * @vdev: pointer to vdev
2362  * @bss_peer_mac: pointer to bss_peer_mac_address
2363  *
2364  * This API is used to get mac address of peer.
2365  *
2366  * Context: Any context.
2367  *
2368  * Return: QDF_STATUS based on overall success
2369  */
2370 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev,
2371 				      struct qdf_mac_addr *bss_peer_mac);
2372 
2373 #ifdef WLAN_FEATURE_11BE_MLO
2374 /**
2375  * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address
2376  * @vdev: pointer to vdev
2377  * @mld_mac: pointer to mld mac address
2378  *
2379  * This API is used to get mld mac address of peer.
2380  *
2381  * Context: Any context.
2382  *
2383  * Return: QDF_STATUS based on overall success
2384  */
2385 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
2386 					  struct qdf_mac_addr *mld_mac);
2387 
2388 /**
2389  * wlan_vdev_get_mlo_dev_ctx() - get MLO dev context
2390  * @vdev: VDEV object
2391  *
2392  * API to get MLO dev context pointer from vdev
2393  *
2394  * Return: MLO dev context pointer
2395  */
wlan_vdev_get_mlo_dev_ctx(struct wlan_objmgr_vdev * vdev)2396 static inline struct wlan_mlo_dev_context *wlan_vdev_get_mlo_dev_ctx(
2397 				struct wlan_objmgr_vdev *vdev)
2398 {
2399 	return vdev->mlo_dev_ctx;
2400 }
2401 
2402 /**
2403  * wlan_objmgr_vdev_init_ml_peer_count() - initialize ml_peer_count
2404  * @vdev: vdev object pointer
2405  *
2406  * Return: void
2407  */
2408 static inline void
wlan_objmgr_vdev_init_ml_peer_count(struct wlan_objmgr_vdev * vdev)2409 wlan_objmgr_vdev_init_ml_peer_count(struct wlan_objmgr_vdev *vdev)
2410 {
2411 	qdf_atomic_init(&vdev->vdev_objmgr.wlan_ml_peer_count);
2412 }
2413 
2414 #else
2415 static inline
wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev * vdev,struct qdf_mac_addr * mld_mac)2416 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
2417 					  struct qdf_mac_addr *mld_mac)
2418 {
2419 	return QDF_STATUS_E_INVAL;
2420 }
2421 
2422 static inline void
wlan_objmgr_vdev_init_ml_peer_count(struct wlan_objmgr_vdev * vdev)2423 wlan_objmgr_vdev_init_ml_peer_count(struct wlan_objmgr_vdev *vdev)
2424 {
2425 }
2426 
2427 static inline
wlan_vdev_mlme_is_tdls_vdev(struct wlan_objmgr_vdev * vdev)2428 bool wlan_vdev_mlme_is_tdls_vdev(struct wlan_objmgr_vdev *vdev)
2429 {
2430 	return false;
2431 }
2432 
2433 #endif
2434 
2435 /**
2436  * wlan_mlo_peer_delete_is_not_allowed()
2437  * @vdev: VDEV object
2438  *
2439  * API to check if WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG is set therefore
2440  * whether mlo peer delete should be allowed or not
2441  *
2442  * Return: True if MLO peer delete is not allowed, otherwise false.
2443  */
wlan_mlo_peer_delete_is_not_allowed(struct wlan_objmgr_vdev * vdev)2444 static inline bool wlan_mlo_peer_delete_is_not_allowed(
2445 		struct wlan_objmgr_vdev *vdev)
2446 {
2447 	return wlan_vdev_mlme_op_flags_get(vdev,
2448 				WLAN_VDEV_OP_MLME_LEGACY_PEER_DISCON_TRIG);
2449 }
2450 
2451 #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
2452 /**
2453  * wlan_vdev_init_skip_pumac_cnt() - init skip_pumac_cnt
2454  * @vdev: VDEV object
2455  *
2456  * API to initialize skip_pumac_cnt
2457  *
2458  * Return: void
2459  */
2460 static inline void
wlan_vdev_init_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2461 wlan_vdev_init_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2462 {
2463 	qdf_atomic_init(&vdev->vdev_mlme.skip_pumac_cnt);
2464 }
2465 
2466 /**
2467  * wlan_vdev_inc_skip_pumac_cnt() - inc skip_pumac_cnt
2468  * @vdev: VDEV object
2469  *
2470  * API to increment skip_pumac_cnt
2471  *
2472  * Return: void
2473  */
2474 static inline void
wlan_vdev_inc_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2475 wlan_vdev_inc_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2476 {
2477 	qdf_atomic_inc(&vdev->vdev_mlme.skip_pumac_cnt);
2478 }
2479 
2480 /**
2481  * wlan_vdev_dec_skip_pumac_cnt() - dec skip_pumac_cnt
2482  * @vdev: VDEV object
2483  *
2484  * API to decrement skip_pumac_cnt
2485  *
2486  * Return: void
2487  */
2488 static inline void
wlan_vdev_dec_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2489 wlan_vdev_dec_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2490 {
2491 	qdf_atomic_dec(&vdev->vdev_mlme.skip_pumac_cnt);
2492 }
2493 
2494 /**
2495  * wlan_vdev_read_skip_pumac_cnt() - read skip_pumac_cnt
2496  * @vdev: VDEV object
2497  *
2498  * API to read skip_pumac_cnt value
2499  *
2500  * Return: skip_pumac_cnt value
2501  */
2502 static inline int32_t
wlan_vdev_read_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2503 wlan_vdev_read_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2504 {
2505 	return qdf_atomic_read(&vdev->vdev_mlme.skip_pumac_cnt);
2506 }
2507 #else
2508 static inline void
wlan_vdev_init_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2509 wlan_vdev_init_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2510 { }
2511 
2512 static inline void
wlan_vdev_inc_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2513 wlan_vdev_inc_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2514 { }
2515 
2516 static inline void
wlan_vdev_dec_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2517 wlan_vdev_dec_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2518 { }
2519 
2520 static inline int32_t
wlan_vdev_read_skip_pumac_cnt(struct wlan_objmgr_vdev * vdev)2521 wlan_vdev_read_skip_pumac_cnt(struct wlan_objmgr_vdev *vdev)
2522 {
2523 	return 0;
2524 }
2525 #endif
2526 
2527 /**
2528  * wlan_vdev_get_peer_sta_count: Get peer STA count
2529  * @vdev: Pointer to vdev
2530  *
2531  * Return: STA peer count
2532  */
2533 uint8_t wlan_vdev_get_peer_sta_count(struct wlan_objmgr_vdev *vdev);
2534 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
2535