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_width: Channel width. 265 * @ch_phymode: Channel phymode. 266 */ 267 struct wlan_channel { 268 uint16_t ch_freq; 269 uint8_t ch_ieee; 270 uint64_t ch_flags; 271 uint16_t ch_flagext; 272 int8_t ch_maxpower; 273 uint8_t ch_freq_seg1; 274 uint8_t ch_freq_seg2; 275 enum phy_ch_width ch_width; 276 enum wlan_phymode ch_phymode; 277 }; 278 279 /** 280 * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure 281 * @vdev_opmode: Opmode of VDEV 282 * @mlme_state: VDEV MLME SM state 283 * @mlme_state: VDEV MLME SM substate 284 * @bss_chan: BSS channel 285 * @des_chan: Desired channel, for STA Desired may not be used 286 * @vdev_caps: VDEV capabilities 287 * @vdev_feat_caps: VDEV feature caps 288 * @vdev_feat_ext_caps: VDEV Extended feature caps 289 * @vdev_op_flags: Operation flags 290 * @mataddr[]: MAT address 291 * @macaddr[]: VDEV self MAC address 292 * @ssid[]: SSID 293 * @ssid_len: SSID length 294 * @nss: Num. Spatial streams 295 * @tx_chainmask: Tx Chainmask 296 * @rx_chainmask: Rx Chainmask 297 * @tx_power: Tx power 298 * @max_rate: MAX rate 299 * @tx_mgmt_rate: TX Mgmt. Rate 300 * @per_band_mgmt_rate: Per-band TX Mgmt. Rate 301 */ 302 struct wlan_objmgr_vdev_mlme { 303 enum QDF_OPMODE vdev_opmode; 304 enum wlan_vdev_state mlme_state; 305 enum wlan_vdev_state mlme_substate; 306 struct wlan_channel *bss_chan; 307 struct wlan_channel *des_chan; 308 uint32_t vdev_caps; 309 uint32_t vdev_feat_caps; 310 uint32_t vdev_feat_ext_caps; 311 uint32_t vdev_op_flags; 312 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 313 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 314 #ifndef CMN_VDEV_MGR_TGT_IF_ENABLE 315 char ssid[WLAN_SSID_MAX_LEN + 1]; 316 uint8_t ssid_len; 317 uint8_t nss; 318 uint8_t tx_chainmask; 319 uint8_t rx_chainmask; 320 uint8_t tx_power; 321 uint32_t max_rate; 322 uint32_t tx_mgmt_rate; 323 uint32_t per_band_mgmt_rate[WLAN_BAND_NUM_MAX]; 324 #endif 325 }; 326 327 /** 328 * struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure 329 * @osdev: OS specific pointer 330 */ 331 struct wlan_objmgr_vdev_nif { 332 struct vdev_osif_priv *osdev; 333 }; 334 335 /** 336 * struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure 337 * @vdev_id: VDEV id 338 * @print_cnt: Count to throttle Logical delete prints 339 * @self_peer: Self PEER 340 * @bss_peer: BSS PEER 341 * @wlan_peer_list: PEER list 342 * @wlan_pdev: PDEV pointer 343 * @wlan_peer_count: Peer count 344 * @max_peer_count: Max Peer count 345 * @c_flags: creation specific flags 346 * @ref_cnt: Ref count 347 * @ref_id_dbg: Array to track Ref count 348 */ 349 struct wlan_objmgr_vdev_objmgr { 350 uint8_t vdev_id; 351 uint8_t print_cnt; 352 struct wlan_objmgr_peer *self_peer; 353 struct wlan_objmgr_peer *bss_peer; 354 qdf_list_t wlan_peer_list; 355 struct wlan_objmgr_pdev *wlan_pdev; 356 uint16_t wlan_peer_count; 357 uint16_t max_peer_count; 358 uint32_t c_flags; 359 qdf_atomic_t ref_cnt; 360 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 361 }; 362 363 /** 364 * struct wlan_objmgr_vdev - VDEV common object 365 * @vdev_node: qdf list of pdev's vdev list 366 * @vdev_mlme: VDEV MLME substructure 367 * @vdev_objmgr: VDEV Object Mgr substructure 368 * @vdev_nif: VDEV HDD substructure 369 * @vdev_comp_priv_obj[]:Component's private objects list 370 * @obj_status[]: Component object status 371 * @obj_state: VDEV object state 372 * @dp_handle: DP module handle 373 * @vdev_lock: VDEV lock 374 */ 375 struct wlan_objmgr_vdev { 376 qdf_list_node_t vdev_node; 377 struct wlan_objmgr_vdev_mlme vdev_mlme; 378 struct wlan_objmgr_vdev_objmgr vdev_objmgr; 379 struct wlan_objmgr_vdev_nif vdev_nif; 380 void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 381 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 382 WLAN_OBJ_STATE obj_state; 383 void *dp_handle; 384 qdf_spinlock_t vdev_lock; 385 }; 386 387 /** 388 ** APIs to Create/Delete Global object APIs 389 */ 390 /** 391 * wlan_objmgr_vdev_obj_create() - vdev object create 392 * @pdev: PDEV object on which this vdev gets created 393 * @params: VDEV create params from HDD 394 * 395 * Creates vdev object, intializes with default values 396 * Attaches to psoc and pdev objects 397 * Invokes the registered notifiers to create component object 398 * 399 * Return: Handle to struct wlan_objmgr_vdev on successful creation, 400 * NULL on Failure (on Mem alloc failure and Component objects 401 * Failure) 402 */ 403 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( 404 struct wlan_objmgr_pdev *pdev, 405 struct wlan_vdev_create_params *params); 406 407 /** 408 * wlan_objmgr_vdev_obj_delete() - vdev object delete 409 * @vdev: vdev object 410 * 411 * Logically deletes VDEV object, 412 * Once all the references are released, object manager invokes the registered 413 * notifiers to destroy component objects 414 * 415 * Return: SUCCESS/FAILURE 416 */ 417 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev); 418 419 /** 420 ** APIs to attach/detach component objects 421 */ 422 /** 423 * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach 424 * @vdev: VDEV object 425 * @id: Component id 426 * @comp_priv_obj: component's private object pointer 427 * @status: Component's private object creation status 428 * 429 * API to be used for attaching component object with VDEV common object 430 * 431 * Return: SUCCESS on successful storing of component's object in common object 432 * On FAILURE (appropriate failure codes are returned) 433 */ 434 QDF_STATUS wlan_objmgr_vdev_component_obj_attach( 435 struct wlan_objmgr_vdev *vdev, 436 enum wlan_umac_comp_id id, 437 void *comp_priv_obj, 438 QDF_STATUS status); 439 440 /** 441 * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach 442 * @vdev: VDEV object 443 * @id: Component id 444 * @comp_priv_obj: component's private object pointer 445 * 446 * API to be used for detaching component object with VDEV common object 447 * 448 * Return: SUCCESS on successful removal of component's object from common 449 * object 450 * On FAILURE (appropriate failure codes are returned) 451 */ 452 QDF_STATUS wlan_objmgr_vdev_component_obj_detach( 453 struct wlan_objmgr_vdev *vdev, 454 enum wlan_umac_comp_id id, 455 void *comp_priv_obj); 456 /* 457 ** APIs to operations on vdev objects 458 */ 459 460 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 461 void *object, 462 void *arg); 463 464 /** 465 * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list 466 * @vdev: vdev object 467 * @handler: the handler will be called for each object of requested type 468 * the handler should be implemented to perform required operation 469 * @arg: agruments passed by caller 470 * @dbg_id: id of the caller 471 * 472 * API to be used for performing the operations on all PEER objects 473 * of vdev 474 * 475 * Return: SUCCESS/FAILURE 476 */ 477 QDF_STATUS wlan_objmgr_iterate_peerobj_list( 478 struct wlan_objmgr_vdev *vdev, 479 wlan_objmgr_vdev_op_handler handler, 480 void *arg, wlan_objmgr_ref_dbgid dbg_id); 481 482 /** 483 * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev 484 * comp object creation 485 * @vdev: VDEV object 486 * @id: Component id 487 * 488 * API to create component private object in run time, this would 489 * be used for features which gets enabled in run time 490 * 491 * Return: SUCCESS on successful creation 492 * On FAILURE (appropriate failure codes are returned) 493 */ 494 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation( 495 struct wlan_objmgr_vdev *vdev, 496 enum wlan_umac_comp_id id); 497 498 /** 499 * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp 500 * object deletion 501 * @vdev: VDEV object 502 * @id: Component id 503 * 504 * API to destroy component private object in run time, this would 505 * be used for features which gets disabled in run time 506 * 507 * Return: SUCCESS on successful deletion 508 * On FAILURE (appropriate failure codes are returned) 509 */ 510 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion( 511 struct wlan_objmgr_vdev *vdev, 512 enum wlan_umac_comp_id id); 513 514 /** 515 * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object 516 * @vdev: VDEV object 517 * @id: Component id 518 * 519 * API to get component private object 520 * 521 * Return: void *ptr on SUCCESS 522 * NULL on Failure 523 */ 524 void *wlan_objmgr_vdev_get_comp_private_obj( 525 struct wlan_objmgr_vdev *vdev, 526 enum wlan_umac_comp_id id); 527 528 /* Util APIs */ 529 530 /** 531 * wlan_vdev_get_pdev() - get pdev 532 * @vdev: VDEV object 533 * 534 * API to get pdev object pointer from vdev 535 * 536 * Return: pdev object pointer 537 */ 538 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev( 539 struct wlan_objmgr_vdev *vdev) 540 { 541 return vdev->vdev_objmgr.wlan_pdev; 542 } 543 544 /** 545 * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list 546 * @peer_list: qdf_list_t 547 * 548 * API to get the head vdev of given vdev (of pdev's vdev list) 549 * 550 * Caller need to acquire lock with wlan_vdev_obj_lock() 551 * 552 * Return: 553 * @peer: head peer 554 */ 555 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head( 556 qdf_list_t *vdev_list) 557 { 558 struct wlan_objmgr_vdev *vdev; 559 qdf_list_node_t *vdev_node = NULL; 560 561 /* This API is invoked with lock acquired, do not add log prints */ 562 if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS) 563 return NULL; 564 565 vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node); 566 return vdev; 567 } 568 569 /** 570 * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 571 * @vdev: VDEV object 572 * @vdev_list: qdf_list_t 573 * @dbg_id: id of the caller 574 * 575 * API to get the head active vdev of given vdev (of pdev's vdev list) 576 * 577 * Return: 578 * @peer: head peer 579 */ 580 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 581 struct wlan_objmgr_pdev *pdev, 582 qdf_list_t *vdev_list, 583 wlan_objmgr_ref_dbgid dbg_id); 584 585 /** 586 * wlan_vdev_get_next_vdev_of_pdev() - get next vdev 587 * @vdev: VDEV object 588 * 589 * API to get next vdev object pointer of vdev 590 * 591 * Caller need to acquire lock with wlan_vdev_obj_lock() 592 * 593 * Return: 594 * @vdev_next: VDEV object 595 */ 596 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( 597 qdf_list_t *vdev_list, 598 struct wlan_objmgr_vdev *vdev) 599 { 600 struct wlan_objmgr_vdev *vdev_next; 601 qdf_list_node_t *node = &vdev->vdev_node; 602 qdf_list_node_t *next_node = NULL; 603 604 /* This API is invoked with lock acquired, do not add log prints */ 605 if (node == NULL) 606 return NULL; 607 608 if (qdf_list_peek_next(vdev_list, node, &next_node) != 609 QDF_STATUS_SUCCESS) 610 return NULL; 611 612 vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev, 613 vdev_node); 614 return vdev_next; 615 } 616 617 /** 618 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 619 * @pdev: PDEV object 620 * @vdev_list: qdf_list_t 621 * @vdev: VDEV object 622 * @dbg_id: id of the caller 623 * 624 * API to get next active vdev object pointer of vdev 625 * 626 * Return: 627 * @vdev_next: VDEV object 628 */ 629 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 630 struct wlan_objmgr_pdev *pdev, 631 qdf_list_t *vdev_list, 632 struct wlan_objmgr_vdev *vdev, 633 wlan_objmgr_ref_dbgid dbg_id); 634 635 636 /** 637 * wlan_vdev_set_pdev() - set pdev 638 * @vdev: VDEV object 639 * @pdev: PDEV object 640 * 641 * API to get pdev object pointer from vdev 642 * 643 * Caller need to acquire lock with wlan_vdev_obj_lock() 644 * 645 * Return: void 646 */ 647 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev, 648 struct wlan_objmgr_pdev *pdev) 649 { 650 /* This API is invoked with lock acquired, do not add log prints */ 651 vdev->vdev_objmgr.wlan_pdev = pdev; 652 } 653 654 /** 655 * wlan_vdev_get_psoc() - get psoc 656 * @vdev: VDEV object 657 * 658 * API to get pdev object pointer from vdev 659 * 660 * Return: psoc object pointer 661 */ 662 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc( 663 struct wlan_objmgr_vdev *vdev) 664 { 665 struct wlan_objmgr_pdev *pdev; 666 struct wlan_objmgr_psoc *psoc = NULL; 667 668 pdev = wlan_vdev_get_pdev(vdev); 669 if (pdev == NULL) 670 return NULL; 671 672 psoc = wlan_pdev_get_psoc(pdev); 673 674 return psoc; 675 } 676 677 /** 678 * wlan_vdev_mlme_set_opmode() - set vdev opmode 679 * @vdev: VDEV object 680 * @mode: VDEV op mode 681 * 682 * API to set opmode in vdev object 683 * 684 * Return: void 685 */ 686 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev, 687 enum QDF_OPMODE mode) 688 { 689 vdev->vdev_mlme.vdev_opmode = mode; 690 } 691 692 /** 693 * wlan_vdev_mlme_get_opmode() - get vdev opmode 694 * @vdev: VDEV object 695 * 696 * API to set opmode of vdev object 697 * 698 * Return: 699 * @mode: VDEV op mode 700 */ 701 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 702 struct wlan_objmgr_vdev *vdev) 703 { 704 return vdev->vdev_mlme.vdev_opmode; 705 } 706 707 /** 708 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 709 * @vdev: VDEV object 710 * @macaddr: MAC address 711 * 712 * API to set macaddr in vdev object 713 * 714 * Caller need to acquire lock with wlan_vdev_obj_lock() 715 * 716 * Return: void 717 */ 718 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev, 719 uint8_t *macaddr) 720 { 721 /* This API is invoked with lock acquired, do not add log prints */ 722 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 723 } 724 725 /** 726 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 727 * @vdev: VDEV object 728 * 729 * API to get MAC address from vdev object 730 * 731 * Caller need to acquire lock with wlan_vdev_obj_lock() 732 * 733 * Return: 734 * @macaddr: MAC address 735 */ 736 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 737 { 738 /* This API is invoked with lock acquired, do not add log prints */ 739 return vdev->vdev_mlme.macaddr; 740 } 741 742 /** 743 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 744 * @vdev: VDEV object 745 * @mataddr: MAT address 746 * 747 * API to set mataddr in vdev object 748 * 749 * Caller need to acquire lock with wlan_vdev_obj_lock() 750 * 751 * Return: void 752 */ 753 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 754 uint8_t *mataddr) 755 { 756 /* This API is invoked with lock acquired, do not add log prints */ 757 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 758 } 759 760 /** 761 * wlan_vdev_mlme_get_mataddr() - get mataddr 762 * @vdev: VDEV object 763 * 764 * API to get MAT address from vdev object 765 * 766 * Caller need to acquire lock with wlan_vdev_obj_lock() 767 * 768 * Return: 769 * @mataddr: MAT address 770 */ 771 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 772 { 773 /* This API is invoked with lock acquired, do not add log prints */ 774 return vdev->vdev_mlme.mataddr; 775 } 776 777 /** 778 * wlan_vdev_get_id() - get vdev id 779 * @vdev: VDEV object 780 * 781 * API to get vdev id 782 * 783 * Return: 784 * @id: vdev id 785 */ 786 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 787 { 788 return vdev->vdev_objmgr.vdev_id; 789 } 790 791 /** 792 * wlan_vdev_get_hw_macaddr() - get hw macaddr 793 * @vdev: VDEV object 794 * 795 * API to retrieve the HW MAC address from PDEV 796 * 797 * Caller need to acquire lock with wlan_vdev_obj_lock() 798 * 799 * Return: 800 * @macaddr: HW MAC address 801 */ 802 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 803 { 804 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 805 806 /* This API is invoked with lock acquired, do not add log prints */ 807 if (pdev != NULL) 808 return wlan_pdev_get_hw_macaddr(pdev); 809 else 810 return NULL; 811 } 812 813 /** 814 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 815 * @vdev: VDEV object 816 * 817 * API to acquire VDEV lock 818 * Parent lock should not be taken in child lock context 819 * but child lock can be taken in parent lock context 820 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 821 * 822 * Return: void 823 */ 824 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 825 { 826 qdf_spin_lock_bh(&vdev->vdev_lock); 827 } 828 829 /** 830 * wlan_vdev_obj_unlock() - Release VDEV spinlock 831 * @vdev: VDEV object 832 * 833 * API to Release VDEV lock 834 * 835 * Return: void 836 */ 837 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 838 { 839 qdf_spin_unlock_bh(&vdev->vdev_lock); 840 } 841 842 /** 843 * wlan_vdev_mlme_set_bss_chan() - set bss chan 844 * @vdev: VDEV object 845 * @bss_chan: Channel 846 * 847 * API to set the BSS channel 848 * 849 * Return: void 850 */ 851 static inline void wlan_vdev_mlme_set_bss_chan( 852 struct wlan_objmgr_vdev *vdev, 853 struct wlan_channel *bss_chan) 854 { 855 vdev->vdev_mlme.bss_chan = bss_chan; 856 } 857 858 /** 859 * wlan_vdev_mlme_get_bss_chan() - get bss chan 860 * @vdev: VDEV object 861 * 862 * API to get the BSS channel 863 * 864 * Return: 865 * @bss_chan: Channel 866 */ 867 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 868 struct wlan_objmgr_vdev *vdev) 869 { 870 return vdev->vdev_mlme.bss_chan; 871 } 872 873 /** 874 * wlan_vdev_mlme_set_des_chan() - set desired chan 875 * @vdev: VDEV object 876 * @des_chan: Channel configured by user 877 * 878 * API to set the desired channel 879 * 880 * Return: void 881 */ 882 static inline void wlan_vdev_mlme_set_des_chan( 883 struct wlan_objmgr_vdev *vdev, 884 struct wlan_channel *des_chan) 885 { 886 vdev->vdev_mlme.des_chan = des_chan; 887 } 888 889 /** 890 * wlan_vdev_mlme_get_des_chan() - get desired chan 891 * @vdev: VDEV object 892 * 893 * API to get the desired channel 894 * 895 * Return: 896 * @des_chan: Channel configured by user 897 */ 898 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 899 struct wlan_objmgr_vdev *vdev) 900 { 901 return vdev->vdev_mlme.des_chan; 902 } 903 904 #ifdef CMN_VDEV_MGR_TGT_IF_ENABLE 905 /** 906 * wlan_vdev_mlme_set_ssid() - set ssid 907 * @vdev: VDEV object 908 * @ssid: SSID (input) 909 * @ssid_len: Length of SSID 910 * 911 * API to set the SSID of VDEV 912 * 913 * Caller need to acquire lock with wlan_vdev_obj_lock() 914 * 915 * Return: SUCCESS, if update is done 916 * FAILURE, if ssid length is > max ssid len 917 */ 918 static inline QDF_STATUS wlan_vdev_mlme_set_ssid( 919 struct wlan_objmgr_vdev *vdev, 920 const uint8_t *ssid, uint8_t ssid_len) 921 { 922 struct vdev_mlme_obj *vdev_mlme; 923 924 /* This API is invoked with lock acquired, do not add log prints */ 925 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 926 if (!vdev_mlme) 927 return QDF_STATUS_E_FAILURE; 928 929 if (ssid_len <= WLAN_SSID_MAX_LEN) { 930 qdf_mem_copy(vdev_mlme->mgmt.generic.ssid, ssid, ssid_len); 931 vdev_mlme->mgmt.generic.ssid_len = ssid_len; 932 } else { 933 vdev_mlme->mgmt.generic.ssid_len = 0; 934 return QDF_STATUS_E_FAILURE; 935 } 936 return QDF_STATUS_SUCCESS; 937 } 938 939 /** 940 * wlan_vdev_mlme_get_ssid() - get ssid 941 * @vdev: VDEV object 942 * @ssid: SSID 943 * @ssid_len: Length of SSID 944 * 945 * API to get the SSID of VDEV, it updates the SSID and its length 946 * in @ssid, @ssid_len respectively 947 * 948 * Caller need to acquire lock with wlan_vdev_obj_lock() 949 * 950 * Return: SUCCESS, if update is done 951 * FAILURE, if ssid length is > max ssid len 952 */ 953 static inline QDF_STATUS wlan_vdev_mlme_get_ssid( 954 struct wlan_objmgr_vdev *vdev, 955 uint8_t *ssid, uint8_t *ssid_len) 956 { 957 struct vdev_mlme_obj *vdev_mlme; 958 959 /* This API is invoked with lock acquired, do not add log prints */ 960 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 961 if (!vdev_mlme) 962 return QDF_STATUS_E_FAILURE; 963 964 if (vdev_mlme->mgmt.generic.ssid_len > 0) { 965 *ssid_len = vdev_mlme->mgmt.generic.ssid_len; 966 qdf_mem_copy(ssid, vdev_mlme->mgmt.generic.ssid, *ssid_len); 967 } else { 968 *ssid_len = 0; 969 return QDF_STATUS_E_FAILURE; 970 } 971 return QDF_STATUS_SUCCESS; 972 } 973 974 /** 975 * wlan_vdev_mlme_set_nss() - set NSS 976 * @vdev: VDEV object 977 * @nss: nss configured by user 978 * 979 * API to set the Number of Spatial streams 980 * 981 * Return: void 982 */ 983 static inline void wlan_vdev_mlme_set_nss( 984 struct wlan_objmgr_vdev *vdev, 985 uint8_t nss) 986 { 987 struct vdev_mlme_obj *vdev_mlme; 988 989 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 990 if (!vdev_mlme) { 991 mlme_err("VDEV MLME is NULL"); 992 return; 993 } 994 995 vdev_mlme->proto.generic.nss = nss; 996 } 997 998 /** 999 * wlan_vdev_mlme_get_nss() - get NSS 1000 * @vdev: VDEV object 1001 * 1002 * API to get the Number of Spatial Streams 1003 * 1004 * Return: 1005 * @nss: nss value 1006 */ 1007 static inline uint8_t wlan_vdev_mlme_get_nss( 1008 struct wlan_objmgr_vdev *vdev) 1009 { 1010 struct vdev_mlme_obj *vdev_mlme; 1011 1012 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1013 if (!vdev_mlme) { 1014 mlme_err("VDEV MLME is NULL"); 1015 return 0; 1016 } 1017 1018 return vdev_mlme->proto.generic.nss; 1019 } 1020 1021 /** 1022 * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask 1023 * @vdev: VDEV object 1024 * @chainmask : chainmask either configured by user or max supported 1025 * 1026 * API to set the Tx chainmask 1027 * 1028 * Return: void 1029 */ 1030 static inline void wlan_vdev_mlme_set_txchainmask( 1031 struct wlan_objmgr_vdev *vdev, 1032 uint8_t chainmask) 1033 { 1034 struct vdev_mlme_obj *vdev_mlme; 1035 1036 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1037 1038 if (!vdev_mlme) { 1039 mlme_err("VDEV MLME is NULL"); 1040 return; 1041 } 1042 1043 vdev_mlme->mgmt.chainmask_info.tx_chainmask = chainmask; 1044 } 1045 1046 /** 1047 * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask 1048 * @vdev: VDEV object 1049 * 1050 * API to get the Tx chainmask 1051 * 1052 * Return: 1053 * @chainmask : Tx chainmask either configured by user or max supported 1054 */ 1055 static inline uint8_t wlan_vdev_mlme_get_txchainmask( 1056 struct wlan_objmgr_vdev *vdev) 1057 { 1058 struct vdev_mlme_obj *vdev_mlme; 1059 1060 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1061 if (!vdev_mlme) { 1062 mlme_err("VDEV MLME is NULL"); 1063 return 0; 1064 } 1065 1066 return vdev_mlme->mgmt.chainmask_info.tx_chainmask; 1067 } 1068 1069 /** 1070 * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask 1071 * @vdev: VDEV object 1072 * @chainmask : Rx chainmask either configured by user or max supported 1073 * 1074 * API to set the Rx chainmask 1075 * 1076 * Return: void 1077 */ 1078 static inline void wlan_vdev_mlme_set_rxchainmask( 1079 struct wlan_objmgr_vdev *vdev, 1080 uint8_t chainmask) 1081 { 1082 struct vdev_mlme_obj *vdev_mlme; 1083 1084 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1085 if (!vdev_mlme) { 1086 mlme_err("VDEV MLME is NULL"); 1087 return; 1088 } 1089 1090 vdev_mlme->mgmt.chainmask_info.rx_chainmask = chainmask; 1091 } 1092 1093 /** 1094 * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask 1095 * @vdev: VDEV object 1096 * 1097 * API to get the Rx chainmask 1098 * 1099 * Return: 1100 * @chainmask : Rx chainmask either configured by user or max supported 1101 */ 1102 static inline uint8_t wlan_vdev_mlme_get_rxchainmask( 1103 struct wlan_objmgr_vdev *vdev) 1104 { 1105 struct vdev_mlme_obj *vdev_mlme; 1106 1107 /* This API is invoked with lock acquired, do not add log prints */ 1108 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1109 if (!vdev_mlme) 1110 return 0; 1111 1112 return vdev_mlme->mgmt.chainmask_info.rx_chainmask; 1113 } 1114 1115 /** 1116 * wlan_vdev_mlme_set_txpower() - set tx power 1117 * @vdev: VDEV object 1118 * @txpow: tx power either configured by used or max allowed 1119 * 1120 * API to set the tx power 1121 * 1122 * Return: void 1123 */ 1124 static inline void wlan_vdev_mlme_set_txpower( 1125 struct wlan_objmgr_vdev *vdev, 1126 uint8_t txpow) 1127 { 1128 struct vdev_mlme_obj *vdev_mlme; 1129 1130 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1131 if (!vdev_mlme) { 1132 mlme_err("VDEV MLME is NULL"); 1133 return; 1134 } 1135 1136 vdev_mlme->mgmt.generic.tx_power = txpow; 1137 } 1138 1139 /** 1140 * wlan_vdev_mlme_get_txpower() - get tx power 1141 * @vdev: VDEV object 1142 * 1143 * API to get the tx power 1144 * 1145 * Return: 1146 * @txpow: tx power either configured by used or max allowed 1147 */ 1148 static inline uint8_t wlan_vdev_mlme_get_txpower( 1149 struct wlan_objmgr_vdev *vdev) 1150 { 1151 struct vdev_mlme_obj *vdev_mlme; 1152 1153 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1154 if (!vdev_mlme) { 1155 mlme_err("VDEV MLME is NULL"); 1156 return 0; 1157 } 1158 1159 return vdev_mlme->mgmt.generic.tx_power; 1160 } 1161 1162 /** 1163 * wlan_vdev_mlme_set_maxrate() - set max rate 1164 * @vdev: VDEV object 1165 * @maxrate: configured by used or based on configured mode 1166 * 1167 * API to set the max rate the vdev supports 1168 * 1169 * Return: void 1170 */ 1171 static inline void wlan_vdev_mlme_set_maxrate( 1172 struct wlan_objmgr_vdev *vdev, 1173 uint32_t maxrate) 1174 { 1175 struct vdev_mlme_obj *vdev_mlme; 1176 1177 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1178 if (!vdev_mlme) { 1179 mlme_err("VDEV MLME is NULL"); 1180 return; 1181 } 1182 1183 vdev_mlme->mgmt.rate_info.max_rate = maxrate; 1184 } 1185 1186 /** 1187 * wlan_vdev_mlme_get_maxrate() - get max rate 1188 * @vdev: VDEV object 1189 * 1190 * API to get the max rate the vdev supports 1191 * 1192 * Return: 1193 * @maxrate: configured by used or based on configured mode 1194 */ 1195 static inline uint32_t wlan_vdev_mlme_get_maxrate( 1196 struct wlan_objmgr_vdev *vdev) 1197 { 1198 struct vdev_mlme_obj *vdev_mlme; 1199 1200 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1201 if (!vdev_mlme) { 1202 mlme_err("VDEV MLME is NULL"); 1203 return 0; 1204 } 1205 1206 return vdev_mlme->mgmt.rate_info.max_rate; 1207 } 1208 1209 /** 1210 * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate 1211 * @vdev: VDEV object 1212 * @txmgmtrate: Tx Mgmt rate 1213 * 1214 * API to set Mgmt Tx rate 1215 * 1216 * Return: void 1217 */ 1218 static inline void wlan_vdev_mlme_set_txmgmtrate( 1219 struct wlan_objmgr_vdev *vdev, 1220 uint32_t txmgmtrate) 1221 { 1222 struct vdev_mlme_obj *vdev_mlme; 1223 1224 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1225 if (!vdev_mlme) { 1226 mlme_err("VDEV MLME is NULL"); 1227 return; 1228 } 1229 vdev_mlme->mgmt.rate_info.tx_mgmt_rate = txmgmtrate; 1230 } 1231 1232 /** 1233 * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate 1234 * @vdev: VDEV object 1235 * 1236 * API to get Mgmt Tx rate 1237 * 1238 * Return: 1239 * @txmgmtrate: Tx Mgmt rate 1240 */ 1241 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate( 1242 struct wlan_objmgr_vdev *vdev) 1243 { 1244 struct vdev_mlme_obj *vdev_mlme; 1245 1246 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 1247 if (!vdev_mlme) { 1248 mlme_err("VDEV MLME is NULL"); 1249 return 0; 1250 } 1251 1252 return vdev_mlme->mgmt.rate_info.tx_mgmt_rate; 1253 } 1254 #else 1255 1256 /** 1257 * wlan_vdev_mlme_set_ssid() - set ssid 1258 * @vdev: VDEV object 1259 * @ssid: SSID (input) 1260 * @ssid_len: Length of SSID 1261 * 1262 * API to set the SSID of VDEV 1263 * 1264 * Caller need to acquire lock with wlan_vdev_obj_lock() 1265 * 1266 * Return: SUCCESS, if update is done 1267 * FAILURE, if ssid length is > max ssid len 1268 */ 1269 static inline QDF_STATUS wlan_vdev_mlme_set_ssid( 1270 struct wlan_objmgr_vdev *vdev, 1271 const uint8_t *ssid, uint8_t ssid_len) 1272 { 1273 /* This API is invoked with lock acquired, do not add log prints */ 1274 if (ssid_len <= WLAN_SSID_MAX_LEN) { 1275 qdf_mem_copy(vdev->vdev_mlme.ssid, ssid, ssid_len); 1276 vdev->vdev_mlme.ssid_len = ssid_len; 1277 } else { 1278 vdev->vdev_mlme.ssid_len = 0; 1279 return QDF_STATUS_E_FAILURE; 1280 } 1281 return QDF_STATUS_SUCCESS; 1282 } 1283 1284 /** 1285 * wlan_vdev_mlme_get_ssid() - get ssid 1286 * @vdev: VDEV object 1287 * @ssid: SSID 1288 * @ssid_len: Length of SSID 1289 * 1290 * API to get the SSID of VDEV, it updates the SSID and its length 1291 * in @ssid, @ssid_len respectively 1292 * 1293 * Caller need to acquire lock with wlan_vdev_obj_lock() 1294 * 1295 * Return: SUCCESS, if update is done 1296 * FAILURE, if ssid length is > max ssid len 1297 */ 1298 static inline QDF_STATUS wlan_vdev_mlme_get_ssid( 1299 struct wlan_objmgr_vdev *vdev, 1300 uint8_t *ssid, uint8_t *ssid_len) 1301 { 1302 /* This API is invoked with lock acquired, do not add log prints */ 1303 if (vdev->vdev_mlme.ssid_len > 0) { 1304 *ssid_len = vdev->vdev_mlme.ssid_len; 1305 qdf_mem_copy(ssid, vdev->vdev_mlme.ssid, *ssid_len); 1306 } else { 1307 *ssid_len = 0; 1308 return QDF_STATUS_E_FAILURE; 1309 } 1310 return QDF_STATUS_SUCCESS; 1311 } 1312 1313 /** 1314 * wlan_vdev_mlme_set_nss() - set NSS 1315 * @vdev: VDEV object 1316 * @nss: nss configured by user 1317 * 1318 * API to set the Number of Spatial streams 1319 * 1320 * Return: void 1321 */ 1322 static inline void wlan_vdev_mlme_set_nss(struct wlan_objmgr_vdev *vdev, 1323 uint8_t nss) 1324 { 1325 vdev->vdev_mlme.nss = nss; 1326 } 1327 1328 /** 1329 * wlan_vdev_mlme_get_nss() - get NSS 1330 * @vdev: VDEV object 1331 * 1332 * API to get the Number of Spatial Streams 1333 * 1334 * Return: 1335 * @nss: nss value 1336 */ 1337 static inline uint8_t wlan_vdev_mlme_get_nss( 1338 struct wlan_objmgr_vdev *vdev) 1339 { 1340 return vdev->vdev_mlme.nss; 1341 } 1342 1343 /** 1344 * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask 1345 * @vdev: VDEV object 1346 * @chainmask : chainmask either configured by user or max supported 1347 * 1348 * API to set the Tx chainmask 1349 * 1350 * Return: void 1351 */ 1352 static inline void wlan_vdev_mlme_set_txchainmask( 1353 struct wlan_objmgr_vdev *vdev, 1354 uint8_t chainmask) 1355 { 1356 vdev->vdev_mlme.tx_chainmask = chainmask; 1357 } 1358 1359 /** 1360 * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask 1361 * @vdev: VDEV object 1362 * 1363 * API to get the Tx chainmask 1364 * 1365 * Return: 1366 * @chainmask : Tx chainmask either configured by user or max supported 1367 */ 1368 static inline uint8_t wlan_vdev_mlme_get_txchainmask( 1369 struct wlan_objmgr_vdev *vdev) 1370 { 1371 return vdev->vdev_mlme.tx_chainmask; 1372 } 1373 1374 /** 1375 * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask 1376 * @vdev: VDEV object 1377 * @chainmask : Rx chainmask either configured by user or max supported 1378 * 1379 * API to set the Rx chainmask 1380 * 1381 * Return: void 1382 */ 1383 static inline void wlan_vdev_mlme_set_rxchainmask( 1384 struct wlan_objmgr_vdev *vdev, 1385 uint8_t chainmask) 1386 { 1387 vdev->vdev_mlme.rx_chainmask = chainmask; 1388 } 1389 1390 /** 1391 * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask 1392 * @vdev: VDEV object 1393 * 1394 * API to get the Rx chainmask 1395 * 1396 * Return: 1397 * @chainmask : Rx chainmask either configured by user or max supported 1398 */ 1399 static inline uint8_t wlan_vdev_mlme_get_rxchainmask( 1400 struct wlan_objmgr_vdev *vdev) 1401 { 1402 /* This API is invoked with lock acquired, do not add log prints */ 1403 return vdev->vdev_mlme.rx_chainmask; 1404 } 1405 1406 /** 1407 * wlan_vdev_mlme_set_txpower() - set tx power 1408 * @vdev: VDEV object 1409 * @txpow: tx power either configured by used or max allowed 1410 * 1411 * API to set the tx power 1412 * 1413 * Return: void 1414 */ 1415 static inline void wlan_vdev_mlme_set_txpower( 1416 struct wlan_objmgr_vdev *vdev, 1417 uint8_t txpow) 1418 { 1419 vdev->vdev_mlme.tx_power = txpow; 1420 } 1421 1422 /** 1423 * wlan_vdev_mlme_get_txpower() - get tx power 1424 * @vdev: VDEV object 1425 * 1426 * API to get the tx power 1427 * 1428 * Return: 1429 * @txpow: tx power either configured by used or max allowed 1430 */ 1431 static inline uint8_t wlan_vdev_mlme_get_txpower( 1432 struct wlan_objmgr_vdev *vdev) 1433 { 1434 return vdev->vdev_mlme.tx_power; 1435 } 1436 1437 /** 1438 * wlan_vdev_mlme_set_maxrate() - set max rate 1439 * @vdev: VDEV object 1440 * @maxrate: configured by used or based on configured mode 1441 * 1442 * API to set the max rate the vdev supports 1443 * 1444 * Return: void 1445 */ 1446 static inline void wlan_vdev_mlme_set_maxrate( 1447 struct wlan_objmgr_vdev *vdev, 1448 uint32_t maxrate) 1449 { 1450 vdev->vdev_mlme.max_rate = maxrate; 1451 } 1452 1453 /** 1454 * wlan_vdev_mlme_get_maxrate() - get max rate 1455 * @vdev: VDEV object 1456 * 1457 * API to get the max rate the vdev supports 1458 * 1459 * Return: 1460 * @maxrate: configured by used or based on configured mode 1461 */ 1462 static inline uint32_t wlan_vdev_mlme_get_maxrate( 1463 struct wlan_objmgr_vdev *vdev) 1464 { 1465 return vdev->vdev_mlme.max_rate; 1466 } 1467 1468 /** 1469 * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate 1470 * @vdev: VDEV object 1471 * @txmgmtrate: Tx Mgmt rate 1472 * 1473 * API to set Mgmt Tx rate 1474 * 1475 * Return: void 1476 */ 1477 static inline void wlan_vdev_mlme_set_txmgmtrate( 1478 struct wlan_objmgr_vdev *vdev, 1479 uint32_t txmgmtrate) 1480 { 1481 vdev->vdev_mlme.tx_mgmt_rate = txmgmtrate; 1482 } 1483 1484 /** 1485 * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate 1486 * @vdev: VDEV object 1487 * 1488 * API to get Mgmt Tx rate 1489 * 1490 * Return: 1491 * @txmgmtrate: Tx Mgmt rate 1492 */ 1493 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate( 1494 struct wlan_objmgr_vdev *vdev) 1495 { 1496 return vdev->vdev_mlme.tx_mgmt_rate; 1497 } 1498 #endif 1499 1500 /** 1501 * wlan_vdev_mlme_feat_cap_set() - set feature caps 1502 * @vdev: VDEV object 1503 * @cap: capabilities to be set 1504 * 1505 * API to set MLME feature capabilities 1506 * 1507 * Return: void 1508 */ 1509 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 1510 uint32_t cap) 1511 { 1512 vdev->vdev_mlme.vdev_feat_caps |= cap; 1513 } 1514 1515 /** 1516 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 1517 * @vdev: VDEV object 1518 * @cap: capabilities to be cleared 1519 * 1520 * API to clear MLME feature capabilities 1521 * 1522 * Return: void 1523 */ 1524 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 1525 uint32_t cap) 1526 { 1527 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 1528 } 1529 1530 /** 1531 * wlan_vdev_mlme_feat_cap_get() - get feature caps 1532 * @vdev: VDEV object 1533 * @cap: capabilities to be checked 1534 * 1535 * API to know MLME feature capability is set or not 1536 * 1537 * Return: 1 -- if capabilities set 1538 * 0 -- if capabilities clear 1539 */ 1540 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 1541 uint32_t cap) 1542 { 1543 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 1544 } 1545 1546 /** 1547 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 1548 * @vdev: VDEV object 1549 * @cap: capabilities to be set 1550 * 1551 * API to set the MLME extensive feature capabilities 1552 * 1553 * Return: void 1554 */ 1555 static inline void wlan_vdev_mlme_feat_ext_cap_set( 1556 struct wlan_objmgr_vdev *vdev, 1557 uint32_t cap) 1558 { 1559 vdev->vdev_mlme.vdev_feat_ext_caps |= cap; 1560 } 1561 1562 /** 1563 * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps 1564 * @vdev: VDEV object 1565 * @cap: capabilities to be cleared 1566 * 1567 * API to clear the MLME extensive feature capabilities 1568 * 1569 * Return: void 1570 */ 1571 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 1572 struct wlan_objmgr_vdev *vdev, 1573 uint32_t cap) 1574 { 1575 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 1576 } 1577 1578 /** 1579 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 1580 * @vdev: VDEV object 1581 * @cap: capabilities to be checked 1582 * 1583 * API to know MLME ext feature capability is set or not 1584 * 1585 * Return: 1 -- if capabilities set 1586 * 0 -- if capabilities clear 1587 */ 1588 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 1589 struct wlan_objmgr_vdev *vdev, 1590 uint32_t cap) 1591 { 1592 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 1593 } 1594 1595 /** 1596 * wlan_vdev_mlme_cap_set() - mlme caps set 1597 * @vdev: VDEV object 1598 * @cap: capabilities to be set 1599 * 1600 * API to set the MLME capabilities 1601 * 1602 * Return: void 1603 */ 1604 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 1605 uint32_t cap) 1606 { 1607 vdev->vdev_mlme.vdev_caps |= cap; 1608 } 1609 1610 /** 1611 * wlan_vdev_mlme_cap_clear() - mlme caps clear 1612 * @vdev: VDEV object 1613 * @cap: capabilities to be cleared 1614 * 1615 * API to clear the MLME capabilities 1616 * 1617 * Return: void 1618 */ 1619 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1620 uint32_t cap) 1621 { 1622 vdev->vdev_mlme.vdev_caps &= ~cap; 1623 } 1624 1625 /** 1626 * wlan_vdev_mlme_cap_get() - get mlme caps 1627 * @vdev: VDEV object 1628 * @cap: capabilities to be checked 1629 * 1630 * API to know MLME capability is set or not 1631 * 1632 * Return: 1 -- if capabilities set 1633 * 0 -- if capabilities clear 1634 */ 1635 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1636 uint32_t cap) 1637 { 1638 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1639 } 1640 1641 /** 1642 * wlan_vdev_mlme_get_state() - get mlme state 1643 * @vdev: VDEV object 1644 * 1645 * API to get MLME state 1646 * 1647 * Return: state of MLME 1648 */ 1649 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1650 struct wlan_objmgr_vdev *vdev) 1651 { 1652 return vdev->vdev_mlme.mlme_state; 1653 } 1654 1655 #ifdef CMN_VDEV_MLME_SM_ENABLE 1656 /** 1657 * wlan_vdev_mlme_get_substate() - get mlme substate 1658 * @vdev: VDEV object 1659 * 1660 * API to get VDEV MLME substate 1661 * 1662 * Return: substate of VDEV MLME 1663 */ 1664 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate( 1665 struct wlan_objmgr_vdev *vdev) 1666 { 1667 return vdev->vdev_mlme.mlme_substate; 1668 } 1669 #else 1670 /** 1671 * wlan_vdev_mlme_set_state() - set mlme state 1672 * @vdev: VDEV object 1673 * @state: MLME state 1674 * 1675 * API to set MLME state 1676 * 1677 * Return: void 1678 */ 1679 static inline void wlan_vdev_mlme_set_state(struct wlan_objmgr_vdev *vdev, 1680 enum wlan_vdev_state state) 1681 { 1682 if (state < WLAN_VDEV_S_MAX) 1683 vdev->vdev_mlme.mlme_state = state; 1684 } 1685 #endif 1686 1687 /** 1688 * wlan_vdev_set_selfpeer() - set self peer 1689 * @vdev: VDEV object 1690 * @peer: peer pointer 1691 * 1692 * API to set the self peer of VDEV 1693 * 1694 * Return: void 1695 */ 1696 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev, 1697 struct wlan_objmgr_peer *peer) 1698 { 1699 vdev->vdev_objmgr.self_peer = peer; 1700 } 1701 1702 /** 1703 * wlan_vdev_get_selfpeer() - get self peer 1704 * @vdev: VDEV object 1705 * 1706 * API to get the self peer of VDEV 1707 * 1708 * Return: 1709 * @peer: peer pointer 1710 */ 1711 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer( 1712 struct wlan_objmgr_vdev *vdev) 1713 { 1714 return vdev->vdev_objmgr.self_peer; 1715 } 1716 1717 /** 1718 * wlan_vdev_set_bsspeer() - set bss peer 1719 * @vdev: VDEV object 1720 * @peer: BSS peer pointer 1721 * 1722 * API to set the BSS peer of VDEV 1723 * 1724 * Return: void 1725 */ 1726 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev, 1727 struct wlan_objmgr_peer *peer) 1728 { 1729 vdev->vdev_objmgr.bss_peer = peer; 1730 } 1731 1732 /** 1733 * wlan_vdev_get_bsspeer() - get bss peer 1734 * @vdev: VDEV object 1735 * 1736 * API to get the BSS peer of VDEV 1737 * 1738 * Return: 1739 * @peer: BSS peer pointer 1740 */ 1741 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer( 1742 struct wlan_objmgr_vdev *vdev) 1743 { 1744 return vdev->vdev_objmgr.bss_peer; 1745 } 1746 1747 /** 1748 * wlan_vdev_get_ospriv() - get os priv pointer 1749 * @vdev: VDEV object 1750 * 1751 * API to get OS private pointer from VDEV 1752 * 1753 * Return: ospriv - private pointer 1754 */ 1755 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv( 1756 struct wlan_objmgr_vdev *vdev) 1757 { 1758 return vdev->vdev_nif.osdev; 1759 } 1760 1761 /** 1762 * wlan_vdev_reset_ospriv() - reset os priv pointer 1763 * @vdev: VDEV object 1764 * 1765 * API to reset OS private pointer in VDEV 1766 * 1767 * Return: void 1768 */ 1769 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) 1770 { 1771 vdev->vdev_nif.osdev = NULL; 1772 } 1773 1774 /** 1775 * wlan_vdev_get_peer_count() - get vdev peer count 1776 * @vdev: VDEV object 1777 * 1778 * API to get peer count from VDEV 1779 * 1780 * Return: peer_count - vdev's peer count 1781 */ 1782 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) 1783 { 1784 return vdev->vdev_objmgr.wlan_peer_count; 1785 } 1786 1787 /** 1788 * DOC: Examples to use VDEV ref count APIs 1789 * 1790 * In all the scenarios, the pair of API should be followed 1791 * other it lead to memory leak 1792 * 1793 * scenario 1: 1794 * 1795 * wlan_objmgr_vdev_obj_create() 1796 * ---- 1797 * wlan_objmgr_vdev_obj_delete() 1798 * 1799 * scenario 2: 1800 * 1801 * wlan_objmgr_vdev_get_ref() 1802 * ---- 1803 * the operations which are done on 1804 * vdev object 1805 * ---- 1806 * wlan_objmgr_vdev_release_ref() 1807 * 1808 * scenario 3: 1809 * 1810 * API to retrieve vdev (xxx_get_vdev_xxx()) 1811 * ---- 1812 * the operations which are done on 1813 * vdev object 1814 * ---- 1815 * wlan_objmgr_vdev_release_ref() 1816 */ 1817 1818 /** 1819 * wlan_objmgr_vdev_get_ref() - increment ref count 1820 * @vdev: VDEV object 1821 * @id: Object Manager ref debug id 1822 * 1823 * API to increment ref count of vdev 1824 * 1825 * Return: void 1826 */ 1827 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, 1828 wlan_objmgr_ref_dbgid id); 1829 1830 /** 1831 * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed 1832 * @vdev: VDEV object 1833 * @id: Object Manager ref debug id 1834 * 1835 * API to increment ref count of vdev after checking valid object state 1836 * 1837 * Return: void 1838 */ 1839 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, 1840 wlan_objmgr_ref_dbgid id); 1841 1842 /** 1843 * wlan_objmgr_vdev_release_ref() - decrement ref count 1844 * @vdev: VDEV object 1845 * @id: Object Manager ref debug id 1846 * 1847 * API to decrement ref count of vdev, if ref count is 1, it initiates the 1848 * VDEV deletion 1849 * 1850 * Return: void 1851 */ 1852 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, 1853 wlan_objmgr_ref_dbgid id); 1854 1855 /** 1856 * wlan_vdev_set_max_peer_count() - set max peer count 1857 * @vdev: VDEV object 1858 * @count: Max peer count 1859 * 1860 * API to set max peer count of VDEV 1861 * 1862 * Return: void 1863 */ 1864 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev, 1865 uint16_t count) 1866 { 1867 vdev->vdev_objmgr.max_peer_count = count; 1868 } 1869 1870 /** 1871 * wlan_vdev_get_max_peer_count() - get max peer count 1872 * @vdev: VDEV object 1873 * 1874 * API to get max peer count of VDEV 1875 * 1876 * Return: max peer count 1877 */ 1878 static inline uint16_t wlan_vdev_get_max_peer_count( 1879 struct wlan_objmgr_vdev *vdev) 1880 { 1881 return vdev->vdev_objmgr.max_peer_count; 1882 } 1883 1884 /** 1885 * wlan_vdev_is_connected() - Check whether peer is associated or not 1886 * @vdev: pointer to objmgr vdev 1887 * 1888 * Return: true in case success else false 1889 */ 1890 bool wlan_vdev_is_connected(struct wlan_objmgr_vdev *vdev); 1891 1892 /** 1893 * wlan_vdev_set_dp_handle() - set dp handle 1894 * @vdev: vdev object pointer 1895 * @dp_handle: Data path module handle 1896 * 1897 * Return: void 1898 */ 1899 static inline void wlan_vdev_set_dp_handle(struct wlan_objmgr_vdev *vdev, 1900 void *dp_handle) 1901 { 1902 if (qdf_unlikely(!vdev)) { 1903 QDF_BUG(0); 1904 return; 1905 } 1906 1907 vdev->dp_handle = dp_handle; 1908 } 1909 1910 /** 1911 * wlan_vdev_get_dp_handle() - get dp handle 1912 * @vdev: vdev object pointer 1913 * 1914 * Return: dp handle 1915 */ 1916 static inline void *wlan_vdev_get_dp_handle(struct wlan_objmgr_vdev *vdev) 1917 { 1918 if (qdf_unlikely(!vdev)) { 1919 QDF_BUG(0); 1920 return NULL; 1921 } 1922 1923 return vdev->dp_handle; 1924 } 1925 1926 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/ 1927