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