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