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