diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 32dcf43ab93f..d8f0b11cecea 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -8345,6 +8345,37 @@ enum hdd_wext_control {
#define CFG_PRIVATE_WEXT_CONTROL_MAX (hdd_wext_enabled)
#define CFG_PRIVATE_WEXT_CONTROL_DEFAULT (hdd_wext_deprecated)
+/*
+ *
+ * gper_roam_mon_time - Minimum time required in seconds to
+ * be considered as valid scenario for PER based roam
+ * @Min: 5
+ * @Max: 25
+ * @Default: 25
+ *
+ * This ini is used to define minimum time in seconds for which DUT has
+ * collected the PER stats before it can consider the stats hysteresis to be
+ * valid for PER based scan.
+ * DUT collects following information during this period:
+ * 1. % of packets below gper_roam_low_rate_th
+ * 2. # packets above gper_roam_high_rate_th
+ * if DUT gets (1) greater than gper_roam_th_percent and (2) is zero during
+ * this period, it triggers PER based roam scan.
+ *
+ * Related: gper_roam_enabled, gper_roam_high_rate_th, gper_roam_low_rate_th,
+ * gper_roam_th_percent, gper_roam_rest_time
+ *
+ * Supported Feature: LFR-3.0
+ *
+ * Usage: Internal
+ *
+ *
+ */
+#define CFG_PER_ROAM_MONITOR_TIME "gper_roam_mon_time"
+#define CFG_PER_ROAM_MONITOR_TIME_MIN (5)
+#define CFG_PER_ROAM_MONITOR_TIME_MAX (25)
+#define CFG_PER_ROAM_MONTIOR_TIME_DEFAULT (25)
+
/*
*
* gPowerUsage - Preferred Power Usage
@@ -9731,6 +9762,7 @@ struct hdd_config {
uint32_t per_roam_low_rate_threshold;
uint32_t per_roam_th_percent;
uint32_t per_roam_rest_time;
+ uint32_t per_roam_mon_time;
};
#define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var))
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index b211f40f44e6..6e56d8c619d0 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -4243,6 +4243,14 @@ REG_TABLE_ENTRY g_registry_table[] = {
CFG_PER_ROAM_REST_TIME_DEFAULT,
CFG_PER_ROAM_REST_TIME_MIN,
CFG_PER_ROAM_REST_TIME_MAX),
+
+ REG_VARIABLE(CFG_PER_ROAM_MONITOR_TIME, WLAN_PARAM_Integer,
+ struct hdd_config, per_roam_mon_time,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_MONTIOR_TIME_DEFAULT,
+ CFG_PER_ROAM_MONITOR_TIME_MIN,
+ CFG_PER_ROAM_MONITOR_TIME_MAX),
+
};
/**
@@ -5040,6 +5048,10 @@ static void hdd_per_roam_print_ini_config(hdd_context_t *hdd_ctx)
hdd_info("Name = [%s] Value = [%u]",
CFG_PER_ROAM_REST_TIME_NAME,
hdd_ctx->config->per_roam_rest_time);
+ hdd_info("Name = [%s] Value = [%u]",
+ CFG_PER_ROAM_MONITOR_TIME,
+ hdd_ctx->config->per_roam_mon_time);
+
}
/**
@@ -6908,6 +6920,10 @@ static void hdd_update_per_config_to_sme(hdd_context_t *hdd_ctx,
sme_config->csrConfig.per_roam_config.per_rest_time =
hdd_ctx->config->per_roam_rest_time;
+ sme_config->csrConfig.per_roam_config.tx_per_mon_time =
+ hdd_ctx->config->per_roam_mon_time;
+ sme_config->csrConfig.per_roam_config.rx_per_mon_time =
+ hdd_ctx->config->per_roam_mon_time;
}
/**
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index c8b0c727320d..7629f26a0603 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -2532,6 +2532,10 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
pParam->per_roam_config.rx_rate_thresh_percnt;
pMac->roam.configParam.per_roam_config.per_rest_time =
pParam->per_roam_config.per_rest_time;
+ pMac->roam.configParam.per_roam_config.tx_per_mon_time =
+ pParam->per_roam_config.tx_per_mon_time;
+ pMac->roam.configParam.per_roam_config.rx_per_mon_time =
+ pParam->per_roam_config.rx_per_mon_time;
/* update p2p offload status */
pMac->pnoOffload = pParam->pnoOffload;
@@ -2755,6 +2759,10 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
cfg_params->per_roam_config.rx_rate_thresh_percnt;
pParam->per_roam_config.per_rest_time =
cfg_params->per_roam_config.per_rest_time;
+ pParam->per_roam_config.tx_per_mon_time =
+ cfg_params->per_roam_config.tx_per_mon_time;
+ pParam->per_roam_config.rx_per_mon_time =
+ cfg_params->per_roam_config.rx_per_mon_time;
pParam->conc_custom_rule1 = cfg_params->conc_custom_rule1;
pParam->conc_custom_rule2 = cfg_params->conc_custom_rule2;
@@ -17615,18 +17623,23 @@ csr_create_per_roam_request(tpAniSirGlobal mac_ctx, uint8_t session_id)
mac_ctx->roam.configParam.per_roam_config.rx_low_rate_thresh;
req_buf->per_config.per_rest_time =
mac_ctx->roam.configParam.per_roam_config.per_rest_time;
+ req_buf->per_config.tx_per_mon_time =
+ mac_ctx->roam.configParam.per_roam_config.tx_per_mon_time;
+ req_buf->per_config.rx_per_mon_time =
+ mac_ctx->roam.configParam.per_roam_config.rx_per_mon_time;
req_buf->per_config.tx_rate_thresh_percnt =
mac_ctx->roam.configParam.per_roam_config.tx_rate_thresh_percnt;
req_buf->per_config.rx_rate_thresh_percnt =
mac_ctx->roam.configParam.per_roam_config.rx_rate_thresh_percnt;
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
- FL("PER based roaming configuaration enable=%d vdev=%d high_rate_thresh=%d low_rate_thresh=%d rate_thresh_percnt=%d per_rest_time=%d"),
+ FL("PER based roaming configuaration enable=%d vdev=%d high_rate_thresh=%d low_rate_thresh=%d rate_thresh_percnt=%d per_rest_time=%d monitor_time=%d"),
req_buf->per_config.enable, session_id,
req_buf->per_config.tx_high_rate_thresh,
req_buf->per_config.tx_low_rate_thresh,
req_buf->per_config.tx_rate_thresh_percnt,
- req_buf->per_config.per_rest_time);
+ req_buf->per_config.per_rest_time,
+ req_buf->per_config.tx_per_mon_time);
return req_buf;
}