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 comp 499 * 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 vdev (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_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 570 * @vdev: VDEV object 571 * @vdev_list: qdf_list_t 572 * @dbg_id: id of the caller 573 * 574 * API to get the head active vdev of given vdev (of pdev's vdev list) 575 * 576 * Return: 577 * @peer: head peer 578 */ 579 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 580 struct wlan_objmgr_pdev *pdev, 581 qdf_list_t *vdev_list, 582 wlan_objmgr_ref_dbgid dbg_id); 583 584 /** 585 * wlan_vdev_get_next_vdev_of_pdev() - get next vdev 586 * @vdev: VDEV object 587 * 588 * API to get next vdev object pointer of vdev 589 * 590 * Caller need to acquire lock with wlan_vdev_obj_lock() 591 * 592 * Return: 593 * @vdev_next: VDEV object 594 */ 595 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( 596 qdf_list_t *vdev_list, 597 struct wlan_objmgr_vdev *vdev) 598 { 599 struct wlan_objmgr_vdev *vdev_next; 600 qdf_list_node_t *node = &vdev->vdev_node; 601 qdf_list_node_t *next_node = NULL; 602 603 /* This API is invoked with lock acquired, do not add log prints */ 604 if (node == NULL) 605 return NULL; 606 607 if (qdf_list_peek_next(vdev_list, node, &next_node) != 608 QDF_STATUS_SUCCESS) 609 return NULL; 610 611 vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev, 612 vdev_node); 613 return vdev_next; 614 } 615 616 /** 617 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 618 * @pdev: PDEV object 619 * @vdev_list: qdf_list_t 620 * @vdev: VDEV object 621 * @dbg_id: id of the caller 622 * 623 * API to get next active vdev object pointer of vdev 624 * 625 * Return: 626 * @vdev_next: VDEV object 627 */ 628 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 629 struct wlan_objmgr_pdev *pdev, 630 qdf_list_t *vdev_list, 631 struct wlan_objmgr_vdev *vdev, 632 wlan_objmgr_ref_dbgid dbg_id); 633 634 635 /** 636 * wlan_vdev_set_pdev() - set pdev 637 * @vdev: VDEV object 638 * @pdev: PDEV object 639 * 640 * API to get pdev object pointer from vdev 641 * 642 * Caller need to acquire lock with wlan_vdev_obj_lock() 643 * 644 * Return: void 645 */ 646 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev, 647 struct wlan_objmgr_pdev *pdev) 648 { 649 /* This API is invoked with lock acquired, do not add log prints */ 650 vdev->vdev_objmgr.wlan_pdev = pdev; 651 } 652 653 /** 654 * wlan_vdev_get_psoc() - get psoc 655 * @vdev: VDEV object 656 * 657 * API to get pdev object pointer from vdev 658 * 659 * Return: psoc object pointer 660 */ 661 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc( 662 struct wlan_objmgr_vdev *vdev) 663 { 664 struct wlan_objmgr_pdev *pdev; 665 struct wlan_objmgr_psoc *psoc = NULL; 666 667 pdev = wlan_vdev_get_pdev(vdev); 668 if (pdev == NULL) 669 return NULL; 670 671 psoc = wlan_pdev_get_psoc(pdev); 672 673 return psoc; 674 } 675 676 /** 677 * wlan_vdev_mlme_set_opmode() - set vdev opmode 678 * @vdev: VDEV object 679 * @mode: VDEV op mode 680 * 681 * API to set opmode in vdev object 682 * 683 * Return: void 684 */ 685 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev, 686 enum QDF_OPMODE mode) 687 { 688 vdev->vdev_mlme.vdev_opmode = mode; 689 } 690 691 /** 692 * wlan_vdev_mlme_get_opmode() - get vdev opmode 693 * @vdev: VDEV object 694 * 695 * API to set opmode of vdev object 696 * 697 * Return: 698 * @mode: VDEV op mode 699 */ 700 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 701 struct wlan_objmgr_vdev *vdev) 702 { 703 return vdev->vdev_mlme.vdev_opmode; 704 } 705 706 /** 707 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 708 * @vdev: VDEV object 709 * @macaddr: MAC address 710 * 711 * API to set macaddr 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_macaddr(struct wlan_objmgr_vdev *vdev, 718 uint8_t *macaddr) 719 { 720 /* This API is invoked with lock acquired, do not add log prints */ 721 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 722 } 723 724 /** 725 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 726 * @vdev: VDEV object 727 * 728 * API to get MAC address from vdev object 729 * 730 * Caller need to acquire lock with wlan_vdev_obj_lock() 731 * 732 * Return: 733 * @macaddr: MAC address 734 */ 735 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 736 { 737 /* This API is invoked with lock acquired, do not add log prints */ 738 return vdev->vdev_mlme.macaddr; 739 } 740 741 /** 742 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 743 * @vdev: VDEV object 744 * @mataddr: MAT address 745 * 746 * API to set mataddr in vdev object 747 * 748 * Caller need to acquire lock with wlan_vdev_obj_lock() 749 * 750 * Return: void 751 */ 752 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 753 uint8_t *mataddr) 754 { 755 /* This API is invoked with lock acquired, do not add log prints */ 756 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 757 } 758 759 /** 760 * wlan_vdev_mlme_get_mataddr() - get mataddr 761 * @vdev: VDEV object 762 * 763 * API to get MAT address from vdev object 764 * 765 * Caller need to acquire lock with wlan_vdev_obj_lock() 766 * 767 * Return: 768 * @mataddr: MAT address 769 */ 770 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 771 { 772 /* This API is invoked with lock acquired, do not add log prints */ 773 return vdev->vdev_mlme.mataddr; 774 } 775 776 /** 777 * wlan_vdev_get_id() - get vdev id 778 * @vdev: VDEV object 779 * 780 * API to get vdev id 781 * 782 * Return: 783 * @id: vdev id 784 */ 785 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 786 { 787 return vdev->vdev_objmgr.vdev_id; 788 } 789 790 /** 791 * wlan_vdev_get_hw_macaddr() - get hw macaddr 792 * @vdev: VDEV object 793 * 794 * API to retrieve the HW MAC address from PDEV 795 * 796 * Caller need to acquire lock with wlan_vdev_obj_lock() 797 * 798 * Return: 799 * @macaddr: HW MAC address 800 */ 801 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 802 { 803 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 804 805 /* This API is invoked with lock acquired, do not add log prints */ 806 if (pdev != NULL) 807 return wlan_pdev_get_hw_macaddr(pdev); 808 else 809 return NULL; 810 } 811 812 /** 813 * wlan_vdev_mlme_set_ssid() - set ssid 814 * @vdev: VDEV object 815 * @ssid: SSID (input) 816 * @ssid_len: Length of SSID 817 * 818 * API to set the SSID of VDEV 819 * 820 * Caller need to acquire lock with wlan_vdev_obj_lock() 821 * 822 * Return: SUCCESS, if update is done 823 * FAILURE, if ssid length is > max ssid len 824 */ 825 static inline QDF_STATUS wlan_vdev_mlme_set_ssid( 826 struct wlan_objmgr_vdev *vdev, 827 const uint8_t *ssid, uint8_t ssid_len) 828 { 829 /* This API is invoked with lock acquired, do not add log prints */ 830 if (ssid_len <= WLAN_SSID_MAX_LEN) { 831 qdf_mem_copy(vdev->vdev_mlme.ssid, ssid, ssid_len); 832 vdev->vdev_mlme.ssid_len = ssid_len; 833 } else { 834 vdev->vdev_mlme.ssid_len = 0; 835 return QDF_STATUS_E_FAILURE; 836 } 837 return QDF_STATUS_SUCCESS; 838 } 839 840 /** 841 * wlan_vdev_mlme_get_ssid() - get ssid 842 * @vdev: VDEV object 843 * @ssid: SSID 844 * @ssid_len: Length of SSID 845 * 846 * API to get the SSID of VDEV, it updates the SSID and its length 847 * in @ssid, @ssid_len respectively 848 * 849 * Caller need to acquire lock with wlan_vdev_obj_lock() 850 * 851 * Return: SUCCESS, if update is done 852 * FAILURE, if ssid length is > max ssid len 853 */ 854 static inline QDF_STATUS wlan_vdev_mlme_get_ssid( 855 struct wlan_objmgr_vdev *vdev, 856 uint8_t *ssid, uint8_t *ssid_len) 857 { 858 /* This API is invoked with lock acquired, do not add log prints */ 859 if (vdev->vdev_mlme.ssid_len > 0) { 860 *ssid_len = vdev->vdev_mlme.ssid_len; 861 qdf_mem_copy(ssid, vdev->vdev_mlme.ssid, *ssid_len); 862 } else { 863 *ssid_len = 0; 864 return QDF_STATUS_E_FAILURE; 865 } 866 return QDF_STATUS_SUCCESS; 867 } 868 869 /** 870 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 871 * @vdev: VDEV object 872 * 873 * API to acquire VDEV lock 874 * Parent lock should not be taken in child lock context 875 * but child lock can be taken in parent lock context 876 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 877 * 878 * Return: void 879 */ 880 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 881 { 882 qdf_spin_lock_bh(&vdev->vdev_lock); 883 } 884 885 /** 886 * wlan_vdev_obj_unlock() - Release VDEV spinlock 887 * @vdev: VDEV object 888 * 889 * API to Release VDEV lock 890 * 891 * Return: void 892 */ 893 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 894 { 895 qdf_spin_unlock_bh(&vdev->vdev_lock); 896 } 897 898 /** 899 * wlan_vdev_mlme_set_bss_chan() - set bss chan 900 * @vdev: VDEV object 901 * @bss_chan: Channel 902 * 903 * API to set the BSS channel 904 * 905 * Return: void 906 */ 907 static inline void wlan_vdev_mlme_set_bss_chan(struct wlan_objmgr_vdev *vdev, 908 struct wlan_channel *bss_chan) 909 { 910 vdev->vdev_mlme.bss_chan = bss_chan; 911 } 912 913 /** 914 * wlan_vdev_mlme_get_bss_chan() - get bss chan 915 * @vdev: VDEV object 916 * 917 * API to get the BSS channel 918 * 919 * Return: 920 * @bss_chan: Channel 921 */ 922 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 923 struct wlan_objmgr_vdev *vdev) 924 { 925 return vdev->vdev_mlme.bss_chan; 926 } 927 928 /** 929 * wlan_vdev_mlme_set_des_chan() - set desired chan 930 * @vdev: VDEV object 931 * @des_chan: Channel configured by user 932 * 933 * API to set the desired channel 934 * 935 * Return: void 936 */ 937 static inline void wlan_vdev_mlme_set_des_chan(struct wlan_objmgr_vdev *vdev, 938 struct wlan_channel *des_chan) 939 { 940 vdev->vdev_mlme.des_chan = des_chan; 941 } 942 943 /** 944 * wlan_vdev_mlme_get_des_chan() - get desired chan 945 * @vdev: VDEV object 946 * 947 * API to get the desired channel 948 * 949 * Return: 950 * @des_chan: Channel configured by user 951 */ 952 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 953 struct wlan_objmgr_vdev *vdev) 954 { 955 return vdev->vdev_mlme.des_chan; 956 } 957 958 /** 959 * wlan_vdev_mlme_set_nss() - set NSS 960 * @vdev: VDEV object 961 * @nss: nss configured by user 962 * 963 * API to set the Number of Spatial streams 964 * 965 * Return: void 966 */ 967 static inline void wlan_vdev_mlme_set_nss(struct wlan_objmgr_vdev *vdev, 968 uint8_t nss) 969 { 970 vdev->vdev_mlme.nss = nss; 971 } 972 973 /** 974 * wlan_vdev_mlme_get_nss() - get NSS 975 * @vdev: VDEV object 976 * 977 * API to get the Number of Spatial Streams 978 * 979 * Return: 980 * @nss: nss value 981 */ 982 static inline uint8_t wlan_vdev_mlme_get_nss( 983 struct wlan_objmgr_vdev *vdev) 984 { 985 return vdev->vdev_mlme.nss; 986 } 987 988 /** 989 * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask 990 * @vdev: VDEV object 991 * @chainmask : chainmask either configured by user or max supported 992 * 993 * API to set the Tx chainmask 994 * 995 * Return: void 996 */ 997 static inline void wlan_vdev_mlme_set_txchainmask(struct wlan_objmgr_vdev *vdev, 998 uint8_t chainmask) 999 { 1000 vdev->vdev_mlme.tx_chainmask = chainmask; 1001 } 1002 1003 /** 1004 * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask 1005 * @vdev: VDEV object 1006 * 1007 * API to get the Tx chainmask 1008 * 1009 * Return: 1010 * @chainmask : Tx chainmask either configured by user or max supported 1011 */ 1012 static inline uint8_t wlan_vdev_mlme_get_txchainmask( 1013 struct wlan_objmgr_vdev *vdev) 1014 { 1015 return vdev->vdev_mlme.tx_chainmask; 1016 } 1017 1018 /** 1019 * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask 1020 * @vdev: VDEV object 1021 * @chainmask : Rx chainmask either configured by user or max supported 1022 * 1023 * API to set the Rx chainmask 1024 * 1025 * Return: void 1026 */ 1027 static inline void wlan_vdev_mlme_set_rxchainmask(struct wlan_objmgr_vdev *vdev, 1028 uint8_t chainmask) 1029 { 1030 vdev->vdev_mlme.rx_chainmask = chainmask; 1031 } 1032 1033 /** 1034 * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask 1035 * @vdev: VDEV object 1036 * 1037 * API to get the Rx chainmask 1038 * 1039 * Return: 1040 * @chainmask : Rx chainmask either configured by user or max supported 1041 */ 1042 static inline uint8_t wlan_vdev_mlme_get_rxchainmask( 1043 struct wlan_objmgr_vdev *vdev) 1044 { 1045 /* This API is invoked with lock acquired, do not add log prints */ 1046 return vdev->vdev_mlme.rx_chainmask; 1047 } 1048 1049 /** 1050 * wlan_vdev_mlme_set_txpower() - set tx power 1051 * @vdev: VDEV object 1052 * @txpow: tx power either configured by used or max allowed 1053 * 1054 * API to set the tx power 1055 * 1056 * Return: void 1057 */ 1058 static inline void wlan_vdev_mlme_set_txpower(struct wlan_objmgr_vdev *vdev, 1059 uint8_t txpow) 1060 { 1061 vdev->vdev_mlme.tx_power = txpow; 1062 } 1063 1064 /** 1065 * wlan_vdev_mlme_get_txpower() - get tx power 1066 * @vdev: VDEV object 1067 * 1068 * API to get the tx power 1069 * 1070 * Return: 1071 * @txpow: tx power either configured by used or max allowed 1072 */ 1073 static inline uint8_t wlan_vdev_mlme_get_txpower( 1074 struct wlan_objmgr_vdev *vdev) 1075 { 1076 return vdev->vdev_mlme.tx_power; 1077 } 1078 1079 /** 1080 * wlan_vdev_mlme_set_maxrate() - set max rate 1081 * @vdev: VDEV object 1082 * @maxrate: configured by used or based on configured mode 1083 * 1084 * API to set the max rate the vdev supports 1085 * 1086 * Return: void 1087 */ 1088 static inline void wlan_vdev_mlme_set_maxrate(struct wlan_objmgr_vdev *vdev, 1089 uint32_t maxrate) 1090 { 1091 vdev->vdev_mlme.max_rate = maxrate; 1092 } 1093 1094 /** 1095 * wlan_vdev_mlme_get_maxrate() - get max rate 1096 * @vdev: VDEV object 1097 * 1098 * API to get the max rate the vdev supports 1099 * 1100 * Return: 1101 * @maxrate: configured by used or based on configured mode 1102 */ 1103 static inline uint32_t wlan_vdev_mlme_get_maxrate( 1104 struct wlan_objmgr_vdev *vdev) 1105 { 1106 return vdev->vdev_mlme.max_rate; 1107 } 1108 1109 /** 1110 * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate 1111 * @vdev: VDEV object 1112 * @txmgmtrate: Tx Mgmt rate 1113 * 1114 * API to set Mgmt Tx rate 1115 * 1116 * Return: void 1117 */ 1118 static inline void wlan_vdev_mlme_set_txmgmtrate(struct wlan_objmgr_vdev *vdev, 1119 uint32_t txmgmtrate) 1120 { 1121 vdev->vdev_mlme.tx_mgmt_rate = txmgmtrate; 1122 } 1123 1124 /** 1125 * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate 1126 * @vdev: VDEV object 1127 * 1128 * API to get Mgmt Tx rate 1129 * 1130 * Return: 1131 * @txmgmtrate: Tx Mgmt rate 1132 */ 1133 static inline uint32_t wlan_vdev_mlme_get_txmgmtrate( 1134 struct wlan_objmgr_vdev *vdev) 1135 { 1136 return vdev->vdev_mlme.tx_mgmt_rate; 1137 } 1138 1139 /** 1140 * wlan_vdev_mlme_feat_cap_set() - set feature caps 1141 * @vdev: VDEV object 1142 * @cap: capabilities to be set 1143 * 1144 * API to set MLME feature capabilities 1145 * 1146 * Return: void 1147 */ 1148 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 1149 uint32_t cap) 1150 { 1151 vdev->vdev_mlme.vdev_feat_caps |= cap; 1152 } 1153 1154 /** 1155 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 1156 * @vdev: VDEV object 1157 * @cap: capabilities to be cleared 1158 * 1159 * API to clear MLME feature capabilities 1160 * 1161 * Return: void 1162 */ 1163 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 1164 uint32_t cap) 1165 { 1166 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 1167 } 1168 1169 /** 1170 * wlan_vdev_mlme_feat_cap_get() - get feature caps 1171 * @vdev: VDEV object 1172 * @cap: capabilities to be checked 1173 * 1174 * API to know MLME feature capability is set or not 1175 * 1176 * Return: 1 -- if capabilities set 1177 * 0 -- if capabilities clear 1178 */ 1179 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 1180 uint32_t cap) 1181 { 1182 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 1183 } 1184 1185 /** 1186 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 1187 * @vdev: VDEV object 1188 * @cap: capabilities to be set 1189 * 1190 * API to set the MLME extensive feature capabilities 1191 * 1192 * Return: void 1193 */ 1194 static inline void wlan_vdev_mlme_feat_ext_cap_set( 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_clear() - clear ext feature caps 1203 * @vdev: VDEV object 1204 * @cap: capabilities to be cleared 1205 * 1206 * API to clear the MLME extensive feature capabilities 1207 * 1208 * Return: void 1209 */ 1210 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 1211 struct wlan_objmgr_vdev *vdev, 1212 uint32_t cap) 1213 { 1214 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 1215 } 1216 1217 /** 1218 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 1219 * @vdev: VDEV object 1220 * @cap: capabilities to be checked 1221 * 1222 * API to know MLME ext feature capability is set or not 1223 * 1224 * Return: 1 -- if capabilities set 1225 * 0 -- if capabilities clear 1226 */ 1227 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 1228 struct wlan_objmgr_vdev *vdev, 1229 uint32_t cap) 1230 { 1231 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 1232 } 1233 1234 /** 1235 * wlan_vdev_mlme_cap_set() - mlme caps set 1236 * @vdev: VDEV object 1237 * @cap: capabilities to be set 1238 * 1239 * API to set the MLME capabilities 1240 * 1241 * Return: void 1242 */ 1243 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 1244 uint32_t cap) 1245 { 1246 vdev->vdev_mlme.vdev_caps |= cap; 1247 } 1248 1249 /** 1250 * wlan_vdev_mlme_cap_clear() - mlme caps clear 1251 * @vdev: VDEV object 1252 * @cap: capabilities to be cleared 1253 * 1254 * API to clear the MLME capabilities 1255 * 1256 * Return: void 1257 */ 1258 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1259 uint32_t cap) 1260 { 1261 vdev->vdev_mlme.vdev_caps &= ~cap; 1262 } 1263 1264 /** 1265 * wlan_vdev_mlme_cap_get() - get mlme caps 1266 * @vdev: VDEV object 1267 * @cap: capabilities to be checked 1268 * 1269 * API to know MLME capability is set or not 1270 * 1271 * Return: 1 -- if capabilities set 1272 * 0 -- if capabilities clear 1273 */ 1274 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1275 uint32_t cap) 1276 { 1277 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1278 } 1279 1280 /** 1281 * wlan_vdev_mlme_get_state() - get mlme state 1282 * @vdev: VDEV object 1283 * 1284 * API to get MLME state 1285 * 1286 * Return: state of MLME 1287 */ 1288 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1289 struct wlan_objmgr_vdev *vdev) 1290 { 1291 return vdev->vdev_mlme.mlme_state; 1292 } 1293 1294 /** 1295 * wlan_vdev_mlme_set_state() - set mlme state 1296 * @vdev: VDEV object 1297 * @state: MLME state 1298 * 1299 * API to set MLME state 1300 * 1301 * Return: void 1302 */ 1303 static inline void wlan_vdev_mlme_set_state(struct wlan_objmgr_vdev *vdev, 1304 enum wlan_vdev_state state) 1305 { 1306 if (state < WLAN_VDEV_S_MAX) 1307 vdev->vdev_mlme.mlme_state = state; 1308 } 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