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