xref: /wlan-dirver/qca-wifi-host-cmn/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h (revision 8ddef7dd9a290d4a9b1efd5d3efacf51d78a1a0d)
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_width:     Channel width.
265  * @ch_phymode:   Channel phymode.
266  */
267 struct wlan_channel {
268 	uint16_t     ch_freq;
269 	uint8_t      ch_ieee;
270 	uint64_t     ch_flags;
271 	uint16_t     ch_flagext;
272 	int8_t       ch_maxpower;
273 	uint8_t      ch_freq_seg1;
274 	uint8_t      ch_freq_seg2;
275 	enum phy_ch_width ch_width;
276 	enum wlan_phymode ch_phymode;
277 };
278 
279 /**
280  * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure
281  * @vdev_opmode:        Opmode of VDEV
282  * @mlme_state:         VDEV MLME SM state
283  * @mlme_state:         VDEV MLME SM substate
284  * @bss_chan:           BSS channel
285  * @des_chan:           Desired channel, for STA Desired may not be used
286  * @vdev_caps:          VDEV capabilities
287  * @vdev_feat_caps:     VDEV feature caps
288  * @vdev_feat_ext_caps: VDEV Extended feature caps
289  * @vdev_op_flags:      Operation flags
290  * @mataddr[]:          MAT address
291  * @macaddr[]:          VDEV self MAC address
292  * @ssid[]:             SSID
293  * @ssid_len:           SSID length
294  * @nss:                Num. Spatial streams
295  * @tx_chainmask:       Tx Chainmask
296  * @rx_chainmask:       Rx Chainmask
297  * @tx_power:           Tx power
298  * @max_rate:           MAX rate
299  * @tx_mgmt_rate:       TX Mgmt. Rate
300  * @per_band_mgmt_rate: Per-band TX Mgmt. Rate
301  */
302 struct wlan_objmgr_vdev_mlme {
303 	enum QDF_OPMODE vdev_opmode;
304 	enum wlan_vdev_state mlme_state;
305 	enum wlan_vdev_state mlme_substate;
306 	struct wlan_channel *bss_chan;
307 	struct wlan_channel *des_chan;
308 	uint32_t vdev_caps;
309 	uint32_t vdev_feat_caps;
310 	uint32_t vdev_feat_ext_caps;
311 	uint32_t vdev_op_flags;
312 	uint8_t  mataddr[QDF_MAC_ADDR_SIZE];
313 	uint8_t  macaddr[QDF_MAC_ADDR_SIZE];
314 #ifndef CMN_VDEV_MGR_TGT_IF_ENABLE
315 	char ssid[WLAN_SSID_MAX_LEN + 1];
316 	uint8_t ssid_len;
317 	uint8_t nss;
318 	uint8_t tx_chainmask;
319 	uint8_t rx_chainmask;
320 	uint8_t  tx_power;
321 	uint32_t max_rate;
322 	uint32_t tx_mgmt_rate;
323 	uint32_t per_band_mgmt_rate[WLAN_BAND_NUM_MAX];
324 #endif
325 };
326 
327 /**
328  *  struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure
329  *  @osdev:  OS specific pointer
330  */
331 struct wlan_objmgr_vdev_nif {
332 	struct vdev_osif_priv *osdev;
333 };
334 
335 /**
336  *  struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure
337  *  @vdev_id:           VDEV id
338  *  @print_cnt:         Count to throttle Logical delete prints
339  *  @self_peer:         Self PEER
340  *  @bss_peer:          BSS PEER
341  *  @wlan_peer_list:    PEER list
342  *  @wlan_pdev:         PDEV pointer
343  *  @wlan_peer_count:   Peer count
344  *  @max_peer_count:    Max Peer count
345  *  @c_flags:           creation specific flags
346  *  @ref_cnt:           Ref count
347  *  @ref_id_dbg:        Array to track Ref count
348  */
349 struct wlan_objmgr_vdev_objmgr {
350 	uint8_t vdev_id;
351 	uint8_t print_cnt;
352 	struct wlan_objmgr_peer *self_peer;
353 	struct wlan_objmgr_peer *bss_peer;
354 	qdf_list_t wlan_peer_list;
355 	struct wlan_objmgr_pdev *wlan_pdev;
356 	uint16_t wlan_peer_count;
357 	uint16_t max_peer_count;
358 	uint32_t c_flags;
359 	qdf_atomic_t ref_cnt;
360 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
361 };
362 
363 /**
364  * struct wlan_objmgr_vdev - VDEV common object
365  * @vdev_node:      qdf list of pdev's vdev list
366  * @vdev_mlme:      VDEV MLME substructure
367  * @vdev_objmgr:    VDEV Object Mgr substructure
368  * @vdev_nif:       VDEV HDD substructure
369  * @vdev_comp_priv_obj[]:Component's private objects list
370  * @obj_status[]:   Component object status
371  * @obj_state:      VDEV object state
372  * @dp_handle:      DP module handle
373  * @vdev_lock:      VDEV lock
374  */
375 struct wlan_objmgr_vdev {
376 	qdf_list_node_t vdev_node;
377 	struct wlan_objmgr_vdev_mlme vdev_mlme;
378 	struct wlan_objmgr_vdev_objmgr vdev_objmgr;
379 	struct wlan_objmgr_vdev_nif vdev_nif;
380 	void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS];
381 	QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS];
382 	WLAN_OBJ_STATE obj_state;
383 	void *dp_handle;
384 	qdf_spinlock_t vdev_lock;
385 };
386 
387 /**
388  ** APIs to Create/Delete Global object APIs
389  */
390 /**
391  * wlan_objmgr_vdev_obj_create() - vdev object create
392  * @pdev: PDEV object on which this vdev gets created
393  * @params: VDEV create params from HDD
394  *
395  * Creates vdev object, intializes with default values
396  * Attaches to psoc and pdev objects
397  * Invokes the registered notifiers to create component object
398  *
399  * Return: Handle to struct wlan_objmgr_vdev on successful creation,
400  *         NULL on Failure (on Mem alloc failure and Component objects
401  *         Failure)
402  */
403 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
404 			struct wlan_objmgr_pdev *pdev,
405 			struct wlan_vdev_create_params *params);
406 
407 /**
408  * wlan_objmgr_vdev_obj_delete() - vdev object delete
409  * @vdev: vdev object
410  *
411  * Logically deletes VDEV object,
412  * Once all the references are released, object manager invokes the registered
413  * notifiers to destroy component objects
414  *
415  * Return: SUCCESS/FAILURE
416  */
417 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev);
418 
419 /**
420  ** APIs to attach/detach component objects
421  */
422 /**
423  * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach
424  * @vdev: VDEV object
425  * @id: Component id
426  * @comp_priv_obj: component's private object pointer
427  * @status: Component's private object creation status
428  *
429  * API to be used for attaching component object with VDEV common object
430  *
431  * Return: SUCCESS on successful storing of component's object in common object
432  *         On FAILURE (appropriate failure codes are returned)
433  */
434 QDF_STATUS wlan_objmgr_vdev_component_obj_attach(
435 		struct wlan_objmgr_vdev *vdev,
436 		enum wlan_umac_comp_id id,
437 		void *comp_priv_obj,
438 		QDF_STATUS status);
439 
440 /**
441  * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach
442  * @vdev: VDEV object
443  * @id: Component id
444  * @comp_priv_obj: component's private object pointer
445  *
446  * API to be used for detaching component object with VDEV common object
447  *
448  * Return: SUCCESS on successful removal of component's object from common
449  *         object
450  *         On FAILURE (appropriate failure codes are returned)
451  */
452 QDF_STATUS wlan_objmgr_vdev_component_obj_detach(
453 		struct wlan_objmgr_vdev *vdev,
454 		enum wlan_umac_comp_id id,
455 		void *comp_priv_obj);
456 /*
457  ** APIs to operations on vdev objects
458 */
459 
460 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev,
461 					void *object,
462 					void *arg);
463 
464 /**
465  * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list
466  * @vdev: vdev object
467  * @handler: the handler will be called for each object of requested type
468  *            the handler should be implemented to perform required operation
469  * @arg:     agruments passed by caller
470  * @dbg_id: id of the caller
471  *
472  * API to be used for performing the operations on all PEER objects
473  * of vdev
474  *
475  * Return: SUCCESS/FAILURE
476  */
477 QDF_STATUS wlan_objmgr_iterate_peerobj_list(
478 		struct wlan_objmgr_vdev *vdev,
479 		wlan_objmgr_vdev_op_handler handler,
480 		void *arg, wlan_objmgr_ref_dbgid dbg_id);
481 
482 /**
483  * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev
484  * comp object creation
485  * @vdev: VDEV object
486  * @id: Component id
487  *
488  * API to create component private object in run time, this would
489  * be used for features which gets enabled in run time
490  *
491  * Return: SUCCESS on successful creation
492  *         On FAILURE (appropriate failure codes are returned)
493  */
494 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation(
495 		struct wlan_objmgr_vdev *vdev,
496 		enum wlan_umac_comp_id id);
497 
498 /**
499  * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp
500  *                                                        object deletion
501  * @vdev: VDEV object
502  * @id: Component id
503  *
504  * API to destroy component private object in run time, this would
505  * be used for features which gets disabled in run time
506  *
507  * Return: SUCCESS on successful deletion
508  *         On FAILURE (appropriate failure codes are returned)
509  */
510 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion(
511 		struct wlan_objmgr_vdev *vdev,
512 		enum wlan_umac_comp_id id);
513 
514 /**
515  * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object
516  * @vdev: VDEV object
517  * @id: Component id
518  *
519  * API to get component private object
520  *
521  * Return: void *ptr on SUCCESS
522  *         NULL on Failure
523  */
524 void *wlan_objmgr_vdev_get_comp_private_obj(
525 		struct wlan_objmgr_vdev *vdev,
526 		enum wlan_umac_comp_id id);
527 
528 /* Util APIs */
529 
530 /**
531  * wlan_vdev_get_pdev() - get pdev
532  * @vdev: VDEV object
533  *
534  * API to get pdev object pointer from vdev
535  *
536  * Return: pdev object pointer
537  */
538 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev(
539 				struct wlan_objmgr_vdev *vdev)
540 {
541 	return vdev->vdev_objmgr.wlan_pdev;
542 }
543 
544 /**
545  * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list
546  * @peer_list: qdf_list_t
547  *
548  * API to get the head vdev of given vdev (of pdev's vdev list)
549  *
550  * Caller need to acquire lock with wlan_vdev_obj_lock()
551  *
552  * Return:
553  * @peer: head peer
554  */
555 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
556 					qdf_list_t *vdev_list)
557 {
558 	struct wlan_objmgr_vdev *vdev;
559 	qdf_list_node_t *vdev_node = NULL;
560 
561 	/* This API is invoked with lock acquired, do not add log prints */
562 	if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS)
563 		return NULL;
564 
565 	vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node);
566 	return vdev;
567 }
568 
569 /**
570  * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
571  * @vdev: VDEV object
572  * @vdev_list: qdf_list_t
573  * @dbg_id: id of the caller
574  *
575  * API to get the head active vdev of given vdev (of pdev's vdev list)
576  *
577  * Return:
578  * @peer: head peer
579  */
580 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
581 				struct wlan_objmgr_pdev *pdev,
582 				qdf_list_t *vdev_list,
583 				wlan_objmgr_ref_dbgid dbg_id);
584 
585 /**
586  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
587  * @vdev: VDEV object
588  *
589  * API to get next vdev object pointer of vdev
590  *
591  * Caller need to acquire lock with wlan_vdev_obj_lock()
592  *
593  * Return:
594  * @vdev_next: VDEV object
595  */
596 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
597 					qdf_list_t *vdev_list,
598 					struct wlan_objmgr_vdev *vdev)
599 {
600 	struct wlan_objmgr_vdev *vdev_next;
601 	qdf_list_node_t *node = &vdev->vdev_node;
602 	qdf_list_node_t *next_node = NULL;
603 
604 	/* This API is invoked with lock acquired, do not add log prints */
605 	if (node == NULL)
606 		return NULL;
607 
608 	if (qdf_list_peek_next(vdev_list, node, &next_node) !=
609 						QDF_STATUS_SUCCESS)
610 		return NULL;
611 
612 	vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev,
613 				vdev_node);
614 	return vdev_next;
615 }
616 
617 /**
618  * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
619  * @pdev: PDEV object
620  * @vdev_list: qdf_list_t
621  * @vdev: VDEV object
622  * @dbg_id: id of the caller
623  *
624  * API to get next active vdev object pointer of vdev
625  *
626  * Return:
627  * @vdev_next: VDEV object
628  */
629 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
630 					struct wlan_objmgr_pdev *pdev,
631 					qdf_list_t *vdev_list,
632 					struct wlan_objmgr_vdev *vdev,
633 					wlan_objmgr_ref_dbgid dbg_id);
634 
635 
636 /**
637  * wlan_vdev_set_pdev() - set pdev
638  * @vdev: VDEV object
639  * @pdev: PDEV object
640  *
641  * API to get pdev object pointer from vdev
642  *
643  * Caller need to acquire lock with wlan_vdev_obj_lock()
644  *
645  * Return: void
646  */
647 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev,
648 					struct wlan_objmgr_pdev *pdev)
649 {
650 	/* This API is invoked with lock acquired, do not add log prints */
651 	vdev->vdev_objmgr.wlan_pdev = pdev;
652 }
653 
654 /**
655  * wlan_vdev_get_psoc() - get psoc
656  * @vdev: VDEV object
657  *
658  * API to get pdev object pointer from vdev
659  *
660  * Return: psoc object pointer
661  */
662 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc(
663 				struct wlan_objmgr_vdev *vdev)
664 {
665 	struct wlan_objmgr_pdev *pdev;
666 	struct wlan_objmgr_psoc *psoc = NULL;
667 
668 	pdev = wlan_vdev_get_pdev(vdev);
669 	if (pdev == NULL)
670 		return NULL;
671 
672 	psoc = wlan_pdev_get_psoc(pdev);
673 
674 	return psoc;
675 }
676 
677 /**
678  * wlan_vdev_mlme_set_opmode() - set vdev opmode
679  * @vdev: VDEV object
680  * @mode: VDEV op mode
681  *
682  * API to set opmode in vdev object
683  *
684  * Return: void
685  */
686 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev,
687 				enum QDF_OPMODE mode)
688 {
689 	vdev->vdev_mlme.vdev_opmode = mode;
690 }
691 
692 /**
693  * wlan_vdev_mlme_get_opmode() - get vdev opmode
694  * @vdev: VDEV object
695  *
696  * API to set opmode of vdev object
697  *
698  * Return:
699  * @mode: VDEV op mode
700  */
701 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode(
702 					struct wlan_objmgr_vdev *vdev)
703 {
704 	return vdev->vdev_mlme.vdev_opmode;
705 }
706 
707 /**
708  * wlan_vdev_mlme_set_macaddr() - set vdev macaddr
709  * @vdev: VDEV object
710  * @macaddr: MAC address
711  *
712  * API to set macaddr in vdev object
713  *
714  * Caller need to acquire lock with wlan_vdev_obj_lock()
715  *
716  * Return: void
717  */
718 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev,
719 					 uint8_t *macaddr)
720 {
721 	/* This API is invoked with lock acquired, do not add log prints */
722 	WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr);
723 }
724 
725 /**
726  * wlan_vdev_mlme_get_macaddr() - get vdev macaddr
727  * @vdev: VDEV object
728  *
729  * API to get MAC address from vdev object
730  *
731  * Caller need to acquire lock with wlan_vdev_obj_lock()
732  *
733  * Return:
734  * @macaddr: MAC address
735  */
736 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev)
737 {
738 	/* This API is invoked with lock acquired, do not add log prints */
739 	return vdev->vdev_mlme.macaddr;
740 }
741 
742 /**
743  * wlan_vdev_mlme_set_mataddr() - set vdev mataddr
744  * @vdev: VDEV object
745  * @mataddr: MAT address
746  *
747  * API to set mataddr in vdev object
748  *
749  * Caller need to acquire lock with wlan_vdev_obj_lock()
750  *
751  * Return: void
752  */
753 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev,
754 					uint8_t *mataddr)
755 {
756 	/* This API is invoked with lock acquired, do not add log prints */
757 	WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr);
758 }
759 
760 /**
761  * wlan_vdev_mlme_get_mataddr() - get mataddr
762  * @vdev: VDEV object
763  *
764  * API to get MAT address from vdev object
765  *
766  * Caller need to acquire lock with wlan_vdev_obj_lock()
767  *
768  * Return:
769  * @mataddr: MAT address
770  */
771 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev)
772 {
773 	/* This API is invoked with lock acquired, do not add log prints */
774 	return vdev->vdev_mlme.mataddr;
775 }
776 
777 /**
778  * wlan_vdev_get_id() - get vdev id
779  * @vdev: VDEV object
780  *
781  * API to get vdev id
782  *
783  * Return:
784  * @id: vdev id
785  */
786 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev)
787 {
788 	return vdev->vdev_objmgr.vdev_id;
789 }
790 
791 /**
792  * wlan_vdev_get_hw_macaddr() - get hw macaddr
793  * @vdev: VDEV object
794  *
795  * API to retrieve the HW MAC address from PDEV
796  *
797  * Caller need to acquire lock with wlan_vdev_obj_lock()
798  *
799  * Return:
800  * @macaddr: HW MAC address
801  */
802 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
803 {
804 	struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
805 
806 	/* This API is invoked with lock acquired, do not add log prints */
807 	if (pdev != NULL)
808 		return wlan_pdev_get_hw_macaddr(pdev);
809 	else
810 		return NULL;
811 }
812 
813 /**
814  * wlan_vdev_obj_lock() - Acquire VDEV spinlock
815  * @vdev: VDEV object
816  *
817  * API to acquire VDEV lock
818  * Parent lock should not be taken in child lock context
819  * but child lock can be taken in parent lock context
820  * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context)
821  *
822  * Return: void
823  */
824 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev)
825 {
826 	qdf_spin_lock_bh(&vdev->vdev_lock);
827 }
828 
829 /**
830  * wlan_vdev_obj_unlock() - Release VDEV spinlock
831  * @vdev: VDEV object
832  *
833  * API to Release VDEV lock
834  *
835  * Return: void
836  */
837 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev)
838 {
839 	qdf_spin_unlock_bh(&vdev->vdev_lock);
840 }
841 
842 /**
843  * wlan_vdev_mlme_set_bss_chan() - set bss chan
844  * @vdev: VDEV object
845  * @bss_chan: Channel
846  *
847  * API to set the BSS channel
848  *
849  * Return: void
850  */
851 static inline void wlan_vdev_mlme_set_bss_chan(
852 				struct wlan_objmgr_vdev *vdev,
853 				struct wlan_channel *bss_chan)
854 {
855 	vdev->vdev_mlme.bss_chan = bss_chan;
856 }
857 
858 /**
859  * wlan_vdev_mlme_get_bss_chan() - get bss chan
860  * @vdev: VDEV object
861  *
862  * API to get the BSS channel
863  *
864  * Return:
865  * @bss_chan: Channel
866  */
867 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan(
868 				struct wlan_objmgr_vdev *vdev)
869 {
870 	return vdev->vdev_mlme.bss_chan;
871 }
872 
873 /**
874  * wlan_vdev_mlme_set_des_chan() - set desired chan
875  * @vdev: VDEV object
876  * @des_chan: Channel configured by user
877  *
878  * API to set the desired channel
879  *
880  * Return: void
881  */
882 static inline void wlan_vdev_mlme_set_des_chan(
883 				struct wlan_objmgr_vdev *vdev,
884 				struct wlan_channel *des_chan)
885 {
886 	vdev->vdev_mlme.des_chan = des_chan;
887 }
888 
889 /**
890  * wlan_vdev_mlme_get_des_chan() - get desired chan
891  * @vdev: VDEV object
892  *
893  * API to get the desired channel
894  *
895  * Return:
896  * @des_chan: Channel configured by user
897  */
898 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan(
899 				struct wlan_objmgr_vdev *vdev)
900 {
901 	return vdev->vdev_mlme.des_chan;
902 }
903 
904 #ifdef CMN_VDEV_MGR_TGT_IF_ENABLE
905 /**
906  * wlan_vdev_mlme_set_ssid() - set ssid
907  * @vdev: VDEV object
908  * @ssid: SSID (input)
909  * @ssid_len: Length of SSID
910  *
911  * API to set the SSID of VDEV
912  *
913  * Caller need to acquire lock with wlan_vdev_obj_lock()
914  *
915  * Return: SUCCESS, if update is done
916  *          FAILURE, if ssid length is > max ssid len
917  */
918 static inline QDF_STATUS wlan_vdev_mlme_set_ssid(
919 				struct wlan_objmgr_vdev *vdev,
920 				const uint8_t *ssid, uint8_t ssid_len)
921 {
922 	struct vdev_mlme_obj *vdev_mlme;
923 
924 	/* This API is invoked with lock acquired, do not add log prints */
925 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
926 	if (!vdev_mlme)
927 		return QDF_STATUS_E_FAILURE;
928 
929 	if (ssid_len <= WLAN_SSID_MAX_LEN) {
930 		qdf_mem_copy(vdev_mlme->mgmt.generic.ssid, ssid, ssid_len);
931 		vdev_mlme->mgmt.generic.ssid_len = ssid_len;
932 	} else {
933 		vdev_mlme->mgmt.generic.ssid_len = 0;
934 		return QDF_STATUS_E_FAILURE;
935 	}
936 	return QDF_STATUS_SUCCESS;
937 }
938 
939 /**
940  * wlan_vdev_mlme_get_ssid() - get ssid
941  * @vdev: VDEV object
942  * @ssid: SSID
943  * @ssid_len: Length of SSID
944  *
945  * API to get the SSID of VDEV, it updates the SSID and its length
946  * in @ssid, @ssid_len respectively
947  *
948  * Caller need to acquire lock with wlan_vdev_obj_lock()
949  *
950  * Return: SUCCESS, if update is done
951  *          FAILURE, if ssid length is > max ssid len
952  */
953 static inline QDF_STATUS wlan_vdev_mlme_get_ssid(
954 				struct wlan_objmgr_vdev *vdev,
955 				 uint8_t *ssid, uint8_t *ssid_len)
956 {
957 	struct vdev_mlme_obj *vdev_mlme;
958 
959 	/* This API is invoked with lock acquired, do not add log prints */
960 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
961 	if (!vdev_mlme)
962 		return QDF_STATUS_E_FAILURE;
963 
964 	if (vdev_mlme->mgmt.generic.ssid_len > 0) {
965 		*ssid_len = vdev_mlme->mgmt.generic.ssid_len;
966 		qdf_mem_copy(ssid, vdev_mlme->mgmt.generic.ssid, *ssid_len);
967 	} else {
968 		*ssid_len = 0;
969 		return QDF_STATUS_E_FAILURE;
970 	}
971 	return QDF_STATUS_SUCCESS;
972 }
973 
974 /**
975  * wlan_vdev_mlme_set_nss() - set NSS
976  * @vdev: VDEV object
977  * @nss: nss configured by user
978  *
979  * API to set the Number of Spatial streams
980  *
981  * Return: void
982  */
983 static inline void wlan_vdev_mlme_set_nss(
984 				struct wlan_objmgr_vdev *vdev,
985 				uint8_t nss)
986 {
987 	struct vdev_mlme_obj *vdev_mlme;
988 
989 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
990 	if (!vdev_mlme) {
991 		mlme_err("VDEV MLME is NULL");
992 		return;
993 	}
994 
995 	vdev_mlme->proto.generic.nss = nss;
996 }
997 
998 /**
999  * wlan_vdev_mlme_get_nss() - get NSS
1000  * @vdev: VDEV object
1001  *
1002  * API to get the Number of Spatial Streams
1003  *
1004  * Return:
1005  * @nss: nss value
1006  */
1007 static inline uint8_t wlan_vdev_mlme_get_nss(
1008 				struct wlan_objmgr_vdev *vdev)
1009 {
1010 	struct vdev_mlme_obj *vdev_mlme;
1011 
1012 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1013 	if (!vdev_mlme) {
1014 		mlme_err("VDEV MLME is NULL");
1015 		return 0;
1016 	}
1017 
1018 	return vdev_mlme->proto.generic.nss;
1019 }
1020 
1021 /**
1022  * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask
1023  * @vdev: VDEV object
1024  * @chainmask : chainmask either configured by user or max supported
1025  *
1026  * API to set the Tx chainmask
1027  *
1028  * Return: void
1029  */
1030 static inline void wlan_vdev_mlme_set_txchainmask(
1031 				struct wlan_objmgr_vdev *vdev,
1032 				uint8_t chainmask)
1033 {
1034 	struct vdev_mlme_obj *vdev_mlme;
1035 
1036 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1037 
1038 	if (!vdev_mlme) {
1039 		mlme_err("VDEV MLME is NULL");
1040 		return;
1041 	}
1042 
1043 	vdev_mlme->mgmt.chainmask_info.tx_chainmask = chainmask;
1044 }
1045 
1046 /**
1047  * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask
1048  * @vdev: VDEV object
1049  *
1050  * API to get the Tx chainmask
1051  *
1052  * Return:
1053  * @chainmask : Tx chainmask either configured by user or max supported
1054  */
1055 static inline uint8_t wlan_vdev_mlme_get_txchainmask(
1056 				struct wlan_objmgr_vdev *vdev)
1057 {
1058 	struct vdev_mlme_obj *vdev_mlme;
1059 
1060 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1061 	if (!vdev_mlme) {
1062 		mlme_err("VDEV MLME is NULL");
1063 		return 0;
1064 	}
1065 
1066 	return vdev_mlme->mgmt.chainmask_info.tx_chainmask;
1067 }
1068 
1069 /**
1070  * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask
1071  * @vdev: VDEV object
1072  * @chainmask : Rx chainmask either configured by user or max supported
1073  *
1074  * API to set the Rx chainmask
1075  *
1076  * Return: void
1077  */
1078 static inline void wlan_vdev_mlme_set_rxchainmask(
1079 				struct wlan_objmgr_vdev *vdev,
1080 				uint8_t chainmask)
1081 {
1082 	struct vdev_mlme_obj *vdev_mlme;
1083 
1084 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1085 	if (!vdev_mlme) {
1086 		mlme_err("VDEV MLME is NULL");
1087 		return;
1088 	}
1089 
1090 	vdev_mlme->mgmt.chainmask_info.rx_chainmask = chainmask;
1091 }
1092 
1093 /**
1094  * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask
1095  * @vdev: VDEV object
1096  *
1097  * API to get the Rx chainmask
1098  *
1099  * Return:
1100  * @chainmask : Rx chainmask either configured by user or max supported
1101  */
1102 static inline uint8_t wlan_vdev_mlme_get_rxchainmask(
1103 				struct wlan_objmgr_vdev *vdev)
1104 {
1105 	struct vdev_mlme_obj *vdev_mlme;
1106 
1107 	/* This API is invoked with lock acquired, do not add log prints */
1108 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1109 	if (!vdev_mlme)
1110 		return 0;
1111 
1112 	return vdev_mlme->mgmt.chainmask_info.rx_chainmask;
1113 }
1114 
1115 /**
1116  * wlan_vdev_mlme_set_txpower() - set tx power
1117  * @vdev: VDEV object
1118  * @txpow: tx power either configured by used or max allowed
1119  *
1120  * API to set the tx power
1121  *
1122  * Return: void
1123  */
1124 static inline void wlan_vdev_mlme_set_txpower(
1125 					struct wlan_objmgr_vdev *vdev,
1126 					uint8_t txpow)
1127 {
1128 	struct vdev_mlme_obj *vdev_mlme;
1129 
1130 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1131 	if (!vdev_mlme) {
1132 		mlme_err("VDEV MLME is NULL");
1133 		return;
1134 	}
1135 
1136 	vdev_mlme->mgmt.generic.tx_power = txpow;
1137 }
1138 
1139 /**
1140  * wlan_vdev_mlme_get_txpower() - get tx power
1141  * @vdev: VDEV object
1142  *
1143  * API to get the tx power
1144  *
1145  * Return:
1146  * @txpow: tx power either configured by used or max allowed
1147  */
1148 static inline uint8_t wlan_vdev_mlme_get_txpower(
1149 				struct wlan_objmgr_vdev *vdev)
1150 {
1151 	struct vdev_mlme_obj *vdev_mlme;
1152 
1153 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1154 	if (!vdev_mlme) {
1155 		mlme_err("VDEV MLME is NULL");
1156 		return 0;
1157 	}
1158 
1159 	return vdev_mlme->mgmt.generic.tx_power;
1160 }
1161 
1162 /**
1163  * wlan_vdev_mlme_set_maxrate() - set max rate
1164  * @vdev: VDEV object
1165  * @maxrate: configured by used or based on configured mode
1166  *
1167  * API to set the max rate the vdev supports
1168  *
1169  * Return: void
1170  */
1171 static inline void wlan_vdev_mlme_set_maxrate(
1172 				struct wlan_objmgr_vdev *vdev,
1173 				uint32_t maxrate)
1174 {
1175 	struct vdev_mlme_obj *vdev_mlme;
1176 
1177 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1178 	if (!vdev_mlme) {
1179 		mlme_err("VDEV MLME is NULL");
1180 		return;
1181 	}
1182 
1183 	vdev_mlme->mgmt.rate_info.max_rate = maxrate;
1184 }
1185 
1186 /**
1187  * wlan_vdev_mlme_get_maxrate() - get max rate
1188  * @vdev: VDEV object
1189  *
1190  * API to get the max rate the vdev supports
1191  *
1192  * Return:
1193  * @maxrate: configured by used or based on configured mode
1194  */
1195 static inline uint32_t wlan_vdev_mlme_get_maxrate(
1196 				struct wlan_objmgr_vdev *vdev)
1197 {
1198 	struct vdev_mlme_obj *vdev_mlme;
1199 
1200 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1201 	if (!vdev_mlme) {
1202 		mlme_err("VDEV MLME is NULL");
1203 		return 0;
1204 	}
1205 
1206 	return vdev_mlme->mgmt.rate_info.max_rate;
1207 }
1208 
1209 /**
1210  * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate
1211  * @vdev: VDEV object
1212  * @txmgmtrate: Tx Mgmt rate
1213  *
1214  * API to set Mgmt Tx rate
1215  *
1216  * Return: void
1217  */
1218 static inline void wlan_vdev_mlme_set_txmgmtrate(
1219 				struct wlan_objmgr_vdev *vdev,
1220 				uint32_t txmgmtrate)
1221 {
1222 	struct vdev_mlme_obj *vdev_mlme;
1223 
1224 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1225 	if (!vdev_mlme) {
1226 		mlme_err("VDEV MLME is NULL");
1227 		return;
1228 	}
1229 	vdev_mlme->mgmt.rate_info.tx_mgmt_rate = txmgmtrate;
1230 }
1231 
1232 /**
1233  * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate
1234  * @vdev: VDEV object
1235  *
1236  * API to get Mgmt Tx rate
1237  *
1238  * Return:
1239  * @txmgmtrate: Tx Mgmt rate
1240  */
1241 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate(
1242 				struct wlan_objmgr_vdev *vdev)
1243 {
1244 	struct vdev_mlme_obj *vdev_mlme;
1245 
1246 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
1247 	if (!vdev_mlme) {
1248 		mlme_err("VDEV MLME is NULL");
1249 		return 0;
1250 	}
1251 
1252 	return vdev_mlme->mgmt.rate_info.tx_mgmt_rate;
1253 }
1254 #else
1255 
1256 /**
1257  * wlan_vdev_mlme_set_ssid() - set ssid
1258  * @vdev: VDEV object
1259  * @ssid: SSID (input)
1260  * @ssid_len: Length of SSID
1261  *
1262  * API to set the SSID of VDEV
1263  *
1264  * Caller need to acquire lock with wlan_vdev_obj_lock()
1265  *
1266  * Return: SUCCESS, if update is done
1267  *          FAILURE, if ssid length is > max ssid len
1268  */
1269 static inline QDF_STATUS wlan_vdev_mlme_set_ssid(
1270 				struct wlan_objmgr_vdev *vdev,
1271 				const uint8_t *ssid, uint8_t ssid_len)
1272 {
1273 	/* This API is invoked with lock acquired, do not add log prints */
1274 	if (ssid_len <= WLAN_SSID_MAX_LEN) {
1275 		qdf_mem_copy(vdev->vdev_mlme.ssid, ssid, ssid_len);
1276 		vdev->vdev_mlme.ssid_len = ssid_len;
1277 	} else {
1278 		vdev->vdev_mlme.ssid_len = 0;
1279 		return QDF_STATUS_E_FAILURE;
1280 	}
1281 	return QDF_STATUS_SUCCESS;
1282 }
1283 
1284 /**
1285  * wlan_vdev_mlme_get_ssid() - get ssid
1286  * @vdev: VDEV object
1287  * @ssid: SSID
1288  * @ssid_len: Length of SSID
1289  *
1290  * API to get the SSID of VDEV, it updates the SSID and its length
1291  * in @ssid, @ssid_len respectively
1292  *
1293  * Caller need to acquire lock with wlan_vdev_obj_lock()
1294  *
1295  * Return: SUCCESS, if update is done
1296  *          FAILURE, if ssid length is > max ssid len
1297  */
1298 static inline QDF_STATUS wlan_vdev_mlme_get_ssid(
1299 				struct wlan_objmgr_vdev *vdev,
1300 				 uint8_t *ssid, uint8_t *ssid_len)
1301 {
1302 	/* This API is invoked with lock acquired, do not add log prints */
1303 	if (vdev->vdev_mlme.ssid_len > 0) {
1304 		*ssid_len = vdev->vdev_mlme.ssid_len;
1305 		qdf_mem_copy(ssid, vdev->vdev_mlme.ssid, *ssid_len);
1306 	} else {
1307 		*ssid_len = 0;
1308 		return QDF_STATUS_E_FAILURE;
1309 	}
1310 	return QDF_STATUS_SUCCESS;
1311 }
1312 
1313 /**
1314  * wlan_vdev_mlme_set_nss() - set NSS
1315  * @vdev: VDEV object
1316  * @nss: nss configured by user
1317  *
1318  * API to set the Number of Spatial streams
1319  *
1320  * Return: void
1321  */
1322 static inline void wlan_vdev_mlme_set_nss(struct wlan_objmgr_vdev *vdev,
1323 					  uint8_t nss)
1324 {
1325 	vdev->vdev_mlme.nss = nss;
1326 }
1327 
1328 /**
1329  * wlan_vdev_mlme_get_nss() - get NSS
1330  * @vdev: VDEV object
1331  *
1332  * API to get the Number of Spatial Streams
1333  *
1334  * Return:
1335  * @nss: nss value
1336  */
1337 static inline uint8_t wlan_vdev_mlme_get_nss(
1338 				struct wlan_objmgr_vdev *vdev)
1339 {
1340 	return vdev->vdev_mlme.nss;
1341 }
1342 
1343 /**
1344  * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask
1345  * @vdev: VDEV object
1346  * @chainmask : chainmask either configured by user or max supported
1347  *
1348  * API to set the Tx chainmask
1349  *
1350  * Return: void
1351  */
1352 static inline void wlan_vdev_mlme_set_txchainmask(
1353 				struct wlan_objmgr_vdev *vdev,
1354 				uint8_t chainmask)
1355 {
1356 	vdev->vdev_mlme.tx_chainmask = chainmask;
1357 }
1358 
1359 /**
1360  * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask
1361  * @vdev: VDEV object
1362  *
1363  * API to get the Tx chainmask
1364  *
1365  * Return:
1366  * @chainmask : Tx chainmask either configured by user or max supported
1367  */
1368 static inline uint8_t wlan_vdev_mlme_get_txchainmask(
1369 				struct wlan_objmgr_vdev *vdev)
1370 {
1371 	return vdev->vdev_mlme.tx_chainmask;
1372 }
1373 
1374 /**
1375  * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask
1376  * @vdev: VDEV object
1377  * @chainmask : Rx chainmask either configured by user or max supported
1378  *
1379  * API to set the Rx chainmask
1380  *
1381  * Return: void
1382  */
1383 static inline void wlan_vdev_mlme_set_rxchainmask(
1384 				struct wlan_objmgr_vdev *vdev,
1385 				uint8_t chainmask)
1386 {
1387 	vdev->vdev_mlme.rx_chainmask = chainmask;
1388 }
1389 
1390 /**
1391  * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask
1392  * @vdev: VDEV object
1393  *
1394  * API to get the Rx chainmask
1395  *
1396  * Return:
1397  * @chainmask : Rx chainmask either configured by user or max supported
1398  */
1399 static inline uint8_t wlan_vdev_mlme_get_rxchainmask(
1400 				struct wlan_objmgr_vdev *vdev)
1401 {
1402 	/* This API is invoked with lock acquired, do not add log prints */
1403 	return vdev->vdev_mlme.rx_chainmask;
1404 }
1405 
1406 /**
1407  * wlan_vdev_mlme_set_txpower() - set tx power
1408  * @vdev: VDEV object
1409  * @txpow: tx power either configured by used or max allowed
1410  *
1411  * API to set the tx power
1412  *
1413  * Return: void
1414  */
1415 static inline void wlan_vdev_mlme_set_txpower(
1416 				struct wlan_objmgr_vdev *vdev,
1417 				uint8_t txpow)
1418 {
1419 	vdev->vdev_mlme.tx_power = txpow;
1420 }
1421 
1422 /**
1423  * wlan_vdev_mlme_get_txpower() - get tx power
1424  * @vdev: VDEV object
1425  *
1426  * API to get the tx power
1427  *
1428  * Return:
1429  * @txpow: tx power either configured by used or max allowed
1430  */
1431 static inline uint8_t wlan_vdev_mlme_get_txpower(
1432 				struct wlan_objmgr_vdev *vdev)
1433 {
1434 	return vdev->vdev_mlme.tx_power;
1435 }
1436 
1437 /**
1438  * wlan_vdev_mlme_set_maxrate() - set max rate
1439  * @vdev: VDEV object
1440  * @maxrate: configured by used or based on configured mode
1441  *
1442  * API to set the max rate the vdev supports
1443  *
1444  * Return: void
1445  */
1446 static inline void wlan_vdev_mlme_set_maxrate(
1447 				struct wlan_objmgr_vdev *vdev,
1448 				uint32_t maxrate)
1449 {
1450 	vdev->vdev_mlme.max_rate = maxrate;
1451 }
1452 
1453 /**
1454  * wlan_vdev_mlme_get_maxrate() - get max rate
1455  * @vdev: VDEV object
1456  *
1457  * API to get the max rate the vdev supports
1458  *
1459  * Return:
1460  * @maxrate: configured by used or based on configured mode
1461  */
1462 static inline uint32_t wlan_vdev_mlme_get_maxrate(
1463 				struct wlan_objmgr_vdev *vdev)
1464 {
1465 	return vdev->vdev_mlme.max_rate;
1466 }
1467 
1468 /**
1469  * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate
1470  * @vdev: VDEV object
1471  * @txmgmtrate: Tx Mgmt rate
1472  *
1473  * API to set Mgmt Tx rate
1474  *
1475  * Return: void
1476  */
1477 static inline void wlan_vdev_mlme_set_txmgmtrate(
1478 				struct wlan_objmgr_vdev *vdev,
1479 				uint32_t txmgmtrate)
1480 {
1481 	vdev->vdev_mlme.tx_mgmt_rate = txmgmtrate;
1482 }
1483 
1484 /**
1485  * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate
1486  * @vdev: VDEV object
1487  *
1488  * API to get Mgmt Tx rate
1489  *
1490  * Return:
1491  * @txmgmtrate: Tx Mgmt rate
1492  */
1493 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate(
1494 				struct wlan_objmgr_vdev *vdev)
1495 {
1496 	return vdev->vdev_mlme.tx_mgmt_rate;
1497 }
1498 #endif
1499 
1500 /**
1501  * wlan_vdev_mlme_feat_cap_set() - set feature caps
1502  * @vdev: VDEV object
1503  * @cap: capabilities to be set
1504  *
1505  * API to set MLME feature capabilities
1506  *
1507  * Return: void
1508  */
1509 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev,
1510 				uint32_t cap)
1511 {
1512 	vdev->vdev_mlme.vdev_feat_caps |= cap;
1513 }
1514 
1515 /**
1516  * wlan_vdev_mlme_feat_cap_clear() - clear feature caps
1517  * @vdev: VDEV object
1518  * @cap: capabilities to be cleared
1519  *
1520  * API to clear MLME feature capabilities
1521  *
1522  * Return: void
1523  */
1524 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev,
1525 				uint32_t cap)
1526 {
1527 	vdev->vdev_mlme.vdev_feat_caps &= ~cap;
1528 }
1529 
1530 /**
1531  * wlan_vdev_mlme_feat_cap_get() - get feature caps
1532  * @vdev: VDEV object
1533  * @cap: capabilities to be checked
1534  *
1535  * API to know MLME feature capability is set or not
1536  *
1537  * Return: 1 -- if capabilities set
1538  *         0 -- if capabilities clear
1539  */
1540 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev,
1541 				uint32_t cap)
1542 {
1543 	return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0;
1544 }
1545 
1546 /**
1547  * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps
1548  * @vdev: VDEV object
1549  * @cap: capabilities to be set
1550  *
1551  * API to set the MLME extensive feature capabilities
1552  *
1553  * Return: void
1554  */
1555 static inline void wlan_vdev_mlme_feat_ext_cap_set(
1556 				struct wlan_objmgr_vdev *vdev,
1557 				uint32_t cap)
1558 {
1559 	vdev->vdev_mlme.vdev_feat_ext_caps |= cap;
1560 }
1561 
1562 /**
1563  * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps
1564  * @vdev: VDEV object
1565  * @cap: capabilities to be cleared
1566  *
1567  * API to clear the MLME extensive feature capabilities
1568  *
1569  * Return: void
1570  */
1571 static inline void wlan_vdev_mlme_feat_ext_cap_clear(
1572 				struct wlan_objmgr_vdev *vdev,
1573 				uint32_t cap)
1574 {
1575 	vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap;
1576 }
1577 
1578 /**
1579  * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps
1580  * @vdev: VDEV object
1581  * @cap: capabilities to be checked
1582  *
1583  * API to know MLME ext feature capability is set or not
1584  *
1585  * Return: 1 -- if capabilities set
1586  *         0 -- if capabilities clear
1587  */
1588 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get(
1589 				struct wlan_objmgr_vdev *vdev,
1590 				uint32_t cap)
1591 {
1592 	return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0;
1593 }
1594 
1595 /**
1596  * wlan_vdev_mlme_cap_set() - mlme caps set
1597  * @vdev: VDEV object
1598  * @cap: capabilities to be set
1599  *
1600  * API to set the MLME capabilities
1601  *
1602  * Return: void
1603  */
1604 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev,
1605 				uint32_t cap)
1606 {
1607 	vdev->vdev_mlme.vdev_caps |= cap;
1608 }
1609 
1610 /**
1611  * wlan_vdev_mlme_cap_clear() -  mlme caps clear
1612  * @vdev: VDEV object
1613  * @cap: capabilities to be cleared
1614  *
1615  * API to clear the MLME capabilities
1616  *
1617  * Return: void
1618  */
1619 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev,
1620 				uint32_t cap)
1621 {
1622 	vdev->vdev_mlme.vdev_caps &= ~cap;
1623 }
1624 
1625 /**
1626  * wlan_vdev_mlme_cap_get() - get mlme caps
1627  * @vdev: VDEV object
1628  * @cap: capabilities to be checked
1629  *
1630  * API to know MLME capability is set or not
1631  *
1632  * Return: 1 -- if capabilities set
1633  *         0 -- if capabilities clear
1634  */
1635 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev,
1636 				uint32_t cap)
1637 {
1638 	return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0;
1639 }
1640 
1641 /**
1642  * wlan_vdev_mlme_get_state() - get mlme state
1643  * @vdev: VDEV object
1644  *
1645  * API to get MLME state
1646  *
1647  * Return: state of MLME
1648  */
1649 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state(
1650 				struct wlan_objmgr_vdev *vdev)
1651 {
1652 	return vdev->vdev_mlme.mlme_state;
1653 }
1654 
1655 #ifdef CMN_VDEV_MLME_SM_ENABLE
1656 /**
1657  * wlan_vdev_mlme_get_substate() - get mlme substate
1658  * @vdev: VDEV object
1659  *
1660  * API to get VDEV MLME substate
1661  *
1662  * Return: substate of VDEV MLME
1663  */
1664 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate(
1665 				struct wlan_objmgr_vdev *vdev)
1666 {
1667 	return vdev->vdev_mlme.mlme_substate;
1668 }
1669 #else
1670 /**
1671  * wlan_vdev_mlme_set_state() - set mlme state
1672  * @vdev: VDEV object
1673  * @state: MLME state
1674  *
1675  * API to set MLME state
1676  *
1677  * Return: void
1678  */
1679 static inline void wlan_vdev_mlme_set_state(struct wlan_objmgr_vdev *vdev,
1680 						enum wlan_vdev_state state)
1681 {
1682 	if (state < WLAN_VDEV_S_MAX)
1683 		vdev->vdev_mlme.mlme_state = state;
1684 }
1685 #endif
1686 
1687 /**
1688  * wlan_vdev_set_selfpeer() - set self peer
1689  * @vdev: VDEV object
1690  * @peer: peer pointer
1691  *
1692  * API to set the self peer of VDEV
1693  *
1694  * Return: void
1695  */
1696 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev,
1697 						struct wlan_objmgr_peer *peer)
1698 {
1699 	vdev->vdev_objmgr.self_peer = peer;
1700 }
1701 
1702 /**
1703  * wlan_vdev_get_selfpeer() - get self peer
1704  * @vdev: VDEV object
1705  *
1706  * API to get the self peer of VDEV
1707  *
1708  * Return:
1709  * @peer: peer pointer
1710  */
1711 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer(
1712 					struct wlan_objmgr_vdev *vdev)
1713 {
1714 	return vdev->vdev_objmgr.self_peer;
1715 }
1716 
1717 /**
1718  * wlan_vdev_set_bsspeer() - set bss peer
1719  * @vdev: VDEV object
1720  * @peer: BSS peer pointer
1721  *
1722  * API to set the BSS peer of VDEV
1723  *
1724  * Return: void
1725  */
1726 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev,
1727 						 struct wlan_objmgr_peer *peer)
1728 {
1729 	vdev->vdev_objmgr.bss_peer = peer;
1730 }
1731 
1732 /**
1733  * wlan_vdev_get_bsspeer() - get bss peer
1734  * @vdev: VDEV object
1735  *
1736  * API to get the BSS peer of VDEV
1737  *
1738  * Return:
1739  * @peer: BSS peer pointer
1740  */
1741 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer(
1742 					struct wlan_objmgr_vdev *vdev)
1743 {
1744 	return vdev->vdev_objmgr.bss_peer;
1745 }
1746 
1747 /**
1748  * wlan_vdev_get_ospriv() - get os priv pointer
1749  * @vdev: VDEV object
1750  *
1751  * API to get OS private pointer from VDEV
1752  *
1753  * Return: ospriv - private pointer
1754  */
1755 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv(
1756 	struct wlan_objmgr_vdev *vdev)
1757 {
1758 	return vdev->vdev_nif.osdev;
1759 }
1760 
1761 /**
1762  * wlan_vdev_reset_ospriv() - reset os priv pointer
1763  * @vdev: VDEV object
1764  *
1765  * API to reset OS private pointer in VDEV
1766  *
1767  * Return: void
1768  */
1769 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev)
1770 {
1771 	vdev->vdev_nif.osdev = NULL;
1772 }
1773 
1774 /**
1775  * wlan_vdev_get_peer_count() - get vdev peer count
1776  * @vdev: VDEV object
1777  *
1778  * API to get peer count from VDEV
1779  *
1780  * Return: peer_count - vdev's peer count
1781  */
1782 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
1783 {
1784 	return vdev->vdev_objmgr.wlan_peer_count;
1785 }
1786 
1787 /**
1788  * DOC: Examples to use VDEV ref count APIs
1789  *
1790  * In all the scenarios, the pair of API should be followed
1791  * other it lead to memory leak
1792  *
1793  *  scenario 1:
1794  *
1795  *     wlan_objmgr_vdev_obj_create()
1796  *     ----
1797  *     wlan_objmgr_vdev_obj_delete()
1798  *
1799  *  scenario 2:
1800  *
1801  *     wlan_objmgr_vdev_get_ref()
1802  *     ----
1803  *     the operations which are done on
1804  *     vdev object
1805  *     ----
1806  *     wlan_objmgr_vdev_release_ref()
1807  *
1808  *  scenario 3:
1809  *
1810  *     API to retrieve vdev (xxx_get_vdev_xxx())
1811  *     ----
1812  *     the operations which are done on
1813  *     vdev object
1814  *     ----
1815  *     wlan_objmgr_vdev_release_ref()
1816  */
1817 
1818 /**
1819  * wlan_objmgr_vdev_get_ref() - increment ref count
1820  * @vdev: VDEV object
1821  * @id:   Object Manager ref debug id
1822  *
1823  * API to increment ref count of vdev
1824  *
1825  * Return: void
1826  */
1827 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
1828 				wlan_objmgr_ref_dbgid id);
1829 
1830 /**
1831  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
1832  * @vdev: VDEV object
1833  * @id:   Object Manager ref debug id
1834  *
1835  * API to increment ref count of vdev after checking valid object state
1836  *
1837  * Return: void
1838  */
1839 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
1840 						wlan_objmgr_ref_dbgid id);
1841 
1842 /**
1843  * wlan_objmgr_vdev_release_ref() - decrement ref count
1844  * @vdev: VDEV object
1845  * @id:   Object Manager ref debug id
1846  *
1847  * API to decrement ref count of vdev, if ref count is 1, it initiates the
1848  * VDEV deletion
1849  *
1850  * Return: void
1851  */
1852 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
1853 						wlan_objmgr_ref_dbgid id);
1854 
1855 /**
1856  * wlan_vdev_set_max_peer_count() - set max peer count
1857  * @vdev: VDEV object
1858  * @count: Max peer count
1859  *
1860  * API to set max peer count of VDEV
1861  *
1862  * Return: void
1863  */
1864 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev,
1865 						uint16_t count)
1866 {
1867 	vdev->vdev_objmgr.max_peer_count = count;
1868 }
1869 
1870 /**
1871  * wlan_vdev_get_max_peer_count() - get max peer count
1872  * @vdev: VDEV object
1873  *
1874  * API to get max peer count of VDEV
1875  *
1876  * Return: max peer count
1877  */
1878 static inline uint16_t wlan_vdev_get_max_peer_count(
1879 						struct wlan_objmgr_vdev *vdev)
1880 {
1881 	return vdev->vdev_objmgr.max_peer_count;
1882 }
1883 
1884 /**
1885  * wlan_vdev_is_connected() - Check whether peer is associated or not
1886  * @vdev: pointer to objmgr vdev
1887  *
1888  * Return: true in case success else false
1889  */
1890 bool wlan_vdev_is_connected(struct wlan_objmgr_vdev *vdev);
1891 
1892 /**
1893  * wlan_vdev_set_dp_handle() - set dp handle
1894  * @vdev: vdev object pointer
1895  * @dp_handle: Data path module handle
1896  *
1897  * Return: void
1898  */
1899 static inline void wlan_vdev_set_dp_handle(struct wlan_objmgr_vdev *vdev,
1900 		void *dp_handle)
1901 {
1902 	if (qdf_unlikely(!vdev)) {
1903 		QDF_BUG(0);
1904 		return;
1905 	}
1906 
1907 	vdev->dp_handle = dp_handle;
1908 }
1909 
1910 /**
1911  * wlan_vdev_get_dp_handle() - get dp handle
1912  * @vdev: vdev object pointer
1913  *
1914  * Return: dp handle
1915  */
1916 static inline void *wlan_vdev_get_dp_handle(struct wlan_objmgr_vdev *vdev)
1917 {
1918 	if (qdf_unlikely(!vdev)) {
1919 		QDF_BUG(0);
1920 		return NULL;
1921 	}
1922 
1923 	return vdev->dp_handle;
1924 }
1925 
1926 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/
1927