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