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