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