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