1 /* 2 * Copyright (c) 2019 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: wlan_vdev_mgr_utils_api.c 21 * 22 * This file provide definition for APIs to enable Tx Ops and Rx Ops registered 23 * through LMAC 24 */ 25 #include <wlan_vdev_mgr_utils_api.h> 26 #include <wlan_vdev_mgr_tgt_if_tx_api.h> 27 #include <cdp_txrx_cmn_struct.h> 28 #include <wlan_mlme_dbg.h> 29 30 enum wlan_op_mode 31 wlan_util_vdev_get_cdp_txrx_opmode(struct wlan_objmgr_vdev *vdev) 32 { 33 enum QDF_OPMODE qdf_opmode; 34 enum wlan_op_mode cdp_txrx_opmode; 35 36 qdf_opmode = wlan_vdev_mlme_get_opmode(vdev); 37 switch (qdf_opmode) { 38 case QDF_STA_MODE: 39 cdp_txrx_opmode = wlan_op_mode_sta; 40 break; 41 case QDF_SAP_MODE: 42 cdp_txrx_opmode = wlan_op_mode_ap; 43 break; 44 case QDF_MONITOR_MODE: 45 cdp_txrx_opmode = wlan_op_mode_monitor; 46 break; 47 default: 48 cdp_txrx_opmode = wlan_op_mode_unknown; 49 }; 50 51 return cdp_txrx_opmode; 52 } 53 54 QDF_STATUS 55 wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, 56 enum wlan_mlme_cfg_id param_id, 57 struct wlan_vdev_mgr_cfg mlme_cfg) 58 { 59 struct wlan_objmgr_vdev *vdev; 60 struct vdev_mlme_proto *mlme_proto; 61 struct vdev_mlme_mgmt *mlme_mgmt; 62 struct vdev_mlme_inactivity_params *inactivity_params; 63 int is_wmi_cmd = 0; 64 int ret = QDF_STATUS_SUCCESS; 65 struct vdev_set_params param = {0}; 66 67 if (!vdev_mlme) { 68 mlme_err("VDEV MLME is NULL"); 69 return QDF_STATUS_E_FAILURE; 70 } 71 vdev = vdev_mlme->vdev; 72 mlme_proto = &vdev_mlme->proto; 73 mlme_mgmt = &vdev_mlme->mgmt; 74 inactivity_params = &mlme_mgmt->inactivity_params; 75 76 switch (param_id) { 77 case WLAN_MLME_CFG_DTIM_PERIOD: 78 mlme_proto->generic.dtim_period = mlme_cfg.value; 79 is_wmi_cmd = 1; 80 break; 81 case WLAN_MLME_CFG_SLOT_TIME: 82 mlme_proto->generic.slot_time = mlme_cfg.value; 83 is_wmi_cmd = 1; 84 break; 85 case WLAN_MLME_CFG_PROTECTION_MODE: 86 mlme_proto->generic.protection_mode = mlme_cfg.value; 87 is_wmi_cmd = 1; 88 break; 89 case WLAN_MLME_CFG_BEACON_INTERVAL: 90 mlme_proto->generic.beacon_interval = mlme_cfg.value; 91 is_wmi_cmd = 1; 92 break; 93 case WLAN_MLME_CFG_LDPC: 94 mlme_proto->generic.ldpc = mlme_cfg.value; 95 is_wmi_cmd = 1; 96 break; 97 case WLAN_MLME_CFG_NSS: 98 mlme_proto->generic.nss = mlme_cfg.value; 99 is_wmi_cmd = 1; 100 break; 101 case WLAN_MLME_CFG_TSF_ADJUST: 102 mlme_proto->generic.tsfadjust = mlme_cfg.tsf; 103 break; 104 case WLAN_MLME_CFG_ASSOC_ID: 105 mlme_proto->sta.assoc_id = mlme_cfg.value; 106 break; 107 case WLAN_MLME_CFG_VHT_CAPS: 108 mlme_proto->vht_info.caps = mlme_cfg.value; 109 break; 110 case WLAN_MLME_CFG_SUBFER: 111 mlme_proto->vht_info.subfer = mlme_cfg.value; 112 break; 113 case WLAN_MLME_CFG_MUBFER: 114 mlme_proto->vht_info.mubfer = mlme_cfg.value; 115 break; 116 case WLAN_MLME_CFG_SUBFEE: 117 mlme_proto->vht_info.subfee = mlme_cfg.value; 118 break; 119 case WLAN_MLME_CFG_MUBFEE: 120 mlme_proto->vht_info.mubfee = mlme_cfg.value; 121 break; 122 case WLAN_MLME_CFG_IMLICIT_BF: 123 mlme_proto->vht_info.implicit_bf = mlme_cfg.value; 124 break; 125 case WLAN_MLME_CFG_SOUNDING_DIM: 126 mlme_proto->vht_info.sounding_dimension = mlme_cfg.value; 127 break; 128 case WLAN_MLME_CFG_TXBF_CAPS: 129 is_wmi_cmd = 1; 130 break; 131 case WLAN_MLME_CFG_HT_CAPS: 132 mlme_proto->ht_info.ht_caps = mlme_cfg.value; 133 break; 134 case WLAN_MLME_CFG_HE_OPS: 135 mlme_proto->he_ops_info.he_ops = mlme_cfg.value; 136 is_wmi_cmd = 1; 137 break; 138 case WLAN_MLME_CFG_RTS_THRESHOLD: 139 mlme_mgmt->generic.rts_threshold = mlme_cfg.value; 140 is_wmi_cmd = 1; 141 break; 142 case WLAN_MLME_CFG_FRAG_THRESHOLD: 143 mlme_mgmt->generic.frag_threshold = mlme_cfg.value; 144 is_wmi_cmd = 1; 145 break; 146 case WLAN_MLME_CFG_PROBE_DELAY: 147 mlme_mgmt->generic.probe_delay = mlme_cfg.value; 148 break; 149 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 150 mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value; 151 break; 152 case WLAN_MLME_CFG_DROP_UNENCRY: 153 mlme_mgmt->generic.drop_unencry = mlme_cfg.value; 154 is_wmi_cmd = 1; 155 break; 156 case WLAN_MLME_CFG_TX_PWR_LIMIT: 157 mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value; 158 break; 159 case WLAN_MLME_CFG_TX_POWER: 160 mlme_mgmt->generic.tx_power = mlme_cfg.value; 161 is_wmi_cmd = 1; 162 break; 163 case WLAN_MLME_CFG_AMPDU: 164 mlme_mgmt->generic.ampdu = mlme_cfg.value; 165 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 166 is_wmi_cmd = 1; 167 break; 168 case WLAN_MLME_CFG_AMSDU: 169 mlme_mgmt->generic.amsdu = mlme_cfg.value; 170 mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; 171 is_wmi_cmd = 1; 172 break; 173 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 174 inactivity_params->bmiss_first_bcnt = mlme_cfg.value; 175 break; 176 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 177 inactivity_params->bmiss_final_bcnt = mlme_cfg.value; 178 break; 179 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 180 inactivity_params->keepalive_min_idle_inactive_time_secs = 181 mlme_cfg.value; 182 is_wmi_cmd = 1; 183 break; 184 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 185 inactivity_params->keepalive_max_idle_inactive_time_secs = 186 mlme_cfg.value; 187 is_wmi_cmd = 1; 188 break; 189 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 190 inactivity_params->keepalive_max_unresponsive_time_secs = 191 mlme_cfg.value; 192 is_wmi_cmd = 1; 193 break; 194 case WLAN_MLME_CFG_RATE_FLAGS: 195 mlme_mgmt->rate_info.rate_flags = mlme_cfg.value; 196 break; 197 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 198 mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value; 199 break; 200 case WLAN_MLME_CFG_MAX_RATE: 201 mlme_mgmt->rate_info.max_rate = mlme_cfg.value; 202 break; 203 case WLAN_MLME_CFG_TX_MGMT_RATE: 204 mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value; 205 break; 206 case WLAN_MLME_CFG_TX_CHAINMASK: 207 mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value; 208 break; 209 case WLAN_MLME_CFG_RX_CHAINMASK: 210 mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value; 211 break; 212 case WLAN_MLME_CFG_PKT_POWERSAVE: 213 mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value; 214 break; 215 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 216 mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value; 217 break; 218 case WLAN_MLME_CFG_DYNDTIM_CNT: 219 mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value; 220 break; 221 case WLAN_MLME_CFG_LISTEN_INTERVAL: 222 mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value; 223 break; 224 case WLAN_MLME_CFG_MODDTIM_CNT: 225 mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value; 226 break; 227 case WLAN_MLME_CFG_PROILE_IDX: 228 mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value; 229 break; 230 case WLAN_MLME_CFG_PROFILE_NUM: 231 mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value; 232 break; 233 case WLAN_MLME_CFG_MBSSID_FLAGS: 234 mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value; 235 break; 236 case WLAN_MLME_CFG_VDEVID_TRANS: 237 mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value; 238 break; 239 case WLAN_MLME_CFG_SSID: 240 if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) { 241 qdf_mem_copy(mlme_mgmt->generic.ssid, 242 mlme_cfg.ssid_cfg.mac_ssid, 243 mlme_cfg.ssid_cfg.length); 244 mlme_mgmt->generic.ssid_len = 245 mlme_cfg.ssid_cfg.length; 246 } else { 247 mlme_mgmt->generic.ssid_len = 0; 248 } 249 250 break; 251 case WLAN_MLME_CFG_TRANS_BSSID: 252 qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid, 253 mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE); 254 break; 255 case WLAN_MLME_CFG_TYPE: 256 mlme_mgmt->generic.type = mlme_cfg.value; 257 break; 258 case WLAN_MLME_CFG_SUBTYPE: 259 mlme_mgmt->generic.subtype = mlme_cfg.value; 260 break; 261 case WLAN_MLME_CFG_UAPSD: 262 mlme_proto->sta.uapsd_cfg = mlme_cfg.value; 263 break; 264 case WLAN_MLME_CFG_TX_DECAP_TYPE: 265 mlme_mgmt->generic.tx_decap_type = mlme_cfg.value; 266 break; 267 case WLAN_MLME_CFG_RX_DECAP_TYPE: 268 mlme_mgmt->generic.rx_decap_type = mlme_cfg.value; 269 break; 270 case WLAN_MLME_CFG_RATEMASK_TYPE: 271 mlme_mgmt->rate_info.type = mlme_cfg.value; 272 break; 273 case WLAN_MLME_CFG_RATEMASK_LOWER32: 274 mlme_mgmt->rate_info.lower32 = mlme_cfg.value; 275 break; 276 case WLAN_MLME_CFG_RATEMASK_HIGHER32: 277 mlme_mgmt->rate_info.higher32 = mlme_cfg.value; 278 break; 279 case WLAN_MLME_CFG_RATEMASK_LOWER32_2: 280 mlme_mgmt->rate_info.lower32_2 = mlme_cfg.value; 281 break; 282 case WLAN_MLME_CFG_BCN_TX_RATE: 283 mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value; 284 break; 285 default: 286 break; 287 } 288 289 if (is_wmi_cmd) { 290 param.param_id = param_id; 291 param.vdev_id = wlan_vdev_get_id(vdev); 292 param.param_value = mlme_cfg.value; 293 ret = tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m); 294 } 295 296 return ret; 297 } 298 299 qdf_export_symbol(wlan_util_vdev_mlme_set_param); 300 301 void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme, 302 enum wlan_mlme_cfg_id param_id, 303 uint32_t *value) 304 { 305 struct vdev_mlme_proto *mlme_proto; 306 struct vdev_mlme_mgmt *mlme_mgmt; 307 struct vdev_mlme_inactivity_params *inactivity_params; 308 309 if (!vdev_mlme) { 310 mlme_err("VDEV MLME is NULL"); 311 return; 312 } 313 mlme_proto = &vdev_mlme->proto; 314 mlme_mgmt = &vdev_mlme->mgmt; 315 inactivity_params = &mlme_mgmt->inactivity_params; 316 317 switch (param_id) { 318 case WLAN_MLME_CFG_DTIM_PERIOD: 319 *value = mlme_proto->generic.dtim_period; 320 break; 321 case WLAN_MLME_CFG_SLOT_TIME: 322 *value = mlme_proto->generic.slot_time; 323 break; 324 case WLAN_MLME_CFG_PROTECTION_MODE: 325 *value = mlme_proto->generic.protection_mode; 326 break; 327 case WLAN_MLME_CFG_BEACON_INTERVAL: 328 *value = mlme_proto->generic.beacon_interval; 329 break; 330 case WLAN_MLME_CFG_LDPC: 331 *value = mlme_proto->generic.ldpc; 332 break; 333 case WLAN_MLME_CFG_NSS: 334 *value = mlme_proto->generic.nss; 335 break; 336 case WLAN_MLME_CFG_ASSOC_ID: 337 *value = mlme_proto->sta.assoc_id; 338 break; 339 case WLAN_MLME_CFG_VHT_CAPS: 340 *value = mlme_proto->vht_info.caps; 341 break; 342 case WLAN_MLME_CFG_SUBFER: 343 *value = mlme_proto->vht_info.subfer; 344 break; 345 case WLAN_MLME_CFG_MUBFER: 346 *value = mlme_proto->vht_info.mubfer; 347 break; 348 case WLAN_MLME_CFG_SUBFEE: 349 *value = mlme_proto->vht_info.subfee; 350 break; 351 case WLAN_MLME_CFG_MUBFEE: 352 *value = mlme_proto->vht_info.mubfee; 353 break; 354 case WLAN_MLME_CFG_IMLICIT_BF: 355 *value = mlme_proto->vht_info.implicit_bf; 356 break; 357 case WLAN_MLME_CFG_SOUNDING_DIM: 358 *value = mlme_proto->vht_info.sounding_dimension; 359 break; 360 case WLAN_MLME_CFG_HT_CAPS: 361 *value = mlme_proto->ht_info.ht_caps; 362 break; 363 case WLAN_MLME_CFG_HE_OPS: 364 *value = mlme_proto->he_ops_info.he_ops; 365 break; 366 case WLAN_MLME_CFG_RTS_THRESHOLD: 367 *value = mlme_mgmt->generic.rts_threshold; 368 break; 369 case WLAN_MLME_CFG_FRAG_THRESHOLD: 370 *value = mlme_mgmt->generic.frag_threshold; 371 break; 372 case WLAN_MLME_CFG_PROBE_DELAY: 373 *value = mlme_mgmt->generic.probe_delay; 374 break; 375 case WLAN_MLME_CFG_REPEAT_PROBE_TIME: 376 *value = mlme_mgmt->generic.repeat_probe_time; 377 break; 378 case WLAN_MLME_CFG_DROP_UNENCRY: 379 *value = mlme_mgmt->generic.drop_unencry; 380 break; 381 case WLAN_MLME_CFG_TX_PWR_LIMIT: 382 *value = mlme_mgmt->generic.tx_pwrlimit; 383 break; 384 case WLAN_MLME_CFG_TX_POWER: 385 *value = mlme_mgmt->generic.tx_power; 386 break; 387 case WLAN_MLME_CFG_AMPDU: 388 *value = mlme_mgmt->generic.ampdu; 389 break; 390 case WLAN_MLME_CFG_AMSDU: 391 *value = mlme_mgmt->generic.amsdu; 392 break; 393 case WLAN_MLME_CFG_SSID_LEN: 394 *value = mlme_mgmt->generic.ssid_len; 395 break; 396 case WLAN_MLME_CFG_BMISS_FIRST_BCNT: 397 *value = inactivity_params->bmiss_first_bcnt; 398 break; 399 case WLAN_MLME_CFG_BMISS_FINAL_BCNT: 400 *value = inactivity_params->bmiss_final_bcnt; 401 break; 402 case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: 403 *value = 404 inactivity_params->keepalive_min_idle_inactive_time_secs; 405 break; 406 case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: 407 *value = 408 inactivity_params->keepalive_max_idle_inactive_time_secs; 409 break; 410 case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: 411 *value = 412 inactivity_params->keepalive_max_unresponsive_time_secs; 413 break; 414 case WLAN_MLME_CFG_RATE_FLAGS: 415 *value = mlme_mgmt->rate_info.rate_flags; 416 break; 417 case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: 418 *value = mlme_mgmt->rate_info.per_band_tx_mgmt_rate; 419 break; 420 case WLAN_MLME_CFG_MAX_RATE: 421 *value = mlme_mgmt->rate_info.max_rate; 422 break; 423 case WLAN_MLME_CFG_TX_MGMT_RATE: 424 *value = mlme_mgmt->rate_info.tx_mgmt_rate; 425 break; 426 case WLAN_MLME_CFG_TX_CHAINMASK: 427 *value = mlme_mgmt->chainmask_info.tx_chainmask; 428 break; 429 case WLAN_MLME_CFG_RX_CHAINMASK: 430 *value = mlme_mgmt->chainmask_info.rx_chainmask; 431 break; 432 case WLAN_MLME_CFG_PKT_POWERSAVE: 433 *value = mlme_mgmt->powersave_info.packet_powersave; 434 break; 435 case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: 436 *value = mlme_mgmt->powersave_info.max_li_of_moddtim; 437 break; 438 case WLAN_MLME_CFG_DYNDTIM_CNT: 439 *value = mlme_mgmt->powersave_info.dyndtim_cnt; 440 break; 441 case WLAN_MLME_CFG_LISTEN_INTERVAL: 442 *value = mlme_mgmt->powersave_info.listen_interval; 443 break; 444 case WLAN_MLME_CFG_MODDTIM_CNT: 445 *value = mlme_mgmt->powersave_info.moddtim_cnt; 446 break; 447 case WLAN_MLME_CFG_PROILE_IDX: 448 *value = mlme_mgmt->mbss_11ax.profile_idx; 449 break; 450 case WLAN_MLME_CFG_PROFILE_NUM: 451 *value = mlme_mgmt->mbss_11ax.profile_num; 452 break; 453 case WLAN_MLME_CFG_MBSSID_FLAGS: 454 *value = mlme_mgmt->mbss_11ax.mbssid_flags; 455 break; 456 case WLAN_MLME_CFG_VDEVID_TRANS: 457 *value = mlme_mgmt->mbss_11ax.vdevid_trans; 458 break; 459 case WLAN_MLME_CFG_BCN_TX_RATE: 460 *value = mlme_mgmt->rate_info.bcn_tx_rate; 461 break; 462 case WLAN_MLME_CFG_2G_VHT: 463 *value = mlme_proto->vht_info.en_2gvht; 464 break; 465 case WLAN_MLME_CFG_11AX_STUB: 466 *value = mlme_mgmt->generic.is_11ax_stub_enabled; 467 break; 468 default: 469 break; 470 } 471 } 472 473 qdf_export_symbol(wlan_util_vdev_mlme_get_param); 474 475 void wlan_util_vdev_get_param(struct wlan_objmgr_vdev *vdev, 476 enum wlan_mlme_cfg_id param_id, 477 uint32_t *value) 478 { 479 ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value); 480 } 481 482 qdf_export_symbol(wlan_util_vdev_get_param); 483