From 8580e33717c6c35db6f401fcaea442932a62ec37 Mon Sep 17 00:00:00 2001 From: Srikanth Marepalli Date: Wed, 27 Dec 2023 18:03:32 +0530 Subject: [PATCH] qcacld-3.0: Add vendor attribute for high RSSI roam trigger threshold Currently the roam scan high RSSI delta is configured via INI. Define an attribute to allow user configure high RSSI roam trigger threshold. STA is expected to trigger roam if the current connected AP's RSSI gets above this high RSSI threshold. STA's roam attempt on high RSSI threshold aims to find candidates from other better Wi-Fi bands. This attribute value is given priority over the INI. Use a new service bit WMI_SERVICE_5GHZ_HI_RSSI_ROAM_SUPPORT to enable high RSSI roam trigger in 5 GHz as well. Change-Id: Ide48ad2261b603de36bd1b31114b91c3a9d6606f CRs-Fixed: 3586170 --- .../dispatcher/inc/wlan_mlme_public_struct.h | 3 + .../src/target_if_cm_roam_offload.c | 63 ++++++++++++++++++- .../core/src/wlan_cm_roam_offload.c | 47 +++++++++++++- .../core/src/wlan_cm_roam_offload.h | 17 ++++- .../dispatcher/inc/wlan_cm_roam_api.h | 46 +++++++++++++- .../inc/wlan_cm_roam_public_struct.h | 22 ++++++- .../dispatcher/inc/wlan_cm_roam_ucfg_api.h | 27 +++++++- .../dispatcher/inc/wlan_cm_tgt_if_tx_api.h | 16 ++++- .../dispatcher/src/wlan_cm_roam_api.c | 29 ++++++++- .../dispatcher/src/wlan_cm_tgt_if_tx_api.c | 30 ++++++++- components/wmi/src/wmi_unified_roam_tlv.c | 3 +- core/hdd/src/wlan_hdd_cfg80211.c | 26 ++++++++ core/sme/src/csr/csr_api_roam.c | 54 ++++++++++++++++ 13 files changed, 373 insertions(+), 10 deletions(-) diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 12d2f7de3c15..ad48cd35c0cd 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1631,6 +1631,8 @@ struct fw_scan_channels { * vsie in Re(assoc) frame * @roam_trigger_bitmap: Bitmap of roaming triggers. * @sta_roam_disable STA roaming disabled by interfaces + * @roam_high_rssi_delta: Delta change in high RSSI at which roam scan is + * triggered in 2.4/5 GHz. * @early_stop_scan_enable: Set early stop scan * @enable_5g_band_pref: Enable preference for 5G from INI * @ese_enabled: Enable ESE feature @@ -1752,6 +1754,7 @@ struct wlan_mlme_lfr_cfg { bool enable_roam_reason_vsie; uint32_t roam_trigger_bitmap; uint32_t sta_roam_disable; + uint8_t roam_high_rssi_delta; #endif bool early_stop_scan_enable; bool enable_5g_band_pref; 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 7ad9b0a04ffc..46e1cab26484 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 @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 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 above @@ -264,6 +264,56 @@ target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev, return status; } +static QDF_STATUS +target_if_cm_roam_scan_offload_rssi_thresh( + wmi_unified_t wmi_handle, + struct wlan_roam_offload_scan_rssi_params *req); + +/** + * target_if_cm_roam_scan_offload_rssi_params() - Set the RSSI parameters + * for roam offload scan + * @vdev: vdev object + * @roam_rssi_params: structure containing parameters for roam offload scan + * based on RSSI + * + * Return: QDF_STATUS + */ +static QDF_STATUS +target_if_cm_roam_scan_offload_rssi_params( + struct wlan_objmgr_vdev *vdev, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params) +{ + QDF_STATUS status = QDF_STATUS_E_FAILURE; + wmi_unified_t wmi_handle; + + wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev); + if (!wmi_handle) + return status; + + status = target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle, + roam_rssi_params); + + return status; +} + +static void +target_if_check_hi_rssi_5ghz_support( + wmi_unified_t wmi_handle, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params) +{ + if ((roam_rssi_params->flags & + ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G) && + wmi_service_enabled(wmi_handle, + wmi_service_5ghz_hi_rssi_roam_support)) { + target_if_debug("FW supports Hi RSSI roam in 5 GHz"); + roam_rssi_params->flags |= + WMI_ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G; + } else { + roam_rssi_params->flags &= + ~ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G; + } +} + static void target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops) { @@ -274,6 +324,8 @@ target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops) target_if_cm_exclude_rm_partial_scan_freq; tx_ops->send_roam_full_scan_6ghz_on_disc = target_if_cm_roam_full_scan_6ghz_on_disc; + tx_ops->send_roam_scan_offload_rssi_params = + target_if_cm_roam_scan_offload_rssi_params; } #else static inline void @@ -314,6 +366,12 @@ target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev, { return QDF_STATUS_E_NOSUPPORT; } + +static inline void +target_if_check_hi_rssi_5ghz_support( + wmi_unified_t wmi_handle, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params) +{} #endif /** @@ -678,6 +736,9 @@ target_if_cm_roam_scan_offload_rssi_thresh( } } + if (req->hi_rssi_scan_rssi_delta) + target_if_check_hi_rssi_5ghz_support(wmi_handle, req); + target_if_debug("RSO_CFG: vdev %d: db2dbm enabled:%d, good_rssi_threshold:%d, early_stop_thresholds en:%d, min:%d, max:%d, roam_scan_rssi_thresh:%d, roam_rssi_thresh_diff:%d", req->vdev_id, db2dbm_enabled, req->good_rssi_threshold, req->early_stop_scan_enable, 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 9883bfc6a980..647f5e0229b2 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 @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 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 @@ -317,6 +317,51 @@ QDF_STATUS cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_psoc *psoc, return status; } + +QDF_STATUS cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + uint8_t param_value) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params; + QDF_STATUS status = QDF_STATUS_E_INVAL; + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_MLME_CM_ID); + if (!vdev) { + mlme_err("vdev object is NULL for vdev %d", vdev_id); + return QDF_STATUS_E_FAILURE; + } + + roam_rssi_params = qdf_mem_malloc(sizeof(*roam_rssi_params)); + if (!roam_rssi_params) + goto rel_vdev_ref; + + wlan_cm_set_roam_scan_high_rssi_offset(psoc, param_value); + qdf_mem_zero(roam_rssi_params, sizeof(*roam_rssi_params)); + status = wlan_cm_roam_scan_offload_rssi_thresh(psoc, vdev_id, + roam_rssi_params); + if (!QDF_IS_STATUS_SUCCESS(status)) { + mlme_err("fail to set roam scan offload RSSI threshold params"); + goto mem_free; + } + mlme_debug("vdev:%d Configured high RSSI delta=%d, 5 GHZ roam flag=%d", + vdev_id, roam_rssi_params->hi_rssi_scan_rssi_delta, + (roam_rssi_params->flags & + ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G)); + + status = wlan_cm_tgt_send_roam_scan_offload_rssi_params( + vdev, roam_rssi_params); + if (!QDF_IS_STATUS_SUCCESS(status)) + mlme_err("fail to set roam scan high RSSI offset"); + +mem_free: + qdf_mem_free(roam_rssi_params); +rel_vdev_ref: + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID); + + return status; +} #else static inline void cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h index 5ae40f27e891..3917d8ac373f 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 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 @@ -156,6 +156,21 @@ cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_psoc *psoc, */ QDF_STATUS cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, uint8_t param_value); + +/** + * cm_set_roam_scan_high_rssi_offset() - Set the delta change in high RSSI at + * which roam scan is triggered in 2.4/5 GHz. + * @psoc: PSOC pointer + * @vdev_id: vdev id + * @param_value: Set the High RSSI delta for roam scan trigger + * * 1-16 - Set an offset value in this range + * * 0 - Disable + * + * Return: QDF_STATUS + */ +QDF_STATUS +cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t param_value); #else static inline QDF_STATUS cm_roam_send_rt_stats_config(struct wlan_objmgr_psoc *psoc, diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h index 6cdd5965714b..479800eaa880 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 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 above @@ -692,6 +692,44 @@ wlan_cm_roam_set_ho_delay_config(struct wlan_objmgr_psoc *psoc, */ uint16_t wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc); + +/** + * wlan_cm_set_roam_scan_high_rssi_offset() - Set the delta change in high RSSI + * at which roam scan is triggered in 2.4/5 GHz. + * @psoc: PSOC pointer + * @roam_high_rssi_delta: Set the High RSSI delta for roam scan trigger + * * 1-16 - Set an offset value in this range + * * 0 - Disable + * + * Return: none + */ +void +wlan_cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t roam_high_rssi_delta); + +/** + * wlan_cm_get_roam_scan_high_rssi_offset() - Get the delta change in high RSSI + * at which roam scan is triggered in 2.4/5 GHz. + * @psoc: PSOC pointer + * + * Return: High RSSI delta for roam scan trigger + */ +uint8_t wlan_cm_get_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc); + +/** + * wlan_cm_roam_scan_offload_rssi_thresh() - set roam offload scan rssi + * parameters + * @psoc: PSOC pointer + * @vdev_id: VDEV id + * @roam_rssi_params: roam offload scan rssi related parameters + * + * This function is used to set roam offload scan rssi related parameters + * + * Return: QDF_STATUS + */ +QDF_STATUS wlan_cm_roam_scan_offload_rssi_thresh( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params); #else static inline void wlan_cm_roam_activate_pcl_per_vdev(struct wlan_objmgr_psoc *psoc, @@ -826,5 +864,11 @@ wlan_cm_roam_get_full_scan_6ghz_on_disc(struct wlan_objmgr_psoc *psoc) { return 0; } + +static inline uint8_t +wlan_cm_get_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc) +{ + return 0; +} #endif /* FEATURE_ROAM_OFFLOAD */ #endif /* WLAN_CM_ROAM_API_H__ */ 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 6118e79b7484..05b4dfc2ec31 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 @@ -1,6 +1,6 @@ /* * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 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 above @@ -980,6 +980,19 @@ struct wlan_roam_scan_offload_params { #endif }; +/** + * enum wlan_roam_offload_scan_rssi_flags - Flags for roam scan RSSI threshold + * params, this enums will be used in flags param of the structure + * wlan_roam_offload_scan_rssi_params + * @ROAM_SCAN_RSSI_THRESHOLD_INVALID_FLAG: invalid flag + * @ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G: enable high RSSI roam + * trigger support to roam from 5 GHz to 6 GHz band + */ +enum wlan_roam_offload_scan_rssi_flags { + ROAM_SCAN_RSSI_THRESHOLD_INVALID_FLAG, + ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G = BIT(0), +}; + /** * struct wlan_roam_offload_scan_rssi_params - structure containing * parameters for roam offload scan based on RSSI @@ -1015,6 +1028,7 @@ struct wlan_roam_scan_offload_params { * roam * @roam_data_rssi_threshold: Bad data RSSI threshold to roam * @rx_data_inactivity_time: Rx duration to check data RSSI + * @flags: Flags for roam scan RSSI threshold params */ struct wlan_roam_offload_scan_rssi_params { int8_t rssi_thresh; @@ -1046,6 +1060,7 @@ struct wlan_roam_offload_scan_rssi_params { uint32_t roam_data_rssi_threshold_triggers; int32_t roam_data_rssi_threshold; uint32_t rx_data_inactivity_time; + uint32_t flags; }; /** @@ -1400,6 +1415,8 @@ struct set_pcl_req { * scan that are already scanned as part of partial scan. * @send_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. + * @send_roam_scan_offload_rssi_params: Set the RSSI parameters for roam + * offload scan */ struct wlan_cm_roam_tx_ops { QDF_STATUS (*send_vdev_set_pcl_cmd)(struct wlan_objmgr_vdev *vdev, @@ -1436,6 +1453,9 @@ struct wlan_cm_roam_tx_ops { QDF_STATUS (*send_roam_full_scan_6ghz_on_disc)( struct wlan_objmgr_vdev *vdev, uint8_t value); + QDF_STATUS (*send_roam_scan_offload_rssi_params)( + struct wlan_objmgr_vdev *vdev, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params); #endif }; diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h index b4ec5f2543dd..7def60210b3b 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 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 above @@ -227,6 +227,24 @@ ucfg_cm_exclude_rm_partial_scan_freq(struct wlan_objmgr_pdev *pdev, QDF_STATUS ucfg_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, uint8_t param_value); + +/** + * ucfg_cm_set_roam_scan_high_rssi_offset() - Set the delta change in high RSSI + * at which roam scan is triggered in 2.4/5 GHz. + * @psoc: Pointer to psoc object + * @vdev_id: vdev id + * @param_value: Set the High RSSI delta for roam scan trigger + * 0 - Disable + * 1-16 - Set an offset value in this range + * + * Return: QDF_STATUS + */ +static inline QDF_STATUS +ucfg_cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t param_value) +{ + return cm_set_roam_scan_high_rssi_offset(psoc, vdev_id, param_value); +} #else static inline QDF_STATUS ucfg_cm_update_roam_scan_scheme_bitmap(struct wlan_objmgr_psoc *psoc, @@ -277,4 +295,11 @@ ucfg_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_pdev *pdev, { return QDF_STATUS_SUCCESS; } + +static inline QDF_STATUS +ucfg_cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, uint8_t param_value) +{ + return QDF_STATUS_SUCCESS; +} #endif diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h index 05486e85645a..60a8c96776de 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h +++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_tgt_if_tx_api.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 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 above @@ -93,6 +93,20 @@ wlan_cm_tgt_send_roam_full_scan_6ghz_on_disc( struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, uint8_t roam_full_scan_6ghz_on_disc); + +/** + * wlan_cm_tgt_send_roam_scan_offload_rssi_params() - Set the RSSI parameters + * for roam offload scan + * @vdev: Pointer to vdev object + * @roam_rssi_params: structure containing parameters for roam offload scan + * based on RSSI + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_cm_tgt_send_roam_scan_offload_rssi_params( + struct wlan_objmgr_vdev *vdev, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params); #else static inline QDF_STATUS wlan_cm_roam_send_set_vdev_pcl(struct wlan_objmgr_psoc *psoc, 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 578cb0e3ddaf..53fce94e29c3 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 @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 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 above @@ -922,7 +922,9 @@ wlan_cm_roam_get_ho_delay_config(struct wlan_objmgr_psoc *psoc) return mlme_obj->cfg.lfr.roam_ho_delay_config; } +#endif +#ifdef WLAN_FEATURE_ROAM_OFFLOAD void wlan_cm_set_exclude_rm_partial_scan_freq(struct wlan_objmgr_psoc *psoc, uint8_t exclude_rm_partial_scan_freq) @@ -977,4 +979,29 @@ uint8_t wlan_cm_roam_get_full_scan_6ghz_on_disc(struct wlan_objmgr_psoc *psoc) return mlme_obj->cfg.lfr.roam_full_scan_6ghz_on_disc; } + +void +wlan_cm_set_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc, + uint8_t roam_high_rssi_delta) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return; + + mlme_obj->cfg.lfr.roam_high_rssi_delta = roam_high_rssi_delta; +} + +uint8_t +wlan_cm_get_roam_scan_high_rssi_offset(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return 0; + + return mlme_obj->cfg.lfr.roam_high_rssi_delta; +} #endif diff --git a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c index f69e416f59a0..69f7501a2688 100644 --- a/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c +++ b/components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_tgt_if_tx_api.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2020, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved + * Copyright (c) 2022-2023 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 above @@ -299,6 +299,34 @@ QDF_STATUS wlan_cm_tgt_send_roam_full_scan_6ghz_on_disc( return status; } + +QDF_STATUS +wlan_cm_tgt_send_roam_scan_offload_rssi_params( + struct wlan_objmgr_vdev *vdev, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params) +{ + QDF_STATUS status; + uint8_t vdev_id; + struct wlan_cm_roam_tx_ops *roam_tx_ops; + + vdev_id = wlan_vdev_get_id(vdev); + + roam_tx_ops = wlan_cm_roam_get_tx_ops_from_vdev(vdev); + if (!roam_tx_ops || !roam_tx_ops->send_roam_scan_offload_rssi_params) { + mlme_err("vdev %d send_roam_scan_offload_rssi_params is NULL", + vdev_id); + wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID); + return QDF_STATUS_E_INVAL; + } + + status = roam_tx_ops->send_roam_scan_offload_rssi_params( + vdev, roam_rssi_params); + if (QDF_IS_STATUS_ERROR(status)) + mlme_debug("vdev %d fail to send roam scan offload RSSI params", + vdev_id); + + return status; +} #endif #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD) diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c index 287fa9c77d8d..0c6e35797f17 100644 --- a/components/wmi/src/wmi_unified_roam_tlv.c +++ b/components/wmi/src/wmi_unified_roam_tlv.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2013-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 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 above @@ -215,6 +215,7 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv( rssi_threshold_fp->hirssi_upper_bound = roam_req->hi_rssi_scan_rssi_ub; rssi_threshold_fp->rssi_thresh_offset_5g = roam_req->rssi_thresh_offset_5g; + rssi_threshold_fp->flags = roam_req->flags; buf_ptr += sizeof(wmi_roam_scan_rssi_threshold_fixed_param); WMITLV_SET_HDR(buf_ptr, diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 297ea8fd24d6..15a16ec28070 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -4655,6 +4655,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = { .type = NLA_U8}, [QCA_ATTR_ROAM_CONTROL_FULL_SCAN_6GHZ_ONLY_ON_PRIOR_DISCOVERY] = { .type = NLA_U8}, + [QCA_ATTR_ROAM_CONTROL_CONNECTED_HIGH_RSSI_OFFSET] = {.type = NLA_U8}, }; /** @@ -5306,6 +5307,31 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx, hdd_err("Fail to decide inclusion of 6 GHz channels"); } + attr = tb2[QCA_ATTR_ROAM_CONTROL_CONNECTED_HIGH_RSSI_OFFSET]; + if (attr) { + value = nla_get_u8(attr); + if (!cfg_in_range(CFG_LFR_ROAM_SCAN_HI_RSSI_DELTA, value)) { + hdd_err("High RSSI offset value %d is out of range", + value); + return -EINVAL; + } + + hdd_debug("%s roam scan high RSSI with offset: %d for vdev %d", + value ? "Enable" : "Disable", value, vdev_id); + + if (!value && + !wlan_cm_get_roam_scan_high_rssi_offset(hdd_ctx->psoc)) { + hdd_debug("Roam scan high RSSI is already disabled"); + return -EINVAL; + } + + status = ucfg_cm_set_roam_scan_high_rssi_offset(hdd_ctx->psoc, + vdev_id, value); + if (QDF_IS_STATUS_ERROR(status)) + hdd_err("Fail to set roam scan high RSSI offset for vdev %d", + vdev_id); + } + return qdf_status_to_os_return(status); } diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index e3565fbbd7ff..5d680fdb97ae 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -17882,6 +17882,29 @@ csr_cm_roam_scan_offload_rssi_thresh(struct mac_context *mac_ctx, else params->hi_rssi_scan_rssi_delta = roam_info->cfgParams.hi_rssi_scan_rssi_delta; + /* + * When the STA operating band is 2.4/5 GHz and if the high RSSI delta + * is configured through vendor command then the priority should be + * given to it and the high RSSI delta value will be overridden with it. + */ + if (!WLAN_REG_IS_6GHZ_CHAN_FREQ(session->connectedProfile.op_freq)) { + uint8_t roam_high_rssi_delta; + + roam_high_rssi_delta = + wlan_cm_get_roam_scan_high_rssi_offset(mac_ctx->psoc); + if (roam_high_rssi_delta) + params->hi_rssi_scan_rssi_delta = + roam_high_rssi_delta; + /* + * Firmware will use this flag to enable 5 to 6 GHz + * high RSSI roam + */ + if (roam_high_rssi_delta && + WLAN_REG_IS_5GHZ_CH_FREQ(session->connectedProfile.op_freq)) + params->flags |= + ROAM_SCAN_RSSI_THRESHOLD_FLAG_ROAM_HI_RSSI_EN_ON_5G; + } + params->hi_rssi_scan_rssi_ub = roam_info->cfgParams.hi_rssi_scan_rssi_ub; params->raise_rssi_thresh_5g = @@ -18474,6 +18497,37 @@ csr_cm_fill_rso_sae_single_pmk_info(struct mac_context *mac_ctx, return false; } #endif + +QDF_STATUS wlan_cm_roam_scan_offload_rssi_thresh( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + struct wlan_roam_offload_scan_rssi_params *roam_rssi_params) +{ + struct csr_roam_session *session; + struct mac_context *mac_ctx; + + mac_ctx = sme_get_mac_context(); + if (!mac_ctx) { + sme_err("mac_ctx is NULL"); + return QDF_STATUS_E_FAILURE; + } + + session = CSR_GET_SESSION(mac_ctx, vdev_id); + if (!session) { + sme_err("session is null %d", vdev_id); + return QDF_STATUS_E_FAILURE; + } + + if (WLAN_REG_IS_6GHZ_CHAN_FREQ(session->connectedProfile.op_freq)) { + sme_err("vdev:%d High RSSI offset can't be set in 6 GHz band", + vdev_id); + return QDF_STATUS_E_FAILURE; + } + + csr_cm_roam_scan_offload_rssi_thresh(mac_ctx, session, + roam_rssi_params); + + return QDF_STATUS_SUCCESS; +} #endif #ifdef WLAN_FEATURE_ROAM_OFFLOAD