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