1 /* 2 * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 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 uint8_t vdev_id, 43 struct vdev_ratemask_params *rate_params, 44 struct config_ratemask_params *param, 45 uint8_t index) 46 { 47 param->vdev_id = vdev_id; 48 param->type = index; 49 param->lower32 = rate_params->lower32; 50 param->lower32_2 = rate_params->lower32_2; 51 param->higher32 = rate_params->higher32; 52 param->higher32_2 = rate_params->higher32_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 /** 124 * wlan_util_vdev_mlme_set_ratemask_config() - common MLME API to fill 125 * ratemask parameters of vdev_mlme object 126 * @vdev_mlme: pointer to vdev_mlme object 127 * @index: array index of ratemask_params 128 */ 129 QDF_STATUS 130 wlan_util_vdev_mlme_set_ratemask_config(struct vdev_mlme_obj *vdev_mlme, 131 uint8_t index) 132 { 133 struct config_ratemask_params rm_param = {0}; 134 uint8_t vdev_id; 135 struct vdev_mlme_rate_info *rate_info; 136 struct vdev_ratemask_params *rate_params; 137 138 if (!vdev_mlme) { 139 mlme_err("VDEV MLME is NULL"); 140 return QDF_STATUS_E_FAILURE; 141 } 142 143 vdev_id = wlan_vdev_get_id(vdev_mlme->vdev); 144 rate_info = &vdev_mlme->mgmt.rate_info; 145 rate_params = &rate_info->ratemask_params[index]; 146 vdev_mgr_config_ratemask_update(vdev_id, 147 rate_params, 148 &rm_param, index); 149 150 return tgt_vdev_mgr_config_ratemask_cmd_send(vdev_mlme, 151 &rm_param); 152 } 153 154 qdf_export_symbol(wlan_util_vdev_mlme_set_ratemask_config); 155 156 static QDF_STATUS 157 tgt_vdev_mgr_vdev_set_param_wrapper(struct vdev_mlme_obj *vdev_mlme, 158 enum wlan_mlme_cfg_id param_id, 159 struct wlan_vdev_mgr_cfg mlme_cfg) 160 { 161 uint8_t id, count = 0; 162 bool is_mbss_enabled, is_cmn_param = 0; 163 unsigned long vdev_bmap = 0; 164 struct wlan_objmgr_pdev *pdev; 165 struct vdev_mlme_mbss_11ax *mbss; 166 struct vdev_set_params param1 = {0}; 167 struct multiple_vdev_set_param param2 = {0}; 168 QDF_STATUS status = QDF_STATUS_SUCCESS; 169 170 mbss = &vdev_mlme->mgmt.mbss_11ax; 171 is_mbss_enabled = (mbss->mbssid_flags 172 & WLAN_VDEV_MLME_FLAGS_NON_MBSSID_AP) ? 0 : 1; 173 174 if (is_mbss_enabled) { 175 vdev_bmap = mbss->vdev_bmap; 176 is_cmn_param = mbss->is_cmn_param; 177 } 178 179 /* 1. if non tx vap and cmn param, dont send any WMI 180 * 2. if tx vap and cmn param, send multi vdev set WMI 181 * 3. if non tx vap and non cmn param, send vdev set WMI 182 * 4. if tx vap and non cmn param, send vdev set WMI 183 * 5. if non mbss vap, send vdev set WMI 184 */ 185 if (!is_mbss_enabled || !is_cmn_param) { 186 param1.param_id = param_id; 187 param1.vdev_id = wlan_vdev_get_id(vdev_mlme->vdev); 188 param1.param_value = mlme_cfg.value; 189 return tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m1); 190 } 191 192 if (is_cmn_param && vdev_bmap) { 193 pdev = wlan_vdev_get_pdev(vdev_mlme->vdev); 194 param2.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); 195 param2.param_id = param_id; 196 param2.param_value = mlme_cfg.value; 197 198 for (id = 0; id < WLAN_UMAC_PDEV_MAX_VDEVS; id++) { 199 if (qdf_test_bit(id, &vdev_bmap)) { 200 param2.vdev_ids[count] = id; 201 count++; 202 } 203 } 204 param2.num_vdevs = count; 205 status = tgt_vdev_mgr_multiple_vdev_set_param(pdev, ¶m2); 206 mbss->vdev_bmap = 0; 207 } 208 209 /* Reset the is_cmn_param for this vap */ 210 mbss->is_cmn_param = 0; 211 212 return status; 213 } 214 215 QDF_STATUS 216 wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, 217 enum wlan_mlme_cfg_id param_id, 218 struct wlan_vdev_mgr_cfg mlme_cfg) 219 { 220 struct wlan_objmgr_vdev *vdev; 221 struct vdev_mlme_proto *mlme_proto; 222 struct vdev_mlme_mgmt *mlme_mgmt; 223 struct vdev_mlme_inactivity_params *inactivity_params; 224 bool is_wmi_cmd = false; 225 int ret = QDF_STATUS_SUCCESS; 226 227 if (!vdev_mlme) { 228 mlme_err("VDEV MLME is NULL"); 229 return QDF_STATUS_E_FAILURE; 230 } 231 vdev = vdev_mlme->vdev; 232 mlme_proto = &vdev_mlme->proto; 233 mlme_mgmt = &vdev_mlme->mgmt; 234 inactivity_params = &mlme_mgmt->inactivity_params; 235 236 switch (param_id) { 237 case WLAN_MLME_CFG_DTIM_PERIOD: 238 mlme_proto->generic.dtim_period = mlme_cfg.value; 239 is_wmi_cmd = true; 240 break; 241 case WLAN_MLME_CFG_SLOT_TIME: 242 mlme_proto->generic.slot_time = mlme_cfg.value; 243 is_wmi_cmd = true; 244 break; 245 case WLAN_MLME_CFG_PROTECTION_MODE: 246 mlme_proto->generic.protection_mode = mlme_cfg.value; 247 is_wmi_cmd = true; 248 break; 249 case WLAN_MLME_CFG_BEACON_INTERVAL: 250 mlme_proto->generic.beacon_interval = mlme_cfg.value; 251 is_wmi_cmd = true; 252 break; 253 case WLAN_MLME_CFG_LDPC: 254 mlme_proto->generic.ldpc = mlme_cfg.value; 255 is_wmi_cmd = true; 256 break; 257 case WLAN_MLME_CFG_NSS: 258 mlme_proto->generic.nss = mlme_cfg.value; 259 is_wmi_cmd = true; 260 break; 261 case WLAN_MLME_CFG_TSF_ADJUST: 262 mlme_proto->generic.tsfadjust = mlme_cfg.tsf; 263 break; 264 case WLAN_MLME_CFG_ASSOC_ID: 265 mlme_proto->sta.assoc_id = mlme_cfg.value; 266 break; 267 case WLAN_MLME_CFG_VHT_CAPS: 268 mlme_proto->vht_info.caps = mlme_cfg.value; 269 break; 270 case WLAN_MLME_CFG_SUBFER: 271 mlme_proto->vht_info.subfer = mlme_cfg.value; 272 break; 273 case WLAN_MLME_CFG_MUBFER: 274 mlme_proto->vht_info.mubfer = mlme_cfg.value; 275 break; 276 case WLAN_MLME_CFG_SUBFEE: 277 mlme_proto->vht_info.subfee = mlme_cfg.value; 278 break; 279 case WLAN_MLME_CFG_MUBFEE: 280 mlme_proto->vht_info.mubfee = mlme_cfg.value; 281 break; 282 case WLAN_MLME_CFG_IMLICIT_BF: 283 mlme_proto->vht_info.implicit_bf = mlme_cfg.value; 284 break; 285 case WLAN_MLME_CFG_SOUNDING_DIM: 286 mlme_proto->vht_info.sounding_dimension = mlme_cfg.value; 287 break; 288 case WLAN_MLME_CFG_BFEE_STS_CAP: 289 mlme_proto->vht_info.bfee_sts_cap = mlme_cfg.value; 290 break; 291 case WLAN_MLME_CFG_TXBF_CAPS: 292 is_wmi_cmd = true; 293 break; 294 case WLAN_MLME_CFG_HT_CAPS: 295 mlme_proto->ht_info.ht_caps = mlme_cfg.value; 296 break; 297 case WLAN_MLME_CFG_HE_OPS: 298 mlme_proto->he_ops_info.he_ops = mlme_cfg.value; 299 is_wmi_cmd = true; 300 break; 301 #ifdef WLAN_FEATURE_11BE 302 case WLAN_MLME_CFG_EHT_OPS: 303 mlme_proto->eht_ops_info.eht_ops = mlme_cfg.value; 304 is_wmi_cmd = true; 305 break; 306 #endif 307 case WLAN_MLME_CFG_RTS_THRESHOLD: 308 mlme_mgmt->generic.rts_threshold = mlme_cfg.value; 309 is_wmi_cmd = true; 310 break; 311 case WLAN_MLME_CFG_FRAG_THRESHOLD: 312 mlme_mgmt->generic.frag_threshold = mlme_cfg.value; 313 is_wmi_cmd = true; 314 break; 315 case WLAN_MLME_CFG_PROBE_DELAY: 316 mlme_mgmt->generic.probe_delay = mlme_cfg.value; 317 break; 318 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 319 mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value; 320 break; 321 case WLAN_MLME_CFG_DROP_UNENCRY: 322 mlme_mgmt->generic.drop_unencry = mlme_cfg.value; 323 is_wmi_cmd = true; 324 break; 325 case WLAN_MLME_CFG_TX_PWR_LIMIT: 326 mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value; 327 break; 328 case WLAN_MLME_CFG_TX_POWER: 329 mlme_mgmt->generic.tx_power = mlme_cfg.value; 330 is_wmi_cmd = true; 331 break; 332 case WLAN_MLME_CFG_AMPDU: 333 mlme_mgmt->generic.ampdu = mlme_cfg.value; 334 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 335 is_wmi_cmd = true; 336 break; 337 case WLAN_MLME_CFG_AMPDU_SIZE: 338 mlme_mgmt->generic.ampdu = mlme_cfg.value; 339 break; 340 case WLAN_MLME_CFG_AMSDU: 341 mlme_mgmt->generic.amsdu = mlme_cfg.value; 342 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 343 is_wmi_cmd = true; 344 break; 345 case WLAN_MLME_CFG_AMSDU_SIZE: 346 mlme_mgmt->generic.amsdu = mlme_cfg.value; 347 break; 348 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 349 inactivity_params->bmiss_first_bcnt = mlme_cfg.value; 350 break; 351 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 352 inactivity_params->bmiss_final_bcnt = mlme_cfg.value; 353 break; 354 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 355 inactivity_params->keepalive_min_idle_inactive_time_secs = 356 mlme_cfg.value; 357 is_wmi_cmd = true; 358 break; 359 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 360 inactivity_params->keepalive_max_idle_inactive_time_secs = 361 mlme_cfg.value; 362 is_wmi_cmd = true; 363 break; 364 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 365 inactivity_params->keepalive_max_unresponsive_time_secs = 366 mlme_cfg.value; 367 is_wmi_cmd = true; 368 break; 369 case WLAN_MLME_CFG_RATE_FLAGS: 370 mlme_mgmt->rate_info.rate_flags = mlme_cfg.value; 371 break; 372 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 373 mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value; 374 break; 375 case WLAN_MLME_CFG_MAX_RATE: 376 mlme_mgmt->rate_info.max_rate = mlme_cfg.value; 377 break; 378 case WLAN_MLME_CFG_TX_MGMT_RATE: 379 mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value; 380 break; 381 case WLAN_MLME_CFG_TX_RTSCTS_RATE: 382 mlme_mgmt->rate_info.rtscts_tx_rate = mlme_cfg.value; 383 break; 384 case WLAN_MLME_CFG_TX_CHAINMASK: 385 mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value; 386 break; 387 case WLAN_MLME_CFG_RX_CHAINMASK: 388 mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value; 389 break; 390 case WLAN_MLME_CFG_PKT_POWERSAVE: 391 mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value; 392 break; 393 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 394 mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value; 395 break; 396 case WLAN_MLME_CFG_DYNDTIM_CNT: 397 mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value; 398 break; 399 case WLAN_MLME_CFG_LISTEN_INTERVAL: 400 mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value; 401 is_wmi_cmd = true; 402 break; 403 case WLAN_MLME_CFG_MODDTIM_CNT: 404 mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value; 405 break; 406 case WLAN_MLME_CFG_PROFILE_IDX: 407 mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value; 408 break; 409 case WLAN_MLME_CFG_PROFILE_NUM: 410 mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value; 411 break; 412 case WLAN_MLME_CFG_MBSSID_FLAGS: 413 mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value; 414 break; 415 case WLAN_MLME_CFG_VDEVID_TRANS: 416 mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value; 417 break; 418 case WLAN_MLME_CFG_SSID: 419 if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) { 420 qdf_mem_copy(mlme_mgmt->generic.ssid, 421 mlme_cfg.ssid_cfg.ssid, 422 mlme_cfg.ssid_cfg.length); 423 mlme_mgmt->generic.ssid_len = 424 mlme_cfg.ssid_cfg.length; 425 } else { 426 mlme_mgmt->generic.ssid_len = 0; 427 } 428 429 break; 430 case WLAN_MLME_CFG_TRANS_BSSID: 431 qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid, 432 mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE); 433 break; 434 case WLAN_MLME_CFG_TYPE: 435 mlme_mgmt->generic.type = mlme_cfg.value; 436 break; 437 case WLAN_MLME_CFG_SUBTYPE: 438 mlme_mgmt->generic.subtype = mlme_cfg.value; 439 break; 440 case WLAN_MLME_CFG_UAPSD: 441 mlme_proto->sta.uapsd_cfg = mlme_cfg.value; 442 break; 443 case WLAN_MLME_CFG_TX_ENCAP_TYPE: 444 is_wmi_cmd = true; 445 mlme_mgmt->generic.tx_encap_type = mlme_cfg.value; 446 tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme, 447 WLAN_MLME_CFG_TX_ENCAP_TYPE, 448 mlme_cfg.value); 449 break; 450 case WLAN_MLME_CFG_RX_DECAP_TYPE: 451 is_wmi_cmd = true; 452 mlme_mgmt->generic.rx_decap_type = mlme_cfg.value; 453 tgt_vdev_mgr_set_tx_rx_decap_type(vdev_mlme, 454 WLAN_MLME_CFG_RX_DECAP_TYPE, 455 mlme_cfg.value); 456 break; 457 case WLAN_MLME_CFG_RATEMASK_LOWER32: 458 if (mlme_cfg.ratemask.index < WLAN_VDEV_RATEMASK_TYPE_MAX) 459 mlme_mgmt->rate_info.ratemask_params[ 460 mlme_cfg.ratemask.index].lower32 = 461 mlme_cfg.ratemask.value; 462 break; 463 case WLAN_MLME_CFG_RATEMASK_HIGHER32: 464 if (mlme_cfg.ratemask.index < WLAN_VDEV_RATEMASK_TYPE_MAX) 465 mlme_mgmt->rate_info.ratemask_params[ 466 mlme_cfg.ratemask.index].higher32 = 467 mlme_cfg.ratemask.value; 468 break; 469 case WLAN_MLME_CFG_RATEMASK_LOWER32_2: 470 if (mlme_cfg.ratemask.index < WLAN_VDEV_RATEMASK_TYPE_MAX) 471 mlme_mgmt->rate_info.ratemask_params[ 472 mlme_cfg.ratemask.index].lower32_2 = 473 mlme_cfg.ratemask.value; 474 break; 475 case WLAN_MLME_CFG_BCN_TX_RATE: 476 mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value; 477 break; 478 case WLAN_MLME_CFG_BCN_TX_RATE_CODE: 479 is_wmi_cmd = true; 480 break; 481 case WLAN_MLME_CFG_TX_MGMT_RATE_CODE: 482 is_wmi_cmd = true; 483 break; 484 case WLAN_MLME_CFG_ENABLE_MULTI_GROUP_KEY: 485 is_wmi_cmd = true; 486 break; 487 case WLAN_MLME_CFG_MAX_GROUP_KEYS: 488 is_wmi_cmd = true; 489 break; 490 case WLAN_MLME_CFG_TX_STREAMS: 491 mlme_mgmt->chainmask_info.num_tx_chain = mlme_cfg.value; 492 break; 493 case WLAN_MLME_CFG_RX_STREAMS: 494 mlme_mgmt->chainmask_info.num_rx_chain = mlme_cfg.value; 495 break; 496 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_RESPONDER_ROLE: 497 is_wmi_cmd = true; 498 break; 499 case WLAN_MLME_CFG_ENABLE_DISABLE_RTT_INITIATOR_ROLE: 500 is_wmi_cmd = true; 501 break; 502 default: 503 break; 504 } 505 506 if (is_wmi_cmd) 507 ret = tgt_vdev_mgr_vdev_set_param_wrapper(vdev_mlme, param_id, 508 mlme_cfg); 509 510 return ret; 511 } 512 513 qdf_export_symbol(wlan_util_vdev_mlme_set_param); 514 515 void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme, 516 enum wlan_mlme_cfg_id param_id, 517 uint32_t *value) 518 { 519 struct vdev_mlme_proto *mlme_proto; 520 struct vdev_mlme_mgmt *mlme_mgmt; 521 struct vdev_mlme_inactivity_params *inactivity_params; 522 523 if (!vdev_mlme) { 524 mlme_err("VDEV MLME is NULL"); 525 return; 526 } 527 mlme_proto = &vdev_mlme->proto; 528 mlme_mgmt = &vdev_mlme->mgmt; 529 inactivity_params = &mlme_mgmt->inactivity_params; 530 531 switch (param_id) { 532 case WLAN_MLME_CFG_DTIM_PERIOD: 533 *value = mlme_proto->generic.dtim_period; 534 break; 535 case WLAN_MLME_CFG_SLOT_TIME: 536 *value = mlme_proto->generic.slot_time; 537 break; 538 case WLAN_MLME_CFG_PROTECTION_MODE: 539 *value = mlme_proto->generic.protection_mode; 540 break; 541 case WLAN_MLME_CFG_BEACON_INTERVAL: 542 *value = mlme_proto->generic.beacon_interval; 543 break; 544 case WLAN_MLME_CFG_LDPC: 545 *value = mlme_proto->generic.ldpc; 546 break; 547 case WLAN_MLME_CFG_NSS: 548 *value = mlme_proto->generic.nss; 549 break; 550 case WLAN_MLME_CFG_ASSOC_ID: 551 *value = mlme_proto->sta.assoc_id; 552 break; 553 case WLAN_MLME_CFG_VHT_CAPS: 554 *value = mlme_proto->vht_info.caps; 555 break; 556 case WLAN_MLME_CFG_SUBFER: 557 *value = mlme_proto->vht_info.subfer; 558 break; 559 case WLAN_MLME_CFG_MUBFER: 560 *value = mlme_proto->vht_info.mubfer; 561 break; 562 case WLAN_MLME_CFG_SUBFEE: 563 *value = mlme_proto->vht_info.subfee; 564 break; 565 case WLAN_MLME_CFG_MUBFEE: 566 *value = mlme_proto->vht_info.mubfee; 567 break; 568 case WLAN_MLME_CFG_IMLICIT_BF: 569 *value = mlme_proto->vht_info.implicit_bf; 570 break; 571 case WLAN_MLME_CFG_SOUNDING_DIM: 572 *value = mlme_proto->vht_info.sounding_dimension; 573 break; 574 case WLAN_MLME_CFG_BFEE_STS_CAP: 575 *value = mlme_proto->vht_info.bfee_sts_cap; 576 break; 577 case WLAN_MLME_CFG_HT_CAPS: 578 *value = mlme_proto->ht_info.ht_caps; 579 break; 580 case WLAN_MLME_CFG_HE_OPS: 581 *value = mlme_proto->he_ops_info.he_ops; 582 break; 583 #ifdef WLAN_FEATURE_11BE 584 case WLAN_MLME_CFG_EHT_OPS: 585 *value = mlme_proto->eht_ops_info.eht_ops; 586 break; 587 #endif 588 case WLAN_MLME_CFG_RTS_THRESHOLD: 589 *value = mlme_mgmt->generic.rts_threshold; 590 break; 591 case WLAN_MLME_CFG_FRAG_THRESHOLD: 592 *value = mlme_mgmt->generic.frag_threshold; 593 break; 594 case WLAN_MLME_CFG_PROBE_DELAY: 595 *value = mlme_mgmt->generic.probe_delay; 596 break; 597 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 598 *value = mlme_mgmt->generic.repeat_probe_time; 599 break; 600 case WLAN_MLME_CFG_DROP_UNENCRY: 601 *value = mlme_mgmt->generic.drop_unencry; 602 break; 603 case WLAN_MLME_CFG_TX_PWR_LIMIT: 604 *value = mlme_mgmt->generic.tx_pwrlimit; 605 break; 606 case WLAN_MLME_CFG_TX_POWER: 607 *value = mlme_mgmt->generic.tx_power; 608 break; 609 case WLAN_MLME_CFG_AMPDU: 610 *value = mlme_mgmt->generic.ampdu; 611 break; 612 case WLAN_MLME_CFG_AMSDU: 613 *value = mlme_mgmt->generic.amsdu; 614 break; 615 case WLAN_MLME_CFG_SSID_LEN: 616 *value = mlme_mgmt->generic.ssid_len; 617 break; 618 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 619 *value = inactivity_params->bmiss_first_bcnt; 620 break; 621 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 622 *value = inactivity_params->bmiss_final_bcnt; 623 break; 624 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 625 *value = 626 inactivity_params->keepalive_min_idle_inactive_time_secs; 627 break; 628 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 629 *value = 630 inactivity_params->keepalive_max_idle_inactive_time_secs; 631 break; 632 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 633 *value = 634 inactivity_params->keepalive_max_unresponsive_time_secs; 635 break; 636 case WLAN_MLME_CFG_RATE_FLAGS: 637 *value = mlme_mgmt->rate_info.rate_flags; 638 break; 639 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 640 *value = mlme_mgmt->rate_info.per_band_tx_mgmt_rate; 641 break; 642 case WLAN_MLME_CFG_MAX_RATE: 643 *value = mlme_mgmt->rate_info.max_rate; 644 break; 645 case WLAN_MLME_CFG_TX_MGMT_RATE: 646 *value = mlme_mgmt->rate_info.tx_mgmt_rate; 647 break; 648 case WLAN_MLME_CFG_TX_RTSCTS_RATE: 649 *value = mlme_mgmt->rate_info.rtscts_tx_rate; 650 break; 651 case WLAN_MLME_CFG_TX_CHAINMASK: 652 *value = mlme_mgmt->chainmask_info.tx_chainmask; 653 break; 654 case WLAN_MLME_CFG_RX_CHAINMASK: 655 *value = mlme_mgmt->chainmask_info.rx_chainmask; 656 break; 657 case WLAN_MLME_CFG_PKT_POWERSAVE: 658 *value = mlme_mgmt->powersave_info.packet_powersave; 659 break; 660 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 661 *value = mlme_mgmt->powersave_info.max_li_of_moddtim; 662 break; 663 case WLAN_MLME_CFG_DYNDTIM_CNT: 664 *value = mlme_mgmt->powersave_info.dyndtim_cnt; 665 break; 666 case WLAN_MLME_CFG_LISTEN_INTERVAL: 667 *value = mlme_mgmt->powersave_info.listen_interval; 668 break; 669 case WLAN_MLME_CFG_MODDTIM_CNT: 670 *value = mlme_mgmt->powersave_info.moddtim_cnt; 671 break; 672 case WLAN_MLME_CFG_PROFILE_IDX: 673 *value = mlme_mgmt->mbss_11ax.profile_idx; 674 break; 675 case WLAN_MLME_CFG_PROFILE_NUM: 676 *value = mlme_mgmt->mbss_11ax.profile_num; 677 break; 678 case WLAN_MLME_CFG_MBSSID_FLAGS: 679 *value = mlme_mgmt->mbss_11ax.mbssid_flags; 680 break; 681 case WLAN_MLME_CFG_VDEVID_TRANS: 682 *value = mlme_mgmt->mbss_11ax.vdevid_trans; 683 break; 684 case WLAN_MLME_CFG_BCN_TX_RATE: 685 *value = mlme_mgmt->rate_info.bcn_tx_rate; 686 break; 687 case WLAN_MLME_CFG_TX_STREAMS: 688 *value = mlme_mgmt->chainmask_info.num_tx_chain; 689 break; 690 case WLAN_MLME_CFG_RX_STREAMS: 691 *value = mlme_mgmt->chainmask_info.num_rx_chain; 692 break; 693 default: 694 break; 695 } 696 } 697 698 qdf_export_symbol(wlan_util_vdev_mlme_get_param); 699 700 void wlan_util_vdev_get_param(struct wlan_objmgr_vdev *vdev, 701 enum wlan_mlme_cfg_id param_id, 702 uint32_t *value) 703 { 704 ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value); 705 } 706 707 qdf_export_symbol(wlan_util_vdev_get_param); 708 709 #ifndef MOBILE_DFS_SUPPORT 710 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev) 711 { 712 struct wlan_channel *des_chan = NULL; 713 struct wlan_channel *bss_chan = NULL; 714 bool continue_current_cac = 0; 715 int dfs_cac_timeout = 0; 716 717 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 718 if (!des_chan) 719 return 0; 720 721 bss_chan = wlan_vdev_mlme_get_bss_chan(vdev); 722 if (!bss_chan) 723 return 0; 724 725 if (!utils_dfs_is_cac_required(wlan_vdev_get_pdev(vdev), des_chan, 726 bss_chan, &continue_current_cac)) 727 return 0; 728 729 dfs_cac_timeout = dfs_mlme_get_cac_timeout_for_freq( 730 wlan_vdev_get_pdev(vdev), des_chan->ch_freq, 731 des_chan->ch_cfreq2, des_chan->ch_flags); 732 /* Seconds to milliseconds */ 733 return SECONDS_TO_MS(dfs_cac_timeout); 734 } 735 #else 736 int wlan_util_vdev_mgr_get_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev) 737 { 738 struct vdev_mlme_obj *vdev_mlme; 739 740 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 741 if (!vdev_mlme) { 742 mlme_err("vdev_mlme is null"); 743 return 0; 744 } 745 746 return vdev_mlme->mgmt.ap.cac_duration_ms; 747 } 748 749 void wlan_util_vdev_mgr_set_cac_timeout_for_vdev(struct wlan_objmgr_vdev *vdev, 750 uint32_t new_chan_cac_ms) 751 { 752 struct vdev_mlme_obj *vdev_mlme; 753 754 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 755 if (!vdev_mlme) { 756 mlme_err("vdev_mlme is null"); 757 return; 758 } 759 760 vdev_mlme->mgmt.ap.cac_duration_ms = new_chan_cac_ms; 761 } 762 #endif /* MOBILE_DFS_SUPPORT */ 763 764 void wlan_util_vdev_mgr_set_acs_mode_for_vdev(struct wlan_objmgr_vdev *vdev, 765 bool is_acs_mode) 766 { 767 struct vdev_mlme_obj *vdev_mlme; 768 769 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 770 if (!vdev_mlme) { 771 mlme_err("vdev_mlme is null"); 772 return; 773 } 774 775 vdev_mlme->mgmt.ap.is_acs_mode = is_acs_mode; 776 } 777 778 bool wlan_util_vdev_mgr_get_acs_mode_for_vdev(struct wlan_objmgr_vdev *vdev) 779 { 780 struct vdev_mlme_obj *vdev_mlme; 781 782 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 783 if (!vdev_mlme) { 784 mlme_err("vdev_mlme is null"); 785 return false; 786 } 787 788 return vdev_mlme->mgmt.ap.is_acs_mode; 789 } 790 791 QDF_STATUS wlan_util_vdev_mgr_get_csa_channel_switch_time( 792 struct wlan_objmgr_vdev *vdev, 793 uint32_t *chan_switch_time) 794 { 795 struct vdev_mlme_obj *vdev_mlme = NULL; 796 797 *chan_switch_time = 0; 798 799 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 800 if (!vdev_mlme) { 801 mlme_err("vdev_mlme is null"); 802 return QDF_STATUS_E_FAILURE; 803 } 804 805 /* Time between CSA count 1 and CSA count 0 is one beacon interval. */ 806 *chan_switch_time = vdev_mlme->proto.generic.beacon_interval; 807 808 /* Vdev restart time */ 809 *chan_switch_time += SECONDS_TO_MS(VDEV_RESTART_TIME); 810 811 /* Add one beacon interval time required to send beacon on the 812 * new channel after switching to the new channel. 813 */ 814 *chan_switch_time += vdev_mlme->proto.generic.beacon_interval; 815 816 return QDF_STATUS_SUCCESS; 817 } 818 819 QDF_STATUS wlan_util_vdev_mgr_compute_max_channel_switch_time( 820 struct wlan_objmgr_vdev *vdev, uint32_t *max_chan_switch_time) 821 { 822 QDF_STATUS status; 823 824 status = wlan_util_vdev_mgr_get_csa_channel_switch_time( 825 vdev, max_chan_switch_time); 826 if (QDF_IS_STATUS_ERROR(status)) { 827 mlme_err("Failed to get the CSA channel switch time"); 828 return status; 829 } 830 831 /* Plus the CAC time */ 832 *max_chan_switch_time += 833 wlan_util_vdev_mgr_get_cac_timeout_for_vdev(vdev); 834 835 return QDF_STATUS_SUCCESS; 836 } 837 838 uint32_t 839 wlan_utils_get_vdev_remaining_channel_switch_time(struct wlan_objmgr_vdev *vdev) 840 { 841 struct vdev_mlme_obj *vdev_mlme = NULL; 842 int32_t remaining_chan_switch_time; 843 844 vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); 845 if (!vdev_mlme) 846 return 0; 847 848 if (!vdev_mlme->mgmt.ap.last_bcn_ts_ms) 849 return 0; 850 851 /* Remaining channel switch time is equal to the time when last beacon 852 * sent on the CSA triggered vap plus max channel switch time minus 853 * current time. 854 */ 855 remaining_chan_switch_time = 856 ((vdev_mlme->mgmt.ap.last_bcn_ts_ms + 857 vdev_mlme->mgmt.ap.max_chan_switch_time) - 858 qdf_mc_timer_get_system_time()); 859 860 return (remaining_chan_switch_time > 0) ? 861 remaining_chan_switch_time : 0; 862 } 863 864 #ifdef WLAN_FEATURE_11BE_MLO 865 QDF_STATUS wlan_util_vdev_mgr_quiet_offload( 866 struct wlan_objmgr_psoc *psoc, 867 struct vdev_sta_quiet_event *quiet_event) 868 { 869 uint8_t vdev_id; 870 bool connected; 871 struct wlan_objmgr_vdev *vdev; 872 873 if (qdf_is_macaddr_zero(&quiet_event->mld_mac) && 874 qdf_is_macaddr_zero(&quiet_event->link_mac)) { 875 mlme_err("mld_mac and link mac are invalid"); 876 return QDF_STATUS_E_INVAL; 877 } 878 879 if (!qdf_is_macaddr_zero(&quiet_event->mld_mac)) { 880 connected = wlan_get_connected_vdev_by_mld_addr( 881 psoc, quiet_event->mld_mac.bytes, &vdev_id); 882 if (!connected) { 883 mlme_err("Can't find vdev with mld " QDF_MAC_ADDR_FMT, 884 QDF_MAC_ADDR_REF(quiet_event->mld_mac.bytes)); 885 return QDF_STATUS_E_INVAL; 886 } 887 vdev = wlan_objmgr_get_vdev_by_id_from_psoc( 888 psoc, vdev_id, WLAN_MLME_OBJMGR_ID); 889 if (!vdev) { 890 mlme_err("Null vdev"); 891 return QDF_STATUS_E_INVAL; 892 } 893 if (wlan_vdev_mlme_is_mlo_vdev(vdev)) 894 mlo_sta_save_quiet_status(vdev->mlo_dev_ctx, 895 quiet_event->link_id, 896 quiet_event->quiet_status); 897 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 898 } else if (!qdf_is_macaddr_zero(&quiet_event->link_mac)) { 899 connected = wlan_get_connected_vdev_from_psoc_by_bssid( 900 psoc, quiet_event->link_mac.bytes, &vdev_id); 901 if (!connected) { 902 mlme_err("Can't find vdev with BSSID" QDF_MAC_ADDR_FMT, 903 QDF_MAC_ADDR_REF(quiet_event->link_mac.bytes)); 904 return QDF_STATUS_E_INVAL; 905 } 906 vdev = wlan_objmgr_get_vdev_by_id_from_psoc( 907 psoc, vdev_id, WLAN_MLME_OBJMGR_ID); 908 if (!vdev) { 909 mlme_err("Null vdev"); 910 return QDF_STATUS_E_INVAL; 911 } 912 if (wlan_vdev_mlme_is_mlo_vdev(vdev)) 913 mlo_sta_save_quiet_status(vdev->mlo_dev_ctx, 914 wlan_vdev_get_link_id(vdev), 915 quiet_event->quiet_status); 916 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID); 917 } 918 919 return QDF_STATUS_SUCCESS; 920 } 921 #endif /* WLAN_FEATURE_11BE_MLO */ 922 923 QDF_STATUS wlan_util_vdev_peer_set_param_send(struct wlan_objmgr_vdev *vdev, 924 uint8_t *peer_mac_addr, 925 uint32_t param_id, 926 uint32_t param_value) 927 { 928 return tgt_vdev_peer_set_param_send(vdev, peer_mac_addr, 929 param_id, param_value); 930 } 931 932 qdf_export_symbol(wlan_util_vdev_peer_set_param_send); 933