From b73718cf7d32fb5d29e654903de4ea48e3dce9b2 Mon Sep 17 00:00:00 2001 From: Srikanth Marepalli Date: Mon, 12 Dec 2022 12:34:30 +0530 Subject: [PATCH] qcacld-3.0: Introduce ini to configure roam RSSI diff for 6 GHz AP This is applicable only when the roaming happens from 2.4 GHz/5 GHz to 6 GHz AP. The value is used to check if the 6 GHz AP to which we are roaming (from 2.4 GHz/ 5 GHz) is better than current AP in terms of RSSI. This checking is disabled if the value is set to zero. Change-Id: I77f1183e1fd704dfa153841e669a20c9e75d0fe7 CRs-Fixed: 3353346 --- components/mlme/core/src/wlan_mlme_main.c | 1 + components/mlme/dispatcher/inc/cfg_mlme_lfr.h | 30 ++++++++++++ .../dispatcher/inc/wlan_mlme_public_struct.h | 2 + .../src/target_if_cm_roam_offload.c | 49 +++++++++++++++++++ .../core/src/wlan_cm_roam_offload.c | 14 ++++++ .../inc/wlan_cm_roam_public_struct.h | 9 ++++ .../dispatcher/src/wlan_cm_roam_api.c | 8 +++ 7 files changed, 113 insertions(+) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 10ad8a6880..f33b0c5924 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -2132,6 +2132,7 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc, lfr->roam_preauth_retry_count = cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT); lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF); + lfr->roam_rssi_diff_6ghz = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF_6GHZ); lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH); lfr->roam_scan_offload_enabled = cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED); diff --git a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h index c8ccfc2110..1681339a46 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_lfr.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_lfr.h @@ -1356,6 +1356,35 @@ CFG_VALUE_OR_DEFAULT, \ "Enable roam based on rssi") +/* + * + * RoamRssiDiff6GHz - Enable roam to 6 GHz AP based on rssi + * @Min: 0 + * @Max: 100 + * @Default: 5 + * + * This INI is used to decide whether to roam to 6 GHz AP or not based on RSSI. + * AP1 is the currently associated AP(2.4 GHz / 5 GHz) and AP2(6 GHz) is chosen + * for roaming. The Roaming will happen only if AP2 has better Signal Quality + * and it has a RSSI better than AP1. RoamRssiDiff6GHz is the number of units + * (typically measured in dB) AP2 is better than AP1. + * + * Related: None + * + * Supported Feature: Roaming + * + * Usage: External + * + * + */ +#define CFG_LFR_ROAM_RSSI_DIFF_6GHZ CFG_INI_UINT( \ + "RoamRssiDiff6GHz", \ + 0, \ + 100, \ + 5, \ + CFG_VALUE_OR_DEFAULT, \ + "Enable 6 GHz roam based on rssi") + /* * * bg_rssi_threshold - To set RSSI Threshold for BG scan roaming @@ -3242,6 +3271,7 @@ CFG(CFG_LFR_MAWC_FEATURE_ENABLED) \ CFG(CFG_LFR_FAST_TRANSITION_ENABLED) \ CFG(CFG_LFR_ROAM_RSSI_DIFF) \ + CFG(CFG_LFR_ROAM_RSSI_DIFF_6GHZ) \ CFG(CFG_LFR_ROAM_BG_RSSI_TH) \ CFG(CFG_LFR_ENABLE_WES_MODE) \ CFG(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 8e93c7e04f..069c527ba5 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1865,6 +1865,7 @@ struct fw_scan_channels { * @roam_preauth_retry_count: Configure the max number of preauth retry * @roam_preauth_no_ack_timeout: Configure the no ack timeout period * @roam_rssi_diff: Enable roam based on rssi + * @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP. * @roam_scan_offload_enabled: Enable Roam Scan Offload * @neighbor_scan_timer_period: Neighbor scan timer period * @neighbor_scan_min_timer_period: Min neighbor scan timer period @@ -1991,6 +1992,7 @@ struct wlan_mlme_lfr_cfg { uint32_t roam_preauth_retry_count; uint32_t roam_preauth_no_ack_timeout; uint8_t roam_rssi_diff; + uint8_t roam_rssi_diff_6ghz; uint8_t bg_rssi_threshold; bool roam_scan_offload_enabled; uint32_t neighbor_scan_timer_period; 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 a71c287c65..83d691b12c 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 @@ -421,6 +421,39 @@ target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev, return status; } +/** + * target_if_cm_roam_rssi_diff_6ghz() - Send the roam RSSI diff value to FW + * which is used to decide how better the RSSI of the new/roamable 6GHz AP + * should be for roaming. + * @vdev: vdev object + * @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP + * + * Return: QDF_STATUS + */ +static QDF_STATUS +target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev, + uint8_t roam_rssi_diff_6ghz) +{ + QDF_STATUS status = QDF_STATUS_E_FAILURE; + uint8_t vdev_id; + wmi_unified_t wmi_handle; + + wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev); + if (!wmi_handle) + return status; + + vdev_id = wlan_vdev_get_id(vdev); + status = target_if_roam_set_param( + wmi_handle, vdev_id, + WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP, + roam_rssi_diff_6ghz); + + if (QDF_IS_STATUS_ERROR(status)) + target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP"); + + return status; +} + static void target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops) { @@ -476,6 +509,13 @@ target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev, { return QDF_STATUS_E_NOSUPPORT; } + +static QDF_STATUS +target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev, + uint8_t roam_rssi_diff_6ghz) +{ + return QDF_STATUS_E_NOSUPPORT; +} #endif /** @@ -1490,6 +1530,11 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev, is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc); target_if_cm_roam_mcc_disallow(vdev, vdev_id, is_mcc_disallowed); + + if (req->wlan_roam_rssi_diff_6ghz) + target_if_cm_roam_rssi_diff_6ghz(vdev, + req->wlan_roam_rssi_diff_6ghz); + /* add other wmi commands */ end: return status; @@ -1886,6 +1931,10 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev, is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc); target_if_cm_roam_mcc_disallow(vdev, vdev_id, is_mcc_disallowed); + + if (req->wlan_roam_rssi_diff_6ghz) + target_if_cm_roam_rssi_diff_6ghz( + vdev, req->wlan_roam_rssi_diff_6ghz); } end: return status; 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 ecd86f686b..dafb1a53fc 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 @@ -3005,6 +3005,7 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, struct rso_config *rso_cfg; struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_pdev *pdev; + struct cm_roam_values_copy temp; start_req = qdf_mem_malloc(sizeof(*start_req)); if (!start_req) @@ -3072,6 +3073,9 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, start_req->wlan_roam_full_scan_6ghz_on_disc = wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc); + wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp); + start_req->wlan_roam_rssi_diff_6ghz = temp.uint_value; + status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req); if (QDF_IS_STATUS_ERROR(status)) mlme_debug("fail to send roam start"); @@ -3101,6 +3105,7 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, struct rso_config *rso_cfg; struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_pdev *pdev; + struct cm_roam_values_copy temp; cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false); @@ -3166,6 +3171,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, update_req->wlan_roam_full_scan_6ghz_on_disc = wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc); + wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp); + update_req->wlan_roam_rssi_diff_6ghz = temp.uint_value; + status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req); if (QDF_IS_STATUS_ERROR(status)) mlme_debug("fail to send update config"); @@ -4981,6 +4989,8 @@ cm_restore_default_roaming_params(struct wlan_mlme_psoc_ext_obj *mlme_obj, mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold; cfg_params->roam_rssi_diff = mlme_obj->cfg.lfr.roam_rssi_diff; + cfg_params->roam_rssi_diff_6ghz = + mlme_obj->cfg.lfr.roam_rssi_diff_6ghz; cfg_params->bg_rssi_threshold = mlme_obj->cfg.lfr.bg_rssi_threshold; @@ -5468,6 +5478,10 @@ static void cm_roam_start_init(struct wlan_objmgr_psoc *psoc, wlan_cm_roam_cfg_set_value(psoc, vdev_id, IS_11R_CONNECTION, &src_cfg); + src_cfg.uint_value = mlme_obj->cfg.lfr.roam_rssi_diff_6ghz; + wlan_cm_roam_cfg_set_value(psoc, vdev_id, + ROAM_RSSI_DIFF_6GHZ, &src_cfg); + if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled) return; /* diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h index 0f1edb9529..06c2ac6dd0 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h @@ -307,6 +307,7 @@ struct rso_cfg_params { uint32_t full_roam_scan_period; bool enable_scoring_for_roam; uint8_t roam_rssi_diff; + uint8_t roam_rssi_diff_6ghz; uint8_t bg_rssi_threshold; uint16_t roam_scan_home_away_time; uint8_t roam_scan_n_probes; @@ -661,6 +662,7 @@ struct rso_config_params { * @MBO_OCE_ENABLED_AP: MBO/OCE enabled network * @LOST_LINK_RSSI: lost link RSSI * @ROAM_BAND: Allowed band for roaming in FW + * @ROAM_RSSI_DIFF_6GHZ: roam rssi diff for 6 GHz AP */ enum roam_cfg_param { RSSI_CHANGE_THRESHOLD, @@ -691,6 +693,7 @@ enum roam_cfg_param { LOST_LINK_RSSI, ROAM_BAND, HI_RSSI_SCAN_RSSI_DELTA, + ROAM_RSSI_DIFF_6GHZ, }; /** @@ -1782,6 +1785,8 @@ struct wlan_roam_mlo_config { * scan that are already scanned as part of partial scan. * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full * scan only on prior discovery of any 6 GHz support in the environment. + * @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of + * the new/roamable 6GHz AP should be for roaming. */ struct wlan_roam_start_config { struct wlan_roam_offload_scan_rssi_params rssi_params; @@ -1806,6 +1811,7 @@ struct wlan_roam_start_config { uint16_t wlan_roam_ho_delay_config; uint8_t wlan_exclude_rm_partial_scan_freq; uint8_t wlan_roam_full_scan_6ghz_on_disc; + uint8_t wlan_roam_rssi_diff_6ghz; /* other wmi cmd structures */ }; @@ -1861,6 +1867,8 @@ struct wlan_roam_stop_config { * scan that are already scanned as part of partial scan. * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full * scan only on prior discovery of any 6 GHz support in the environment. + * @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of + * the new/roamable 6GHz AP should be for roaming. */ struct wlan_roam_update_config { struct wlan_roam_beacon_miss_cnt beacon_miss_cnt; @@ -1879,6 +1887,7 @@ struct wlan_roam_update_config { uint16_t wlan_roam_ho_delay_config; uint8_t wlan_exclude_rm_partial_scan_freq; uint8_t wlan_roam_full_scan_6ghz_on_disc; + uint8_t wlan_roam_rssi_diff_6ghz; }; #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c index c7d9b41f3b..2b51f71046 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c @@ -762,6 +762,9 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc, case ROAM_RSSI_DIFF: dst_config->uint_value = src_cfg->roam_rssi_diff; break; + case ROAM_RSSI_DIFF_6GHZ: + dst_config->uint_value = src_cfg->roam_rssi_diff_6ghz; + break; case NEIGHBOUR_LOOKUP_THRESHOLD: dst_config->uint_value = src_cfg->neighbor_lookup_threshold; break; @@ -1334,6 +1337,9 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, cm_roam_update_cfg(psoc, vdev_id, REASON_RSSI_DIFF_CHANGED); break; + case ROAM_RSSI_DIFF_6GHZ: + dst_cfg->roam_rssi_diff_6ghz = src_config->uint_value; + break; case NEIGHBOUR_LOOKUP_THRESHOLD: dst_cfg->neighbor_lookup_threshold = src_config->uint_value; break; @@ -1567,6 +1573,8 @@ QDF_STATUS wlan_cm_rso_config_init(struct wlan_objmgr_vdev *vdev, mlme_obj->cfg.lfr.roam_scan_hi_rssi_ub; cfg_params->roam_rssi_diff = mlme_obj->cfg.lfr.roam_rssi_diff; + cfg_params->roam_rssi_diff_6ghz = + mlme_obj->cfg.lfr.roam_rssi_diff_6ghz; cfg_params->bg_rssi_threshold = mlme_obj->cfg.lfr.bg_rssi_threshold;