diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 41a0ffd56025..e6ace5f57f4f 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -4117,6 +4117,7 @@ roam_control_policy[QCA_ATTR_ROAM_CONTROL_MAX + 1] = { [QCA_ATTR_ROAM_CONTROL_ENABLE] = {.type = NLA_U8}, [PARAM_FREQ_LIST_SCHEME] = {.type = NLA_NESTED}, [QCA_ATTR_ROAM_CONTROL_FULL_SCAN_PERIOD] = {.type = NLA_U32}, + [QCA_ATTR_ROAM_CONTROL_CLEAR_ALL] = {.type = NLA_FLAG}, [QCA_ATTR_ROAM_CONTROL_TRIGGERS] = {.type = NLA_U32}, [QCA_ATTR_ROAM_CONTROL_SELECTION_CRITERIA] = {.type = NLA_NESTED}, }; @@ -4370,6 +4371,68 @@ hdd_set_roam_with_control_config(struct hdd_context *hdd_ctx, return qdf_status_to_os_return(status); } +#define ENABLE_ROAM_TRIGGERS_ALL (QCA_ROAM_TRIGGER_REASON_PER | \ + QCA_ROAM_TRIGGER_REASON_BEACON_MISS | \ + QCA_ROAM_TRIGGER_REASON_POOR_RSSI | \ + QCA_ROAM_TRIGGER_REASON_BETTER_RSSI | \ + QCA_ROAM_TRIGGER_REASON_PERIODIC | \ + QCA_ROAM_TRIGGER_REASON_DENSE | \ + QCA_ROAM_TRIGGER_REASON_BTM | \ + QCA_ROAM_TRIGGER_REASON_BSS_LOAD) + +static int +hdd_clear_roam_control_config(struct hdd_context *hdd_ctx, + struct nlattr **tb, + uint8_t vdev_id) +{ + QDF_STATUS status; + struct nlattr *tb2[QCA_ATTR_ROAM_CONTROL_MAX + 1]; + mac_handle_t mac_handle = hdd_ctx->mac_handle; + + /* The command must carry PARAM_ROAM_CONTROL_CONFIG */ + if (!tb[PARAM_ROAM_CONTROL_CONFIG]) { + hdd_err("Attribute CONTROL_CONFIG is not present"); + return -EINVAL; + } + + if (wlan_cfg80211_nla_parse_nested(tb2, QCA_ATTR_ROAM_CONTROL_MAX, + tb[PARAM_ROAM_CONTROL_CONFIG], + roam_control_policy)) { + hdd_err("nla_parse failed"); + return -EINVAL; + } + + hdd_debug("Clear the control config done through SET"); + if (tb2[QCA_ATTR_ROAM_CONTROL_CLEAR_ALL]) { + hdd_debug("Disable roam control config done through SET"); + status = sme_set_roam_config_enable(hdd_ctx->mac_handle, + vdev_id, 0); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("failed to enable/disable roam control config"); + return qdf_status_to_os_return(status); + } + + hdd_debug("Reset roam trigger bitmap to 0x%x", + ENABLE_ROAM_TRIGGERS_ALL); + status = hdd_send_roam_triggers_to_sme(hdd_ctx, + ENABLE_ROAM_TRIGGERS_ALL, + vdev_id); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("failed to restore roam trigger bitmap"); + return qdf_status_to_os_return(status); + } + + status = sme_roam_control_restore_default_config(mac_handle, + vdev_id); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("failed to config roam control"); + return qdf_status_to_os_return(status); + } + } + + return 0; +} + #undef PARAM_ROAM_CONTROL_CONFIG #undef PARAM_FREQ_LIST_SCHEME_MAX #undef PARAM_FREQ_LIST_SCHEME @@ -4522,6 +4585,11 @@ static int hdd_set_ext_roam_params(struct hdd_context *hdd_ctx, if (ret) goto fail; break; + case QCA_WLAN_VENDOR_ROAMING_SUBCMD_CONTROL_CLEAR: + ret = hdd_clear_roam_control_config(hdd_ctx, tb, vdev_id); + if (ret) + goto fail; + break; } return 0; diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 9d8c0ed00487..a539ff7d689c 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -850,6 +850,20 @@ QDF_STATUS sme_modify_roam_cand_sel_criteria(mac_handle_t mac_handle, uint8_t vdev_id, bool enable_scoring_for_roam); + +/** + * sme_roam_control_restore_default_config - Restore roam config to default + * @mac_handle: Opaque handle to the global MAC context + * @vdev_id: vdev Identifier + * + * Restore enable_scoring_for_roam, emptyScanRefreshPeriod, + * full_roam_scan_period to their default values and send RSO command to + * firmware with the updated values. + * + * Return: Success or failure + */ +QDF_STATUS sme_roam_control_restore_default_config(mac_handle_t mac_handle, + uint8_t vdev_id); QDF_STATUS sme_set_neighbor_scan_min_chan_time(mac_handle_t mac_handle, const uint16_t nNeighborScanMinChanTime, uint8_t sessionId); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 327bfe06e5cf..e50fa6d8f886 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -6783,8 +6783,6 @@ QDF_STATUS sme_update_empty_scan_refresh_period(mac_handle_t mac_handle, neighborRoamInfo [sessionId]. neighborRoamState)); - mac->mlme_cfg->lfr.empty_scan_refresh_period = - empty_scan_refresh_period; pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod = empty_scan_refresh_period; @@ -6869,6 +6867,56 @@ out: return status; } +QDF_STATUS sme_roam_control_restore_default_config(mac_handle_t mac_handle, + uint8_t vdev_id) +{ + struct mac_context *mac = MAC_CONTEXT(mac_handle); + QDF_STATUS status; + tpCsrNeighborRoamControlInfo neighbor_roam_info; + + if (vdev_id >= WLAN_MAX_VDEVS) { + sme_err("Invalid vdev_id: %d", vdev_id); + return QDF_STATUS_E_INVAL; + } + + status = sme_acquire_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(status)) + return status; + + if (!mac->mlme_cfg->lfr.roam_scan_offload_enabled) { + sme_err("roam_scan_offload_enabled is not supported"); + status = QDF_STATUS_E_INVAL; + goto out; + } + + sme_debug("%s default roam scoring", + mac->mlme_cfg->scoring.enable_scoring_for_roam ? + "Enable" : "Disable"); + + neighbor_roam_info = &mac->roam.neighborRoamInfo[vdev_id]; + + neighbor_roam_info->cfgParams.enable_scoring_for_roam = + mac->mlme_cfg->scoring.enable_scoring_for_roam; + + neighbor_roam_info->cfgParams.emptyScanRefreshPeriod = + mac->mlme_cfg->lfr.empty_scan_refresh_period; + + neighbor_roam_info->cfgParams.full_roam_scan_period = + mac->mlme_cfg->lfr.roam_full_scan_period; + + sme_debug("Restore scan period to: %u and full scan period to: %u", + neighbor_roam_info->cfgParams.emptyScanRefreshPeriod, + neighbor_roam_info->cfgParams.full_roam_scan_period); + + csr_roam_offload_scan(mac, vdev_id, + ROAM_SCAN_OFFLOAD_UPDATE_CFG, + REASON_SCORING_CRITERIA_CHANGED); +out: + sme_release_global_lock(&mac->sme); + + return status; +} + /* * sme_set_neighbor_scan_min_chan_time() - * Update nNeighborScanMinChanTime