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