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