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