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
This commit is contained in:
Srikanth Marepalli 2022-12-13 16:25:00 +05:30
commit d54888ac08
8 changed files with 111 additions and 0 deletions

View file

@ -1822,6 +1822,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);

View file

@ -1,5 +1,6 @@
/*
* Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -1250,6 +1251,35 @@
CFG_VALUE_OR_DEFAULT, \
"Enable roam based on rssi")
/*
* <ini>
* 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
*
* </ini>
*/
#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")
/*
* <ini>
* bg_rssi_threshold - To set RSSI Threshold for BG scan roaming
@ -2899,6 +2929,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) \

View file

@ -1673,6 +1673,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
@ -1795,6 +1796,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;

View file

@ -231,6 +231,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)
{
@ -274,6 +307,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
/**
@ -1171,6 +1211,11 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
if (req->wlan_roam_full_scan_6ghz_on_disc)
target_if_cm_roam_full_scan_6ghz_on_disc(
vdev, req->wlan_roam_full_scan_6ghz_on_disc);
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;
@ -1406,6 +1451,10 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
if (req->wlan_roam_full_scan_6ghz_on_disc)
target_if_cm_roam_full_scan_6ghz_on_disc(
vdev, req->wlan_roam_full_scan_6ghz_on_disc);
if (req->wlan_roam_rssi_diff_6ghz)
target_if_cm_roam_rssi_diff_6ghz(
vdev, req->wlan_roam_rssi_diff_6ghz);
}
end:
return status;

View file

@ -548,6 +548,7 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
{
struct wlan_roam_start_config *start_req;
QDF_STATUS status;
struct cm_roam_values_copy temp;
start_req = qdf_mem_malloc(sizeof(*start_req));
if (!start_req)
@ -580,6 +581,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");
@ -603,6 +607,7 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
{
struct wlan_roam_update_config *update_req;
QDF_STATUS status;
struct cm_roam_values_copy temp;
cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
@ -638,6 +643,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");

View file

@ -119,11 +119,13 @@
* @RSSI_CHANGE_THRESHOLD: Rssi change threshold
* @BEACON_RSSI_WEIGHT: Beacon Rssi weight parameter
* @HI_RSSI_DELAY_BTW_SCANS: High Rssi delay between scans
* @ROAM_RSSI_DIFF_6GHZ: roam rssi diff for 6 GHz AP
*/
enum roam_cfg_param {
RSSI_CHANGE_THRESHOLD,
BEACON_RSSI_WEIGHT,
HI_RSSI_DELAY_BTW_SCANS,
ROAM_RSSI_DIFF_6GHZ,
};
/**
@ -1173,6 +1175,8 @@ enum roam_rt_stats_params {
* 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;
@ -1195,6 +1199,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 */
};
@ -1245,6 +1250,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;
@ -1262,6 +1269,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)
@ -1479,6 +1487,7 @@ enum roam_fail_params {
* @roam_trigger_reason: Roam trigger reason(enum WMI_ROAM_TRIGGER_REASON_ID)
* @roam_invoke_fail_reason: One of reason id from enum
* wmi_roam_invoke_status_error in case of forced roam
* @roam_rssi_diff_6ghz: roam rssi diff for 6 GHz AP
*/
struct wlan_cm_rso_configs {
uint8_t rescan_rssi_delta;
@ -1488,6 +1497,7 @@ struct wlan_cm_rso_configs {
uint32_t roam_fail_reason;
uint32_t roam_trigger_reason;
uint32_t roam_invoke_fail_reason;
uint8_t roam_rssi_diff_6ghz;
};
/**

View file

@ -516,6 +516,9 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
case HI_RSSI_DELAY_BTW_SCANS:
dst_config->uint_value = src_config->hi_rssi_scan_delay;
break;
case ROAM_RSSI_DIFF_6GHZ:
dst_config->uint_value = src_config->roam_rssi_diff_6ghz;
break;
default:
mlme_err("Invalid roam config requested:%d", roam_cfg_type);
status = QDF_STATUS_E_FAILURE;
@ -562,6 +565,9 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
case HI_RSSI_DELAY_BTW_SCANS:
dst_config->hi_rssi_scan_delay = src_config->uint_value;
break;
case ROAM_RSSI_DIFF_6GHZ:
dst_config->roam_rssi_diff_6ghz = src_config->uint_value;
break;
default:
mlme_err("Invalid roam config requested:%d", roam_cfg_type);
status = QDF_STATUS_E_FAILURE;

View file

@ -844,6 +844,10 @@ static void csr_neighbor_roam_info_ctx_init(struct mac_context *mac,
wlan_cm_update_roam_scan_scheme_bitmap(mac->psoc, session_id,
DEFAULT_ROAM_SCAN_SCHEME_BITMAP);
src_cfg.uint_value = mac->mlme_cfg->lfr.roam_rssi_diff_6ghz;
wlan_cm_roam_cfg_set_value(mac->psoc, session_id,
ROAM_RSSI_DIFF_6GHZ, &src_cfg);
/*
* Now we can clear the preauthDone that
* was saved as we are connected afresh