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