1 /* 2 * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: wlan_vdev_mgr_utils_api.c 22 * 23 * This file provide definition for APIs to enable Tx Ops and Rx Ops registered 24 * through LMAC 25 */ 26 #include <wlan_vdev_mgr_utils_api.h> 27 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 28 #include <cdp_txrx_cmn_struct.h> 29 #include <wlan_mlme_dbg.h> 30 #include <qdf_module.h> 31 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 32 #include <wlan_dfs_mlme_api.h> 33 #ifndef MOBILE_DFS_SUPPORT 34 #include <wlan_dfs_utils_api.h> 35 #endif /* MOBILE_DFS_SUPPORT */ 36 #ifdef WLAN_FEATURE_11BE_MLO 37 #include <wlan_utility.h> 38 #include <wlan_mlo_mgr_sta.h> 39 #endif 40 41 static QDF_STATUS vdev_mgr_config_ratemask_update( 42 struct vdev_mlme_obj *mlme_obj, 43 struct config_ratemask_params *param) 44 { 45 struct wlan_objmgr_vdev *vdev; 46 47 vdev = mlme_obj->vdev; 48 param->vdev_id = wlan_vdev_get_id(vdev); 49 param->type = mlme_obj->mgmt.rate_info.type; 50 param->lower32 = mlme_obj->mgmt.rate_info.lower32; 51 param->higher32 = mlme_obj->mgmt.rate_info.higher32; 52 param->lower32_2 = mlme_obj->mgmt.rate_info.lower32_2; 53 54 return QDF_STATUS_SUCCESS; 55 } 56 57 enum wlan_op_subtype 58 wlan_util_vdev_get_cdp_txrx_subtype(struct wlan_objmgr_vdev *vdev) 59 { 60 enum QDF_OPMODE qdf_opmode; 61 enum wlan_op_subtype cdp_txrx_subtype; 62 63 qdf_opmode = wlan_vdev_mlme_get_opmode(vdev); 64 switch (qdf_opmode) { 65 case QDF_P2P_DEVICE_MODE: 66 cdp_txrx_subtype = wlan_op_subtype_p2p_device; 67 break; 68 case QDF_P2P_CLIENT_MODE: 69 cdp_txrx_subtype = wlan_op_subtype_p2p_cli; 70 break; 71 case QDF_P2P_GO_MODE: 72 cdp_txrx_subtype = wlan_op_subtype_p2p_go; 73 break; 74 default: 75 cdp_txrx_subtype = wlan_op_subtype_none; 76 }; 77 78 return cdp_txrx_subtype; 79 } 80 81 enum wlan_op_mode 82 wlan_util_vdev_get_cdp_txrx_opmode(struct wlan_objmgr_vdev *vdev) 83 { 84 enum QDF_OPMODE qdf_opmode; 85 enum wlan_op_mode cdp_txrx_opmode; 86 87 qdf_opmode = wlan_vdev_mlme_get_opmode(vdev); 88 switch (qdf_opmode) { 89 case QDF_STA_MODE: 90 cdp_txrx_opmode = wlan_op_mode_sta; 91 break; 92 case QDF_SAP_MODE: 93 cdp_txrx_opmode = wlan_op_mode_ap; 94 break; 95 case QDF_MONITOR_MODE: 96 cdp_txrx_opmode = wlan_op_mode_monitor; 97 break; 98 case QDF_P2P_DEVICE_MODE: 99 cdp_txrx_opmode = wlan_op_mode_ap; 100 break; 101 case QDF_P2P_CLIENT_MODE: 102 cdp_txrx_opmode = wlan_op_mode_sta; 103 break; 104 case QDF_P2P_GO_MODE: 105 cdp_txrx_opmode = wlan_op_mode_ap; 106 break; 107 case QDF_OCB_MODE: 108 cdp_txrx_opmode = wlan_op_mode_ocb; 109 break; 110 case QDF_IBSS_MODE: 111 cdp_txrx_opmode = wlan_op_mode_ibss; 112 break; 113 case QDF_NDI_MODE: 114 cdp_txrx_opmode = wlan_op_mode_ndi; 115 break; 116 default: 117 cdp_txrx_opmode = wlan_op_mode_unknown; 118 }; 119 120 return cdp_txrx_opmode; 121 } 122 123 QDF_STATUS 124 wlan_util_vdev_mlme_set_ratemask_config(struct vdev_mlme_obj *vdev_mlme) 125 { 126 struct config_ratemask_params rm_param = {0}; 127 128 if (!vdev_mlme) { 129 mlme_err("VDEV MLME is NULL"); 130 return QDF_STATUS_E_FAILURE; 131 } 132 133 vdev_mgr_config_ratemask_update(vdev_mlme, &rm_param); 134 135 return tgt_vdev_mgr_config_ratemask_cmd_send(vdev_mlme, &rm_param); 136 } 137 138 qdf_export_symbol(wlan_util_vdev_mlme_set_ratemask_config); 139 140 static QDF_STATUS 141 tgt_vdev_mgr_vdev_set_param_wrapper(struct vdev_mlme_obj *vdev_mlme, 142 enum wlan_mlme_cfg_id param_id, 143 struct wlan_vdev_mgr_cfg mlme_cfg) 144 { 145 uint8_t id, count = 0; 146 bool is_mbss_enabled, is_cmn_param = 0; 147 unsigned long vdev_bmap = 0; 148 struct wlan_objmgr_pdev *pdev; 149 struct vdev_mlme_mbss_11ax *mbss; 150 struct vdev_set_params param1 = {0}; 151 struct multiple_vdev_set_param param2 = {0}; 152 QDF_STATUS status = QDF_STATUS_SUCCESS; 153 154 mbss = &vdev_mlme->mgmt.mbss_11ax; 155 is_mbss_enabled = (mbss->mbssid_flags 156 & WLAN_VDEV_MLME_FLAGS_NON_MBSSID_AP) ? 0 : 1; 157 158 if (is_mbss_enabled) { 159 vdev_bmap = mbss->vdev_bmap; 160 is_cmn_param = mbss->is_cmn_param; 161 } 162 163 /* 1. if non tx vap and cmn param, dont send any WMI 164 * 2. if tx vap and cmn param, send multi vdev set WMI 165 * 3. if non tx vap and non cmn param, send vdev set WMI 166 * 4. if tx vap and non cmn param, send vdev set WMI 167 * 5. if non mbss vap, send vdev set WMI 168 */ 169 if (!is_mbss_enabled || !is_cmn_param) { 170 param1.param_id = param_id; 171 param1.vdev_id = wlan_vdev_get_id(vdev_mlme->vdev); 172 param1.param_value = mlme_cfg.value; 173 return tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m1); 174 } 175 176 if (is_cmn_param && vdev_bmap) { 177 pdev = wlan_vdev_get_pdev(vdev_mlme->vdev); 178 param2.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 179 param2.param_id = param_id; 180 param2.param_value = mlme_cfg.value; 181 182 for (id = 0; id < WLAN_UMAC_PDEV_MAX_VDEVS; id++) { 183 if (qdf_test_bit(id, &vdev_bmap)) { 184 param2.vdev_ids[count] = id; 185 count++; 186 } 187 } 188 param2.num_vdevs = count; 189 status = tgt_vdev_mgr_multiple_vdev_set_param(pdev, ¶m2); 190 mbss->vdev_bmap = 0; 191 } 192 193 /* Reset the is_cmn_param for this vap */ 194 mbss->is_cmn_param = 0; 195 196 return status; 197 } 198 199 QDF_STATUS 200 wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, 201 enum wlan_mlme_cfg_id param_id, 202 struct wlan_vdev_mgr_cfg mlme_cfg) 203 { 204 struct wlan_objmgr_vdev *vdev; 205 struct vdev_mlme_proto *mlme_proto; 206 struct vdev_mlme_mgmt *mlme_mgmt; 207 struct vdev_mlme_inactivity_params *inactivity_params; 208 bool is_wmi_cmd = false; 209 int ret = QDF_STATUS_SUCCESS; 210 211 if (!vdev_mlme) { 212 mlme_err("VDEV MLME is NULL"); 213 return QDF_STATUS_E_FAILURE; 214 } 215 vdev = vdev_mlme->vdev; 216 mlme_proto = &vdev_mlme->proto; 217 mlme_mgmt = &vdev_mlme->mgmt; 218 inactivity_params = &mlme_mgmt->inactivity_params; 219 220 switch (param_id) { 221 case WLAN_MLME_CFG_DTIM_PERIOD: 222 mlme_proto->generic.dtim_period = mlme_cfg.value; 223 is_wmi_cmd = true; 224 break; 225 case WLAN_MLME_CFG_SLOT_TIME: 226 mlme_proto->generic.slot_time = mlme_cfg.value; 227 is_wmi_cmd = true; 228 break; 229 case WLAN_MLME_CFG_PROTECTION_MODE: 230 mlme_proto->generic.protection_mode = mlme_cfg.value; 231 is_wmi_cmd = true; 232 break; 233 case WLAN_MLME_CFG_BEACON_INTERVAL: 234 mlme_proto->generic.beacon_interval = mlme_cfg.value; 235 is_wmi_cmd = true; 236 break; 237 case WLAN_MLME_CFG_LDPC: 238 mlme_proto->generic.ldpc = mlme_cfg.value; 239 is_wmi_cmd = true; 240 break; 241 case WLAN_MLME_CFG_NSS: 242 mlme_proto->generic.nss = mlme_cfg.value; 243 is_wmi_cmd = true; 244 break; 245 case WLAN_MLME_CFG_TSF_ADJUST: 246 mlme_proto->generic.tsfadjust = mlme_cfg.tsf; 247 break; 248 case WLAN_MLME_CFG_ASSOC_ID: 249 mlme_proto->sta.assoc_id = mlme_cfg.value; 250 break; 251 case WLAN_MLME_CFG_VHT_CAPS: 252 mlme_proto->vht_info.caps = mlme_cfg.value; 253 break; 254 case WLAN_MLME_CFG_SUBFER: 255 mlme_proto->vht_info.subfer = mlme_cfg.value; 256 break; 257 case WLAN_MLME_CFG_MUBFER: 258 mlme_proto->vht_info.mubfer = mlme_cfg.value; 259 break; 260 case WLAN_MLME_CFG_SUBFEE: 261 mlme_proto->vht_info.subfee = mlme_cfg.value; 262 break; 263 case WLAN_MLME_CFG_MUBFEE: 264 mlme_proto->vht_info.mubfee = mlme_cfg.value; 265 break; 266 case WLAN_MLME_CFG_IMLICIT_BF: 267 mlme_proto->vht_info.implicit_bf = mlme_cfg.value; 268 break; 269 case WLAN_MLME_CFG_SOUNDING_DIM: 270 mlme_proto->vht_info.sounding_dimension = mlme_cfg.value; 271 break; 272 case WLAN_MLME_CFG_BFEE_STS_CAP: 273 mlme_proto->vht_info.bfee_sts_cap = mlme_cfg.value; 274 break; 275 case WLAN_MLME_CFG_TXBF_CAPS: 276 is_wmi_cmd = true; 277 break; 278 case WLAN_MLME_CFG_HT_CAPS: 279 mlme_proto->ht_info.ht_caps = mlme_cfg.value; 280 break; 281 case WLAN_MLME_CFG_HE_OPS: 282 mlme_proto->he_ops_info.he_ops = mlme_cfg.value; 283 is_wmi_cmd = true; 284 break; 285 #ifdef WLAN_FEATURE_11BE 286 case WLAN_MLME_CFG_EHT_OPS: 287 mlme_proto->eht_ops_info.eht_ops = mlme_cfg.value; 288 is_wmi_cmd = true; 289 break; 290 #endif 291 case WLAN_MLME_CFG_RTS_THRESHOLD: 292 mlme_mgmt->generic.rts_threshold = mlme_cfg.value; 293 is_wmi_cmd = true; 294 break; 295 case WLAN_MLME_CFG_FRAG_THRESHOLD: 296 mlme_mgmt->generic.frag_threshold = mlme_cfg.value; 297 is_wmi_cmd = true; 298 break; 299 case WLAN_MLME_CFG_PROBE_DELAY: 300 mlme_mgmt->generic.probe_delay = mlme_cfg.value; 301 break; 302 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 303 mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value; 304 break; 305 case WLAN_MLME_CFG_DROP_UNENCRY: 306 mlme_mgmt->generic.drop_unencry = mlme_cfg.value; 307 is_wmi_cmd = true; 308 break; 309 case WLAN_MLME_CFG_TX_PWR_LIMIT: 310 mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value; 311 break; 312 case WLAN_MLME_CFG_TX_POWER: 313 mlme_mgmt->generic.tx_power = mlme_cfg.value; 314 is_wmi_cmd = true; 315 break; 316 case WLAN_MLME_CFG_AMPDU: 317 mlme_mgmt->generic.ampdu = mlme_cfg.value; 318 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 319 is_wmi_cmd = true; 320 break; 321 case WLAN_MLME_CFG_AMPDU_SIZE: 322 mlme_mgmt->generic.ampdu = mlme_cfg.value; 323 break; 324 case WLAN_MLME_CFG_AMSDU: 325 mlme_mgmt->generic.amsdu = mlme_cfg.value; 326 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 327 is_wmi_cmd = true; 328 break; 329 case WLAN_MLME_CFG_AMSDU_SIZE: 330 mlme_mgmt->generic.amsdu = mlme_cfg.value; 331 break; 332 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 333 inactivity_params->bmiss_first_bcnt = mlme_cfg.value; 334 break; 335 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 336 inactivity_params->bmiss_final_bcnt = mlme_cfg.value; 337 break; 338 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 339 inactivity_params->keepalive_min_idle_inactive_time_secs = 340 mlme_cfg.value; 341 is_wmi_cmd = true; 342 break; 343 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 344 inactivity_params->keepalive_max_idle_inactive_time_secs = 345 mlme_cfg.value; 346 is_wmi_cmd = true; 347 break; 348 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 349 inactivity_params->keepalive_max_unresponsive_time_secs = 350 mlme_cfg.value; 351 is_wmi_cmd = true; 352 break; 353 case WLAN_MLME_CFG_RATE_FLAGS: 354 mlme_mgmt->rate_info.rate_flags = mlme_cfg.value; 355 break; 356 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 357 mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value; 358 break; 359 case WLAN_MLME_CFG_MAX_RATE: 360 mlme_mgmt->rate_info.max_rate = mlme_cfg.value; 361 break; 362 case WLAN_MLME_CFG_TX_MGMT_RATE: 363 mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value; 364 break; 365 case WLAN_MLME_CFG_TX_RTSCTS_RATE: 366 mlme_mgmt->rate_info.rtscts_tx_rate = mlme_cfg.value; 367 break; 368 case WLAN_MLME_CFG_TX_CHAINMASK: 369 mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value; 370 break; 371 case WLAN_MLME_CFG_RX_CHAINMASK: 372 mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value; 373 break; 374 case WLAN_MLME_CFG_PKT_POWERSAVE: 375 mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value; 376 break; 377 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 378 mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value; 379 break; 380 case WLAN_MLME_CFG_DYNDTIM_CNT: 381 mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value; 382 break; 383 case WLAN_MLME_CFG_LISTEN_INTERVAL: 384 mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value; 385 is_wmi_cmd = true; 386 break; 387 case WLAN_MLME_CFG_MODDTIM_CNT: 388 mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value; 389 break; 390 case WLAN_MLME_CFG_PROFILE_IDX: 391 mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value; 392 break; 393 case WLAN_MLME_CFG_PROFILE_NUM: 394 mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value; 395 break; 396 case WLAN_MLME_CFG_MBSSID_FLAGS: 397 mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value; 398 break; 399 case WLAN_MLME_CFG_VDEVID_TRANS: 400 mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value; 401 break; 402 case WLAN_MLME_CFG_SSID: 403 if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) { 404 qdf_mem_copy(mlme_mgmt->generic.ssid, 405 mlme_cfg.ssid_cfg.ssid, 406 mlme_cfg.ssid_cfg.length); 407 mlme_mgmt->generic.ssid_len = 408 mlme_cfg.ssid_cfg.length; 409 } else { 410 mlme_mgmt->generic.ssid_len = 0; 411 } 412 413 break; 414 case WLAN_MLME_CFG_TRANS_BSSID: 415 qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid, 416 mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE); 417 break; 418 case WLAN_MLME_CFG_TYPE: 419 mlme_mgmt->generic.type = mlme_cfg.value; 420 break; 421 case WLAN_MLME_CFG_SUBTYPE: 422 mlme_mgmt->generic.subtype = mlme_cfg.value; 423 break; 424 case WLAN_MLME_CFG_UAPSD: 425 mlme_proto->sta.uapsd_cfg = mlme_cfg.value; 426 break; 427 case WLAN_MLME_CFG_TX_ENCAP_TYPE: 428 is_wmi_cmd = true; 429 mlme_mgmt->generic.tx_encap_type = mlme_cfg.value; 430 tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme, 431 WLAN_MLME_CFG_TX_ENCAP_TYPE, 432 mlme_cfg.value); 433 break; 434 case WLAN_MLME_CFG_RX_DECAP_TYPE: 435 is_wmi_cmd = true; 436 mlme_mgmt->generic.rx_decap_type = mlme_cfg.value; 437 tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme, 438 WLAN_MLME_CFG_RX_DECAP_TYPE, 439 mlme_cfg.value); 440 break; 441 case WLAN_MLME_CFG_RATEMASK_TYPE: 442 mlme_mgmt->rate_info.type = mlme_cfg.value; 443 break; 444 case WLAN_MLME_CFG_RATEMASK_LOWER32: 445 mlme_mgmt->rate_info.lower32 = mlme_cfg.value; 446 break; 447 case WLAN_MLME_CFG_RATEMASK_HIGHER32: 448 mlme_mgmt->rate_info.higher32 = mlme_cfg.value; 449 break; 450 case WLAN_MLME_CFG_RATEMASK_LOWER32_2: 451 mlme_mgmt->rate_info.lower32_2 = mlme_cfg.value; 452 break; 453 case WLAN_MLME_CFG_BCN_TX_RATE: 454 mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value; 455 break; 456 case WLAN_MLME_CFG_BCN_TX_RATE_CODE: 457 is_wmi_cmd = true; 458 break; 459 case WLAN_MLME_CFG_TX_MGMT_RATE_CODE: 460 is_wmi_cmd = true; 461 break; 462 case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY: 463 is_wmi_cmd = true; 464 break; 465 case WLAN_MLME_CFG_MAX_GROUP_KEYS: 466 is_wmi_cmd = true; 467 break; 468 case WLAN_MLME_CFG_TX_STREAMS: 469 mlme_mgmt->chainmask_info.num_tx_chain = mlme_cfg.value; 470 break; 471 case WLAN_MLME_CFG_RX_STREAMS: 472 mlme_mgmt->chainmask_info.num_rx_chain = mlme_cfg.value; 473 break; 474 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_RESPONDER_ROLE: 475 is_wmi_cmd = true; 476 break; 477 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_INITIATOR_ROLE: 478 is_wmi_cmd = true; 479 break; 480 default: 481 break; 482 } 483 484 if (is_wmi_cmd) 485 ret = tgt_vdev_mgr_vdev_set_param_wrapper(vdev_mlme, param_id, 486 mlme_cfg); 487 488 return ret; 489 } 490 491 qdf_export_symbol(wlan_util_vdev_mlme_set_param); 492 493 void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme, 494 enum wlan_mlme_cfg_id param_id, 495 uint32_t *value) 496 { 497 struct vdev_mlme_proto *mlme_proto; 498 struct vdev_mlme_mgmt *mlme_mgmt; 499 struct vdev_mlme_inactivity_params *inactivity_params; 500 501 if (!vdev_mlme) { 502 mlme_err("VDEV MLME is NULL"); 503 return; 504 } 505 mlme_proto = &vdev_mlme->proto; 506 mlme_mgmt = &vdev_mlme->mgmt; 507 inactivity_params = &mlme_mgmt->inactivity_params; 508 509 switch (param_id) { 510 case WLAN_MLME_CFG_DTIM_PERIOD: 511 *value = mlme_proto->generic.dtim_period; 512 break; 513 case WLAN_MLME_CFG_SLOT_TIME: 514 *value = mlme_proto->generic.slot_time; 515 break; 516 case WLAN_MLME_CFG_PROTECTION_MODE: 517 *value = mlme_proto->generic.protection_mode; 518 break; 519 case WLAN_MLME_CFG_BEACON_INTERVAL: 520 *value = mlme_proto->generic.beacon_interval; 521 break; 522 case WLAN_MLME_CFG_LDPC: 523 *value = mlme_proto->generic.ldpc; 524 break; 525 case WLAN_MLME_CFG_NSS: 526 *value = mlme_proto->generic.nss; 527 break; 528 case WLAN_MLME_CFG_ASSOC_ID: 529 *value = mlme_proto->sta.assoc_id; 530 break; 531 case WLAN_MLME_CFG_VHT_CAPS: 532 *value = mlme_proto->vht_info.caps; 533 break; 534 case WLAN_MLME_CFG_SUBFER: 535 *value = mlme_proto->vht_info.subfer; 536 break; 537 case WLAN_MLME_CFG_MUBFER: 538 *value = mlme_proto->vht_info.mubfer; 539 break; 540 case WLAN_MLME_CFG_SUBFEE: 541 *value = mlme_proto->vht_info.subfee; 542 break; 543 case WLAN_MLME_CFG_MUBFEE: 544 *value = mlme_proto->vht_info.mubfee; 545 break; 546 case WLAN_MLME_CFG_IMLICIT_BF: 547 *value = mlme_proto->vht_info.implicit_bf; 548 break; 549 case WLAN_MLME_CFG_SOUNDING_DIM: 550 *value = mlme_proto->vht_info.sounding_dimension; 551 break; 552 case WLAN_MLME_CFG_BFEE_STS_CAP: 553 *value = mlme_proto->vht_info.bfee_sts_cap; 554 break; 555 case WLAN_MLME_CFG_HT_CAPS: 556 *value = mlme_proto->ht_info.ht_caps; 557 break; 558 case WLAN_MLME_CFG_HE_OPS: 559 *value = mlme_proto->he_ops_info.he_ops; 560 break; 561 #ifdef WLAN_FEATURE_11BE 562 case WLAN_MLME_CFG_EHT_OPS: 563 *value = mlme_proto->eht_ops_info.eht_ops; 564 break; 565 #endif 566 case WLAN_MLME_CFG_RTS_THRESHOLD: 567 *value = mlme_mgmt->generic.rts_threshold; 568 break; 569 case WLAN_MLME_CFG_FRAG_THRESHOLD: 570 *value = mlme_mgmt->generic.frag_threshold; 571 break; 572 case WLAN_MLME_CFG_PROBE_DELAY: 573 *value = mlme_mgmt->generic.probe_delay; 574 break; 575 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 576 *value = mlme_mgmt->generic.repeat_probe_time; 577 break; 578 case WLAN_MLME_CFG_DROP_UNENCRY: 579 *value = mlme_mgmt->generic.drop_unencry; 580 break; 581 case WLAN_MLME_CFG_TX_PWR_LIMIT: 582 *value = mlme_mgmt->generic.tx_pwrlimit; 583 break; 584 case WLAN_MLME_CFG_TX_POWER: 585 *value = mlme_mgmt->generic.tx_power; 586 break; 587 case WLAN_MLME_CFG_AMPDU: 588 *value = mlme_mgmt->generic.ampdu; 589 break; 590 case WLAN_MLME_CFG_AMSDU: 591 *value = mlme_mgmt->generic.amsdu; 592 break; 593 case WLAN_MLME_CFG_SSID_LEN: 594 *value = mlme_mgmt->generic.ssid_len; 595 break; 596 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 597 *value = inactivity_params->bmiss_first_bcnt; 598 break; 599 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 600 *value = inactivity_params->bmiss_final_bcnt; 601 break; 602 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 603 *value = 604 inactivity_params->keepalive_min_idle_inactive_time_secs; 605 break; 606 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 607 *value = 608 inactivity_params->keepalive_max_idle_inactive_time_secs; 609 break; 610 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 611 *value = 612 inactivity_params->keepalive_max_unresponsive_time_secs; 613 break; 614 case WLAN_MLME_CFG_RATE_FLAGS: 615 *value = mlme_mgmt->rate_info.rate_flags; 616 break; 617 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 618 *value = mlme_mgmt->rate_info.per_band_tx_mgmt_rate; 619 break; 620 case WLAN_MLME_CFG_MAX_RATE: 621 *value = mlme_mgmt->rate_info.max_rate; 622 break; 623 case WLAN_MLME_CFG_TX_MGMT_RATE: 624 *value = mlme_mgmt->rate_info.tx_mgmt_rate; 625 break; 626 case WLAN_MLME_CFG_TX_RTSCTS_RATE: 627 *value = mlme_mgmt->rate_info.rtscts_tx_rate; 628 break; 629 case WLAN_MLME_CFG_TX_CHAINMASK: 630 *value = mlme_mgmt->chainmask_info.tx_chainmask; 631 break; 632 case WLAN_MLME_CFG_RX_CHAINMASK: 633 *value = mlme_mgmt->chainmask_info.rx_chainmask; 634 break; 635 case WLAN_MLME_CFG_PKT_POWERSAVE: 636 *value = mlme_mgmt->powersave_info.packet_powersave; 637 break; 638 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 639 *value = mlme_mgmt->powersave_info.max_li_of_moddtim; 640 break; 641 case WLAN_MLME_CFG_DYNDTIM_CNT: 642 *value = mlme_mgmt->powersave_info.dyndtim_cnt; 643 break; 644 case WLAN_MLME_CFG_LISTEN_INTERVAL: 645 *value = mlme_mgmt->powersave_info.listen_interval; 646 break; 647 case WLAN_MLME_CFG_MODDTIM_CNT: 648 *value = mlme_mgmt->powersave_info.moddtim_cnt; 649 break; 650 case WLAN_MLME_CFG_PROFILE_IDX: 651 *value = mlme_mgmt->mbss_11ax.profile_idx; 652 break; 653 case WLAN_MLME_CFG_PROFILE_NUM: 654 *value = mlme_mgmt->mbss_11ax.profile_num; 655 break; 656 case WLAN_MLME_CFG_MBSSID_FLAGS: 657 *value = mlme_mgmt->mbss_11ax.mbssid_flags; 658 break; 659 case WLAN_MLME_CFG_VDEVID_TRANS: 660 *value = mlme_mgmt->mbss_11ax.vdevid_trans; 661 break; 662 case WLAN_MLME_CFG_BCN_TX_RATE: 663 *value = mlme_mgmt->rate_info.bcn_tx_rate; 664 break; 665 case WLAN_MLME_CFG_TX_STREAMS: 666 *value = mlme_mgmt->chainmask_info.num_tx_chain; 667 break; 668 case WLAN_MLME_CFG_RX_STREAMS: 669 *value = mlme_mgmt->chainmask_info.num_rx_chain; 670 break; 671 default: 672 break; 673 } 674 } 675 676 qdf_export_symbol(wlan_util_vdev_mlme_get_param); 677 678 void wlan_util_vdev_get_param(struct wlan_objmgr_vdev *vdev, 679 enum wlan_mlme_cfg_id param_id, 680 uint32_t *value) 681 { 682 ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value); 683 } 684 685 qdf_export_symbol(wlan_util_vdev_get_param); 686 687 #ifndef MOBILE_DFS_SUPPORT 688 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev) 689 { 690 struct wlan_channel *des_chan = NULL; 691 struct wlan_channel *bss_chan = NULL; 692 bool continue_current_cac = 0; 693 int dfs_cac_timeout = 0; 694 695 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 696 if (!des_chan) 697 return 0; 698 699 bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); 700 if (!bss_chan) 701 return 0; 702 703 if (!utils_dfs_is_cac_required(wlan_vdev_get_pdev(vdev), des_chan, 704 bss_chan, &continue_current_cac)) 705 return 0; 706 707 dfs_cac_timeout = dfs_mlme_get_cac_timeout_for_freq( 708 wlan_vdev_get_pdev(vdev), des_chan->ch_freq, 709 des_chan->ch_cfreq2, des_chan->ch_flags); 710 /* Seconds to milliseconds */ 711 return SECONDS_TO_MS(dfs_cac_timeout); 712 } 713 #else 714 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev) 715 { 716 struct vdev_mlme_obj *vdev_mlme; 717 718 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 719 if (!vdev_mlme) { 720 mlme_err("vdev_mlme is null"); 721 return 0; 722 } 723 724 return vdev_mlme->mgmt.ap.cac_duration_ms; 725 } 726 727 void wlan_util_vdev_mgr_set_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev, 728 uint32_t new_chan_cac_ms) 729 { 730 struct vdev_mlme_obj *vdev_mlme; 731 732 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 733 if (!vdev_mlme) { 734 mlme_err("vdev_mlme is null"); 735 return; 736 } 737 738 vdev_mlme->mgmt.ap.cac_duration_ms = new_chan_cac_ms; 739 } 740 #endif /* MOBILE_DFS_SUPPORT */ 741 742 QDF_STATUS wlan_util_vdev_mgr_get_csa_channel_switch_time( 743 struct wlan_objmgr_vdev *vdev, 744 uint32_t *chan_switch_time) 745 { 746 struct vdev_mlme_obj *vdev_mlme = NULL; 747 748 *chan_switch_time = 0; 749 750 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 751 if (!vdev_mlme) { 752 mlme_err("vdev_mlme is null"); 753 return QDF_STATUS_E_FAILURE; 754 } 755 756 /* Time between CSA count 1 and CSA count 0 is one beacon interval. */ 757 *chan_switch_time = vdev_mlme->proto.generic.beacon_interval; 758 759 /* Vdev restart time */ 760 *chan_switch_time += SECONDS_TO_MS(VDEV_RESTART_TIME); 761 762 /* Add one beacon interval time required to send beacon on the 763 * new channel after switching to the new channel. 764 */ 765 *chan_switch_time += vdev_mlme->proto.generic.beacon_interval; 766 767 return QDF_STATUS_SUCCESS; 768 } 769 770 QDF_STATUS wlan_util_vdev_mgr_compute_max_channel_switch_time( 771 struct wlan_objmgr_vdev *vdev, uint32_t *max_chan_switch_time) 772 { 773 QDF_STATUS status; 774 775 status = wlan_util_vdev_mgr_get_csa_channel_switch_time( 776 vdev, max_chan_switch_time); 777 if (QDF_IS_STATUS_ERROR(status)) { 778 mlme_err("Failed to get the CSA channel switch time"); 779 return status; 780 } 781 782 /* Plus the CAC time */ 783 *max_chan_switch_time += 784 wlan_util_vdev_mgr_get_cac_timeout_for_vdev(vdev); 785 786 return QDF_STATUS_SUCCESS; 787 } 788 789 uint32_t 790 wlan_utils_get_vdev_remaining_channel_switch_time(struct wlan_objmgr_vdev *vdev) 791 { 792 struct vdev_mlme_obj *vdev_mlme = NULL; 793 int32_t remaining_chan_switch_time; 794 795 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 796 if (!vdev_mlme) 797 return 0; 798 799 if (!vdev_mlme->mgmt.ap.last_bcn_ts_ms) 800 return 0; 801 802 /* Remaining channel switch time is equal to the time when last beacon 803 * sent on the CSA triggered vap plus max channel switch time minus 804 * current time. 805 */ 806 remaining_chan_switch_time = 807 ((vdev_mlme->mgmt.ap.last_bcn_ts_ms + 808 vdev_mlme->mgmt.ap.max_chan_switch_time) - 809 qdf_mc_timer_get_system_time()); 810 811 return (remaining_chan_switch_time > 0) ? 812 remaining_chan_switch_time : 0; 813 } 814 815 #ifdef WLAN_FEATURE_11BE_MLO 816 QDF_STATUS wlan_util_vdev_mgr_quiet_offload( 817 struct wlan_objmgr_psoc *psoc, 818 struct vdev_sta_quiet_event *quiet_event) 819 { 820 uint8_t vdev_id; 821 bool connected; 822 struct wlan_objmgr_vdev *vdev; 823 824 if (qdf_is_macaddr_zero(&quiet_event->mld_mac) && 825 qdf_is_macaddr_zero(&quiet_event->link_mac)) { 826 mlme_err("mld_mac and link mac are invalid"); 827 return QDF_STATUS_E_INVAL; 828 } 829 830 if (!qdf_is_macaddr_zero(&quiet_event->mld_mac)) { 831 connected = wlan_get_connected_vdev_by_mld_addr( 832 psoc, quiet_event->mld_mac.bytes, &vdev_id); 833 if (!connected) { 834 mlme_err("Can't find vdev with mld " QDF_MAC_ADDR_FMT, 835 QDF_MAC_ADDR_REF(quiet_event->mld_mac.bytes)); 836 return QDF_STATUS_E_INVAL; 837 } 838 vdev = wlan_objmgr_get_vdev_by_id_from_psoc( 839 psoc, vdev_id, WLAN_MLME_OBJMGR_ID); 840 if (!vdev) { 841 mlme_err("Null vdev"); 842 return QDF_STATUS_E_INVAL; 843 } 844 if (wlan_vdev_mlme_is_mlo_vdev(vdev)) 845 mlo_sta_save_quiet_status(vdev->mlo_dev_ctx, 846 quiet_event->link_id, 847 quiet_event->quiet_status); 848 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 849 } else if (!qdf_is_macaddr_zero(&quiet_event->link_mac)) { 850 connected = wlan_get_connected_vdev_from_psoc_by_bssid( 851 psoc, quiet_event->link_mac.bytes, &vdev_id); 852 if (!connected) { 853 mlme_err("Can't find vdev with BSSID" QDF_MAC_ADDR_FMT, 854 QDF_MAC_ADDR_REF(quiet_event->link_mac.bytes)); 855 return QDF_STATUS_E_INVAL; 856 } 857 vdev = wlan_objmgr_get_vdev_by_id_from_psoc( 858 psoc, vdev_id, WLAN_MLME_OBJMGR_ID); 859 if (!vdev) { 860 mlme_err("Null vdev"); 861 return QDF_STATUS_E_INVAL; 862 } 863 if (wlan_vdev_mlme_is_mlo_vdev(vdev)) 864 mlo_sta_save_quiet_status(vdev->mlo_dev_ctx, 865 wlan_vdev_get_link_id(vdev), 866 quiet_event->quiet_status); 867 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 868 } 869 870 return QDF_STATUS_SUCCESS; 871 } 872 #endif /* WLAN_FEATURE_11BE_MLO */ 873