From 3173789d9950eaf74cce0010843f78216e9258ff Mon Sep 17 00:00:00 2001 From: abhinav kumar Date: Mon, 9 Aug 2021 16:51:17 +0530 Subject: [PATCH] qcacld-3.0: Add new BT Coex roam trigger reason Send additional roam trigger TLV for BTC in WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID command, to support a new roaming trigger "WMI_ROAM_TRIGGER_REASON_BTC". Change-Id: Ib767bd6bcf005c187b0fb58986ad287fe8753c1b CRs-Fixed: 3009788 --- .../mlme/dispatcher/src/wlan_mlme_api.c | 2 + .../src/target_if_cm_roam_offload.c | 2 - .../core/src/wlan_cm_roam_offload.c | 70 ++++++++++++++++++- components/wmi/src/wmi_unified_roam_tlv.c | 21 ++++++ core/wma/src/wma_scan_roam.c | 1 + 5 files changed, 92 insertions(+), 4 deletions(-) diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 445fea04fe..9a639d69e7 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3958,6 +3958,8 @@ char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger) return "NONE"; case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT: return "PMK Expired"; + case WMI_ROAM_TRIGGER_REASON_BTC: + return "BTC TRIGGER"; default: return "UNKNOWN"; } diff --git a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c index ec36933f3d..52e494b48a 100644 --- a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c +++ b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c @@ -345,8 +345,6 @@ target_if_cm_roam_idle_params(wmi_unified_t wmi_handle, uint8_t command, switch (command) { case ROAM_SCAN_OFFLOAD_START: case ROAM_SCAN_OFFLOAD_UPDATE_CFG: - if (!req->enable) - return; break; case ROAM_SCAN_OFFLOAD_STOP: req->enable = false; diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c index c53db46965..5a011e2a18 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c @@ -40,6 +40,7 @@ #include "connection_mgr/core/src/wlan_cm_roam.h" #include "connection_mgr/core/src/wlan_cm_main.h" #include "connection_mgr/core/src/wlan_cm_sm.h" +#include "wlan_reg_ucfg_api.h" #ifdef WLAN_FEATURE_SAE #define CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap) \ @@ -162,6 +163,53 @@ cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, params->enable_roam_reason_vsie = enable_roam_reason_vsie; } +/** + * cm_is_only_2g_band_supported() - Check if BTC trigger and IDLE trigger needs + * to be disabled based on the current connected band. + * @psoc: Pointer to the psoc object + * @vdev_id: Vdev id + * + * Return: true if BTC trigger and IDLE trigger are allowed or not + */ +static bool +cm_is_only_2g_band_supported(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_pdev *pdev; + bool only_2g_band_supported = false; + uint32_t band_bitmap; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_CM_ID); + if (!vdev) { + mlme_err("Vdev is null for vdev_id:%d", vdev_id); + return false; + } + + pdev = wlan_vdev_get_pdev(vdev); + if (!pdev) { + mlme_err("pdev is null for vdev_id:%d", vdev_id); + goto release; + } + + if (QDF_IS_STATUS_ERROR(ucfg_reg_get_band(pdev, &band_bitmap))) { + mlme_debug("Failed to get band"); + goto release; + } + + mlme_debug("Current band bitmap:%d", band_bitmap); + + if (band_bitmap & BIT(REG_BAND_2G) && + !(band_bitmap & BIT(REG_BAND_5G)) && + !(band_bitmap & BIT(REG_BAND_6G))) + only_2g_band_supported = true; + + +release: + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); + return only_2g_band_supported; +} + /** * cm_roam_triggers() - set roam triggers * @psoc: psoc pointer @@ -191,6 +239,17 @@ cm_roam_triggers(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, if (!is_per_roam_enabled) params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_PER); + /* + * Enable BTC trigger and IDLE trigger only when DUT is dual band + * capable(2g + 5g/6g) + */ + if (cm_is_only_2g_band_supported(psoc, vdev_id)) { + params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_IDLE); + params->trigger_bitmap &= ~BIT(ROAM_TRIGGER_REASON_BTC); + } + + mlme_debug("[ROAM_TRIGGER] trigger_bitmap:%d", params->trigger_bitmap); + params->roam_scan_scheme_bitmap = wlan_cm_get_roam_scan_scheme_bitmap(psoc, vdev_id); wlan_cm_roam_get_vendor_btm_params(psoc, ¶ms->vendor_btm_param); @@ -2491,6 +2550,10 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, cm_roam_bss_load_config(psoc, vdev_id, &start_req->bss_load_config); cm_roam_disconnect_params(psoc, vdev_id, &start_req->disconnect_params); cm_roam_idle_params(psoc, vdev_id, &start_req->idle_params); + if (!(BIT(ROAM_TRIGGER_REASON_IDLE) & + start_req->roam_triggers.trigger_bitmap)) + start_req->idle_params.enable = false; + cm_roam_scan_offload_rssi_thresh(psoc, vdev_id, &start_req->rssi_params, rso_cfg); cm_roam_scan_offload_scan_period(vdev_id, @@ -2568,10 +2631,13 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, if (MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) { cm_roam_disconnect_params(psoc, vdev_id, &update_req->disconnect_params); - cm_roam_idle_params(psoc, vdev_id, - &update_req->idle_params); cm_roam_triggers(psoc, vdev_id, &update_req->roam_triggers); + cm_roam_idle_params(psoc, vdev_id, + &update_req->idle_params); + if (!(BIT(ROAM_TRIGGER_REASON_IDLE) & + update_req->roam_triggers.trigger_bitmap)) + update_req->idle_params.enable = false; } cm_roam_scan_offload_rssi_thresh(psoc, vdev_id, &update_req->rssi_params, rso_cfg); diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c index 4b882c2770..9188f970c6 100644 --- a/components/wmi/src/wmi_unified_roam_tlv.c +++ b/components/wmi/src/wmi_unified_roam_tlv.c @@ -823,6 +823,8 @@ convert_roam_trigger_reason(enum roam_trigger_reason trigger_reason) return WMI_ROAM_TRIGGER_REASON_WTC_BTM; case ROAM_TRIGGER_REASON_PMK_TIMEOUT: return WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT; + case ROAM_TRIGGER_REASON_BTC: + return WMI_ROAM_TRIGGER_REASON_BTC; case ROAM_TRIGGER_REASON_MAX: return WMI_ROAM_TRIGGER_REASON_MAX; default: @@ -1312,6 +1314,9 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle, if (BIT(ROAM_TRIGGER_REASON_PER) & roam_scan_scheme_bitmap) num_triggers_enabled++; + if (BIT(ROAM_TRIGGER_REASON_BTC) & roam_scan_scheme_bitmap) + num_triggers_enabled++; + if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap) num_triggers_enabled++; @@ -1395,6 +1400,12 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle, wmi_fill_score_delta_params(roam_trigger_parameters, triggers, IDLE_ROAM_TRIGGER); + if (cmd->trigger_reason_bitmask & + BIT(WMI_ROAM_TRIGGER_REASON_IDLE)) + roam_trigger_parameters->enable = 1; + else + roam_trigger_parameters->enable = 0; + roam_trigger_parameters++; wmi_fill_score_delta_params(roam_trigger_parameters, @@ -1444,6 +1455,16 @@ static QDF_STATUS send_set_roam_trigger_cmd_tlv(wmi_unified_t wmi_handle, roam_trigger_parameters++; } + if (BIT(ROAM_TRIGGER_REASON_BTC) & roam_scan_scheme_bitmap) { + wmi_fill_default_roam_trigger_parameters( + roam_trigger_parameters, + WMI_ROAM_TRIGGER_REASON_BTC); + roam_trigger_parameters->scan_mode = + ROAM_TRIGGER_SCAN_MODE_PARTIAL; + + roam_trigger_parameters++; + } + if (BIT(ROAM_TRIGGER_REASON_BMISS) & roam_scan_scheme_bitmap) { wmi_fill_default_roam_trigger_parameters( roam_trigger_parameters, diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 1dd620f0cc..11976d975c 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1594,6 +1594,7 @@ wma_get_trigger_detail_str(struct wmi_roam_trigger_info *roam_info, char *buf) case WMI_ROAM_TRIGGER_REASON_IDLE: case WMI_ROAM_TRIGGER_REASON_FORCED: case WMI_ROAM_TRIGGER_REASON_UNIT_TEST: + case WMI_ROAM_TRIGGER_REASON_BTC: return; case WMI_ROAM_TRIGGER_REASON_BTM: buf_cons = qdf_snprint(temp, buf_left,