1 /* 2 * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: wlan_cm_api.c 20 * 21 * This file maintains definitaions public apis. 22 */ 23 24 #include <wlan_cm_api.h> 25 #include "connection_mgr/core/src/wlan_cm_main_api.h" 26 #include "connection_mgr/core/src/wlan_cm_roam.h" 27 #include <wlan_vdev_mgr_utils_api.h> 28 #ifdef WLAN_FEATURE_11BE_MLO 29 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 30 #include "wlan_mlo_mgr_roam.h" 31 #endif 32 #endif 33 34 QDF_STATUS wlan_cm_start_connect(struct wlan_objmgr_vdev *vdev, 35 struct wlan_cm_connect_req *req) 36 { 37 return cm_connect_start_req(vdev, req); 38 } 39 40 QDF_STATUS wlan_cm_disconnect(struct wlan_objmgr_vdev *vdev, 41 enum wlan_cm_source source, 42 enum wlan_reason_code reason_code, 43 struct qdf_mac_addr *bssid) 44 { 45 struct wlan_cm_disconnect_req req = {0}; 46 47 req.vdev_id = wlan_vdev_get_id(vdev); 48 req.source = source; 49 req.reason_code = reason_code; 50 if (bssid) 51 qdf_copy_macaddr(&req.bssid, bssid); 52 53 return cm_disconnect_start_req(vdev, &req); 54 } 55 56 QDF_STATUS wlan_cm_disconnect_sync(struct wlan_objmgr_vdev *vdev, 57 enum wlan_cm_source source, 58 enum wlan_reason_code reason_code) 59 { 60 struct wlan_cm_disconnect_req req = {0}; 61 62 req.vdev_id = wlan_vdev_get_id(vdev); 63 req.source = source; 64 req.reason_code = reason_code; 65 66 return cm_disconnect_start_req_sync(vdev, &req); 67 } 68 69 QDF_STATUS wlan_cm_bss_select_ind_rsp(struct wlan_objmgr_vdev *vdev, 70 QDF_STATUS status) 71 { 72 return cm_bss_select_ind_rsp(vdev, status); 73 } 74 75 QDF_STATUS wlan_cm_bss_peer_create_rsp(struct wlan_objmgr_vdev *vdev, 76 QDF_STATUS status, 77 struct qdf_mac_addr *peer_mac) 78 { 79 uint32_t prefix; 80 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 81 82 if (!cm_ctx) 83 return QDF_STATUS_E_INVAL; 84 85 prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id); 86 if (prefix == ROAM_REQ_PREFIX) 87 return cm_roam_bss_peer_create_rsp(vdev, status, peer_mac); 88 else 89 return cm_bss_peer_create_rsp(vdev, status, peer_mac); 90 } 91 92 QDF_STATUS wlan_cm_connect_rsp(struct wlan_objmgr_vdev *vdev, 93 struct wlan_cm_connect_resp *resp) 94 { 95 return cm_connect_rsp(vdev, resp); 96 } 97 98 QDF_STATUS wlan_cm_bss_peer_delete_ind(struct wlan_objmgr_vdev *vdev, 99 struct qdf_mac_addr *peer_mac) 100 { 101 return cm_bss_peer_delete_req(vdev, peer_mac); 102 } 103 104 QDF_STATUS wlan_cm_bss_peer_delete_rsp(struct wlan_objmgr_vdev *vdev, 105 uint32_t status) 106 { 107 return cm_vdev_down_req(vdev, status); 108 } 109 110 QDF_STATUS wlan_cm_disconnect_rsp(struct wlan_objmgr_vdev *vdev, 111 struct wlan_cm_discon_rsp *resp) 112 { 113 uint32_t prefix; 114 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 115 116 if (!cm_ctx) 117 return QDF_STATUS_E_INVAL; 118 119 prefix = CM_ID_GET_PREFIX(cm_ctx->active_cm_id); 120 if (prefix == ROAM_REQ_PREFIX) 121 return cm_roam_disconnect_rsp(vdev, resp); 122 else 123 return cm_disconnect_rsp(vdev, resp); 124 } 125 126 #ifdef WLAN_FEATURE_HOST_ROAM 127 QDF_STATUS wlan_cm_reassoc_rsp(struct wlan_objmgr_vdev *vdev, 128 struct wlan_cm_connect_resp *resp) 129 { 130 return cm_reassoc_rsp(vdev, resp); 131 } 132 #endif 133 134 void wlan_cm_free_connect_req(struct wlan_cm_connect_req *connect_req) 135 { 136 if (!connect_req) 137 return; 138 139 cm_free_connect_req(connect_req); 140 } 141 142 void wlan_cm_free_connect_resp(struct wlan_cm_connect_resp *connect_rsp) 143 { 144 if (!connect_rsp) 145 return; 146 147 cm_free_connect_rsp(connect_rsp); 148 } 149 150 void wlan_cm_free_connect_req_param(struct wlan_cm_connect_req *req) 151 { 152 if (!req) 153 return; 154 155 cm_free_connect_req_param(req); 156 } 157 158 void wlan_cm_set_max_connect_attempts(struct wlan_objmgr_vdev *vdev, 159 uint8_t max_connect_attempts) 160 { 161 cm_set_max_connect_attempts(vdev, max_connect_attempts); 162 } 163 164 void wlan_cm_set_max_connect_timeout(struct wlan_objmgr_vdev *vdev, 165 uint32_t max_connect_timeout) 166 { 167 cm_set_max_connect_timeout(vdev, max_connect_timeout); 168 } 169 170 bool wlan_cm_is_vdev_connecting(struct wlan_objmgr_vdev *vdev) 171 { 172 return cm_is_vdev_connecting(vdev); 173 } 174 175 bool wlan_cm_is_vdev_connected(struct wlan_objmgr_vdev *vdev) 176 { 177 return cm_is_vdev_connected(vdev); 178 } 179 180 bool wlan_cm_is_vdev_active(struct wlan_objmgr_vdev *vdev) 181 { 182 return cm_is_vdev_active(vdev); 183 } 184 185 bool wlan_cm_is_vdev_disconnecting(struct wlan_objmgr_vdev *vdev) 186 { 187 return cm_is_vdev_disconnecting(vdev); 188 } 189 190 bool wlan_cm_is_vdev_disconnected(struct wlan_objmgr_vdev *vdev) 191 { 192 return cm_is_vdev_disconnected(vdev); 193 } 194 195 bool wlan_cm_is_vdev_roaming(struct wlan_objmgr_vdev *vdev) 196 { 197 return cm_is_vdev_roaming(vdev); 198 } 199 200 #ifdef WLAN_FEATURE_ROAM_OFFLOAD 201 bool wlan_cm_is_vdev_roam_started(struct wlan_objmgr_vdev *vdev) 202 { 203 return cm_is_vdev_roam_started(vdev); 204 } 205 206 bool wlan_cm_is_vdev_roam_sync_inprogress(struct wlan_objmgr_vdev *vdev) 207 { 208 return cm_is_vdev_roam_sync_inprogress(vdev); 209 } 210 #endif 211 212 #ifdef WLAN_FEATURE_HOST_ROAM 213 bool wlan_cm_is_vdev_roam_preauth_state(struct wlan_objmgr_vdev *vdev) 214 { 215 return cm_is_vdev_roam_preauth_state(vdev); 216 } 217 218 bool wlan_cm_is_vdev_roam_reassoc_state(struct wlan_objmgr_vdev *vdev) 219 { 220 return cm_is_vdev_roam_reassoc_state(vdev); 221 } 222 #endif 223 224 enum wlan_cm_active_request_type 225 wlan_cm_get_active_req_type(struct wlan_objmgr_vdev *vdev) 226 { 227 return cm_get_active_req_type(vdev); 228 } 229 230 bool wlan_cm_get_active_connect_req(struct wlan_objmgr_vdev *vdev, 231 struct wlan_cm_vdev_connect_req *req) 232 { 233 return cm_get_active_connect_req(vdev, req); 234 } 235 236 QDF_STATUS 237 wlan_cm_get_active_connect_req_param(struct wlan_objmgr_vdev *vdev, 238 struct wlan_cm_connect_req *req) 239 { 240 return cm_get_active_connect_req_param(vdev, req); 241 } 242 243 cm_ext_t *wlan_cm_get_ext_hdl(struct wlan_objmgr_vdev *vdev) 244 { 245 return cm_get_ext_hdl(vdev); 246 } 247 248 bool wlan_cm_is_first_candidate_connect_attempt(struct wlan_objmgr_vdev *vdev) 249 { 250 return cm_is_first_candidate_connect_attempt(vdev); 251 } 252 253 bool wlan_cm_is_link_switch_disconnect_resp(struct wlan_cm_discon_rsp *resp) 254 { 255 return cm_is_link_switch_disconnect_resp(resp); 256 } 257 258 bool wlan_cm_is_link_switch_connect_resp(struct wlan_cm_connect_resp *resp) 259 { 260 return cm_is_link_switch_connect_resp(resp); 261 } 262 263 #ifdef WLAN_FEATURE_HOST_ROAM 264 bool wlan_cm_get_active_reassoc_req(struct wlan_objmgr_vdev *vdev, 265 struct wlan_cm_vdev_reassoc_req *req) 266 { 267 return cm_get_active_reassoc_req(vdev, req); 268 } 269 #endif 270 271 bool wlan_cm_get_active_disconnect_req(struct wlan_objmgr_vdev *vdev, 272 struct wlan_cm_vdev_discon_req *req) 273 { 274 return cm_get_active_disconnect_req(vdev, req); 275 } 276 277 const char *wlan_cm_reason_code_to_str(enum wlan_reason_code reason) 278 { 279 if (reason > REASON_PROP_START) 280 return ""; 281 282 switch (reason) { 283 CASE_RETURN_STRING(REASON_UNSPEC_FAILURE); 284 CASE_RETURN_STRING(REASON_PREV_AUTH_NOT_VALID); 285 CASE_RETURN_STRING(REASON_DEAUTH_NETWORK_LEAVING); 286 CASE_RETURN_STRING(REASON_DISASSOC_DUE_TO_INACTIVITY); 287 CASE_RETURN_STRING(REASON_DISASSOC_AP_BUSY); 288 CASE_RETURN_STRING(REASON_CLASS2_FRAME_FROM_NON_AUTH_STA); 289 CASE_RETURN_STRING(REASON_CLASS3_FRAME_FROM_NON_ASSOC_STA); 290 CASE_RETURN_STRING(REASON_DISASSOC_NETWORK_LEAVING); 291 CASE_RETURN_STRING(REASON_STA_NOT_AUTHENTICATED); 292 CASE_RETURN_STRING(REASON_BAD_PWR_CAPABILITY); 293 CASE_RETURN_STRING(REASON_BAD_SUPPORTED_CHANNELS); 294 CASE_RETURN_STRING(REASON_DISASSOC_BSS_TRANSITION); 295 CASE_RETURN_STRING(REASON_INVALID_IE); 296 CASE_RETURN_STRING(REASON_MIC_FAILURE); 297 CASE_RETURN_STRING(REASON_4WAY_HANDSHAKE_TIMEOUT); 298 CASE_RETURN_STRING(REASON_GROUP_KEY_UPDATE_TIMEOUT); 299 CASE_RETURN_STRING(REASON_IN_4WAY_DIFFERS); 300 CASE_RETURN_STRING(REASON_INVALID_GROUP_CIPHER); 301 CASE_RETURN_STRING(REASON_INVALID_PAIRWISE_CIPHER); 302 CASE_RETURN_STRING(REASON_INVALID_AKMP); 303 CASE_RETURN_STRING(REASON_UNSUPPORTED_RSNE_VER); 304 CASE_RETURN_STRING(REASON_INVALID_RSNE_CAPABILITIES); 305 CASE_RETURN_STRING(REASON_1X_AUTH_FAILURE); 306 CASE_RETURN_STRING(REASON_CIPHER_SUITE_REJECTED); 307 CASE_RETURN_STRING(REASON_TDLS_PEER_UNREACHABLE); 308 CASE_RETURN_STRING(REASON_TDLS_UNSPEC); 309 CASE_RETURN_STRING(REASON_DISASSOC_SSP_REQUESTED); 310 CASE_RETURN_STRING(REASON_NO_SSP_ROAMING_AGREEMENT); 311 CASE_RETURN_STRING(REASON_BAD_CIPHER_OR_AKM); 312 CASE_RETURN_STRING(REASON_LOCATION_NOT_AUTHORIZED); 313 CASE_RETURN_STRING(REASON_SERVICE_CHANGE_PRECLUDES_TS); 314 CASE_RETURN_STRING(REASON_QOS_UNSPECIFIED); 315 CASE_RETURN_STRING(REASON_NO_BANDWIDTH); 316 CASE_RETURN_STRING(REASON_XS_UNACKED_FRAMES); 317 CASE_RETURN_STRING(REASON_EXCEEDED_TXOP); 318 CASE_RETURN_STRING(REASON_STA_LEAVING); 319 CASE_RETURN_STRING(REASON_END_TS_BA_DLS); 320 CASE_RETURN_STRING(REASON_UNKNOWN_TS_BA); 321 CASE_RETURN_STRING(REASON_TIMEDOUT); 322 CASE_RETURN_STRING(REASON_PEERKEY_MISMATCH); 323 CASE_RETURN_STRING(REASON_AUTHORIZED_ACCESS_LIMIT_REACHED); 324 CASE_RETURN_STRING(REASON_EXTERNAL_SERVICE_REQUIREMENTS); 325 CASE_RETURN_STRING(REASON_INVALID_FT_ACTION_FRAME_COUNT); 326 CASE_RETURN_STRING(REASON_INVALID_PMKID); 327 CASE_RETURN_STRING(REASON_INVALID_MDE); 328 CASE_RETURN_STRING(REASON_INVALID_FTE); 329 CASE_RETURN_STRING(REASON_MESH_PEERING_CANCELLED); 330 CASE_RETURN_STRING(REASON_MESH_MAX_PEERS); 331 CASE_RETURN_STRING(REASON_MESH_CONFIG_POLICY_VIOLATION); 332 CASE_RETURN_STRING(REASON_MESH_CLOSE_RCVD); 333 CASE_RETURN_STRING(REASON_MESH_MAX_RETRIES); 334 CASE_RETURN_STRING(REASON_MESH_CONFIRM_TIMEOUT); 335 CASE_RETURN_STRING(REASON_MESH_INVALID_GTK); 336 CASE_RETURN_STRING(REASON_MESH_INCONSISTENT_PARAMS); 337 CASE_RETURN_STRING(REASON_MESH_INVALID_SECURITY_CAP); 338 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_PROXY_INFO); 339 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_NO_FORWARDING_INFO); 340 CASE_RETURN_STRING(REASON_MESH_PATH_ERROR_DEST_UNREACHABLE); 341 CASE_RETURN_STRING(REASON_MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS); 342 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_REGULATORY_REQ); 343 CASE_RETURN_STRING(REASON_MESH_CHANNEL_SWITCH_UNSPECIFIED); 344 CASE_RETURN_STRING(REASON_POOR_RSSI_CONDITIONS); 345 default: 346 return "Unknown"; 347 } 348 } 349 350 #ifdef WLAN_POLICY_MGR_ENABLE 351 void wlan_cm_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 352 wlan_cm_id cm_id, QDF_STATUS status) 353 { 354 uint32_t prefix; 355 356 prefix = CM_ID_GET_PREFIX(cm_id); 357 if (prefix == ROAM_REQ_PREFIX) 358 cm_reassoc_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 359 else 360 cm_hw_mode_change_resp(pdev, vdev_id, cm_id, status); 361 } 362 #endif /* ifdef POLICY_MGR_ENABLE */ 363 364 #ifdef WLAN_FEATURE_LL_LT_SAP 365 void wlan_cm_bearer_switch_resp(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, 366 wlan_cm_id cm_id, QDF_STATUS status) 367 { 368 cm_bearer_switch_resp(psoc, vdev_id, cm_id, status); 369 } 370 #endif 371 372 #ifdef SM_ENG_HIST_ENABLE 373 void wlan_cm_sm_history_print(struct wlan_objmgr_vdev *vdev) 374 { 375 return cm_sm_history_print(vdev); 376 } 377 378 void wlan_cm_req_history_print(struct wlan_objmgr_vdev *vdev) 379 { 380 struct cnx_mgr *cm_ctx = cm_get_cm_ctx(vdev); 381 382 if (!cm_ctx) 383 return; 384 385 cm_req_history_print(cm_ctx); 386 } 387 #endif /* SM_ENG_HIST_ENABLE */ 388 389 #ifndef CONN_MGR_ADV_FEATURE 390 void wlan_cm_set_candidate_advance_filter_cb( 391 struct wlan_objmgr_vdev *vdev, 392 void (*filter_fun)(struct wlan_objmgr_vdev *vdev, 393 struct scan_filter *filter)) 394 { 395 cm_set_candidate_advance_filter_cb(vdev, filter_fun); 396 } 397 398 void wlan_cm_set_candidate_custom_sort_cb( 399 struct wlan_objmgr_vdev *vdev, 400 void (*sort_fun)(struct wlan_objmgr_vdev *vdev, 401 qdf_list_t *list)) 402 { 403 cm_set_candidate_custom_sort_cb(vdev, sort_fun); 404 } 405 406 #endif 407 408 QDF_STATUS wlan_cm_get_rnr(struct wlan_objmgr_vdev *vdev, wlan_cm_id cm_id, 409 struct reduced_neighbor_report *rnr) 410 { 411 enum QDF_OPMODE op_mode = wlan_vdev_mlme_get_opmode(vdev); 412 413 if (op_mode != QDF_STA_MODE && op_mode != QDF_P2P_CLIENT_MODE) { 414 mlme_err("vdev %d Invalid mode %d", 415 wlan_vdev_get_id(vdev), op_mode); 416 return QDF_STATUS_E_NOSUPPORT; 417 } 418 419 return cm_get_rnr(vdev, cm_id, rnr); 420 } 421 422 void 423 wlan_cm_connect_resp_fill_mld_addr_from_cm_id(struct wlan_objmgr_vdev *vdev, 424 wlan_cm_id cm_id, 425 struct wlan_cm_connect_resp *rsp) 426 { 427 return cm_connect_resp_fill_mld_addr_from_cm_id(vdev, cm_id, rsp); 428 } 429 430 #ifdef WLAN_FEATURE_11BE_MLO 431 void 432 wlan_cm_connect_resp_fill_mld_addr_from_vdev_id(struct wlan_objmgr_psoc *psoc, 433 uint8_t vdev_id, 434 struct scan_cache_entry *entry, 435 struct wlan_cm_connect_resp *rsp) 436 { 437 struct wlan_objmgr_vdev *vdev; 438 439 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, 440 WLAN_MLME_CM_ID); 441 if (!vdev) 442 return; 443 444 cm_connect_resp_fill_mld_addr_from_candidate(vdev, entry, rsp); 445 wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); 446 } 447 #endif 448 449 QDF_STATUS 450 wlan_cm_disc_cont_after_rso_stop(struct wlan_objmgr_vdev *vdev, 451 struct wlan_cm_vdev_discon_req *req) 452 { 453 return cm_handle_rso_stop_rsp(vdev, req); 454 } 455 456 #ifdef WLAN_FEATURE_11BE 457 QDF_STATUS wlan_cm_sta_set_chan_param(struct wlan_objmgr_vdev *vdev, 458 qdf_freq_t ch_freq, 459 enum phy_ch_width ori_bw, 460 uint16_t ori_punc, 461 uint8_t ccfs0, uint8_t ccfs1, 462 struct ch_params *chan_param) 463 { 464 uint16_t primary_puncture_bitmap = 0; 465 struct wlan_objmgr_pdev *pdev; 466 struct reg_channel_list chan_list; 467 qdf_freq_t sec_ch_2g_freq = 0; 468 qdf_freq_t center_freq_320 = 0; 469 qdf_freq_t center_freq_40 = 0; 470 uint8_t band_mask; 471 uint16_t new_punc = 0; 472 473 if (!vdev || !chan_param) { 474 mlme_err("invalid input parameters"); 475 return QDF_STATUS_E_INVAL; 476 } 477 pdev = wlan_vdev_get_pdev(vdev); 478 if (!pdev) { 479 mlme_err("invalid pdev"); 480 return QDF_STATUS_E_INVAL; 481 } 482 if (ori_bw == CH_WIDTH_320MHZ) { 483 if (WLAN_REG_IS_6GHZ_CHAN_FREQ(ch_freq)) 484 band_mask = BIT(REG_BAND_6G); 485 else 486 band_mask = BIT(REG_BAND_5G); 487 center_freq_320 = wlan_reg_chan_band_to_freq(pdev, ccfs1, 488 band_mask); 489 } else if (ori_bw == CH_WIDTH_40MHZ) { 490 if (WLAN_REG_IS_24GHZ_CH_FREQ(ch_freq)) { 491 band_mask = BIT(REG_BAND_2G); 492 center_freq_40 = wlan_reg_chan_band_to_freq(pdev, 493 ccfs0, 494 band_mask); 495 if (center_freq_40 == ch_freq + BW_10_MHZ) 496 sec_ch_2g_freq = ch_freq + BW_20_MHZ; 497 if (center_freq_40 == ch_freq - BW_10_MHZ) 498 sec_ch_2g_freq = ch_freq - BW_20_MHZ; 499 } 500 } 501 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 502 ch_freq, 503 center_freq_320, 504 CH_WIDTH_20MHZ, 505 &primary_puncture_bitmap); 506 if (primary_puncture_bitmap) { 507 mlme_err("sta vdev %d freq %d RX bw %d puncture 0x%x primary chan is punctured", 508 wlan_vdev_get_id(vdev), ch_freq, 509 ori_bw, ori_punc); 510 return QDF_STATUS_E_FAULT; 511 } 512 if (chan_param->ch_width != CH_WIDTH_320MHZ) 513 center_freq_320 = 0; 514 qdf_mem_zero(&chan_list, sizeof(chan_list)); 515 wlan_reg_fill_channel_list_for_pwrmode(pdev, ch_freq, 516 sec_ch_2g_freq, 517 chan_param->ch_width, 518 center_freq_320, &chan_list, 519 REG_CURRENT_PWR_MODE, true); 520 *chan_param = chan_list.chan_param[0]; 521 if (chan_param->ch_width == ori_bw) 522 new_punc = ori_punc; 523 else 524 wlan_reg_extract_puncture_by_bw(ori_bw, ori_punc, 525 ch_freq, 526 chan_param->mhz_freq_seg1, 527 chan_param->ch_width, 528 &new_punc); 529 530 chan_param->reg_punc_bitmap = new_punc; 531 532 return QDF_STATUS_SUCCESS; 533 } 534 535 QDF_STATUS wlan_cm_sta_update_bw_puncture(struct wlan_objmgr_vdev *vdev, 536 uint8_t *peer_mac, 537 uint16_t ori_punc, 538 enum phy_ch_width ori_bw, 539 uint8_t ccfs0, uint8_t ccfs1, 540 enum phy_ch_width new_bw) 541 { 542 struct wlan_channel *des_chan; 543 struct ch_params ch_param; 544 uint32_t bw_puncture = 0; 545 QDF_STATUS status = QDF_STATUS_E_INVAL; 546 547 if (!vdev || !peer_mac) { 548 mlme_err("invalid input parameters"); 549 return status; 550 } 551 des_chan = wlan_vdev_mlme_get_des_chan(vdev); 552 if (!des_chan) { 553 mlme_err("invalid des chan"); 554 return status; 555 } 556 qdf_mem_zero(&ch_param, sizeof(ch_param)); 557 ch_param.ch_width = new_bw; 558 status = wlan_cm_sta_set_chan_param(vdev, des_chan->ch_freq, 559 ori_bw, ori_punc, ccfs0, 560 ccfs1, &ch_param); 561 if (QDF_IS_STATUS_ERROR(status)) 562 return status; 563 564 if (des_chan->puncture_bitmap == ch_param.reg_punc_bitmap && 565 des_chan->ch_width == ch_param.ch_width) 566 return status; 567 568 des_chan->ch_freq_seg1 = ch_param.center_freq_seg0; 569 des_chan->ch_freq_seg2 = ch_param.center_freq_seg1; 570 des_chan->ch_cfreq1 = ch_param.mhz_freq_seg0; 571 des_chan->ch_cfreq2 = ch_param.mhz_freq_seg1; 572 des_chan->puncture_bitmap = ch_param.reg_punc_bitmap; 573 des_chan->ch_width = ch_param.ch_width; 574 mlme_debug("sta vdev %d freq %d bw %d puncture 0x%x ch_cfreq1 %d ch_cfreq2 %d", 575 wlan_vdev_get_id(vdev), des_chan->ch_freq, 576 des_chan->ch_width, des_chan->puncture_bitmap, 577 des_chan->ch_cfreq1, des_chan->ch_cfreq2); 578 QDF_SET_BITS(bw_puncture, 0, 8, des_chan->ch_width); 579 QDF_SET_BITS(bw_puncture, 8, 16, des_chan->puncture_bitmap); 580 return wlan_util_vdev_peer_set_param_send(vdev, peer_mac, 581 WLAN_MLME_PEER_BW_PUNCTURE, 582 bw_puncture); 583 } 584 #endif /* WLAN_FEATURE_11BE */ 585 586 #ifdef WLAN_FEATURE_11BE_MLO 587 #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE 588 bool 589 wlan_cm_check_mlo_roam_auth_status(struct wlan_objmgr_vdev *vdev) 590 { 591 return mlo_roam_is_auth_status_connected(wlan_vdev_get_psoc(vdev), 592 wlan_vdev_get_id(vdev)); 593 } 594 #endif 595 #endif 596 enum MLO_TYPE 597 wlan_cm_bss_mlo_type(struct wlan_objmgr_psoc *psoc, 598 struct scan_cache_entry *entry, 599 qdf_list_t *scan_list) 600 { 601 return cm_bss_mlo_type(psoc, entry, scan_list); 602 } 603