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